Asteroids Advanced
概述
主機模式
拓撲。Fusion Asteroids Advanced 範例是原始的PUN Asteroids示範版本在PC版Unity 2021.3(Windows作業系統)下的再製版,其使用Fusion的一些更先進的功能:
- 主機移轉:當主機離開遊戲階段時,網路物件的所有權被移轉到其中一個剩餘的客戶端。
- 可定址:太空船及主要遊戲場景都是可定址的。
- 延遲補償:子彈是使用延遲補償射線,來檢查與小行星的碰撞。
- 自訂遊戲物件處理:子彈不是網路物件,但是使用一個較簡單的已連網的架構,來管理它們的狀態,及使用一個自訂管理器,來將該狀態關聯到本機遊戲物件。
- 自訂場景管理器:處理可定址所特別需要。
在您開始之前
為了運行範例,首先先在PhotonEngine儀表板建立一個Fusion應用程式帳號,然後將其貼上到即時設定(可從Fusion選單中進入)中的App Id Fusion
欄位中。
這個示例使用Unity的可定址資產,所以在您啟動範例之前,您需要組建這些事項:
前往Window
| AssetManagement
| Addressables
| Groups
以開啟可定址資產的資產管理視窗。
然後找到Build
按鈕並且選擇New Build
| Default Build Script
當組建完成時,您可以載入Launch
場景並且按下Play
。
下載
版本 | 發佈日期 | 下載 | |
---|---|---|---|
1.1.10 | Sep 11, 2024 | Fusion Asteroids Host Advanced 1.1.10 Build 654 |
應用程式流程
AsteroidsAdvanced-Menu
場景允許玩家擔任一個遊戲的主機或加入一個其他主機的運行中的遊戲階段。當遊戲階段已經開始的時候,將具現化Asteroids遊戲的一個執行個體,並且載入AsteroidsAdvanced-Game
場景。客戶端隨後將等待主機來開始遊戲。
這個初始設定是完全由選單資料夾中的程式碼來處理。
AsteroidsGame
只負責核心遊戲階段處理。它不建立任何額外的網路狀態或物件內,而是已載入地圖含有一個GameStateController
,其管理遊戲迴圈並且繁衍所需的物件——特別是玩家太空船及小行星,雖然後者被委派到AsteroidSpawner
。
雖然遊戲正在運行,SpaceshipController
處理從玩家收集輸入,並且在FixedUpdateNetwork
中預測/應用該輸入。各個太空船也保持其自己的子彈清單,作為一個「簡單的」網路物件的陣列,以及一個SimpleObjectCollection
中的關聯的本機遊戲物件。
當時間過完或是一位玩家死亡3次,遊戲結束且誰有更多點數的話就獲勝。可以說,這是一種奇怪的遊戲遊玩形式,因為一位領先的玩家可以飛入一個小行星而獲勝,但這個不是這個示例的重點。
如果主機中斷連線的情形,MigrationManager
接手並且初始化主機移轉流程。基本上,這允許一位先前的客戶端成為新的主機並且獲得一個先前儲存的網路快照,其中它可以還原原始遊戲狀態的選擇性部分。在這個示例中,SpaceShipController
及GameStateController
執行個體被還原,因為只有這兩個是衍生自MigrationBehaviour
(請注意,這是本範例中專門使用的慣例,而不是一個一般性的Fusion功能)。
移轉管理器
主機移轉是一個Fusion功能,當原始主機離開時,其允許一個客戶端針對一個網路遊戲階段來繼承主機責任。MigrationManager
嘗試簡單化這個流程,方法是透過引入一些限制及慣例。
具體而言,為了讓一個網路物件被移轉到新的主機,它必須明確地有一個衍生自MigrationBehaviour
的元件。
MigrationBehaviour
擴展NetworkBehaviour
,多了一些新的屬性及一個新的回調,其在一個物件已經被移轉時被調用(合適地名為Migrated
)。
當一個物件已經再次被繁衍並且讓其狀態被儲存,一個物件被「移轉」,但同時,可能更重要的是,最初有物件的輸入授權的玩家已經重新連線到新的已移轉遊戲階段,並且是再一次可以控制物件。
當使用MigrationManager
時需要記住的主要事情是,被移轉的物件在它們的輸入授權重新連線之前很早就被重新生成,所以您一般希望延遲被移轉物件的啟用,直到已經調用Migrated
。
為了簡化這個,To simplify this, the default implementation if MigrationBehaviour
的預設執行方式是,如果移轉正在擱置中,則停用Spawned
中的遊戲物件,如果不是擱置中,則立即調用Migrated
。Migrated
的預設執行方法將隨後啟用遊戲物件。
因此,大多數衍生類別可以從Spawned
到Migrated
來移動它們的程式碼,但是請記得從您已覆寫的執行方法來調用base.Migrated
。
簡單物件集合
SimpleObjectCollection
是一個針對已連線物件的輕量包裝函式,其不需要在網路上個別地被識別,並且因此不需要針對各個本機遊戲物件而有一個完整的網路物件。
集合有兩個部分:
- 已連線狀態(一個執行
ISimpleState
的架構),其是一個特別的INetworkStruct
,其含有所有在網路之間需要被同步的事情。在這個範例中,這是BulletState
。 - 一個執行
ISimpleObject
的單行為,其在視覺上代表狀態。在這個範例中,這是BulletBehaviour
,請注意,BulletBehaviour
不 是一個NetworkBehaviour
SimpleObjectCollection
將在狀態架構上調用SimpleFixedUpdateNetwork
,以從一個刷新推進狀態到下一個刷新,並且它將在單行為上調用SimpleRender
以更新視覺。
轉譯方法與常見的NetworkBehaviour
所使用的方法稍微不同,因為它提供了狀態的兩個副本,以及兩個副本之間的標準化位移,這兩個副本應該代表內插值。如果您希望快照準確,只需使用to
值並可忽略其他東西。