What's New 2.0
Fusion 1 作為業界領先的狀態同步 SDK 設定了很高的標準,它結合了 Bolt 的基於滴答的網路編碼和 PUN 的基於雲端的便利性。這種獨特的架構使 Fusion 能夠覆蓋各種各樣的遊戲類型,再加上其出色的 CPU 和頻寬使用效率,使其成為真正的下一代網路 SDK。
Fusion 2 在這個基礎上進行了拓展,為現有的 API 帶來了新功能和體驗提升更新。此外,Fusion 的內核大部分已重新編寫,旨在改進和簡化它。我們對多種系統進行了全面的更改,包括數據傳輸、時間同步、記憶體管理和整體 CPU 性能。
本頁概述了我們為 Fusion 2 所做的更改。
重新設計的興趣管理系統
新系統性能更強,現在當物件進入 / 離開客戶端的興趣集時,會提供可靠的 Enter/Exit 回調。
當網路物件進入 / 離開特定玩家的 AOI 區域時,以及當玩家明確添加或移除對某個物件的興趣時(使用Runner.SetPlayerAlwaysInterested()),這些回調會被觸發。這些回調在伺服器、主機和共用模式下的伺服器上可靠地計算。
我們還提供了 NetworkObject/NetworkBehaviour.ReplicateTo API,允許對哪些行為複製到哪些客戶端進行精細的動態控制。
代理上的 FixedUpdateNetwork
FixedUpdateNetwork默認情況下不再在代理上執行。(代理是客戶端上客戶端不擁有輸入許可權的網路物件。)
此更改減少了整體 CPU 使用率,因為大多數應用程式不需要模擬代理。對於 需要 此功能的情況(例如使用預測物理時),可以通過以下方式設置代理以模擬並調用FixedUpdateNetwork回調:
C#
networkRunner.SetIsSimulated(networkObject, true);
新的時間同步
Fusion 2 改進了其系統,該系統控制客戶端預測的超前程度以及在渲染前緩衝伺服器快照的時間。這個新系統仍然可以平穩地適應不斷變化的網路條件,但比在 Fusion 1.1 中更快、更可靠。
設置也更簡單且更有意義。客戶端的預測領先時間和緩衝快照的時間都來自兩個設置(每個設置各一個)—— 目標封包丟失率和一個額外的靜態偏移量。客戶端將採樣最近的網路狀況,並動態調整其領先於伺服器的程度,以便網路抖動只會導致指定的封包丟失率。如果抖動增加,客戶端將進一步超前預測。如果抖動再次減少,客戶端將回落至較小的領先程度。靜態偏移量本質上只是提供更多的「傳輸嘗試次數」。
例如,如果可以接受約 1% 的客戶端輸入延遲到達伺服器,但又希望每個輸入有第二次機會按時到達(以防第一個封包丟失),則可以將TimeSyncConfiguration.MaxLateInputs和TimeSyncConfiguration.ExtraSimulationOffset都設置為1。
共用模式
共用模式現在也依賴於客戶端之間精確的刷新對齊數據。
這允許使用Runner.Tick來引用各個客戶端上的特定滴答,這意味著TickTimer現在在共用模式中受支援。
基於刷新的共用模式現在也使用與伺服器模式相同的精確快照插值,從而提高了視覺精度和感知延遲。
更改檢測
Fusion 2 引入了新的更改檢測 API,不僅允許在Render中檢測更改,還允許在FixedUpdateNetwork中檢測更改以觸發遊戲邏輯。
像這樣創建一個ChangeDetector:
C#
_changes = GetChangeDetector(ChangeDetector.Source.SimulationState);
然後隨時調用ChangeDetector.DetectChanges(例如在FixedUpdateNetwork或Render中),以檢測自上次調用以來發生的任何更改。
新的網路數據訪問系統
新的 API 允許直接訪問底層網路數據緩衝區。使用TryGetSnapshotsBuffers訪問快照緩衝區。有可用的函數來讀取數據,以及用於自定義插值的輔助函數來對它們進行插值。
插值目標
在 Fusion 1 中,處理插值目標很困難,尤其是在為網路物件設置父物件時。Fusion 2 簡化了插值,因此在使用NetworkTransform時不再需要插值目標。相反,帶有NetworkTransform元件的 Unity Transform會直接進行插值。
NetworkTransform 改進
NetworkTransform現在在本地空間中存儲其 TRS 數據(位置 / 旋轉 / 縮放)。這意味著:
- 子網路變換和嵌套
NetworkTransform的數據效率更高。 - 但是,嵌套網路物件的興趣區域位置不再有效。引入了 AreaOfInterestOverride 來解決這個問題,它允許網路物件指定另一個網路物件的位置來確定玩家的興趣。
現在可以選擇是否同步 Transform 的 LocalScale。
現在可以選擇是否同步網路物件的父物件。父 Transform 上必須存在有效的 NetworkBehaviour,並且NetworkTransform必須位於網路物件的根目錄上。
網路物理
NetworkRigidBody 和 NetworkPhysicsSimulation 已從 Fusion DLL 中移除,並由 Unity Physics Addon 取代,該插件包含在主要的 Fusion SDK 下載中。伺服器專用和全預測物理的完整功能集都可用。
通過原始碼提供物理插件允許您修改和擴展它以適合您項目的需求。這在處理複雜用例(如 VR 遊戲)中的物理時提供了更大的靈活性。雖然 Fusion 2 中的NetworkTransform已移除其插值目標要求,但 NetworkRigidbody 仍然具有 InterpolationTarget 屬性。但是,插值目標僅在非常特定的用例中需要,通常可以保留為 null(表示將移動剛體變換以進行插值)。
VR輸入模式
一種專為 VR 遊戲設計的新輸入傳輸模式。默認情況下,Fusion 使用不可靠的傳輸方式將輸入從客戶端發送到伺服器。為了減輕封包丟失,每個輸入封包中都包含一小段過去輸入的歷史記錄。這允許伺服器在即使少數個別封包丟失的情況下也能使用完整的輸入流,但會增加輸入封包的大小。
VR 輸入模式只發送最新的輸入狀態,以大幅減少包含頭部 / 手部位置數據的大型輸入結構的 VR 遊戲的頻寬。
要啟用此功能,請在NetworkProjectConfig中將Input Transfer Mode設置為Latest State。
加密
Fusion 2 引入了無縫的端到端加密,確保遊戲流量的安全性。加密系統基於現有的 Realtime SDK,覆蓋客戶端和 Photon Cloud 之間的通信。Fusion 2 的主要新增功能是自動加密客戶端和伺服器之間交換的數據,使這個過程變得輕鬆無憂 —— 只需啟用該功能即可。無論是在共用模式還是客戶端 - 伺服器模式下,Fusion 2 都會加密在對等點之間傳輸的整個數據包,提供強大的加密解決方案以增強安全性。
簡單 KCC
通過 Simple KCC,我們為 Fusion 添加了一個用戶友好且直觀的 3D 角色控制器插件。它旨在簡化使用 Fusion 在遊戲中設置角色移動的過程。
與 Unity CharacterController相比,它提供了更多功能,並完全支援所有多人遊戲用例,因此您可以在共用模式、主機模式和伺服器模式中使用它。
新的堆積系統
Fusion 2 配備了新的內部堆,它動態地預分配記憶體。新堆允許檢測 Fusion 所使用的內部非託管記憶體的洩漏並進行垃圾回收。
統一的數據傳輸模型
Fusion 1 提供了兩種數據傳輸模型:增量快照和最終一致性。兩者都有其用例,但是我們發現,通過專注於單一模型,我們可以在幾乎所有用例中提供更高效的 CPU 和頻寬數據傳輸。
Fusion 中新的最終一致性模式不僅比先前版本有很多性能改進,而且默認確保單個NetworkObject上的所有Networked Property更新在同一滴答到達客戶端,在每個物件的基礎上提供一致的滴答精確數據。對於經典的每屬性最終一致性傳輸,您可以將SimulationConfig.ObjectDataConsistency設置為Eventual。
場景管理
為了支援更多現成可用的案例,場景管理已完全重新編寫。它現在可以作為 Unity 的 SceneManager 的替代方案,使您能夠在其上構建更複雜的場景過渡。
不再需要為可尋址場景編寫自定義支援。只需將FusionScenes可尋址標籤添加到您的可尋址場景資產中,Fusion 就會自動識別它。
附加場景加載已準備就緒!新的NetworkSceneInfo同時支援多達 8 個場景。在單個和多個對等模式下都能工作。
使用版本控制,可以通過簡單地從SceneAuthority中移除所需場景並再次添加或以Single模式加載它,讓客戶端重新加載場景。
最重要的是,現在可以將物件作為DontDestroyOnLoad生成,即使在具有附加場景的多個對等模式下也是如此。
Fusion 2應用程式ID
Fusion 2 應用程式需要在Photon 儀表板上明確創建一個 Fusion 2 應用程式 ID。
有關更多信息,請閱讀Fusion 共用模式基礎 - 創建應用程式 ID教程。
新的演示菜單
新的演示菜單通過提供用於原型設計的模板菜單,幫助您啟動 Fusion 開發。
它展示了許多常用功能,例如隨機配對和通過共享派對代碼進行的基於派對的配對。
它旨在具有可擴展性,並處理連接邏輯的複雜性。不幸的是,這些設計目標相互競爭,但此解決方案試圖合理地平衡它們。
|
|
|
|
|
|
延遲補償
不再需要將動畫碰撞箱定位在Render之前,以使其處於延遲補償的正確位置。延遲補償系統現在自動使用Render中正確的插值動畫位置,該位置與玩家在屏幕上看到的內容匹配。
延遲補償現在也支援 2D 用例,並允許查詢 2D 物理場景。
此外,現在也支援 3D 膠囊碰撞箱。
NetworkObjectProvider
INetworkObjectPool已被INetworkObjectProvider取代,提供了更一致和完整的 API。默認實現現在能夠異步加載和生成物件。
為了適應這些新功能,添加了NetworkRunner.TrySpawn和一個可等待的NetworkRunner.SpawnAsync方法。可尋址資源不再需要使用WaitForCompletion進行預加載或等待!
未使用的可尋址預製件現在可以在其實例計數達到零後立即卸載,或者由用戶自行決定使用NetworkRunner.Prefabs.UnloadUnreferenced卸載。
以上所有內容現在都可以在NetworkPrefabsInspector窗口中驗證 - 該窗口允許檢查加載了哪些網路預製件、生成了哪些網路預製件以及它們的實例計數是多少。
SendReliableData
可靠的數據流 API 進行了重新設計,帶來了許多新的體驗提升改進。它自動將數據拆分為片段,這些片段被流式傳輸到目標客戶端並重新組裝。一旦收到完整的數據,就會調用帶有數據的回調。還提供了另一個回調來跟蹤數據傳輸的狀態。
示例代碼:
C#
byte[] largeData = new byte [10000];
// Provide 4 numbers as a unique key for the data
var key = ReliableKey.FromInts(42, 0, 0, 0);
// Use in shared mode or as the server/host to send data to players
runner.SendReliableDataToPlayer(playerRef, key, largeData);
// Use as a client to send data to the server/host
runner.SendReliableDataToServer(key, largeData);
接收數據的回調(INetworkRunnerCallbacks):
C#
public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, ArraySegment<byte> data){}
public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress){}
Back to top