項目框架——場景管理器【GameSceneManager】

        其實Unity自身的SceneManager已經繼承了很多內容,爲什麼這裏面我們要重新寫一套場景管理器呢,其目的是爲了更方便的管理場景已經線性打開切換場景,怎麼樣做到線性,就是不使用腳本驅動,使用生成順序控制實例化的先後而達到Awake的運行先後。

        可能上面說的有點籠統,下面我們來詳細解釋一下。

        第一個考慮:自身的場景管理,能更好的輸出場景切換進度;

        第二個考慮:動態場景加載;

        第三個考慮:統一的切換規則以及開始規則管理。

        第一個不難理解了,尤其是在場景比較大的時候,這樣的做法能很清晰的知道我們場景加載到哪一個步驟了,然後直接了當的在進度當中表現出來。

        第二個其實也不難理解,目的就是想要動態的加載一個場景,而不是每次都把新場景打包到首包和添加到buildsetting當中。

        第三個也是這個的框架的重點之一,場景切換的時候,上一個場景退出的時候,我們需要做什麼,目標場景進來的時候,我們需要做什麼,這些那個在前面,那個在後面,都有嚴格的規定,就好像Mono的生命週期一樣。

        目前場景管理當中,我們僅僅提供了兩個接口,一個是獲取當前場景,一個是切換場景。

        其他的都是封裝內容,接下來我們主要來描述一下一個場景。

        目前框架當中,我們一共可以有三種場景,普通場景,Lua控制場景和拼接場景,其中後面兩個場景內容是由第一個場景派生出來的。

        IScene:普通場景。

        首先,普通場景,其實就是一系列的prefab集合,場景的打開和銷燬均不涉及真正的unity場景,而是通過加載prefab並且實例化進去運行形成的新場景,所以這個時候我們需要的是每一個prefab對應的世界信息,當然,爲了更方便簡潔,在場景prefab製作的時候就應該統一世界信息,通過子節點或者必要的節點進行世界信息偏移達到目標效果。這個類當中,我們需要帶參數的構造方法,初始化數據、加載場景、清除數據和移除場景內容。

        前面的兩個方法,是進入場景的時候調用的,後面兩個方法,是退出場景的時候調用的。

        基本上這些內容,我們都可以進去查看一下,非常簡單。

        ISceneWithLua:Lua控制的場景內容。

        直接繼承IScene來的一個場景內容控制,他也是一系列的prefab集合,只是有些需要的參數和內容是通過lua進行控制和返回的,說白了,也就是多了一個luatable,其他的沒什麼區別。

        ISceneWithAdditive:拼接場景。

        這個場景也是繼承自IScene,但它是拼接場景,也就是說在unity裏面,它的表現形式是unity的scene內容。那麼就有人問,爲什麼不直接使用unity的scenemanager直接加載,因爲我們這個設定,第一點、第二點和第三點都沒有實現,其實不然,我們巧妙的運用了場景的打包和動態加載就實現了進度控制和動態場景以及統一的規範管理。

        說到打包,這裏連帶將場景打包內容一併講解。

        

        這個就是我們場景打包的界面,當中需要選擇平臺和需要打包的場景所在的目錄,然後選擇需要打包的場景,最後打包即可。

        這個就是打包的流程,打包完成之後會直接將場景ab包拷貝到editor測試運行目錄下面,可以直接測試使用,具體打包的內容可以參照之前的資源加載,當中有關於ab包思路的,當然只是思路,代碼肯定不一樣的,打包prefab和unity3d還是有區別的,詳細的網上搜索一下就可以了。

        使用這個拼接場景的目的最主要的是解決LightMapping的動態加載和大場景的分割加載。

        這裏需要提一下的是ISceneWithAdditive的場景是疊加的,對於navmesh是無效的,所以目前沒有解決這個問題,而且根據資料顯示,目前靜態的navmesh還不能使用場景疊加,只能是一個完整的,但是網上有很多動態的navmesh框架,後續可能會集成進來。

        以上就是目前框架當中關於場景管理的一些籠統和簡要說明,想要知道詳細代碼的可以去GitHub個人項目當中下載查看,有問題或者更好的建言隨時留言溝通交流。

 

 

項目GitHub地址

https://github.com/FengFaming/ClientEngine

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