分享:游戏新手引导程序框架设计3要点
新手引導(dǎo)確實(shí)是個(gè)麻煩事,邏輯雜亂,而且跟界面的邏輯常常交叉在一塊,弄的不好的話代碼里到處都是if else,保存各種臨時(shí)狀態(tài)變量。但這里面其實(shí)也是有規(guī)律可循的,不說(shuō)完美解決了所有問(wèn)題,但至少可以提供一個(gè)框架,一種問(wèn)題解決的思路。這里面有3個(gè)關(guān)注點(diǎn):
1.引導(dǎo)的觸發(fā)點(diǎn)
2.引導(dǎo)的進(jìn)度
3.引導(dǎo)的表現(xiàn)內(nèi)容
傳統(tǒng)的方案實(shí)際上也是在解決這3個(gè)問(wèn)題,只不過(guò)用的是生硬粗暴的硬插的方式去編寫代碼,代價(jià)是容易出現(xiàn)bug,不好維護(hù),而且?guī)缀醪豢蓮?fù)用。
就像把狀態(tài)機(jī)轉(zhuǎn)化為行為樹(shù)一樣,思想上需求去抽象各個(gè)點(diǎn),然后讓它們有機(jī)組合起來(lái),形成一個(gè)模塊,加入說(shuō)是新手引導(dǎo)模塊。
假設(shè)這個(gè)模塊叫做Guide,下面分別闡述以上3個(gè)問(wèn)題的解決方式。
1.新手引導(dǎo)的觸發(fā)點(diǎn),一般新手引導(dǎo)是在界面切換后發(fā)生的,那比如這個(gè)界面有個(gè)OnEnter,那一般界面都會(huì)有一個(gè)基類,所以我們可以在這個(gè)基類的OnEnter里注入一句Guide::Instance().Trigger(...界面名稱等參數(shù)),當(dāng)然我們也可以在其他界面統(tǒng)一調(diào)度的地方去調(diào)用這個(gè)Trigger。有時(shí)候也可能需要在游戲幀里去調(diào)用Guide::Instance().Update(dt)。這一點(diǎn)上,不一樣的地方在于以前是硬在各個(gè)界面里寫觸發(fā),現(xiàn)在是在統(tǒng)一的地方寫,數(shù)量上明顯少了。
有觸發(fā)入口了,然后到底是否要觸發(fā)引導(dǎo)?這個(gè)時(shí)候就需要Guide里維護(hù)一個(gè)Trigger列表,簡(jiǎn)單比如說(shuō)是List<ITrigger*>,每一個(gè)ITrigger上有一個(gè)斷言方法bool CheckCondition(...參數(shù)自己定),這樣簡(jiǎn)單來(lái)說(shuō),你只要遍歷這個(gè)Trigger列表的CheckCondition方法,就可以實(shí)現(xiàn)條件觸發(fā)了。而里面的CheckCondition的實(shí)現(xiàn),簡(jiǎn)單的可以直接查詢Player的屬性來(lái)定(比如說(shuō)到10級(jí)才觸發(fā)),或者當(dāng)前判斷當(dāng)前是在什么界面,復(fù)雜的甚至可以用IPredicate,AddPredicate,OrPredicate,NotPredicate來(lái)實(shí)現(xiàn)一棵條件判斷樹(shù),也可以觸發(fā)腳本。游戲在啟動(dòng)的時(shí)候會(huì)通過(guò)配置或腳本加載這么一個(gè)trigger列表,已經(jīng)觸發(fā)的Trigger可以從列表中刪掉。
ITrigger想要實(shí)現(xiàn)的話可以支持嵌套,變成一棵跟行為樹(shù)一樣的結(jié)構(gòu)。
2. 引導(dǎo)的進(jìn)度,有些引導(dǎo)進(jìn)度是根據(jù)玩家屬性相關(guān)的,比如手游賬號(hào)買賣平臺(tái)玩家等級(jí),這個(gè)不需要專門保存。而有些引導(dǎo)步驟進(jìn)度通常需要保存,這些可以在服務(wù)器數(shù)據(jù)庫(kù)(網(wǎng)游)或客戶端存檔(單機(jī)的話)保存一個(gè)引導(dǎo)表,每一行有引導(dǎo)Id(對(duì)應(yīng)Trigger),進(jìn)度Index,再附加內(nèi)容。已經(jīng)完成的引導(dǎo)可以從玩家上標(biāo)記。如果只支持引導(dǎo)按序觸發(fā)的話,那玩家身上可以保存一個(gè)當(dāng)前引導(dǎo)Id,可以加快不少效率。如果支持非線性觸發(fā),那就從引導(dǎo)記錄上做標(biāo)記也可。
3.引導(dǎo)的表現(xiàn)內(nèi)容,一般引導(dǎo)的內(nèi)容就是切換界面,禁止一些按鈕等等,這個(gè)在ITrigger的Run里來(lái)實(shí)現(xiàn),可以由你發(fā)揮了,看是直接在里面寫UI或者觸發(fā)腳本什么的。
這樣下來(lái),就把引導(dǎo)的邏輯和界面邏輯隔離開(kāi)了,不過(guò)實(shí)際上因?yàn)橐龑?dǎo)是強(qiáng)關(guān)聯(lián)到界面的行為的,所以在實(shí)現(xiàn)引導(dǎo)的時(shí)候,也經(jīng)常需要獲取當(dāng)前界面的某個(gè)按鈕等等操作,不過(guò)至少清晰可維護(hù)。
總結(jié)
以上是生活随笔為你收集整理的分享:游戏新手引导程序框架设计3要点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 游戏性能优化技术干货分享——内存管理
- 下一篇: 游戏编程设计模式-state