This document is about: FUSION 2
SWITCH TO

Coming from Pun2

概述

本文討論了在PUN背景下如何開始使用Fusion;重點是物件同步和遊戲遊玩。

雖然PUN是一個非常成功且易於使用的網路解決方案,但它在處理現代多人玩家遊戲方面顯示出了其老舊和不足之處,如更高的玩家計數、玩家動作的精確複製和授權的處理。Fusion同樣易於使用,應該會成為大多數專案的首選。

Fusion模式

從PUN到Fusion非常重要的一點是,PUN只透過所有客戶端共享的房間提供「分散式」授權模型。

在共享模式下運行Fusion以允許分散式授權,類似於PUN的模型。場景物件由一個玩家自動控制。PUN中存在的大多數概念可以轉移到Fusion共享模式,但不能轉移到Fusion伺服器/主機端模式。

本頁介紹如何將PUN知識遷移到Fusion共享模式。但是,主機端/伺服器模式可能是更好的選擇,這具體取決於應用程式。

不同處

參照表

PUN Fusion
Photon網路 模擬行為.運行器及模擬行為.物件
單行為Pun回調 模擬行為及網路行為
Photon網路.新增回調目標(這個) N/A(自動)
Photon網路.具現化() 運行器.生成()
Photon檢視 網路物件
IPun可觀察.在Photon序列化檢視() C#自動執行屬性及輸入同步
Photon轉換檢視 網路轉換
Photon剛體檢視 網路剛體
Photon動畫檢視 網路Mecanim動畫器
N/A 網路角色控制器
[PunRPC] [Rpc]
Photon網路.載入層級() 運行器.設定活躍場景()

連線及配對

PUN和Fusion之間的配對核心概念保持不變。大廳、配對、房間、配對屬性等仍然存在。

Fusion使用完全不同的API進行網路運行器上公開的匹配調用。您可以在這裡了解更多如何使用Fusion進行連線及配對的資訊。

放置設定的位置/如何替換連線使用設定,版本控制

PUN將大多數設定存儲在PhotonServerSettings檔案(可指令碼物件)中。它主要是關於AppId、伺服器設定、協定和日誌記錄。

在Fusion中,設定被分為兩個檔案:

PhotonAppSettings包含客戶端用於連線Photon Cloud的資訊。在大多數情況下,此配置中唯一需要更改的資料是應用程式的AppId,也可以透過Fusion Hub進行設定。

NetworkProjectConfig是一個詳細的配置,展示了Fusion的許多配置選項。預設配置可以作為起點。設定刷新率,最大玩家數量和更多設定。

驗證

Fusion和PUN一樣支持驗證提供者。可以在驗證頁面上找到這方面的更多資訊。

離線模式

如同PUN,Fusion也有離線模式。並非使用PhotonNetwork.OfflineMode,而是在調用NetworkRunner.StartGame時使用GameMode.Single

執行者數量

在PUN中,每個新玩家的Player.ActorNumber都會增加。在Fusion中,PlayerRef從0開始,一直到最大玩家-1。如果遊戲有主機端,該玩家將始終獲得最大玩家-1作為PlayerRef值。

使用運行器而非Photon網路

PUN中的許多API都可以透過PhotonNetwork類別獲得。取而代之地,Fusion的每個執行個體都有一個運行器。任何繼承自NetworkBehaviour的類別都可以存取運行器及物件成員,因此存取Fusion API與PUN中一樣容易。

階層面板的內容選單有一個Fusion子選單,其中包含設定場景的有用捷徑。

回調(單行為Pun回調/Photon網路.新增回調目標(這個))

回調是PUN網路API的主要概念,無論您是等待連線建立或隨機配對的結果。在PUN中,回調被分類為指令碼執行的幾個介面定義。在運行階段,必須登錄這些指令碼才能調用這些回調。 為了簡化此工作流程,PUN提供了MonoBehaviourPunCallbacks類別來被繼承。這樣,您的指令碼就可以覆寫特定的方法來獲取它們的回調。

Fusion透過INetworkRunnerCallbacks提供大多數回調。這些是遊戲階段回調。物件特定回調可直接在NetworkBehaviour上使用,如Spawned/Despawned等等。

具現化

在Fusion中,調用Runner.Spawn()而不是PhotonNetwork.Instantiate()。為了輪詢執行個體,不是使用自訂IPunPrefabPool,而是使用INetworkObjectProvider

場景物件

場景物件在PUN和Fusion中以類似的方式工作。當第一次載入場景時,主客戶端會自動針對所有場景物件使用StateAuthority

手動具現化

為了替換Fusion中來自PUN的手動具現化,需要一個自訂INetworkPrefabSource來為生成的內容提供預製件。與PUN不同,它不建立網路物件的特定執行個體,而是建立隨後由INetworkObjectProvider具現化的預製件。

對於大多數Fusion應用程式,通常不建議也不需要這樣做。

場景

為了載入場景,以Runner.SetActiveScene()替換PhotonNetwork.LoadLevel()

多重場景

在Fusion中,開箱即用地支援多重場景。Runner.LoadScene提供用於額外載入場景的多載。

Photon檢視

PUN中的一個關鍵元素是PhotonView,它有一個直接等價物稱為網路物件。與PUN一樣,網路物件只是一個識別碼,它依賴於其他元件來提供所需的行為。

單行為Pun

Fusion中的MonoBehaviourPUNs稱為NetworkBehavioursNetworkBehaviours可以放在與NetworkObject相同的GameObject上,也可以放在子GameObjects上。

在需要時,Fusion完全支援在一個階層中具有多個巢狀NetworkObjects

Photon轉換檢視

PhotonTransformView可以替換為NetworkTransformNetworkTransform提供了更好的執行方式和更多功能,如開箱即用的上層功能。

Photon動畫器檢視 -> 網路Mecanim動畫器

PhotonAnimatorView可以替換為NetworkMecanimAnimatorNetworkMecaimAnimator的工作原理與PUN版本類似,並將動畫從具有StateAuthority的客戶端同步到所有其他客戶端(代理)。

角色控制器

在PUN中移動玩家角色,可以使用常規的CharacterController。在Fusion共享模式中,這也是一個選項,但也有簡單KCC附加元件可用,其為一個具有更多功能的高級選項。

Photon剛體檢視 -> 網路剛體

Fusion有一個類似於PUN的網路物理系統。使用的不是PhotonRigidbodyView,而是NetworkRigidbody3D元件。擁有物件的客戶端運行剛體的物理模擬,而所有其他客戶端僅使用剛體的運動學代表,來提供檢視。物理元件在2D中也可用。

Fusion中可以替換常見元件:例如,PhotonRigidbodyView可以替換為NetworkRigidbodyPhotonTransformView變成NetworkTransform。兩者都可以作為2D變數使用,就像在PUN中一樣。

PhotonView.IsMine / 物件的授權

PUN中的指令碼通常只檢查photonView.IsMine以確定客戶端是否控制該物件。Fusion中等效於photonView.IsMine的是Object.HasStateAuthority

玩家(控制者)離開時所有權轉移

在PUN中,當主客戶端更改時,新的主客戶端會自動控制沒有所有者的網路物件。

在Fusion中,當客戶端中斷連線或離開房間時,有多種選項可處理授權轉移。

networkobject authority settings

當在NetworkObject上勾選IsMasterClientObject時,StateAuthority將自動轉移到新的主客戶端,類似於PUN的行為。

勾選Destroy When State Authority Leaves時,物件將被銷毀。

RPC

盡可能使用網路變數

也支援遠端程序調用(RPC),並將其提升到一個新的級別:將屬性RPC放在一個方法上,並在您調用本機方法時對其進行調用——Fusion將轉換調用以透過網路工作。

已連網變數而非自訂屬性

雖然PUN中的自訂屬性是帶有設定器方法的雜湊表,但Fusion會取而代之地同步普通的C#屬性:作為網路行為的一部分,自動執行的屬性只需要一個[已連網]屬性就可以成為遊戲狀態的一部分。只有物件的授權才能更改值,並且這些值會透過網路自動複製,這意味著作弊的可能性較小。

要替換玩家屬性,只需將附有NetworkedPropertiesNetworkBehaviour新增到它即可。

為了替換房間屬性,請建立一個場景NetworkObject,並新增一個附有NetworkPropertiesNetworkBehaviour到它。您必須使用FindObjectOfType或單一模式等在場景中找到此物件。

不再需要IPunObservable.OnPhotonSerializeView()

OnPhotonSerializeView也被網路屬性替換。網路屬性結合了OnPhotonSerializeView和自訂屬性的最佳功能。它們透過刷新貼齊來立即更新。只有同步更改,而且偵測更改回調是可用的。

Fusion 2中的更改偵測

在PUN中,當房間或玩家屬性發生更改時,會觸發PropertyChanged事件。在Fusion中,可以使用OnChangeRenderChangeDetector

多重同儕節點

Fusion可以在一個流程中運行多個NetworkRunner執行個體,主要用於測試和偵錯。編輯器中的協助工具面板允許您選擇哪個執行個體可見並取得輸入。

當編輯器同時運行多個同儕節點時,它將在啟動時重新載入當前場景。可能需要調整遊戲邏輯以支援這一點。獨立組建可以很容易地與編輯器連線,就像在PUN中一樣。

特殊案例

共享模式提供了與PUN相同的靈活性和易用性。然而,對於一些更具競爭力和節奏更快的遊戲類型,Fusion提供了專用的伺服器/主機端模式。

在這種模式下,伺服器或其中一個客戶端擁有對遊戲狀態的完全授權。這意味著該同儕節點持有完整狀態,並且是唯一允許修改狀態的同儕節點。其他同儕節點可以在本機預測中修改狀態,以遮罩延遲,但它們的更改需要由伺服器複製才能生效。 為了確定主機端/伺服器模式是否是您的遊戲的更好選擇,我們建議您查看一下Quadrant。

the quadrant

完整大小

Back to top