原文?http://www.cocoachina.com/game/20151204/14574.html
? ? ? ?以下總結(jié)一部分來自經(jīng)驗(yàn)之談,一部分來自其他人的分享??偟膩碇v,Unity開發(fā)原型和效果、驗(yàn)證想法,確實(shí)是無比便利??赡芤粋€月就把核心玩法做得差不多。強(qiáng)大的編輯器功能讓我們也有很大的可擴(kuò)展空間來協(xié)助我們開發(fā)工具??墒蔷庉嬈魇前央p刃劍。如果提前看清楚有什么坑在前面,或者其他人踩過什么坑。我想這會對項(xiàng)目風(fēng)險的把控會有很大幫助。
避開unity的坑
1.制作抽象的prefab來做關(guān)卡編輯
盡可能制作抽象的prefab來做關(guān)卡編輯,該prefab應(yīng)該足夠抽象簡單(只有一個GameObject,然后通過Gizmo來繪制是個不錯的手段),否則以后變化的時候(常見的就是改美術(shù)資源),所有關(guān)卡都lost prefab,那么對策劃來說是一場災(zāi)難。可以考慮通過數(shù)據(jù)表+編輯器的方式來提供策劃操作同時也不再需要擔(dān)心lost prefab的問題。prefab越簡單抽象越不容易丟失,prefab之間嵌套的正確方式是通過鏈接而不是掛在節(jié)點(diǎn)下面。
2.盡可能避免修改Scene,方法有幾種:
使用xml之類的數(shù)據(jù)組織場景
盡量多讓scene由prefab組成,這樣變動都在prefab上
使用工具做場景Merge
3.不要過度依賴Component特性來開發(fā),考慮數(shù)據(jù)驅(qū)動。
4.邏輯容易散落在編輯器各處,可以做一個中心管理。
利用Unity的特性
組織好hierarchy,不管是編輯的時候還是運(yùn)行的時候,編輯的時候可以通過工具來簡化組織層級的工作。
讓每個場景自己能跑。
利用基于組件的架構(gòu),盡可能少的使用繼承(用C#的話),多通過組合來完成開發(fā)。遇到需要數(shù)據(jù)訪問的通用接口,我們可以通過組合的方式來完成,而不是提供一個公共基類接口來繼承,只要大家都認(rèn)識這個公共組件就可以取到數(shù)據(jù)了。遇到通用的事件派發(fā),我們可以用字符串拼接的方式派發(fā)到指定的對象或者更參數(shù)組合派發(fā)事件到對象身上。
框架采用星型架構(gòu)+事件機(jī)制,由于Unity3D沒有一個所謂的入口函數(shù),不利于代碼跟蹤,這樣的基礎(chǔ)架構(gòu)能帶來很多便利。
unity界面擴(kuò)展能力很強(qiáng),而且借助CLR(commom language runtime)的反射能力,C#里面開發(fā)界面非常容易。
做好tag、layer規(guī)劃,要考慮業(yè)務(wù)中哪類物體之間需要交互。
在代碼里面get某個prefab或者GameObject,可以考慮利用界面拖目標(biāo)過來,這樣更加直觀,而且也能對抗變化,比如目標(biāo)名字變了也不怕,而且還能節(jié)省代碼量。
代碼
這里針對C#,靜態(tài)強(qiáng)類型面向?qū)ο蟊旧砭褪且粋€坑,繼承帶著兩個職責(zé),一個是復(fù)用代碼,一個是接口繼承。雖然性能比lua高那么一丟丟,因?yàn)樾阅芷款i不在業(yè)務(wù)本身,設(shè)計上的問題要嚴(yán)重得多。我認(rèn)為像lua這種動態(tài)語言的元編程才能夠貫徹單點(diǎn)真理,通過元編程把真理推導(dǎo)到系統(tǒng)的每一處。讓代碼始終保持語義,而我認(rèn)為寫業(yè)務(wù)代碼最重要的是保持語義。保持語義的簡單有效評判方法就是看這個類中的某個函數(shù),單獨(dú)看它能否看懂;多個接口能否組成完備的解決方案。靜態(tài)強(qiáng)類型面向?qū)ο笳Z言比較適合需求穩(wěn)定的嚴(yán)謹(jǐn)?shù)南到y(tǒng)開發(fā),而不是游戲開發(fā)。容易經(jīng)過多次的策劃需求沖刷,語義很容易扭曲,各種抽象泄露、各種hack。好吧,跑題了。
Unity3D容易被破解,因?yàn)榘l(fā)布版本的IL是非常容易被反編譯的,要做好混淆的考慮。在Unity3D中混淆要考慮對編輯器的影響。
復(fù)雜類型盡量使用引用類型,值類型反射麻煩,不方便序列化以及做成編輯器。值類型要小心賦值對象是否只是臨時對象。
引用類型釋放之后,引用它的指針會置為null,可以放心使用。
foreach、linq、協(xié)程慎用,反射只在編輯器中使用。
考慮封裝Time,方便做暫停。
考慮使用調(diào)度器來完成功能,而不是在Update自己維護(hù)狀態(tài),這樣做暫停也很容易,代碼更清晰,功能更內(nèi)聚。
增量更新要一開始就想清楚。
美術(shù)
Unity3D可以通過擴(kuò)展編輯器讓非技術(shù)人員編輯界面來工作,組織好美術(shù)資源規(guī)格、路徑,并且自動生成prefab。游戲場景物件也要規(guī)劃好邏輯節(jié)點(diǎn),這個也應(yīng)該通過編輯器擴(kuò)展好。復(fù)雜功能也應(yīng)該通過編輯器開發(fā)給策劃微調(diào),特別是可視化比較重要的模塊,比如動作調(diào)整。
制作原型美術(shù),讓開發(fā)提升開發(fā)效率。
有統(tǒng)一的約定,比如模型總是中心對齊,角色總是腳部對齊,統(tǒng)一的縮放、統(tǒng)一的動畫骨骼命名,資源有統(tǒng)一的路徑。
支持換裝(avatar)要一開始就想清楚。
資源加載和優(yōu)化盡可能早地給出雛形(只是雛形,幫助你對需求的把握,因?yàn)檫@時候你還不知道熱點(diǎn)在哪),因?yàn)橐坏]有規(guī)劃好異步和資源釋放,那么阻塞卡頓和內(nèi)存飆升那是意料之內(nèi)的。因?yàn)橛须r形,那么代碼會間接一點(diǎn),也為改變提供了空間。