日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

《炉石传说》架构设计赏析(2):Scene管理

發(fā)布時間:2024/8/26 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《炉石传说》架构设计赏析(2):Scene管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天我們主要分析一下爐石這款游戲中一共有哪些Scene,他們各自負責什么,以及它內(nèi)部的邏輯、UI的處理方式。

在正式開始之前,我來對前文中提到的Scene切換再做一些補充分析。前文中我們看到SceneMgr是調(diào)用了“Application.LoadLevelAdditiveAsync(this.sceneName);”,那內(nèi)存中的東西豈不是越搞越多嗎?我們再仔細看一下SceneMgr:SwitchMode()函數(shù),它是一個Coroutine,他主要進行了下面這幾個步驟的操作:

1.調(diào)用當前Scene的Scene:PreUnload()函數(shù);

發(fā)送FireScenePreUnloadEvent事件;
等待直到Unload過程走完(通過檢測LoadingScreen的階段);

2.調(diào)用Scene:Unload()函數(shù);

發(fā)送FireScenePreUnloadEvent事件;
調(diào)用成員函數(shù)PostUnloadCleanup()函數(shù),它調(diào)用了兩個關鍵的函數(shù):

  • 首先是成員函數(shù):DestroyAllObjectsOnModeSwitch(),這個函數(shù)查找到所有的GameObject(Object.FindObjectsOfType(typeof(GameObject))),然后進行了篩選(通過成員函數(shù)ShouldDestroyOnModeSwitch),除了一些全局對象之外(主要是SceneMgr、PegUI、Box、DefLoader),全都刪除了(通過調(diào)用Object.DestroyImmediate())。
  • 然后調(diào)用了:Resources.UnloadUnusedAssets();


3.然后是調(diào)用前文提到過的成員函數(shù):LoadModeFromModeSwitch(),進行了LoadLevelAdditiveAsync()操作;

綜上所述,爐石的Scene切換主要是包含兩步:1刪除所有非全局對象,卸載未引用的Asset;2加載新的Scene。(我倒是想到另外一個土鱉一點的替代方案:創(chuàng)建一個完全空的scene,調(diào)用LoadLevel加載它,那么所有沒有設置"DontDestroyOnLoad"的對象就都被刪除了。)

除了前文提到的Login,我們可以看到Scene還有很多派生類,詳見下圖:

?



這是我猜測的這些類和游戲內(nèi)容的對應關系,賣二手游戲平臺沒有太仔細分析,可能有些對應是錯誤的:


下面我們就挑選一個簡單的Scene來分析一下它的內(nèi)部運作機制,我們來看一下AdventureScene吧。Adventure相關的Class很多,我們只做一個粗略的分析,只涉及到下面這幾個類和接口:
?


首先我推測,在Hub屏幕中點擊中間的【Solo Adventure】(冒險模式)按鈕之后,通過我們前文分析的LoadScene流程,加載了一個冒險模式相關的Scene。它里面有一個GameObject綁定了“AdventureScene”這個腳本,我們可以看到AdventureScene:Awake()方法中主要是注冊了很多事件的回調(diào)。

我們可以看到有一個“AdventrueSubScenes”枚舉,它基本上對應了下圖中的按鈕:
?

  • <font color="#000000">public enum AdventureSubScenes
  • {
  • Chooser,
  • Practice,
  • MissionDeckPicker,
  • NormalHeroic,
  • ClassChallenge
  • }</font>
  • 復制代碼


    接下來還有一個"AdventureSubScene"是處理子場景對應的一些邏輯的。

    我們看到有“AdventureChooserTray”這個類:

    1.我推測這個類就是用來處理上面這個游戲畫面的UI交互操作的;

    2.這個類在Awake時,通過調(diào)用“CreateAdventureChooserButton()”方法創(chuàng)建了上圖中的上部分那幾個冒險游戲內(nèi)容模式相關的按鈕;

    3.這些按鈕都綁定了事件回調(diào):AdventureChooserTray.ButtonModeSelected();當這些按鈕被點擊時,主要是調(diào)用:
    ?

    • AdventureConfig:SetSelectedAdventureMode(),此函數(shù)修改內(nèi)部數(shù)據(jù)之后觸發(fā)事件:FireSelectedModeChangeEvent()
    • AdventureChooserTray通過OnSelectedModeChange()響應此事件,這也就是點擊上面那幾個按鈕之后要做的一些處理:包括更新左側的畫面、設置Choose按鈕狀態(tài)等等;
    • 其中調(diào)用了PlayMakerFSM,主要是向其發(fā)送事件“Burst”;通過這里,我們可以確定爐石使用了PlayerMaker插件。
    • AdventureScene也通過OnSelectedModeChanged()相應了此事件;


    4.它里面還有一個“PlayButton m_ChooseButton”成員變量,并把為它添加了EventListener,用來調(diào)用ChangeSubScene()方法。這就和游戲?qū)嶋H的操作對應上來:在上面選擇模式,然后點擊下面的【Choose】按鈕,就進行到下一步的選擇了。

    5.AdventureChooserTray:ChangeSubScene()通過Coroutine的方式調(diào)用了AdventureConfig:ChangeSubSceneToSelectedAdventure(),然后調(diào)用了AdventureConfig:ChangeSubScene();它主要觸發(fā)兩個事件:
    ?

    • FireSubSceneChangeEvent:AdventureScene通過OnSubSceneChange()函數(shù)響應它,主要是調(diào)用AdventureScene:LoadSubScene(),內(nèi)部主要是調(diào)用AssetLoader.LoadUIScreen();
    • FireAdventureModeChangeEvent:AdventureScene通過OnAdventureModeChanged()響應它。


    通過上面的分析,我們大致了解了上面這個游戲截圖中的操作實現(xiàn)邏輯。

    這次的分析算是一次熱身,接下來重點分析有兩個方面:
    ?

    • 游戲邏輯的組織,特別是技能的數(shù)據(jù)、邏輯組織;這可能需要經(jīng)過多次嘗試,慢慢接近;
    • 游戲的Asset資源管理、加載機制;


    OK,今天的分析就到這里,歡迎大家拍磚。后續(xù)分析敬請期待!

    順便來秀一下我的魚人部隊,別看這些1點學的小東西,加在一起還蠻歡樂的!


    ?

    總結

    以上是生活随笔為你收集整理的《炉石传说》架构设计赏析(2):Scene管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。