Unity3D一些注意知識點總結
難查錯誤
C#引用傳遞和值傳遞並不明確,要仔細辨別
C#中集合類只傳引用,一旦在函式內部修改了,全域性都會改變
常用指令碼命令
Application.LoadLevel
Application.Quit
Application.targetFrameRate 使程式保持在一個固定幀率執行
Input.mousePosition
transform.translate
Matrix4x4.identity 單位矩陣
Quaternion.identity 單位四元數
gameObject.name
gameObject.FindChild
gameObeject.Getcomponent<型別>() 取得對應物件中的指定型別,可用於跨指令碼函式呼叫
gameObject.renderer.enable控制物體可見與否
gameObject.SetActive控制物件以及下面所有子物件是否啟用
NowGameObject=(GameObject)Instantiate(YourObject)複製相應物件
Destroy從記憶體中銷燬除引用物件本身的克隆,銷燬後腳本中未執行的程式段會繼續執行,但是協程會立刻終止,所以Destroy前要把Destroy的物體SetActive為false
Resource.Load
Resource.UnloadusedAssets(將引用全部賦值為null後)從記憶體中銷燬不用的引用資源
camera.ScreenToWorldPoint 製作可以拖動等的NGUI元素用的座標轉換
collider.bounds.Contains(Vector3) 可以檢測一個點是否在collider內
一個可以在Inspector面板裡顯示的自定義類,Inspector面板不會顯示自定義struct,所以只能用類
[Serializable]
public class Point
{
public Color color;
public Vector3 offset;
}
1.不要把太多東西放在Update裡面,可以SendMessage或者用C#自帶的delegate以提高效率2.載入外部資源要用WWW,場景間的資料傳遞可以用PlayerPrefs.Set 和Get系列函式
選擇一個物體的父物件可以用transform.parent
3.滑鼠的0點從螢幕左下角開始
4.當一個物體有了collider之後就可以檢測滑鼠的動作
可以觸發OnMouseEnter,OnMouseOver,OnMouseExit
5.滑鼠在螢幕上的座標相對於攝像頭的射線
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
6.射線與路徑上的collider的碰撞檢測
返回第一個用Physics.Raycast
返回多個用
RaycastHit[] hits;
hits = Physics.RaycastAll(transform.position, transform.forward, 100.0F);
射線碰到的物體數量為hits.length
7.物體加剛體的時候要使用重力才會不到處亂飄,但使用重力前為防止出現意外,要注意物體初始高度要貼在地面上
剛體的碰撞運動可以限制旋轉和位移
速度快的碰撞修改collision detect模式可以改善穿過bug
8.物體加了剛體(rigidbody)和collider之後才會與別的具有collider的物體發生碰撞
可以觸發OnCollisionExit,OnCollisionStay,OnCollisionEnter
9.collider的isTrigger打勾之後物體將不會被碰撞而可以穿過
可以觸發OnTriggerEnter,OnTriggerStay,OnTriggerExit
剛體撞牆抖動是因為直接修改了transform,如果不修改而用rigidbody.velocity的話就不會撞牆抖動了
10.多執行緒用
using System.Threading;
帶引數開執行緒
ThreadStart starter=delegate {帶參函式}
new Thread(starter).Start();
11.大資料傳值用引用,小資料可以傳值
12.改不了的子資料可以賦值整個給一個臨時變數,然後修改後再賦值回去
13.C# GUI.Button(new Rect(),此處可以是文字或者一張圖片);
14.一個可輸入的GUI輸入框str=GUI.TextField(new Rect(),str)
15.跨指令碼呼叫可用static靜態變數
17.舊的動畫系統用animation.crossfade有過渡,直接播放用animation.play
18.新的動畫系統mecanim要設定正確的avatar和動畫控制器和狀態機
指令碼中修改狀態機中的控制引數用
Animator animator;
animator.Getbool Setbool Getfloat Setfloat等等
用指令碼控制物體的transform時最好吧Animator控制元件中的Apply Root Motion關了
關了後要注意RigidBody控制元件裡面Drag設定為Infinity,不然遇到碰撞會亂飄
19.靜止的物體產生陰影可以用lightmap,記住要改lightmap static
人物底下實時陰影效能行的話開燈光陰影,不行的話假影子一團黑
unity3d的lightmap烘培後直接就是所有燈光的效果
由於沒有燈光,人物要表現的受到燈光效果可以用light probe,小球球很難弄,但是相對來說效能好一點吧,大概
20.專業版有效能分析器 profiler,還有occlusion culling和靜態Batching,對優化有一定的作用
21.Navmesh Agent裡面的BaseOffset注意設定一下,不然尋路時可能會出現高度問題
Navmesh和Character Controller有些衝突,最好是一個開啟另一個就關閉
22.Unity Remote有安卓版和iOS版,可以直接在手機上除錯
但是要先在手機上開APP,電腦裡再開Unity3D才能保證連線
23.動態Batching部分平臺需要自行在player setting裡面打勾
24.unity3d現在自帶iOS的GameCenter功能和iAd功能,在Social和AdBannerView裡面
25.本地儲存檔案最好用Application.persistentDataPath+'"//"+name的地址,以防在iOS裝置上弄出錯誤
26.有個Animation視窗,可以修改匯入的Animation的,而且可以支援正負180度範圍之外的旋轉,並且可以x,y,z三軸採用完全不同的動畫曲線
27.新動畫系統的transition的動畫混合部分不設定ExitTime的話混合會從任意位置開始,如果要從指定位置開始,記得設定
28.新動畫系統播放指定動畫Animator.Play("state",0,0.0),第一個引數為狀態名稱,第二個為狀態層級,第三個為播放起始位置
29.判斷攻擊作用可以用RaycastHit[] RaycastAll(Vector3 origin, Vector3 direction, float distance = Mathf.Infinity, int layermask = DefaultRaycastLayers);要注意的就是第二個是direction而不是to,所以StartPos->EndPos應該是...(StartPos,EndPos-StartPos,...);
30.匯入maya的模型可能會很卡的原因是因為有個motionsystem,不能直接在mb檔案裡面刪,請匯出fbx後再匯入maya並刪除至僅剩deformationsystem和模型面片