1. 程式人生 > >Unity3D新手引導開發手記

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,並根據配表顯示具體的樣式,內容,以及點選屏幕後的處理

【和伺服器聯調】

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

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

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

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

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

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