Player
概述
Player
(Player
指令碼、Player
預製件)代表一個在遊戲中的已連線的同儕節點,並且沒有視覺效果。玩家提供存取到常用中繼資料——使用者帳號、暱稱、已選取角色,以及其他應該在Agent
的重新繁衍時存活的資料(在遊戲世界中繁衍的視覺效果代表)。
Agent
(Agent
指令碼、AgentBase
預製件,以及其變體)代表一個遊戲中角色,其由玩家控制。它由GameplayMode
繁衍,並且有Health
、Weapons
,以及其他元件。根據需要來繁衍及取消繁衍角色。
以下圖表展示元件階層為一個執行瀑布:
輸入處理流程
以下圖表描述了輸入的處理及動作的執行:
注意事項:
Frame
:Unity轉譯幀數字,Tick
:Fusion固定的更新刷新數字- 在各個幀的開始時,在
BeforeUpdate()
中收集來自裝置的輸入,並且寫入到Render Input
資料架構(只在輸入授權上執行) - 相同的輸入也被累積到
Cached Input
之中(舉例而言,查看旋轉差異) - 如果已累積差異事件已經足夠大,足以模擬下一個固定刷新(幀103)
- 透過
NetworkEvents.OnInput()
回調來輪詢/取用Cached Input
- 因為已經累積最近的
Render Input
,並且將在跟隨的FixedUpdateNetwork()
中處理,它需要被清除,這樣它不會應用兩次(從FixedUpdateNetwork()
及Render()
) - 玩家輸入在
BeforeTick()
中從Fusion讀取,並且儲存在Fixed Input
(在輸入及狀態授權上執行) - 在其他指令碼中調用
FixedUpdateNetwork()
,使用Fixed Input
以生成遊戲遊玩動作 - 在其他指令碼中調用
Render()
,使用Render Input
以生成遊戲遊玩動作(轉譯已預測的移動,只從FUN完成射擊)
- 透過
- 如果已累積差異時間還不夠大,不足以模擬下一個固定刷新(幀101、102)
- 在其他指令碼中調用
Render()
,使用Render Input
及Cached Input
以生成遊戲遊玩動作(轉譯已預測的移動,查看旋轉)
- 在其他指令碼中調用
這個圖表是一個簡化版本,並且不涵蓋所有邊際案例。如需取得更多資訊,請查看已記錄的程式碼。
查看旋轉平滑
Fusion BR附有一個自訂解決方案,來處理任何情況下的平滑查看旋轉。
以下記錄描述了當使用常用硬體(以125Hz率輪詢的滑鼠)以及高轉譯/輸出的重新整理的頻率(200+ FPS)時,原始輸入的鋸齒化的問題。已轉譯的輸出將總是感覺有點顫抖,不論CPU/GPU有多好皆是如此。
為了修復這個問題,以一個時間戳記來記錄輸入值,然後將目前幀的值計算為一個被定義的時間範圍的平均值(Fusion BR預設使用一個25毫秒的視窗)。這帶來一個非常平滑的感知體驗(在一個高的重新整理的頻率螢幕下的情況更值得注意),但只有非常小的輸入延遲。使用帶有一個較高的取樣率的硬體,讓您可以將平滑視窗減到最小。
以下圖表展示了時間上的 原始 滑鼠差異(底線)及角色查看旋轉(上線):
以下圖表展示了時間上的 已平滑的 滑鼠差異(底線)及角色查看旋轉(上線):
這也有助於減少由不平均的手/滑鼠移動(桌摩擦力、肌肉)所造成的取樣錯誤(桌表面)及微小顫抖。
角色動畫
專案有一個自訂動畫控制器執行方式,其基於可遊玩的API。它提供針對刷新準確動畫評估及動態效能縮放的支援。
以下圖表展示了架構,其類似於Mecanim
:
在代理的物件階層中的動畫圖層及狀態設定:
動畫圖層:
Locomotion
:針對移動的基礎完整主體圖層FullBody
:針對完整主體動作的覆寫圖層,與運動混合LowerBody
:針對下層主體角色迴轉的覆寫圖層UpperBody
:針對上層主體動作的覆寫圖層,通常與運動混合Shoot
:針對手動作(射擊)的覆寫圖層,通常與運動混合Look
:針對向上及向下看的附加的上層主體圖層
取決於動畫控制器複雜度,評估200名玩家可能很容易成為伺服器上的一個瓶頸。為了達到更好的效能,伺服器允許基於已連線玩家計數,每隔n幀來進行交錯式PlayableGraph
評估。仍然在每個幀來計算所有重要的屬性,比如圖層或狀態重量。以下表格展示了針對一個交錯式評估的規則。
已連線玩家 | 可遊玩圖表評估 |
---|---|
大於150 | 每個第4幀 |
大於100 | 每個第3幀 |
大於50 | 每個第2幀 |
其他 | 每一幀 |
角色控制器
針對移動,這個範例使用Fusion KCC(一個進階的運動學的角色控制器附加元件)。它是一個泛型低等級的角色控制器,其強力專注於效能、遊戲遊玩互動,及客製化。
Fusion KCC功能:
- 控制位置及查看旋轉(繞X軸旋轉+繞Y軸旋轉)
- 由膠囊碰撞器定義的形狀
- 針對本機玩家的已預測的轉譯移動
- 結合的動態的(類似物理的)及運動學的(不真實的)基於速度的移動
- 外部力量——來自爆炸、移動平台…
- 移動加速度及摩擦力
- 針對客製化的進階的KCC處理器管線(速度及方向覆寫、封鎖)
- 針對預設屬性(半徑、高度、質量…)的開箱即用的網路同步,其他屬性的選擇性的同步
- 自動碰撞器篩選及忽略清單
- CCD(持續性碰撞偵測)
- 碰撞回調
- 支援地面貼齊及台階高度
- 支援本機模式(沒有網路流量)
- 最佳化的網路及效能
- 獨立式平台,對於行動裝置友善
- 基本地支援逐幀偵錯——編輯器繪製及記錄
當一名玩家的健康低於一個特定閾值時,並且該玩家目前不在戰鬥中時,將開始自動治療,並且開始補充玩家的健康。
噴射背包
噴射背包提供了在排放燃料的同時飛行及在關卡中快速地導航的能力。可以透過拾取在物品盒中找到的燃料罐來補充燃料。
噴射背包的狀態由Jetpack
指令碼處理,該指令碼處理燃料消耗、螺旋槳、聲音,及開啟/關閉狀態。由JetpackKCCProcessor
處理在天空中的實際的移動。這個指令碼覆寫KCC速度及抑制預設行為。
觀眾模式
當玩家被殲滅或太晚加入遊戲,他們進入觀眾模式。在觀眾模式,玩家可以從另一名玩家的角度來觀察遊戲。在程式碼中,這實際上處理方式相當簡單。相機及UI的行為是基於在SceneContext
中指派的ObservedAgent
。ObservedAgent
可以是本機玩家代理或旁觀玩家代理。