Karts
概述
Fusion Kart範例展示了如何使用伺服器權威域及客戶端預測模型來製作一個賽車遊戲的方法,其中玩家可以使用房間識別碼,來建立和加入房間。
在您開始之前
為了運行這個範例,首先先在PhotonEngine儀表板建立一個Fusion應用程式帳號,然後將其貼上到即時設定(可從Fusion功能表中進入)中的App Id Fusion
欄位中。可以從Fusion選單Fusion > Realtime Settings
中選擇Photon應用程式設定資產。
下載
版本 | 發佈日期 | 下載 | ||
---|---|---|---|---|
1.1.7 | 2023年6月21日 | Fusion卡丁車1.1.7組建198 |
聚焦點
此專案有一個完整的遊戲迴圈,允許最多8名使用者加入彼此並且展開賽車競賽以決定勝負,或是在沒有計時器且無限圈數的賽道的狀況下一起練習。主要功能包含:
- 兩種不同的模式(競賽和練習)
- 兩種賽車賽道
- 有著不同的統計資料的卡丁車
- 共享物品,比如加速/香蕉障礙、錢幣
- 基於物品系統的可編寫指令碼的物件,這是可擴張的。
- 使用代碼以主機端的身份設立房間來讓客戶端加入,和處理邊緣案件如「未找到房間」、「房間已滿」、「房間目前處於遊戲階段之中」及其他問題。
資料夾結構
主要的指令碼資料夾/Scripts
有子資料夾包含Networking
及Fusion Helpers
,這些與網路特定元件有關,而其他子資料夾包含不同的介面及管理者元件等等,這些元件負責管理遊戲遊玩。
遊戲啟動器
GameLauncher.cs
層級負責將使用者設定成Host
或Client
,這取決於他們在遊戲模式選單中選擇的選項。它與使用者介面有關,而且負責管理諸如生成玩家、取消生成玩家,以及關閉等等的事情。
第一次啟動
當第一次啟動範例時,將提示使用者來提供一個暱稱(如果需要的話)並選擇一個區。在任何時間都可以從選項選單中存取這個畫面。提供的暱稱將使用於三個地方:
- 當使用者建立或加入一個房間,將以他們提供的暱稱來具現化一個使用者介面項目。
- 在世界空間畫布裡,在賽車競賽時暱稱將被具現化在各個卡丁車上方。
- 在賽車競賽結束時的結果畫面中,暱稱將用於展示第一名、第二名和第三名等等。
房間
Fusion Karts範例使用房間,這是一個在Photon Cloud遊戲階段之上的抽象。對於這個範例而言,最多可以有8名使用者同時連接到房間。這個人數上限可以從1到8進行自由設定。
建立一個房間
CreateGameUI
指令碼儲存一個畫布階層中找到的Create Room Screen
下的各種使用者介面元素的參照。在Room Code
的輸入欄位將針對此房間設定一個帳號。當使用者試著加入大廳,將透過相似的輸入欄位提示他們,而且必須提供可識別的代碼。玩家計數的滑桿允許主機端透過設定CreateGameUI
指令碼中的ServerInfo.MaxUsers
來輸入房間的使用者數量。在範例中包含兩種不同的遊戲模式,而且也有兩種不同的賽道,可在建立房間時透過下列方法進行選擇,而這將在ServerInfo.cs
中設定適當的整數值:
C#
public void SetGameType(int gameType)
{
ServerInfo.GameMode = gameType;
}
public void SetTrack(int trackId)
{
ServerInfo.TrackId = trackId;
trackImage.sprite = ResourceManager.Instance.tracks[trackId].trackIcon;
}
加入一個房間
為了加入一個房間,使用者必須提供一個房間代碼。如果使用者試圖加入一個不存在的房間,將會顯示使用者介面的訊息以提示他們。使用者無法加入一個目前正在遊戲階段的房間,而且也必須確保他們與他們嘗試連接的房間處於同一個區裡面。JoinGameUI
指令碼有一個提供所需代碼的輸入欄位的參照。如果沒有在輸入欄位中輸入任何文字,則將無法點擊確認按鍵,因為不可能在沒有代碼的情況下建立一個房間。
C#
private void SetLobbyName(string lobby)
{
ClientInfo.LobbyName = lobby;
confirmButton.interactable = !string.IsNullOrEmpty(lobby);
}
準備就緒
各個玩家的準備狀態都會顯示在玩家列表中的他們的暱稱旁邊,已經準備好的玩家會以綠色標記來註明。所有玩家必須先準備就緒之後,才會允許賽車競賽開始。在LobbyUI.cs
中的EnsureAllPlayersReady
功能由各個RoomPlayer
網路行為的PlayerChanged
事件所支持,這些網路行為的IsReady
已連接網路屬性透過Fusion的Networked
屬性所提供的OnChanged
回調來啟動。當被調用之後,此功能將檢查各個RoomPlayer
擁有其各自的 IsReady
的布林值設定為真,然後以sceneIndex
參數調用LevelManager.LoadTrack
,該參數針對所選賽道設定為相對應的指標。這個方法設定了Fusion啟用中的場景,而這反過來啟動了已註冊的場景物件提供者。
處理輸入
這個範例使用新的輸入系統,並且調控InputAction
層級以處理針對鍵盤及遊戲搖桿兩者的控制的支援。新的輸入系統讓支援各種控制器變得更簡單。這裡是鍵盤及搖桿的支援細節,其中包含觸覺回饋功能。
鍵盤
- A和D或向左和向右箭頭鍵以轉向
- W或向上箭頭鍵以加速
- S或向下箭頭鍵以倒退
- Alt鍵以向後看
- 空白鍵以跳躍/漂移
- Shift鍵以使用喇叭/物品
遊戲搖桿
- 左類比搖桿以轉向
- 下按鈕以加速
- 右按鈕以倒退
- 十字方向鍵下方鍵以向後看
- 右扳機鍵以跳躍/漂移
- 左扳機鍵以使用喇叭/物品
(支援控制器聲音)
卡丁車
卡丁車由許多單獨的行為所組成,所有行為都源自於KartComponent
,並帶有一個KartEntity
作為他們之間的中樞及提供次要部分協助。元件有:
KartAnimator
——與Animator
元件有關,視覺元素例如粒子系統和軌跡,以及播放動畫和效果的方法。KartAudio
——與卡丁車上的各個常設性音源有關,而且負責引擎的音調和音量,以及播放漂移的音效。KartCamera
——控制相機視角、視野範圍,以及速度線粒子系統KartController
——大多數的邏輯和網路都發生於此;加速、轉向、漂移和增壓加速,以及旋轉輪胎和朝向道路方向。KartInput
——檢查本地輸入,以及處理InputAction
啟用/停用及回調KartLapController
——處理卡丁車目前的圈數及檢查點KartItemController
——當按下使用物品按鈕時,處理行為
此外,KartEntity
與GameUI
抬頭顯示器介面有關,其本身不是元件結構的一部分,但是提供一個方法來向外反映卡丁車的狀態給玩家。
拾取物
拾取物在這個範例中是一個用語,以形容一組廣泛定義的實體,卡丁車可以與這些實體進行互動。所有拾取物都執行ICollidable
介面,而且ICollidable.Collide
執行方式將指示特定行為。KartEntity
負責啟動互動,這是在OnTriggerStay
方法中所執行,並且向其傳遞對KartEntity
執行個體的參照。對於OnTriggerStay
的使用是因為在網路的環境下OnTriggerEnter
功能的不太穩定的本質。
- 錢幣:錢幣在遊戲進行中沒有功能上的作用,但是有著展示一個基本的實體的功能,這個實體能夠由玩家所收集,之後消失,然後加入到使用者介面顯示的計數器中。
- 物品箱:雖然物品箱本身並不是拾取物,但是它們也執行
ICollidable
以輔助它們的行為。當卡丁車碰到物品箱,物品箱負責將一個Powerup
分配給卡丁車,這是透過KartEntity.SetHeldItem
方法進行。
強化物品
強化物品是一種特別的拾取物,可從物品箱獲得,玩家可根據自己的判斷在收集之後的任意時間內使用。強化物品由兩種元件組成;Powerup
指令碼物件,以及抽象SpawnedPowerup
層級。
SpawnedPowerup
繼承ICollidable
並虛擬地執行ICollidable.Collide
,以便針對衍生層級作為一個選擇性的執行方式。一個虛擬的Init
方法也將被提供,作為選擇性的初始化方式,其由Powerup.Use
方法生成後將立即被啟動。
- 香蕉:使用之後,卡丁車後方將掉落一個香蕉作為一個物理實體,這將成為玩家的一個危險。
BananaPowerup
覆寫SpawnedPowerup.Collide
以讓碰到香蕉的卡丁車旋轉失控。 - 增壓加速:提供立即性的第2等級增壓加速。增壓加速的強化物品沒有像香蕉一樣的物理實體,一旦提供增壓加速之後就立即消失。