標籤:
由於Unity是一個指令碼化開發的引擎,所以實現一個具體功能的代碼往往非常簡短。
我剛開始寫的時候總會碰到一個頭疼的問題,當遊戲變得越來越大,情境內的物體越來越多,各種繁雜的指令碼互相交錯,最後當需求變更或者發現BUG的時候,我發現有茫茫多的代碼需要檢查和修改。
關於怎麼樣來架構Unity3D中的指令碼,詳細的可以看一下雨松momo的這篇文章
http://www.xuanyusong.com/archives/1851
總結來講主要是三個點:
1、運用單例指令碼來控制一類工作
2、一個指令碼不要管和自己無關的內容
3、將UI和邏輯分開
至於這其中的協作方式,無論你通過SendMessage還是直接調用方法,抑或使用回調或者委託,都是可以的。
再來說下屬性的運用,假如在一個打飛機遊戲中有一個類Plane,我建議這樣設計(部分):
public class Plane{ public PlaneType type { get; private set; } public double HP { get; private set; } public void SetType(PlaneType type) { this.type = type; } public void Damaged(double damage) { HP -= damage; }}
大家都知道使用private set可以確保HP這個屬性只在類內部被修改,使用Damaged方法來扣血比較符合邏輯。
但我以前一直覺得,如果我謹慎對待變數HP,確保所有的修改都是我有意為之而不是意外,是不是就可以直接使用public變數在其他地方修改,這樣做還有沒有其他的好處?
有!假如現在我需要一個功能,要求統計在整個遊戲中造成的總傷害,那麼基於上面的類設計,我可以非常簡單的在Damaged方法中加入一個判斷,當類型為敵人的時候,把當次攻擊的數值加到統計值上即可。
但如果我用的是public變數,並且是在其他地方直接修改了HP值,即使我知道所有的修改都是我有意為之,但要實現這個功能我還是得查看所有HP被引用的地方,逐個修改,並且免不了擔心是否有遺漏。
所以我建議在Unity3D的指令碼中,盡量使用屬性來替代公開變數並且設為private set,使用方法來修改屬性值,即使這個類在當前看來非常簡單(比如一個Player類,只有一個變數Money時,往往會為了方便設計成全域靜態變數,但其實以後很容易出類似的問題)
Unity3D心得之遊戲架構設計和屬性的運用