This page is a work in progress and could be pending updates.

Coming From PUN

簡介

本文討論了當來自PUN背景的人如何進入Fusion;重點是對象同步和遊戲性。

雖然PUN是一個非常成功的、易於使用的網路解決方案,但它在處理現代多人遊戲方面顯示出了它的不成熟和不足,如更進階的玩家數量、玩家行動的精確模擬和權限處理。Fusion同樣易於使用,對於大多數項目來說應該是首選。

Back To Top

差異之處

若是前身使用PUN,有一些差異需要注意。

Fusion為每個玩家事件化一個Runner,它必須在某些場景中設置。要做到這一點,層次結構介面的上下文選單有一個Fusion子選單,有設置場景的快捷方式。

Fusion可以在一個過程中執行多個Runner事件,這主要是為了測試和除錯。編輯器中的幫助介面讓你選擇哪個事件是可見的並取得輸入。

當編輯器同時執行多個對象時,它將在啟動時重新加載當前場景。遊戲邏輯可能需要調整以支持此項目。獨立的構建可以很容易地與編輯器連接,就像在PUN中一樣。

PUN中的許多API都可以通過PhotonNetwork類取得。Fusion有一個Runner,而不是每個事件。任何繼承自SimulationObjectNetworkObject的類別都可以訪問Runner和Object成員,所以訪問Fusion的API就像在PUN中一樣簡單。

PUN只提供“分布式”權限,而Fusion支持以Dedicated ServerClient HostedShared Mode執行。Shared Mode類似於PUN,網路對象的權限被分配給玩家。場景對象是由一個玩家自動控制的。

PUN只有對象的控制概念,而Fusion將權限分解為state authorityinput authority(除非使用Shared Mode)。

PUN中的腳本通常只檢查photonView.IsMine,以確定客戶端是否控制該對象。Fusion 會分別跟蹤Object.HasStateAuthorityObject.HasInputAuthority。來自PUN的端口應該使用Fusion的Shared Mode,並檢查HasStateAuthority

在PUN中,每一個新玩家的Player.ActorNumber都會上升。在Fusion中,PlayerRef從0開始,一直到MaxPlayers - 1。如果一個遊戲有一個主持人,這個玩家將永遠得到MaxPlayers - 1作為PlayerRef值。

Fusion需要知道一個項目的場景。場景可以在項目構建設置中安排,然後從此置入。

Back To Top

相似之處

雖然人們期望Fusion與PUN有很大的不同,但許多想法實際上是延續的。

PUN中的一個關鍵元素是PhotonView,它有一個直接對應的NetworkObject。在PUN中,NetworkObject只是一個標識符,它依賴於其他組件來提供所需的行為。

Fusion有普通組件的替代物。例如,PhotonRigidbodyView可以用NetworkRigidbody代替,PhotonTransformView變成NetworkTransform。兩者都可以作為2D參數,就像在PUN中一樣。

PhotonAnimatorView可以用NetworkMecanimator代替。對於具體控制角色,Fusion有一個全面的NetworkCharacterController,這是PUN所不提供的。

組件的個別設置是不同的 - 在大多數情況下,默認值是可以接受的。所有在NetworkObject上的組件和其子家族都會被自動找到。如果需要的話,Fusion完全支持在一個層次結構中擁有多個NetworkObject

和PUN一樣,NetworkObjects可以放在場景中,也可以在執行時事件化。在Fusion中,呼叫Runner.Spawn()而不是PhotonNetwork.Instantiate()。要下載場景,用Runner.SetActiveScene()替換PhotonNetwork.LoadLevel()

PUN中其他重要的類是MonoBehaviourPunMonoBehaviourPunCallbacks。在Fusion中,腳本繼承自NetworkBehaviour,以編寫遊戲邏輯和保持狀態。如果它們不會包含遊戲狀態,腳本可以繼承SimulationBehaviour。在PUN呼叫OnPhotonInstantiate()的地方,Fusion使用Spawned()的回調來初始化網路腳本。

PUN中的自定義屬性是帶有setter方法的Hashtables,而Fusion則同步了普通的C#屬性。作為NetworkBehaviour的一部分,自動實現的屬性只需要一個[Networked]屬性就可以成為遊戲狀態的一部分。只有對象的權限可以改變這些值,而且它們會自動在網路上複製,這意味著作弊的可能性更小。

遠程程序呼叫(Rpcs)也得到支持,並被升級到一個新的水平。把屬性[Rpc]放置於在一個方法上,並像呼叫本地方法一樣執行呼叫-Fusion將轉換呼叫以在網路上工作。

Back To Top

參考表

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()


To Document Top