游戲開發中的新手引導與事件管理系統


前言

在游戲開發接近尾聲的時候,大部分的游戲都會接入新手引導功能,提升玩家的游戲體驗,不至於讓玩家進入游戲有冷場或者不知所措的感覺。
對於新手引導的做法估計一百個人有一百種方式,接下來我將分享一下自己的使用方式,並伴隨一些問題的討論。

教學引導

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函數,傳入對應的觸發條件類型,和特定的值即可。下面舉幾個例子。

  1. 進入界面后在start函數中主動檢查
    在這里插入圖片描述

  2. 在界面已經打開時通過事件接收事件管理器觸發的通知。
    在這里插入圖片描述

  3. 當UI關閉時。比如剛進入大廳時可能會彈出離線獎勵,簽到等界面,當這些界面都關閉時觸發。
    在這里插入圖片描述

總結

以上就是我在游戲開發中使用的事件管理系統,理論上可以實現你想要的任何操作。
代碼已經提交到框架項目中。感興趣的可以自己研究研究。​

歡迎掃碼關注公眾號《微笑游戲》,瀏覽更多內容。

image

微信圖片_20190904220029.jpg

更多內容

跨引擎游戲開發框架

小游戲SDK整合框架

使用四叉樹優化碰撞檢

游戲開發中UI管理器的使用

小游戲開發中如何優雅的使用本地存檔

sdk接入整合,用一個變量切換不同渠道

CocosCreator之AssetBundle使用方案分享

CocosCreator之填色游戲的一種實現方案

一個可屏蔽長短鏈接的網絡模塊

游戲開發中的人工智能

歡迎掃碼關注公眾號《微笑游戲》,瀏覽更多內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM