前回の作業で敵キャラのアニメーションを制御できるようになったので、次は敵キャラの基本的なC#スクリプトを作り、ついでにダメージ処理も追加しようと思います。
敵キャラ(ゾンビ)のゲームオブジェクトの作成
では、まずはゾンビのゲームオブジェクトを作成します。
最初にインポートしてもらったゾンビアセットの「Prefabs」フォルダの中に「Zombie3」(※注)というプレハブがあると思うので、それをシーンにドラッグ&ドロップしてください。
そうしたらゾンビのAnimatorコンポーネントを次のように変更しましょう。
- コントローラー:前回作ったゾンビ用のアニメーターコントローラーを指定
- ルートモーションを適用:OFF
あとゾンビにカプセルコライダーコンポーネントをアタッチして、当たり判定の大きさを適当に調整しておいてください。
これで下準備はOKです。
※注:ちなみに同じフォルダにあるZombie1、Zombie2はそれぞれ切断表現が可能なプレハブです。ただ今回はそういう表現は不要なので、体のメッシュが1つになっている3番目のプレハブを使います。
敵キャラの基本的なC#スクリプト
そうしたら次はいよいよ敵キャラのC#スクリプトを書いていきます。新しいC#スクリプトを作り、名前を「EnemyController」にしたら次のスクリプトを書いてください。
using System.Collections; using UnityEngine; public class EnemyController : MonoBehaviour { [SerializeField] Animator animator = null; [SerializeField] CapsuleCollider capsuleCollider = null; [SerializeField, Min(0)] int maxHp = 3; [SerializeField] float deadWaitTime = 3; // アニメーターのパラメーターのIDを取得(高速化のため) readonly int SpeedHash = Animator.StringToHash("Speed"); readonly int AttackHash = Animator.StringToHash("Attack"); readonly int DeadHash = Animator.StringToHash("Dead"); bool isDead = false; int hp = 0; Transform thisTransform; public int Hp { set { hp = Mathf.Clamp(value, 0, maxHp); } get { return hp; } } void Start() { thisTransform = transform; // transformをキャッシュ(高速化) InitEnemy(); } void Update() { if (isDead) { return; } UpdateAnimator(); } void InitEnemy() { Hp = maxHp; } // 被ダメージ処理 public void Damage(int value) { if(value <= 0) { return; } Hp -= value; if(Hp <= 0) { Dead(); } } // 死亡時の処理 void Dead() { isDead = true; capsuleCollider.enabled = false; animator.SetBool(DeadHash, true); StartCoroutine(nameof(DeadTimer)); } // 死亡してから数秒間待つ処理 IEnumerator DeadTimer() { yield return new WaitForSeconds(deadWaitTime); Destroy(gameObject); } // アニメーターのアップデート処理 void UpdateAnimator() { } }
ここでは主に
- HPなどのパラメーター
- 弾がヒットしたときのダメージ処理・死亡処理
- アニメーションのステート切り替え処理
といった項目を実装しました。難しい処理は無いのでスクリプトを眺めて処理内容を確認してください。
ただし上記はまだ未完成のスクリプトです。敵キャラの移動処理や攻撃処理などは実装されていません。その辺は次回以降に作ることになるでしょう。
銃のスクリプトに敵へのダメージ処理を追加する
最後に、今までプレイヤーの銃にはダメージを与える処理が無かったので、敵キャラができたところでその処理を追加しておきます。FpsGunControllerスクリプトを開き、「BulletHit」関数に次のように処理を追加してください。
// 弾がヒットしたときの処理 void BulletHit() { // ★変更その1 Instantiate(bulletHitEffectPrefab, hit.point, Quaternion.LookRotation(hit.normal)); // ★変更その3 if (hit.collider.gameObject.CompareTag("Enemy")) { EnemyController enemy = hit.collider.gameObject.GetComponent<EnemyController>(); enemy.Damage(damage); } }
さてこれでOKかと思いきや、実はまだ敵を撃っても何も起きません。なぜなら敵に適切なタグとレイヤーが設定されていないからです。そこでプロジェクト設定ウィンドウを開き(メニューバーの「編集」→「プロジェクト設定」)、「タグとレイヤー」タブで
- Enemyタグ
- Enemyレイヤー(※とりあえず11番に作ってください)
をそれぞれ作り、ゾンビに設定してください。
そして忘れずに「FpsGunController」の「Hit Layers」に今作った「Enemy」レイヤーを指定しましょう。これでゾンビを撃つとダメージが通って倒せるようになります。
テストプレイして動作を確認しよう
ではテストプレイして動作を確認してみましょう。次のGIFのように、ゾンビを何回か撃つと倒れるようになれば成功です。
次のページ→NavmeshAgentを使って敵キャラを動かす