Fusion Golf
概述
Fusion Golf 範例展示了如何使用伺服器授權的客戶端預測模型,建立一個以物理為重點的街機高爾夫競賽遊戲。它具有遊戲階段瀏覽器以及透過房間代碼直接連線的功能。主機端可以修改各種遊戲設定,如每個洞的最長時間、最大擊球次數、玩家是否會相互碰撞,以及遊戲階段是否在遊戲階段瀏覽器中可見。範例有一個18洞的球場,裡面有各種物理驅動的物件,如大炮、旋轉器、助推隧道和電梯平台。
Fusion Golf 最初是使用Fusion 1.0建立的;然而,它已經移植到Fusion 2.0,但保留了Fusion 1.0版本的大部分功能。
在您開始之前
為了運行範例,首先在Photon引擎儀表板中建立一個Fusion應用程式帳號,然後將它貼上到Real Time設定(可從Fusion選單到達)中的App Id Fusion
欄位。然後在Scenes
資料夾中載入Menu
場景並且按下Play
。
下載
版本 | 發佈日期 | 下載 | |
---|---|---|---|
2.0.1 | May 27, 2024 | Fusion Golf 2.0.1 Build 557 |
聚焦點
- 完全已連網的遊戲狀態系統(賽前、介紹、比賽、結尾和賽後)
- 觀看其他玩家
- 可自訂的遊戲設定(碰撞、洞數、最大擊球次數、最長時間)
- 世界中物件的同步狀態
- 大廳瀏覽器(以及將房間設為私人房間的功能)
- 以物理為重點的物體(大炮、旋轉器、電梯平台、助推隧道)
- 可自訂的玩家視覺效果(RGB滑塊)
- 區域設置、暱稱設定、圖形選項
專案
資料夾架構
主指令碼資料夾/Scripts
有一個子資料夾Networking
,其含有主要功能是作為Fusion介面的指令碼:
值得注意的指令碼:
玩家登錄
玩家登錄儲存對房間中每個玩家的參照,並提供對一個或多個玩家進行計數、選擇和執行動作的公用程式方法。公用程式函數的預設行為是忽略作為觀眾的玩家,但如果includeSpectators
參數為真,則將對完整的玩家集合進行操作。
觀眾
觀眾是明確選擇觀看比賽而不是參與比賽的玩家。觀眾的PlayerObject
永遠不會被指派Controller
。
遊戲狀態
遊戲邏輯的流程和行為由GameState
網路行為。GameState
定義了遊戲的階段的列舉,已連網StateMachine
屬性將其用作其狀態。
StateMachine<T>
定義了一個具有3個欄位的StateHooks
類別:onEnter
、onExit
和onUpdate
。當使用StateMachine
類別時,每個列舉狀態都可能有StateHooks
來定義在進入、退出和主動停留在該狀態時會發生什麼。
進入一場遊戲
使用者可以使用遊戲階段瀏覽器或直接透過遊戲階段代碼主持或加入遊戲階段。如果使用者選擇主持,輸入遊戲階段代碼是可選的,因為如果保留為空,它將自動生成。一旦進入遊戲階段,代碼將顯示在畫面頂部。
The session code is accessed via:
runner.SessionInfo.Name
地區選擇
在選擇主持或加入之前,系統會向使用者顯示一個下拉式選單,以選擇要使用的Photon Cloud地區。下拉式選單的選項是根據地區文檔選擇的。
對戰配對器
主持、加入和遊戲階段瀏覽器都由Matchmaker
類別處理。它充當NetworkRunner.StartGame
方法的包裝函式,並且在出現連線錯誤的情况下,將錯誤轉發到DisconnectUI
以顯示給使用者。
處理輸入
輸入由PlayerInputBehaviour.cs
輪詢到自訂的INetworkInput
架構PlayerInput
中。此範例中的輸入僅包括按一下和移動滑鼠。
PlayerInput
相對簡單,僅包含3個欄位:
isDragging
- 玩家是否按住滑鼠按鈕dragDelta
- 玩家的滑鼠被向下拖動了多少yaw
- 玩家面對的Angle
這個資料由Putter
玩家指令碼處理,除了投球外,還有助於本機玩家和觀眾看到適當的UI。
玩家
玩家以2部分處理:
PlayerObject
- 包含與該物件相關聯的PlayerRef
值、對玩家的控制器(Putter
)的參照、房間中的索引、暱稱、所選顏色以及與得分相關的遊戲遊玩資料Putter
- 負責回應物理和UI的輸入
移轉注意事項
如前所述,Fusion Golf 從Fusion 1.0移轉到Fusion 2.0。您可以在此閱讀更多關於從Fusion 1.0移轉到Fusion 2.0的資訊。以下是在移轉過程中所做的一些更改。
- 物理:Fusion 2.0使用了一個單獨的物理的附加元件。匯入之後,遊戲中使用的
NetworkRunner
現在需要RunnerSimulatePhysics3D
元件。由於此遊戲大量依賴物理模擬,因此需要注意的是,此元件的Client Physics Simulation
屬性應設定為「始終模擬」,如圖所示:
此外,任何NetworkRigidbody
元件都應替換為NetworkRigidbody3D
。如圖所示,此範例中的Sync Parent
參數應設定為偽:
- 指令碼與原型:Fusion 1.0中呈現的以下資料夾
Assets/Fusion/Scripts
包含各種原型工具,如PlayerSpawnerPrototype
,在Fusion 2.0中已不存在。雖然該目錄中的許多指令碼都可以升級,但其中許多都是多餘的、過於複雜的和/或不必要的,因此這些項目已從該範例中刪除。唯一需要建立的新類別是PlayerSpawner
,這是一個附加在主NetworkRunner
預製件上的SimulationBehaviour
,用於在玩家加入時處理NetworkObject
的生成,並在玩家離開時取消生成:
C#
public class PlayerSpawner : SimulationBehaviour, IPlayerJoined, IPlayerLeft
{
public NetworkObject playerObject;
public void PlayerJoined(PlayerRef player)
{
// In a ClientServer topology, only the server can spawn players.
if (Runner.Topology == Topologies.ClientServer)
{
if (Runner.CanSpawn)
{
Runner.Spawn(playerObject, inputAuthority: player);
}
}
// In a shared topology, every player can spawn, however, we only want the local player to spawn their own player
else if (Runner.LocalPlayer == player)
{
Runner.Spawn(playerObject, inputAuthority: player);
}
}
public void PlayerLeft(PlayerRef player)
{
bool canDespawn = (Runner.Topology == Topologies.ClientServer && Runner.IsServer) ||
(Runner.Topology == Topologies.Shared && Runner.IsSharedModeMasterClient);
if (canDespawn)
{
PlayerObject leavingPlayer = PlayerRegistry.GetPlayer(player);
Runner.Despawn(leavingPlayer.Object);
}
}
}
FixedUpdateNetwork
:在Fusion 2.0中,FixedUpdateNetwork
不在代理上運行。這可能會導致移轉時出現一些奇怪的行為。例如,在這個範例中,GameState
存在一些問題,它只在主機端上執行狀態轉換。在其Spawned
方法的末尾添加了以下行:
C#
...
// Ensures that FixedUpdateNetwork is called for all proxies.
Runner.SetIsSimulated(Object, true);
...
- 生成:在Fusion 1.0中,如果玩家試圖調用
Runner.Spawn
,但它們沒有這樣做的授權——比如遊戲中使用ClientServer
拓撲的客戶端——生成將無聲地失敗。在Fusion 2.0中,當客戶端無法生成物件時,嘗試生成物件會導致擲出異常,並可能導致各種問題。在此範例中,在調用Runner.Spawn
之前,預先使用Runner.CanSpawn
來完成一個檢查,以防止出現此錯誤。
第三方資產
Golf範例包括由其各自創作者提供的若干資產。您可以在其各自的網站上為自己的專案獲取完整的套裝軟體:
- BOXOPHOBIC的Skybox擴展著色器
- Kenney的Kenney's迷你高爾夫套件
- Erik Roystan Ross的卡通水著色器
- Broken Vector的低多邊形懸崖套件
- Broken Vector的低多邊形樹套件
- Milena B Design的Fredoka One字體
重要事項:要在商業專案中使用它們,需要從相應的創作者那裡購買授權。
Back to top