盤點Unity中比較容易踩得坑(1)

作爲一名剛剛入門Unity C#的新手,在編程過程中也踩了不少坑(有些不算是坑),這裏面有不少會對遊戲運行產生少量或甚至大幅的影響,我在這裡列舉一下Unity C#中比較容易踩坑的地方以及建議。


1. 刪除不必要的空Update()方法

在我們新建腳本之後,Unity會提前爲我們創建好兩個空的內置方法:Start() 以及 Update()

新建腳本

但有些腳本並不需要這些方法,因此我們需要將它們刪除掉而不是留空,因爲無論這些內置方法是否爲空,Unity始終會通過C#的反射來調用這些方法,從而造成不必要的性能開銷。



2. Invoke() 內的方法名使用nameof代替string

在使用諸如Invoke(), InvokeRepeating()來調用方法時,盡可能使用nameof(圖2.1)來代替string(圖2.2)

圖2.1:推薦方法



圖2.2:不推薦方法


雖然不論使用哪種方法都不會出現性能上的差距,但未來一旦需要使用“Ctrl+R,Ctrl+R”快捷鍵來重命名“SampleMethod”方法時,Visual Studio會自動檢測並修改nameof(SampleMethod)(圖2.1)中的方法名,但不會自動重命名string中的常值"SampleMethod"(圖2.2),因此使用nameof增加了代碼的可維護性,降低了在未來因代碼維護而產生BUG的可能性。


3. 使用 gameObject.CompareTag() 代替 gameObject.Tag == "Tag"

在很多情況下(例如:碰撞體事件),我們需要對遊戲物體的Tag進行比較,常見的比較方法是
gameObject.tag == "Tag" 或 gameObject.CompareTag("Tag"),這裏比較推薦第二種也就是CompareTag("Tag")來比較物體的Tag。


下面列出了在分別使用兩種方式比較三次所花費的時間的測試結果

方法一:gameObject.tag == "Player"

方法二:gameObject.CompareTag("Player")


用於測試兩種方法的代碼

測試結果:


經過以上測試表明,方法二比方法一的執行消耗時間更少,原因是gameObject.Tag作爲GameObject中的屬性,對比時需要先執行 get; 再進行比較,而gameObject.CompareTag()是GameObject中的方法,直接在在方法中進行比較再返回Bool,因而方法二更快。



未完待續。


留言