This document is about: FUSION 2
SWITCH TO

Architecture

玩家

Player指令碼處理基本功能,如移動和武器控制的輸入處理。它還決定了正確玩家視覺表示的可見性,在本機玩家的第一人稱視覺(僅手拿武器)和本機玩家看到的其他玩家的第三人稱視覺(全身角色)之間切換。第三人稱動畫也在此指令碼中進行控制。

玩家輸入由PlayerInput類別處理,該類別累積來自裝置(鍵盤/滑鼠)的輸入。然後,透過標準Fusion OnInput回調來消耗累積的輸入。

玩家運行狀況存儲在Health指令碼中。在遊戲過程中,玩家在生成後會有一段短暫的永生期。如果玩家使用武器開火,永生將立即停止。

所有玩家都能聽到 Simple FPS 中的腳步聲,而本機玩家聽到自己的腳步聲稍微安靜一些。

SimpleKCC(簡單運動學角色控制器)元件解決玩家的移動和碰撞問題。有關更多資訊,請參閱Simple KCC

BodyHitbox是標準Fusion Hitbox元件的下層,用於為不同的身體部位執行具有不同傷害修改器的命中框。例如,頭部受到雙重傷害,而腿部受到減少的傷害。值得注意的是,為了簡單起見,玩家命中框的位置不受動畫的影響,它們以靜態姿勢設定,這代表了最常見的玩家姿勢——手持武器。

gizmos showcasing hit boxes

有關Fusion中動畫的更多資訊,請參閱Fusion操作手冊中的動畫頁面與動畫技術範例。請注意,這些範例是使用Fusion V1組建的。

武器

Weapons指令碼處理遊戲中武器的一般功能,包含對所有玩家武器的參照,並允許進行射擊和重新裝彈等操作。所有武器都已經包含在玩家預製件的層次結構中,當遊戲中只有少數武器時,這是一種簡單的方法。

Simple FPS 範例包含命中掃描武器,該武器以指定的最大距離發射光線投射,允許立即進行命中評估。儘管拋射物不會隨著時間的推移而物理上傳播,但該範例採用了虛擬拋射物視覺效果(由ProjectileVisual指令碼處理),產生了穿過有彈痕的快速黃色子彈的錯覺。該彈痕準確地表示光線投射的方向和終點。

assault rifle shooting

對於每一次拋射物發射,一個小的資料結構ProjectileData存儲在Weapon指令碼內的陣列中。該陣列是聯網的,起到迴圈資料緩衝區的作用,這意味著當到達陣列的末端時,拋射物會從頭開始重新存儲。使用此陣列,可以向所有客戶端發射拋射物,確保高效的拋射物網路。

C#

private struct ProjectileData : INetworkStruct
{
    public Vector3     HitPosition;
    public Vector3     HitNormal;
    public NetworkBool ShowHitEffect;
}

為了更深入地瞭解拋射物及其網路,可以在拋射物基礎拋射物進階範例中找到全面的說明。請注意,這些範例是使用Fusion V1組建的。

拾取物

範例中有兩種類型的拾取物:武器拾取物和健康拾取物。當玩家走過這兩個拾取物時,都會自動收集它。HealthPickup會立即對玩家進行指定數量的治療,恢復他們的健康。WeaponPickup會授予玩家一件新武器,或者在玩家已經獲得特定武器的情況下重新裝填彈藥。

health pickup

遊戲遊玩

Gameplay指令碼是遊戲的中心指令碼,處理 Simple FPS 中遊戲體驗的各個方面。它負責玩家生成、計算玩家分數以及管理不同遊戲狀態之間的轉換。

Simple FPS 中的遊戲模式是一種經典的死亡競賽,玩家在其中進行戰鬥以消滅對方。被淘汰後,玩家在死亡後一定時間後重生。比賽在時間結束時結束,擊殺次數最多的玩家獲勝。

遊戲系統在幾個狀態下運行,包括SkirmishRunningFinished。在Skirmish狀態下,單人玩家可以在沒有任何時間限制的情況下自由探索競技場。一旦第二名玩家連線到遊戲,遊戲將切換到Running狀態,比賽計時器將啟動。最後,當比賽結束時達到Finished狀態,並顯示結果。

連線的玩家由Gameplay指令碼使用玩家資料字典(複製到所有玩家)進行管理。在這個字典中,每個玩家都與PlayerData資料結構相關聯,該資料結構保存了關於玩家的重要資訊。PlayerData包括玩家的暱稱、他們累積的擊殺人數以及他們的當前狀態(無論他們是否活著)等詳細資訊。

C#

public struct PlayerData : INetworkStruct
{
    [Networked, Capacity(24)]
    public string    Nickname { get => default; set {} }
    public PlayerRef PlayerRef;
    public int       Kills;
    public int       Deaths;
    public int       LastKillTick;
    public int       StatisticPosition;
    public bool      IsAlive;
    public bool      IsConnected;
}

PlayerData資料結構允許在整個遊戲體驗中高效追蹤玩家及其統計資料。

UI

Simple FPS 中的使用者介面以直接的方式被處理,不依賴於任何特定的UI框架。負責UI管理的主要指令碼是GameUI指令碼。它啟用了在遊戲過程中應該可見的適當的UI遊戲物件。此外,GameUI指令碼維護對其他UI元素的參照,並在玩家生成時更新玩家UI。

scoreboard ui

除了一般的UI處理外,遊戲還發佈了遊戲公告,為玩家提供重要的反饋。這些公告,如「線索遺失」或「線索已拿取」,由負責遊戲資訊面板的UIGameplayInfo指令碼管理。該指令碼根據玩家統計資料的變化啟用特定的公告遊戲物件,確保在適當的時間向玩家顯示相關消息。

Simple FPS 中的UI執行方式注重簡單性和功能性,確保玩家在不需要複雜UI框架的情況下接收必要的資訊。

Back to top