1、在使用數組或ArrayList對象時應當注意
- length=myArray.Length;
- for(int i=0;i<length;i++)
- {
- }
避免
- for(int i=0;i<myArray.Length;i++)
- {
- }
2、如果沒有必要每幀都處理,則可以每隔幾幀處理一次
- void Update(){ if(Time.frameCount%6==0) { DoSomething(); }}
3、定時重複調用可以使用InvokeRepeating函數實現,比如,啓動0.5秒後每隔1秒執行一次 DoSomeThing 函數:
- void Start()
- {
- InvokeRepeating("DoSomeThing", 0.5f, 1.0f);
- }
4、少使用臨時變量,特別是在Update OnGUI等實時調用的函數中。
- void Update()
- {
- Vector3 pos;
- pos=transform.position;
- }
可以改爲:
- private Vector3 pos;
- void Update()
- {
- pos=transform.position;
- }
5、主動進行垃圾回收
- void Update()
- {
- if(Time.frameCount%50==0)
- {
- System.GC.Collection();
- }
- }
6、優化數學運算,儘量避免使用float,而使用int,特別是在手機遊戲中,儘量少用複雜的數學函數,比如sin,cos等函數。改除法/爲乘法,例如:使用x*0.5f而不是 x/2.0f 。
7、壓縮 Mesh
導入 3D 模型之後,在不影響顯示效果的前提下,最好打開 Mesh Compression。 Off, Low, Medium, High 這幾個選項,可酌情選取。對於單個Mesh最好使用一個材質。
8、 運行時儘量減少 Tris 和 Draw Calls
預覽的時候,可點開 Stats,查看圖形渲染的開銷情況。特別注意 Tris 和 Draw Calls 這兩個參數。 一般來說,要做到: Tris 保持在 7.5k 以下 ,Draw Calls 保持在 35 以下。
9、避免大量使用 Unity 自帶的 Sphere 等內建 Mesh
Unity 內建的 Mesh,多邊形的數量比較大,如果物體不要求特別圓滑,可導入其他的簡單3D模型代替。
10、如果可能,將GameObject上不必要的腳本disable掉。如果你有一個大的場景在你的遊戲中,並且敵方的位置在數千米意外,這是你可以disable你的敵方AI腳本直到它們接近攝像機爲止。一個好的途徑來開啓或關閉GameObject是使用SetActiveRecursively(false),並且球形或盒型碰撞器設爲trigger。
11、刪除空的Update方法。當通過Assets目錄創建新的腳本時,腳本里會包括一個Update方法,當你不使用時刪除它。
12、引用一個遊戲對象的最合乎邏輯的組件。有人可能會這樣寫someGameObject.transform,gameObject.rigidbody.transform.gameObject.rigidbody.transform,但是這樣做了一些不必要的工作,你可以在最開始的地方引用它,像這樣:
privateTransform myTrans;
void Start()
{
myTrans=transform;
}
13、協同是一個好方法。可以使用協同程序來代替不必每幀都執行的方法。(還有InvokeRepeating方法也是一個好的取代Update的方法)。
14、儘可能不要再Update或FixedUpdate中使用搜索方法(例如GameObject.Find()),你可以像前面那樣在Start方法裏獲得它。
15、不要使用SendMessage之類的方法,他比直接調用方法慢了100倍,你可以直接調用或通過C#的委託來實現。
16、使用javascript或Boo語言時,你最好確定變量的類型,不要使用動態類型,這樣會降低效率,你可以在腳本開頭使用#pragmastrict 來檢查,這樣當你編譯你的遊戲時就不會出現莫名其妙的錯誤了。