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
稱為NetworkBehaviours
。NetworkBehaviours
可以放在與NetworkObject
相同的GameObject
上,也可以放在子GameObjects
上。
在需要時,Fusion完全支援在一個階層中具有多個巢狀NetworkObjects
。
Photon轉換檢視
PhotonTransformView
可以替換為NetworkTransform
。NetworkTransform
提供了更好的執行方式和更多功能,如開箱即用的上層功能。
Photon動畫器檢視 -> 網路Mecanim動畫器
PhotonAnimatorView
可以替換為NetworkMecanimAnimator
。NetworkMecaimAnimator
的工作原理與PUN版本類似,並將動畫從具有StateAuthority
的客戶端同步到所有其他客戶端(代理)。
角色控制器
在PUN中移動玩家角色,可以使用常規的CharacterController
。在Fusion共享模式中,這也是一個選項,但也有簡單KCC附加元件可用,其為一個具有更多功能的高級選項。
Photon剛體檢視 -> 網路剛體
Fusion有一個類似於PUN的網路物理系統。使用的不是PhotonRigidbodyView
,而是NetworkRigidbody3D
元件。擁有物件的客戶端運行剛體的物理模擬,而所有其他客戶端僅使用剛體的運動學代表,來提供檢視。物理元件在2D中也可用。
Fusion中可以替換常見元件:例如,PhotonRigidbodyView
可以替換為NetworkRigidbody
,PhotonTransformView
變成NetworkTransform
。兩者都可以作為2D變數使用,就像在PUN中一樣。
PhotonView.IsMine / 物件的授權
PUN中的指令碼通常只檢查photonView.IsMine
以確定客戶端是否控制該物件。Fusion中等效於photonView.IsMine
的是Object.HasStateAuthority
。
玩家(控制者)離開時所有權轉移
在PUN中,當主客戶端更改時,新的主客戶端會自動控制沒有所有者的網路物件。
在Fusion中,當客戶端中斷連線或離開房間時,有多種選項可處理授權轉移。
當在NetworkObject
上勾選IsMasterClientObject
時,StateAuthority
將自動轉移到新的主客戶端,類似於PUN的行為。
勾選Destroy When State Authority Leaves
時,物件將被銷毀。
RPC
盡可能使用網路變數
也支援遠端程序調用(RPC),並將其提升到一個新的級別:將屬性RPC放在一個方法上,並在您調用本機方法時對其進行調用——Fusion將轉換調用以透過網路工作。
已連網變數而非自訂屬性
雖然PUN中的自訂屬性是帶有設定器方法的雜湊表,但Fusion會取而代之地同步普通的C#屬性:作為網路行為的一部分,自動執行的屬性只需要一個[已連網]屬性就可以成為遊戲狀態的一部分。只有物件的授權才能更改值,並且這些值會透過網路自動複製,這意味著作弊的可能性較小。
要替換玩家屬性,只需將附有NetworkedProperties
的NetworkBehaviour
新增到它即可。
為了替換房間屬性,請建立一個場景NetworkObject
,並新增一個附有NetworkProperties
的NetworkBehaviour
到它。您必須使用FindObjectOfType
或單一模式等在場景中找到此物件。
不再需要IPunObservable.OnPhotonSerializeView()
OnPhotonSerializeView
也被網路屬性替換。網路屬性結合了OnPhotonSerializeView和自訂屬性的最佳功能。它們透過刷新貼齊來立即更新。只有同步更改,而且偵測更改回調是可用的。
Fusion 2中的更改偵測
在PUN中,當房間或玩家屬性發生更改時,會觸發PropertyChanged
事件。在Fusion中,可以使用OnChangeRender
或ChangeDetector
。
多重同儕節點
Fusion可以在一個流程中運行多個NetworkRunner
執行個體,主要用於測試和偵錯。編輯器中的協助工具面板允許您選擇哪個執行個體可見並取得輸入。
當編輯器同時運行多個同儕節點時,它將在啟動時重新載入當前場景。可能需要調整遊戲邏輯以支援這一點。獨立組建可以很容易地與編輯器連線,就像在PUN中一樣。
特殊案例
共享模式提供了與PUN相同的靈活性和易用性。然而,對於一些更具競爭力和節奏更快的遊戲類型,Fusion提供了專用的伺服器/主機端模式。
在這種模式下,伺服器或其中一個客戶端擁有對遊戲狀態的完全授權。這意味著該同儕節點持有完整狀態,並且是唯一允許修改狀態的同儕節點。其他同儕節點可以在本機預測中修改狀態,以遮罩延遲,但它們的更改需要由伺服器複製才能生效。
為了確定主機端/伺服器模式是否是您的遊戲的更好選擇,我們建議您查看一下Quadrant。
- 概述
- Fusion模式
- 不同處
- 參照表
- 連線及配對
- 放置設定的位置/如何替換連線使用設定,版本控制
- 驗證
- 離線模式
- 執行者數量
- 使用運行器而非Photon網路
- 回調(單行為Pun回調/Photon網路.新增回調目標(這個))
- 具現化
- 場景物件
- 手動具現化
- 場景
- 多重場景
- Photon檢視
- 單行為Pun
- Photon轉換檢視
- Photon動畫器檢視 -> 網路Mecanim動畫器
- 角色控制器
- Photon剛體檢視 -> 網路剛體
- PhotonView.IsMine / 物件的授權
- 玩家(控制者)離開時所有權轉移
- RPC
- 已連網變數而非自訂屬性
- 不再需要IPunObservable.OnPhotonSerializeView()
- Fusion 2中的更改偵測
- 多重同儕節點
- 特殊案例