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