Coming From PUN
簡介
本文討論了當來自PUN背景的人如何進入Fusion;重點是對象同步和遊戲性。
雖然PUN是一個非常成功的、易於使用的網路解決方案,但它在處理現代多人遊戲方面顯示出了它的不成熟和不足,如更進階的玩家數量、玩家行動的精確模擬和權限處理。Fusion同樣易於使用,對於大多數項目來說應該是首選。
差異之處
若是前身使用PUN,有一些差異需要注意。
Fusion為每個玩家事件化一個Runner
,它必須在某些場景中設置。要做到這一點,層次結構介面的上下文選單有一個Fusion子選單,有設置場景的快捷方式。
Fusion可以在一個過程中執行多個Runner
事件,這主要是為了測試和除錯。編輯器中的幫助介面讓你選擇哪個事件是可見的並取得輸入。
當編輯器同時執行多個對象時,它將在啟動時重新加載當前場景。遊戲邏輯可能需要調整以支持此項目。獨立的構建可以很容易地與編輯器連接,就像在PUN中一樣。
PUN中的許多API都可以通過PhotonNetwork
類取得。Fusion有一個Runner
,而不是每個事件。任何繼承自SimulationObject
或NetworkObject
的類別都可以訪問Runner
和Object成員,所以訪問Fusion的API就像在PUN中一樣簡單。
PUN只提供“分布式”權限,而Fusion支持以Dedicated Server
、Client Hosted
和Shared Mode
執行。Shared Mode
類似於PUN,網路對象的權限被分配給玩家。場景對象是由一個玩家自動控制的。
PUN只有對象的_控制_概念,而Fusion將權限分解為state authority和input authority(除非使用Shared Mode
)。
PUN中的腳本通常只檢查photonView.IsMine
,以確定客戶端是否控制該對象。Fusion 會分別跟蹤Object.HasStateAuthority
和Object.HasInputAuthority
。來自PUN的端口應該使用Fusion的Shared Mode
,並檢查HasStateAuthority
。
在PUN中,每一個新玩家的Player.ActorNumber
都會上升。在Fusion中,PlayerRef
從0開始,一直到MaxPlayers - 1
。如果一個遊戲有一個主持人,這個玩家將永遠得到MaxPlayers - 1
作為PlayerRef
值。
Fusion需要知道一個項目的場景。場景可以在項目構建設置中安排,然後從此置入。
相似之處
雖然人們期望Fusion與PUN有很大的不同,但許多想法實際上是延續的。
PUN中的一個關鍵元素是PhotonView
,它有一個直接對應的NetworkObject
。在PUN中,NetworkObject只是一個標識符,它依賴於其他組件來提供所需的行為。
Fusion有普通組件的替代物。例如,PhotonRigidbodyView
可以用NetworkRigidbody
代替,PhotonTransformView
變成NetworkTransform
。兩者都可以作為2D參數,就像在PUN中一樣。
PhotonAnimatorView
可以用NetworkMecanimator
代替。對於具體控制角色,Fusion有一個全面的NetworkCharacterController
,這是PUN所不提供的。
組件的個別設置是不同的 - 在大多數情況下,默認值是可以接受的。所有在NetworkObject
上的組件和其子家族都會被自動找到。如果需要的話,Fusion完全支持在一個層次結構中擁有多個NetworkObject
。
和PUN一樣,NetworkObject
s可以放在場景中,也可以在執行時事件化。在Fusion中,呼叫Runner.Spawn()
而不是PhotonNetwork.Instantiate()
。要下載場景,用Runner.SetActiveScene()
替換PhotonNetwork.LoadLevel()
。
PUN中其他重要的類是MonoBehaviourPun
和MonoBehaviourPunCallbacks
。在Fusion中,腳本繼承自NetworkBehaviour
,以編寫遊戲邏輯和保持狀態。如果它們不會包含遊戲狀態,腳本可以繼承SimulationBehaviour
。在PUN呼叫OnPhotonInstantiate()
的地方,Fusion使用Spawned()
的回調來初始化網路腳本。
PUN中的自定義屬性是帶有setter方法的Hashtables,而Fusion則同步了普通的C#屬性。作為NetworkBehaviour
的一部分,自動實現的屬性只需要一個[Networked]
屬性就可以成為遊戲狀態的一部分。只有對象的權限可以改變這些值,而且它們會自動在網路上複製,這意味著作弊的可能性更小。
遠程程序呼叫(Rpc
s)也得到支持,並被升級到一個新的水平。把屬性[Rpc]
放置於在一個方法上,並像呼叫本地方法一樣執行呼叫-Fusion將轉換呼叫以在網路上工作。
參考表
PUN | Fusion |
---|---|
PhotonNetwork | SimulationBehaviour.Runner and SimulationBehaviour.Object |
MonoBehaviourPunCallbacks | SimulationBehaviour and NetworkBehaviour |
PhotonNetwork.AddCallbackTarget(this) | N/A (automatic) |
PhotonNetwork.Instantiate() | Runner.Spawn() |
PhotonView | NetworkObject |
IPunObservable.OnPhotonSerializeView() | C# auto-implemented properties and Input Sync |
PhotonTransformView | NetworkTransform |
PhotonRigidbodyView | NetworkRigidbody |
PhotonAnimatorView | NetworkMecanimAnimator |
N/A | NetworkCharacterController |
[PunRPC] | [Rpc] |
PhotonNetwork.LoadLevel() | Runner.SetActiveScene() |