Further Steps
此示例Unity項目和原始程式碼可用於深入瞭解如何使用Quantum SDK構建 簡單的2D多人遊戲。此頁面將提供更多資源、連結和資訊,以幫助更好地理解架構的各個部分。
雖然這只是一個簡單的遊戲,但這個專案已經相當複雜了。要按照關於如何創建簡單核心遊戲迴圈的分步教程進行操作,Asteroids教學更適合。
關於什麼是Quantum SDK以及什麼是確定性/復原的介紹可以在Quantum概述中找到。
要瞭解SDK內容是如何構建的,請閱讀Quantum SDK和項目佈局。
Quantum基礎
本節將快速介紹從哪裡開始探索Quantum遊戲的基本方面,特別是Platform Shooter 2D示例。
QuantumGameScene
包含QuantumMap
和SceneColliders
遊戲物件,它們後來代表了Quantum模擬的一部分。
例如,透過在地圖檢查器中按Bake
,將靜態碰撞器內嵌成該場景的Quantum地圖。
當按下Play
時,QuantumDebugRunner
遊戲物件用於在當前場景中啟動Quantum模擬。它包含RuntimeConfig
內容,地圖和其他重要的Quantum配置從這裡開始連結。
例如,SystemsConfig
,它引用了PlatformShooter2DSystemsConfig
資產。該檔案包括將要啟動的所有Quantum系統。
當透過遊戲選單場景載入場景時,調試運行器會自行禁用。
Assets/QuantumUser/Simulation
資料夾的內容包括所有遊戲模擬源和QTN檔案(Quantum程式碼生成)。它使用Unity的asmref
以最終新增到模擬dll中。
當遊戲在QuantumEntityViewUpdater
遊戲物件下運行時,會生成Quantum實體視圖。例如,玩家角色實體(在UI中選擇後)。
要選擇的兩個實體原型是Character_Boy_Variant
及Character_Girl_Variant
資產。
PlayerSystem
類別控制如何在運行時根據使用ISignalOnPlayerAdded
訊號加入的新玩家創建化身。
示例功能實現
本節將更詳細地解釋所選功能的實現。
新的二維運動學角色控制器

2D KCC是使用膠囊碰撞器的新實現,未來也將作為外掛程式提供,就像3D KCC外掛程式一樣。
它也不同於我們即將棄用的在機KCC。
它的設計讓人很容易上手任何2D平台遊戲,也包含一套全面的生產級功能。它的預構建選項可以透過KCC2DConfig資產進行調整,以實現多種遊戲風格,而無需修改其程式碼。
這是一份現時所包含內容的非詳盡清單:
- 可配置的膠囊形狀和LayerMask
- 預求解器、後求解器碰撞和觸發器的回調
- 自我調整多步CCD:全過程的次數是動態的,取決於速度和膠囊的半徑
- 反覆運算穿透求解器,每次反覆運算都有動態窄相位檢查
- 土狼時間、輸入緩衝區、雙跳、壁跳和破折號:所有參數均可切換和調整
- 坡度、空氣控制、空氣阻力和向下重力倍增器(重量控制+按鈕控制的跳躍高度)
- 有限狀態機(自由落體、地面、斜坡、牆壁、衝刺、跳躍、雙跳躍)
- UI/視圖果汁的預構建事件(跳躍、著陸等)

基於差量運動的射線拋射物

在不使用CCD的情况下,對子彈使用增量光線投射是防止快速子彈穿過牆壁的好方法。檢查基於方向和速度的光線投射,以預測下一個子彈運動並檢測命中。
C#
Physics2D.HitCollection hits = frame.Physics2D.LinecastAll(bulletTransform->Position, futurePosition, -1, QueryOptions.HitAll | QueryOptions.ComputeDetailedInfo);
for (int i = 0; i < hits.Count; i++)
{
var entity = hits[i].Entity;
...
if (entity == EntityRef.None)
{
bulletTransform->Position = hits[i].Point;
// Applies polymorphic behavior on the bullet action
data.BulletAction(frame, bullet, EntityRef.None);
return true;
}
}
遊戲中角色選擇大廳
遊戲中的角色選擇是在遊戲前創建大廳場景的替代方案。在沒有權威服務器的情况下,使用Photon Realtime房間內容控制大廳的所有邊緣情况(併發團隊選擇、超時等)通常很難處理。
在模擬中運行角色或團隊選擇不易出錯且安全。例如,團隊分佈的最終決定權是基於確定性模擬的,不能被欺騙。
此示例允許模擬開始,同時將玩家新增到遊戲中延後到在UI中選擇角色之後。
CharacterSelectionUIController.cs
處理UI,最後創建一個RuntimePlayer
物件並請求新增玩家。使用AddPlayer webhook,可以透過自訂遊戲資料後端來輕鬆驗證RuntimePlayer
配置。
C#
// Create player data with the selected character.
RuntimePlayer playerData = new RuntimePlayer();
playerData.PlayerAvatar = characterPrototype;
// Attempt to set the player's nickname from the menu.
var menu =
FindAnyObjectByType(typeof(Quantum.Menu.QuantumMenuUIController)) as Quantum.Menu.QuantumMenuUIController;
if (menu != null)
{
playerData.PlayerNickname = menu.ConnectArgs.Username;
}
// Add the player to the game.
runner.Game.AddPlayer(playerData);
在伺服器確認新增玩家請求後,模擬中的PlayerSystem.cs
指令碼會監聽ISignalOnPlayerAdded
訊號以創建玩家化身。
C#
EntityRef character = frame.Create(prototypeAsset);
PlayerLink* playerLink = frame.Unsafe.GetPointer<PlayerLink>(character);
playerLink->PlayerRef = player;
RespawnHelper.RespawnRobot(frame, character);

定制QuantumMenu

遊戲示例使用Quantum原型選單定制和預製變體來創建Quantum示例選單的不同外觀,同時仍然相容SDK升級。
這樣的定制可以快速用於示例原型,並給出如何創建自己的線上選單的印象。
