This document is about: FUSION 2
SWITCH TO

Scene Loading

概述

Fusion內部不包含Unity場景處理執行方式,但它確實提供了一個INetworkSceneManager介面, 您可以在其中定義Fusion如何回應各種與場景相關的事件——例如場景更改。INetworkSceneManager的執行方式 以下簡稱為場景管理器

需要在NetworkRunner.StartGame()方法中透過StartGameArgs.SceneManager欄位指派INetworkSceneManager的執行方式。 如果沒有提供執行方式(空值),Fusion將建立一個NetworkSceneManagerDummy類別的執行個體,並記錄一個錯誤,來告知它將無法連結場景物件。

Fusion附帶了一個名為NetworkSceneManagerDefault的預設執行方式,它可以:

  • 載入及卸載場景。
  • 支援常規場景載入和透過可定址載入場景。
  • 可以重新載入當前活躍中的場景。
  • 使用附加場景載入,同時載入多達8個場景。
  • 支援多重同儕節點場景載入,每個運行器都有正確的物理場景關聯。

載入及卸載場景

重要事項: 只允許在伺服器/主機或主客戶端上調用LoadScene()UnloadScene()。(這是由預設場景管理器執行方式強制執行的。自訂執行方式也必須強制執行這個)

為了載入場景,只需調用NetworkRunner.LoadScene(),其傳送場景的SceneRefLoadSceneParameters。請記住,使用單一載入模式來載入,將卸載所有先前的場景,而使用附加場景載入時,先前的場景將保持已載入狀態。

C#

// Loading 3 scenes in additive mode.
if (Runner.IsSceneAuthority) {
  Runner.LoadScene(SceneRef.FromIndex(1), LoadSceneMode.Additive);
  Runner.LoadScene(SceneRef.FromIndex(2), LoadSceneMode.Additive);
  Runner.LoadScene(SceneRef.FromIndex(3), LoadSceneMode.Additive);
}

用於建立SceneRef的索引是Unity組建中場景的索引。為了取得當前場景的索引,您可以使用SceneManager.GetActiveScene().buildIndex。對於其他場景,可以使用SceneUtility.GetBuildIndexByScenePath,按照場景路徑中找到索引。例如,為了載入儲存在Assets/Scenes/GameScene.unity中的場景,請使用以下程式碼:

C#

  Runner.LoadScene(SceneRef.FromIndex(SceneUtility.GetBuildIndexByScenePath("Assets/Scenes/GameScene.unity")), LoadSceneMode.Additive);

為了卸載場景,只需調用NetworkRunner.UnloadScene(),其傳送要卸載的場景的SceneRef

C#

// Unloading scene 1.
if (Runner.IsSceneAuthority) {
  Runner.UnloadScene(SceneRef.FromIndex(1));
}

也可以透過按順序卸載和再次載入場景來重新載入場景。 NetworkSceneManagerDefault執行方式維持一個Version欄位,該欄位用作計數器,每次載入或卸載場景時都會增加, 此值用於註冊場景對象的載入ID,以區分上次載入的場景和新載入的場景,即使它們是 同一個場景。

C#

// Reloading scene 2.
if (Runner.IsSceneAuthority) {
  Runner.UnloadScene(SceneRef.FromIndex(2));
  Runner.LoadScene(SceneRef.FromIndex(2), LoadSceneMode.Additive);
}

SceneRef可以從具有SceneRef.FromIndex(int index)的場景索引或從路徑來建立,主要用於以SceneRef.FromPath(string path)建立對可定址場景的參照。

建立一個自訂網路管理器

網路場景資訊

代表使用者控制的活躍中場景資訊,它最多可以儲存8個活動場景,並允許重複。 這是建立自訂執行方式的一個很好的起點。此網路結構是NetworkRunner 連線的地方,以便正確同步場景載入。每當場景授權(主機/伺服器或主客戶端)更改場景資訊時, 將在NetworkRunner上註冊的INetworkSceneManager執行個體上調用OnSceneInfoChanged()

I網路場景管理器

StartGameArgs上提供此介面的自訂執行方式,以完全控制處理場景載入的方式。 請記住,此執行方式需要調用Fusion場景載入回調Runner.InvokeSceneLoadStart(sceneRef)Runner.InvokeSceneLoadDone(SceneLoadDoneArgs)。請看一下NetworkSceneManagerDefault執行方式以看見預設行為。

在執行自訂場景管理器時,介面將提供以下內容:

  • void Initialize(NetworkRunner runner):當運行器初始化自身時被調用。使用它來儲存NetworkRunner參照並進行任何必要的預熱。

  • void Shutdown():當運行器關閉時被調用。使用它來釋放任何參照並停止任何進行中的操作。

  • bool IsBusy:使用此屬性可以知道場景管理器何時正忙於載入場景,或忙於執行NetworkRunner或遊戲上的其他系統可能需要注意的任何其他操作。

  • Scene MainRunnerScene:使用此屬性可以知道哪個場景是NetworkRunner的主場景。這主要用於多重同儕節點支援。(有關更多資訊,請查看預設執行方式)

  • bool TryGetPhysicsScene2D(out PhysicsScene2D scene2D):在out參數上設定2D物理場景,傳回操作結果。

  • bool TryGetPhysicsScene3D(out PhysicsScene scene3D):在out參數上設定3D物理場景,傳回操作結果。

  • void MakeDontDestroyOnLoad(GameObject obj):使物件在載入時不被破壞。用於多重同儕節點支援。(有關更多資訊,請查看預設執行方式)

  • void MoveToRunnerScene(GameObject obj):將被傳送的物件移動到與NetworkRunner相關的場景中。這僅用於多重同儕節點支援。(有關更多資訊,請查看預設執行方式)

  • bool IsRunnerScene(Scene scene):如果此場景與NetworkRunner相關,則傳回。用於多重同儕節點支援。(有關更多資訊,請查看預設執行方式)

  • NetworkSceneAsyncOp LoadScene(SceneRef sceneRef, LoadSceneParameters parameters):使用此方法以使用接收到的參數載入新場景。載入場景的方式完全由開發人員決定,唯一需要的步驟是將新載入的NetworkObjects註冊為NetworkRunner.RegisterSceneObjects(SceneRef scene, NetworkObject[] objects, byte loadId = 0)。傳送額外的載入Id參數以確保每個場景載入替場景物件生成唯一的類型id。

  • NetworkSceneAsyncOp UnloadScene(SceneRef sceneRef):使用此方法卸載場景。

  • void OnSceneInfoChanged():當NetworRunner上的INetworkSceneInfo更改時調用。 使用此方法在客戶端上反應並觸發場景載入,因為只有場景授權才能調用LoadScene

  • SceneRef GetSceneRef(string sceneName):使用此方法以根據提供的場景名稱傳回SceneRef

Back to top