在遊戲開發接近尾聲的時候,大部分的遊戲都會接入新手引導功能,提高玩家的遊戲體驗,不至於讓玩家進入遊戲有冷場或者不知所措的感受。
對於新手引導的作法估計一百我的有一百種方式,接下來我將分享一下本身的使用方式,並伴隨一些問題的討論。node
這種方式能夠轉移玩家的注意力,畢竟進入遊戲的時候內容有不少,可是人的接受能力有限。
能夠根據配置表設置決定是否有遮罩
數組
這種方式比較省事,也避免了玩家亂點致使的引導錯誤。可是咱們能夠經過配置表的方式,決定這一步是否爲強制引導,若是不是那麼能夠不屏蔽事件。
服務器
經過配置好的界面節點名稱,控件名稱直接得到節點。
這裏邊使用的數組的形式配置,是預留的爲了實現拖拽教學。讓手指從一個位置滑動到另外一個位置。微信
setWidget() { if (this.widget) { return; } let parent = EngineHelper.findChild(this.className, UIManager.instance().getRoot()) if (parent) { if (this.widgetName) { if (this.widgetName == 'this') { this.widget = parent; } else { this.widget = EngineHelper.findChild(this.widgetName, parent) } if (this.index >= 0) { this.widget = this.widget.children[this.index] if (this.index2 >= 0) { this.widget = this.widget.children[this.index2] } } } else { this.widget = parent; } } }
而後將節點的座標通過轉換賦值給手指
網絡
在數據表中配置好節點,組件,和函數名
當用戶點擊手指時,經過代碼直接調用框架
trigger() { if (this.widget) { let comp = this.widget.getComponent(this.compName) if (comp) { comp[this.funcName](); }else{ cc.warn(' comp is null ',this.compName) } } }
完整教學數據表
ide
遊戲中可能觸發各類各樣的事件,教學只是其中之一,還有可能彈出提示,設置節點隱藏,指定某個角色走向某個點,等等。
事件管理器根據特定的狀況和斷定條件決定是否開啓。
可能的類型有
對比類型:
經過觸發時傳遞進來的數值與數據表中的需求值進行對比,判斷第一階段是否成立。若是成立在判斷附加條件是否成立,若是成立,那麼事件啓動。執行事件表中的每一步。這裏之因此添加兩段判斷是爲了效率考慮,當觸發一個類型的事件時只檢查此類型對應的事件。
函數
在數據表中配置好每一步要作的事情以及參數
第一列爲事件執行序號,惟一標識。
第二列爲事件ID,是一個索引列,若是你傳入1 會直接獲得一個含有[1,2,3]的數組
第三列爲是否存檔的設置,也就是在哪一步存檔,若是是網絡遊戲,就是哪一步告知服務器事件結束。
第四列 就是操做類型了,
經過代碼將全部的功能組織起來。因此說,教學只是事件管理系統的一個很小的部分。優化
update() { let item = this.event.getItemModel() // cc.log('update ================= step ', this.step, ' this.eventID ', this.eventID) switch (item.getOperateType()) { case OperateType.OPEN_DIALOG: break; case OperateType.OPEN_GUIDE: GuideManager.instance().start(item.getParam()) break; case OperateType.OPEN_TIP: TipController.instance().showTip(item.getParam(), () => { this.event.next() }) break; case OperateType.IN_VISIBLE: let list = item.getParam().split(':') let parent = UIManager.instance().getRoot() while (list.length > 0) { let name = list.shift(); let node = EngineHelper.findChild(name, parent) if (node) { parent = node; } else { break; } } cc.log(' list.length =========== ', list.length) if (parent && list.length == 0) { parent.active = false; this.event.next() } break; default: this.emit(GameEventName.EVENT_UPDATE, item) break; } }
根據本身定義的處理類型,在數據表中配置不一樣的參數,代碼中作不一樣的處理。之因此有defualt 是由於有些操做不是管理器能觸及的。好比對遊戲中的角色的操做,應該是仿真器的事情,因此仿真器監聽事件,而後根據不一樣 的操做調用不一樣的函數,實現不一樣的邏輯。ui
事件的檢查時機是根據定義的觸發類型而定的,當你的條件成立時,須要主動調用事件管理器的checkEvent函數,傳入對應的觸發條件類型,和特定的值便可。下面舉幾個例子。
進入界面後在start函數中主動檢查
在界面已經打開時經過事件接收事件管理器觸發的通知。
當UI關閉時。好比剛進入大廳時可能會彈出離線獎勵,簽到等界面,當這些界面都關閉時觸發。
以上就是我在遊戲開發中使用的事件管理系統,理論上能夠實現你想要的任何操做。
代碼已經提交到框架項目中。感興趣的能夠本身研究研究。
CocosCreator之AssetBundle使用方案分享
歡迎掃碼關注公衆號《微笑遊戲》,瀏覽更多內容。