Photon Engine 多人射擊遊戲製作 Part. 2

本教學將以前面製作的多人連線為基礎,搭配 Toon Soldiers 資源製作玩家操作的遊戲角色。

先從 Asset Store / Package Manager 將 Toon Soldiers 與 Unity Particle Pack 匯入專案。

+ Particle Pack

建立一個用於製作玩家角色的場景,開啟 [ Toon_Soldiers > ToonSoldiers_2 > ...... ] 資料夾。

將 ToonSoldiers_Infantry 預製物件拖曳到場景的原點位置,這是步兵角色預製物件與武器的結構。

這是機槍兵角色 ( ToonSoldiers_Infantry ) 預製物件與武器的結構。

從上面的 2 個預製物件可以發現,不同的角色只需要開啟不同的子物件,再換上不同的武器即可。

加入膠囊碰撞器與 Rigidbody 剛體元件,凍結旋轉。

 

 

加入士兵的動作,建立 Animator Controller 動作控制器。

開啟 Player Animator Controller 動畫控制器,加入待機、走路、跑步、射擊、投手榴彈…等動作。

開啟 [ ... > animation > Infantry ] 資料夾,可找到步兵 ( Infantry ) 的動作: Infantry_combat_idle 待機。

開啟 [ ... > animation > Infantry > root_motion ] 資料夾,收錄步兵 Root Motion 版本的走路、跑步、衝刺動作。

開啟 [ ... > animation > Infantry > movement ] 資料夾,收錄步兵 In Place 版本的走路、跑步、衝刺動作。

 

製作武器射擊功能

先製作子彈,建立空物件並重新命名為 "Bullet",套用 Rigidbody 剛體元件。

建立一個 Bullet.cs 腳本,套用到 Bullet 物件,程式碼如下:

加上子彈的外觀,從 Hierarchy 選取 Bullet 新增一個膠囊子物件。

新增子彈的材質(例如 Bullet Material),套用到膠囊物件。

透過 Inspector 設定 Thrust(推力)變數的數值,將會影響飛行速度。

備註:變數的預設值 = 0 子彈不會向前移動。

按下 Play 測試遊戲,確認子彈的推力設定、飛行方向與飛行速度。

若子彈不需受重力往下掉,透過 Inspector 關閉 Rigidbody > Use Gravity

調整 Capsule 的旋轉角度與縮放比例,符合子彈的外觀。

 

製作子彈軌跡

選取 Bullet 物件增加 Trail Renderer 元件,調整 Width 寬度~

新增一個軌跡的材質,套用到 Trail Renderer > Materials > Element 0。

按下 Play 測試遊戲,確認子彈軌跡的效果。

套用 Photon View, Photon Rigidbody View 元件。

將 Bullet 拖曳到 Resources 製作預製物件。

 

製作武器射擊功能

選取遊戲角色的武器,注意 ToonSoldiers 每個角色的武器都不同,透過 Hierarchy 視窗找到武器物件,在武器新增空物件並且命名為 "Muzzle" 槍口,調整位置與旋轉角度。

 

若是 ToonSoldiers_infantry 應該是 weapon_assault_rifle_A 物件。

透過 Hierarchy 選取武器,滑鼠右鍵 Create Empty 建立空的子物件。

將子物件重新命名為 "Muzzle" 用於標示槍口的位置。

修改 PlayerController.cs 腳本,加入以下程式碼:

public GameObject bullet; 設定子彈的預製物件

public Transform muzzle; 設定槍口的位置

 

 

動畫控制器加入射擊動作、參數、過渡條件。

設定過渡條件:射擊與投擲手榴彈。

設定過渡條件:裝填彈藥、互動操作。

 

if (Input.GetButtonDown("Fire1"))
{
Instantiate(bullet, muzzle.transform.position, muzzle.transform.rotation);
}

玩家按下射擊時動態生成子彈

void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Instantiate(bullet, muzzle.transform.position, muzzle.transform.rotation);
}
}

★ 注意!開槍射擊的程式碼不是放在原有的 void FixedUpdate() 裡面,否則開槍將會時有時無。

 

測試遊戲,子彈前進的方向如果不正確的話需要修正,將玩家角色的預製物件拖曳到一個場景,

選取 Muzzle 物件旋轉 Y = -90 後按下 Apply All 套回預製物件,刪除場景的子彈。

如果前面的操作步驟沒問題,子彈可以正常發射,將原本的子彈改為適用於多人連線。

開啟 Bullet.cs 修改程式碼~

為了讓每個玩家的射擊都是相同而公平,動態生成與刪除改用 PhotonNetwork 方式。

開啟 PlayerController.cs 修改程式碼,透過 PhotonView.IsMine 判斷若是本地端玩家,按下 Fire1 時武器射擊。

 

[參考另一種方法] 修改 PlayerWeapon.cs 腳本,透過 PhotonView.IsMine 判斷若是本地端玩家,按下 Fire1 時武器射擊。

 

製作玩家血量

玩家被擊中時 HP 扣血,當 HP <= 0 時玩家倒地。

修改 Bullet.cs 子彈的腳本,讓子彈擊中遊戲角色時扣血。

 

建立 C# 腳本並命名為 PlayerState.cs 套用到玩家角色,程式碼如下: