Unity3D小功能 小技巧 小教程 小原理(持續更新...)
1.Unity的.NET版本是2.0
按道理來說,C#能用的功能Unity也能用,但是Unity的.NET卻不是最新版
要是用一些别的DLL或者接入SDK的時候有DLL,就會發現有一些DLL的.NET版本是4.0,Unity便無法使用這些DLL,相當困擾。
2.關閉Request error提示 Edit→Preferences→General→Show Asset Store search hits
3.設定物體實體互不碰撞
Edit-Project Settings-Physics 打開實體管理器(Physics Manager)
裡面可以設定層級互相間的碰撞
4.進度條
通過改變UI的FillAmount值
public UnityEngine.UI.Image healthBar;
void Start() {healthBar.fillAmount = 0.0f;}
5.Unity連接配接多媒體SDK開發
體感:Kinect、Leapmotion
AR:Vuforia Metiao EasyAR VoidAR
VR:gear 暴風 oculus HTC
觸屏: Input.Touch EasyTouch(插件)
7.Inspector面闆修改
例如添加一個按鈕:
[CustomEditor(typeof(出現按鈕的腳本名)), CanEditMultipleObjects]
public class 自定腳本名: Editor {
public override void OnInspectorGUI(){
base.OnInspectorGUI();//繪制原本的資訊//
if(GUILayout.Button("自定義按鈕名字")){
方法函數();
}
}}
8.平台預處理
#if UNITY_EDITOR
platform = "hi,大家好,我是在unity編輯模式下";
#elif UNITY_XBOX360
platform="hi,大家好,我在XBOX360平台";
#elif UNITY_IPHONE
platform="hi,大家好,我是IPHONE平台";
#elif UNITY_ANDROID
platform="hi,大家好,我是ANDROID平台";
#elif UNITY_STANDALONE_OSX
platform="hi,大家好,我是OSX平台";
#elif UNITY_STANDALONE_WIN
platform="hi,大家好,我是Windows平台";
#endif
Debug.Log("Current Platform:" + platform);
9.加載Resources
GameObject instance = Resources.Load("資源名字") as GameObject;
GameObject cube = Instantiate(instance) as GameObject;
cube.transform.position = this.transform.position;
10.Only one exe隻允許打開一個程式
int count=Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length ;
if (count> 1)
{// MessageBox.Show(count.ToString());調試使用
//殺掉目前
Process.GetCurrentProcess().Kill();}
11.物體de 旋轉 and 位移
旋轉:
(瞬間)transform.localRotation = Quaternion.Euler(new Vector3(x,y,z));
(緩慢)transform.rotation = Quaternion.Slerp( a , b , t );
位移
(速度相關) transform.position=Vector3.MoveTowards(transform.position,tempUpdatePos,Time.deltaTimeDisShakeThreshold);
(固定時間)this.transform.Translate(Vector3.normalize(目标位置-自身位置) (Vector3.Distance(自身位置, 目标位置)/(所用時間 * Time.deltime)));
2d 向某方向移動
moveDirection = mTarget.transform.position - mSelf.transform.position;
moveDirection.Normalize();
float target = Mathf.Atan2(moveDirection.y, moveDirection.x) Mathf.Rad2Deg - 90f;
mSelf.transform.rotation = Quaternion.Slerp(mSelf.transform.rotation, Quaternion.Euler(0, 0, target), turnSpeed Time.deltaTime);
_controller.SetForce(speedX,speedY));
6.改變滑鼠位置和隐藏滑鼠
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
public static extern int SetCursorPos(int x, int y);
Void XX(){ SetCursorPos(0, 0); }
void Start () {
//隐藏
Cursor.visible = false;
17.控制全局音量
通過 AudioListener.volume = *;來控制場景場景音量
18.UGUI
對于Text 使用材質和Outline可以制作出藝術字型
Mask可以遮掩 對于制作一些動畫比較好
19.滑鼠點選設定UI位置(不同分辨率設定有不同 此處執行個體為1920*1080 可在調試模式下使用)
GetComponent<Animator>().SetTrigger("Clip");
// 擷取目标對象目前的世界坐标系位置,并将其轉換為螢幕坐标系的點
Vector3 Pos = Camera.main.WorldToScreenPoint(transform.position);
// 設定滑鼠的螢幕坐标向量,用上面獲得的Pos的z軸資料作為滑鼠的z軸資料,使滑鼠坐标與目标對象坐标處于同一層面上
Vector3 mousePos = new Vector3(Input.mousePosition.x(1920.0f/(float)Screen.width) - 1920/2, Input.mousePosition.y(1080f/(float)Screen.height) - 1080/2,Pos.z);//先乘一個GameView折扣(GameView要設定為1920*1080) 然後減去中心點的內插補點
Debug.Log(mousePos.ToString());
transform.position = mousePos;
20.使用AssetsBundle壓縮檔案有奇效
首先制作一個空項目,加入AB代碼後,導出有28M
然後我是使用了一組72幀的動畫,這組動畫大約有4M
衆所周知,unity對2D Sprite格式處理會使圖檔很大,由原本的圖檔大小67k變到了Unity裡的1m一張
然後我把動畫加到了UGUI裡 然後導出,震驚的94M總共
最後使用AB壓縮,觀察壓縮的檔案,最大的image裡就2M
比原圖還要小
導出結果當然也小
AB真是太好用了 建議獨立物件都用AB
21.重置動畫(播放動畫第一幀)
firstAnimName = GetComponent<Animator>().GetCurrentAnimatorClipInfo(0)[0].clip.name;
GetComponent<Animator>().Play (firstAnimName,-1,0);
22.Mono中文亂碼
【Tools】-->【Option】, 然後選擇【Fonts】,輕按兩下【Text Editor】,選擇【Monospace】字型 Normal 10
23.uLua使用方法
注意AppConst裡的LuaBundleModel變量,如果想使用AssetBundle模式,該值置為true,但是每次修改lua代碼,需要執行菜單欄上的LuaFramework->Build XXX Resource,将lua資源打包,否則,你修改的lua邏輯不會更新并執行。
如果LuaBundleModel置為false,則lua代碼會時時更新。
此外,修改C#代碼,一定不要忘了執行菜單Lua->Clear wrap files,然後重新生成Gen Wrap + Binder
确定邏輯無誤後,注冊C#類,打開"CustomSettings.cs",注冊我們的類。"_GT(typeof(XXXXXX)),"。最後,執行上面第2步的Lua->Clear wrap files,Gen Wrap + Binder。此時,會生成一個叫MyHelloWorldWrap.cs的檔案,在Assets\LuaFramework\ToLua\Source\Generate目錄下,其實所有在CustomSettings中注冊的C#類都會生成Wrap檔案,儲存在該目錄下。
24.使用VS作為C#編輯器
vs可以斷點調試和為Unity提供的便捷簡直不要太好
下載下傳VS Tool for unity即可斷點調試 (選擇相應VS版本) 位址:https://marketplace.visualstudio.com/items?itemName=SebastienLebreton.VisualStudio2015ToolsforUnity
但是vs的快捷鍵蛋疼得很,--修改快捷鍵ctrl+w關閉目前視窗的方法:http://www.cnblogs.com/ayanmw/p/3161286.html
編譯器相關 如果使用Vs的 #region 和 #endregion 用于代碼的隐藏縮放,對于項目代碼管理,相當好用。Mono也有縮放模式,有點礙眼..
Process.Start()
一個C#的API 可以用于打開一個網頁..應用..或者程序..或者控制台内的功能..例如列印..
public void PrintFile(){
System.Diagnostics.Process process = new System.Diagnostics.Process(); //系統程序
process.StartInfo.CreateNoWindow = false; //不顯示調用程式視窗
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//
process.StartInfo.UseShellExecute = true; //采用作業系統自動識别模式
process.StartInfo.FileName=path; //要列印的檔案路徑
process.StartInfo.Verb="print"; //指定執行的動作,列印:print打開:open…………
process.Start(); //開始列印}
5.Unity加載圖檔動畫(動畫比較多的情況)
(1.UnityAnimation播放,直接全選png序列幀圖(卡超級久) 然後拖到面闆上(卡很久),會自動生成序列播放的animator。但我發現超過300圖之後有可能會出現不明報錯(大概因為輸出問題),1k張感覺就沒什麼希望了,最重要的是在unity裡1080p的圖轉成sprite,都會變成10m一張,導緻項目釋出之後更是奇大無比。
(2.播放mov,可以嘗試播帶透明通道的mov,但需要一個shader,具體我不會寫,在網上找到的也不太好用,各種問題(摳色會失真和有噪點,提取透明or黑白遮罩會出現不同步)。
(3.Load的方法,unity有3種。(需要在start前預先加載完,不要一邊播一邊加載會卡的。)
① LoadPrefab,不考慮。
②LoadResources,先load資源檔案夾内的,然後播放。目前測試超過700張Unity會迷之不加載,估計是load的東西太大。
③LoadAssets。因為是一張張地load,不會出現太大而不加載的問題。目前使用這個辦法播放
④AB加載
25.遠端Mac雞可以使用vnc viewer連接配接 ,Cornerstone作為項目管理
26.求向量夾角
向量 = 目标位置 - 共同起點位置
v3.angle(向量A,向量B)