前言
在游戲開發接近尾聲的時候,大部分的游戲都會接入新手引導功能,提升玩家的游戲體驗,不至于讓玩家進入游戲有冷場或者不知所措的感覺,
對于新手引導的做法估計一百個人有一百種方式,接下來我將分享一下自己的使用方式,并伴隨一些問題的討論,
教學引導
1. 使用簡單的遮罩聚焦,
這種方式可以轉移玩家的注意力,畢竟進入游戲的時候內容有很多,但是人的接受能力有限,
可以根據配置表設定決定是否有遮罩

2. 將引導放到最上層,屏蔽觸摸事件
這種方式比較省事,也避免了玩家亂點導致的引導錯誤,但是我們可以通過配置表的方式,決定這一步是否為強制引導,如果不是那么可以不屏蔽事件,

3. 手指位置如何獲得
通過配置好的界面節點名稱,控制元件名稱直接獲得節點,

這里邊使用的陣列的形式配置,是預留的為了實作拖拽教學,讓手指從一個位置滑動到另一個位置,
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;
}
}
}
然后將節點的坐標經過轉換賦值給手指

3. 如何觸發函式,
在資料表中配置好節點,組件,和函式名

當用戶點擊手指時,通過代碼直接呼叫
trigger() {
if (this.widget) {
let comp = this.widget.getComponent(this.compName)
if (comp) {
comp[this.funcName]();
}else{
cc.warn(' comp is null ',this.compName)
}
}
}
完整教學資料表

事件管理器
游戲中可能觸發各種各樣的事件,教學只是其中之一,還有可能彈出提示,設定節點隱藏,指定某個角色走向某個點,等等,
事件管理器根據特定的情況和判定條件決定是否開啟,

可能的型別有

對比型別:

通過觸發時傳遞進來的數值與資料表中的需求值進行對比,判斷第一階段是否成立,如果成立在判斷附加條件是否成立,如果成立,那么事件啟動,執行事件表中的每一步,這里之所以添加兩段判斷是為了效率考慮,當觸發一個型別的事件時只檢查此型別對應的事件,

4. 事件處理
在資料表中配置好每一步要做的事情以及引數

第一列為事件執行序號,唯一標識,
第二列為事件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 是因為有些操作不是管理器能觸及的,比如對游戲中的角色的操作,應該是仿真器的事情,所以仿真器監聽事件,然后根據不同 的操作呼叫不同的函式,實作不同的邏輯,
5. 何時檢查事件
事件的檢查時機是根據定義的觸發型別而定的,當你的條件成立時,需要主動呼叫事件管理器的checkEvent函式,傳入對應的觸發條件型別,和特定的值即可,下面舉幾個例子,
-
進入界面后在start函式中主動檢查

-
在界面已經打開時通過事件接收事件管理器觸發的通知,

-
當UI關閉時,比如剛進入大廳時可能會彈出離線獎勵,簽到等界面,當這些界面都關閉時觸發,

總結
以上就是我在游戲開發中使用的事件管理系統,理論上可以實作你想要的任何操作,
代碼已經提交到框架專案中,感興趣的可以自己研究研究,?
歡迎掃碼關注公眾號《微笑游戲》,瀏覽更多內容,

更多內容
跨引擎游戲開發框架
小游戲SDK整合框架
使用四叉樹優化碰撞檢
游戲開發中UI管理器的使用
小游戲開發中如何優雅的使用本地存檔
sdk接入整合,用一個變數切換不同渠道
CocosCreator之AssetBundle使用方案分享
CocosCreator之填色游戲的一種實作方案
一個可屏蔽長短鏈接的網路模塊
游戲開發中的人工智能
歡迎掃碼關注公眾號《微笑游戲》,瀏覽更多內容,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/665.html
標籤:其他
下一篇:一個可屏蔽長短鏈接的網路模塊
