1. 程式人生 > >Unity3D一些注意知識點總結

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 originVector3 direction, float distance = Mathf.Infinity, int layermask = DefaultRaycastLayers);要注意的就是第二個是direction而不是to,所以StartPos->EndPos應該是...(StartPos,EndPos-StartPos,...);

30.匯入maya的模型可能會很卡的原因是因為有個motionsystem,不能直接在mb檔案裡面刪,請匯出fbx後再匯入maya並刪除至僅剩deformationsystem和模型面片