Scene Loading
概述
Fusion內部不包含Unity場景處理執行方式,但它確實提供了一個INetworkSceneManager
介面,
您可以在其中定義Fusion如何回應各種與場景相關的事件——例如場景更改。INetworkSceneManager
的執行方式
以下簡稱為場景管理器。
需要在NetworkRunner.StartGame()
方法中透過StartGameArgs.SceneManager
欄位指派INetworkSceneManager
的執行方式。
如果沒有提供執行方式(空值),Fusion將建立一個NetworkSceneManagerDummy
類別的執行個體,並記錄一個錯誤,來告知它將無法連結場景物件。
Fusion附帶了一個名為NetworkSceneManagerDefault
的預設執行方式,它可以:
- 載入及卸載場景。
- 支援常規場景載入和透過可定址載入場景。
- 可以重新載入當前活躍中的場景。
- 使用附加場景載入,同時載入多達8個場景。
- 支援多重同儕節點場景載入,每個運行器都有正確的物理場景關聯。
載入及卸載場景
重要事項: 只允許在伺服器/主機或主客戶端上調用LoadScene()
和UnloadScene()
。(這是由預設場景管理器執行方式強制執行的。自訂執行方式也必須強制執行這個)
為了載入場景,只需調用NetworkRunner.LoadScene()
,其傳送場景的SceneRef
和LoadSceneParameters
。請記住,使用單一載入模式來載入,將卸載所有先前的場景,而使用附加場景載入時,先前的場景將保持已載入狀態。
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
。