Unity3D新手引導開發手記

最近開始接手新手引導的開發,記錄下這塊相關的心得

首先客戶端是Unity,在接手前,前面的同學已經初步完成了新手引導框架的搭建,這套框架比較簡單,有優點也有缺點,稍後一一點評

clipboard

我們的新手引導是由一個個強引導組成的,每個強引導都有一系列的步驟,這套框架實現的功能就是:

1.組織一個強引導(任務)所需的步驟,並可以一步一步前進

2.實現蒙版,遮罩以及高亮引導區

第一個功能比較簡單,首先需要有一個新手引導管理器來管理每一個步驟,然後啓動第一個步驟,只需要在每一次點擊的事件處理中,通知新手引導管理器,結束當前步驟,啓動下一個步驟

第二個功能相對麻煩一點,首先每一個步驟可能都會有一個高亮區域,我們需要在不改動原有代碼的基礎上,實現這個高亮,首先我們增加一個Guide攝像機,這個攝像機的優先級是最高的,他只照射Guide這個層的東西,而這個層的最底部,有一個黑色的蒙版,在步驟開始執行時,我們只需要將要高亮的對象,設置爲該層的對象,即可高亮顯示,並且蒙版添加一個BoxCollider,來防止玩家點擊到蒙版以下的按鈕。在該新手引導步驟結束的時候,再將引導區設置回原來的層。

clipboard[1]

//找到該物件並設置其層
    private void SetObjectLayer(int layer, bool isStart)
    {
        if (highLightObj != null)
        {
            if (isStart)
            {
                highLightObjLayer = highLightObj.layer;
            }

            CommonTools.SetLayer(highLightObj, layer);
        }
    }

每一個強引導都是一個Prefab,裏面記錄了每一步的引導區域,在運行狀態下,找到引導區域,拖給Prefab的腳本,然後腳本找到該區域的完整路徑,拖完每一步的引導區域後,隨即保存這個Prefab,這樣我們就可以根據路徑來找到要高亮的引導區了

clipboard[2]

上面的引導區拖拽是非常適合策劃人員來設計新手引導的,而動態改變引導區所在的層,來實現高亮和屏蔽其他按鈕,也是比較巧妙的,但是這裏關於步驟完成相關的邏輯,耦合性是非常大的,我們來看一下這裏是如何實現下一步的

前人留下的Demo中,是在每一個步驟對應高亮區域的按鈕點擊回調中,添加一行代碼,來通知新手引導管理器步驟完成,也就是說,在實現過程中,每一個需要點擊引導區的步驟,都需要添加這麼一行代碼,工作量大,而且可維護性太差

另外,當發生界面跳轉的時候,也需要特殊處理,因爲需要等新的界面加載完成,並顯示才能執行下一個步驟,所以Demo在界面完全顯示的時候,來通知新手引導管理器,而每個界面加載完成的標準又不統一,有些需要等某個特效播放完畢,纔會顯示,如果對相應的邏輯不是很熟悉,這塊地方非常容易出BUG

 

【改進】

在這裏特別針對上面兩個問題做出如下改進,使其無需在原先的代碼添加額外的代碼來通知步驟完成

但凡有高亮引導區的,都是可以點擊的,那麼一定有BoxCollider,在我獲取這個對象進行設置層級的時候,順便找到這塊引導區域的BoxCollider,一般只會有一個,因爲引導的每一步都是明確的,找到這個BoxCollider之後,爲他的點擊委託添加一個委託,就是完成步驟的委託,然後在步驟結束的時候,去除這個委託,這樣就無需在每一個點擊事件處,強制添加完成下一步的代碼,而是在點擊事件中,順帶執行我們的委託(原事件處理委託+新手引導步驟結束委託),這樣既不需要添加額外的代碼,破壞封裝,整體的流程也非常清晰

對於第二個問題,關鍵是因爲在界面未顯示完全的時候,我們無法獲得相應的高亮區域,這裏使用逆向思維,我不等你加載完之後通知我,我主動去掃描你,當我們開始步驟的時候,如果有引導區域先掃描引導區域,啓用一個協同,每0.2秒主動查找該引導區域,當界面完全顯示出來的時候,一定可以獲得引導區域,也不需要在對應的界面加載完成,顯示之後寫額外的代碼來通知新手引導模塊這邊了

通過上面兩個改進,完全解決了新手引導和原有代碼邏輯的耦合,將新手引導相關的功能全部內聚在新手引導模塊中實現了

 

【其他改進】

一個是使用消息機制來替代單例,原有的新手引導管理器是一個單例,但當你完成新手引導之後,就不再需要它了,所以使用消息機制來推動新手引導管理器,當新手引導完成之後,消息照常發出,只是處理者不見了

根據服務器下發的消息動態創建,只有當我需要完成新手引導時,才創建新手引導管理器,並初始化新手引導

文字提示和點擊屏幕繼續,有N種文字提示樣式,我們將其實現爲一個Prefab,並根據配表顯示具體的樣式,內容,以及點擊屏幕後的處理

 

【和服務器聯調】

在新手引導這塊,服務器只做簡單的判斷,只要不是明顯的錯誤,我們選擇信任前端,並做好數據的存儲以及下發工作

在遊戲的前端,我們需要做好異常處理,以及強制引導流程,當強引導一開始,就要強制執行到結束

我們遊戲的引導是這樣的,例如去商城購買物品這樣的一個引導,都是正常一步一步走的,當走到購買完成的步驟,即通知服務器,完成了這個引導,那麼會碰到三種異常,當我們走到一半的時候斷掉,當我們購買完成,未來得及通知服務器時斷線,當我們通知了服務器之後斷線,有不一樣的處理

第一種,未購買掉線,則重連後讓玩家強制重新開始該引導

第二種,購買後未通知掉線,則強制執行該引導,但開始執行時,做異常檢測,例如檢測是否存在任務物品,如果是則直接完成任務

第三種,購買通知後掉線,則直接讓玩家完成該新手引導


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章