Unityゲームにおける状態管理とキャラクター制御スクリプトの概要解説資料(敵からの攻撃まで)

敵を倒せるようにする前まで

「Mob」とは、もともと「mobile object」または「mobile entity」の略で、ゲーム内で自律的に動くキャラクターや敵、NPC(Non-Player Character)など、動的な挙動を持つオブジェクト全般を指す用語です。

具体的には、以下のような特徴があります:

  • 状態管理:
    多くの場合、Mobは「通常状態(Normal)」「攻撃状態(Attack)」「死亡状態(Die)」など、状況に応じた複数の状態を持ち、それぞれの状態に応じた動作や挙動を管理する仕組みが組み込まれています。
  • 行動制御:
    移動、攻撃、ダメージ処理など、ゲーム内での一連の行動がプログラム上で定義され、MobStatusやMobAttackといったスクリプトでその制御が行われます。
  • 再利用性:
    同じ基盤(例:MobStatusクラス)を利用することで、プレイヤーキャラクターや敵キャラクターなど、動的なオブジェクトの基本的な挙動や状態管理を共通化し、再利用や拡張が容易になる設計になっています。

つまり、ゲーム開発において「Mob」は、動きや行動、状態の変化を持つあらゆる対象を包括する概念として利用され、効率的なプログラム設計や統一的な動作管理に寄与しています。


1. 基本的な状態管理とキャラクターの基本クラス

1.1 MobStatus クラス

  • 目的:
    Mob(移動・攻撃可能なオブジェクト)の共通状態(Normal、Attack、Die)を管理する抽象クラス。
  • 主な機能:
    • 移動や攻撃が可能かどうかの判定(IsMovable, IsAttackable)
    • ライフ管理(LifeMax と Life)
    • 初期化でライフのセットやAnimator取得
    • ダメージ処理と、ライフ0以下で死亡状態への遷移

1.2 EnemyStatus クラス

  • 目的:
    敵キャラクター固有の状態管理を実装(MobStatusの派生)。
  • 主な機能:
    • NavMeshAgent を利用した移動制御
    • 移動速度を Animator に反映
    • 死亡時の後処理(一定時間後のオブジェクト破棄)

2. 攻撃制御と関連オブジェクト

2.1 MobAttack クラス

  • 目的:
    Mobの攻撃処理を制御するクラス。
  • 主な機能:
    • 攻撃可能かどうかの判定(AttackIfPossible)
    • 攻撃範囲内に侵入した対象への処理(OnAttackRangeEnter)
    • 実際の攻撃時に対象へダメージを与える処理(OnHitAttack)
    • 攻撃開始(OnAttackStart)および終了後のクールダウン処理

2.2 AttackRangeDetector オブジェクト

  • 役割:
    敵がプレイヤーを追跡・攻撃する際、プレイヤーが「攻撃可能範囲」に入ったかを検知するトリガー用オブジェクト。
  • 主な設定:
    • BoxCollider(Is Trigger 設定)で範囲を定義
    • CollisionDetector スクリプトをアタッチし、OnTriggerEnter/Stay で EnemyMove の OnDetectObject などを呼び出す

2.3 MobAttackHitCollider オブジェクト

  • 役割:
    攻撃アニメーションのタイミングで有効化され、実際に「攻撃が当たった」ことを判定するトリガー用コライダー。
  • 主な設定:
    • Collider(Is Trigger 設定)で攻撃判定用の範囲を定義
    • CollisionDetector スクリプトを用いて OnTriggerEnter/Stay 時に MobAttack.OnHitAttack を実行し、相手にダメージを与える

3. キャラクターの移動および入力制御

3.1 EnemyMove クラス

  • 目的:
    敵キャラクターの移動制御およびプレイヤー追跡ロジックを実装。
  • 主な機能:
    • NavMeshAgent を用いた経路探索
    • CollisionDetector からの通知(OnDetectObject)により、プレイヤー検知と障害物判定(RaycastNonAllocを使用)
    • 障害物がなければ追跡、障害物があれば移動停止

3.2 PlayerController クラス

  • 目的:
    プレイヤーキャラクターの入力受付と動作(移動、回転、ジャンプ)の管理。
  • 主な機能:
    • UnityのPlayerInputコンポーネントを利用した入力管理(Move, Jump)
    • CharacterController を使った移動処理と Animator の MoveSpeed 更新
    • 入力方向に基づいた Quaternion.Slerp を用いたスムーズな回転
    • 地上判定、ジャンプ処理、重力適用による落下処理

4. 衝突判定の共通処理

4.1 CollisionDetector クラス

  • 目的:
    衝突(Trigger)判定を行い、Inspectorで設定したUnityEvent(TriggerEvent)を発火させる。
  • 主な機能:
    • OnTriggerEnter と OnTriggerStay により、指定イベントをInvoke
    • 内部クラス TriggerEvent は [Serializable] 属性を持ち、Inspector上でメソッドを設定可能にしている

5. シーン上のオブジェクト配置とスクリプト間連携

5.1 シーン上の配置イメージ

  • オブジェクトの設置:
    • AttackRangeDetector: 敵キャラクターの子オブジェクトとして配置。敵がプレイヤーを認識できる範囲を示す。
    • MobAttackHitCollider: 攻撃時のみ有効化されるトリガー。武器や手・足の先端などに配置。

5.2 Inspector 設定例

  • Collider の Is Trigger 設定:
    • AttackRangeDetector と MobAttackHitCollider それぞれの Collider に対して有効
  • CollisionDetector の設定:
    • TriggerEvent に各クラス(EnemyMove、MobAttackなど)の呼び出したいメソッドをアサイン

5.3 各クラス・オブジェクト間の連携

  • 連携例:
    • EnemyMove: AttackRangeDetector の TriggerEvent により、プレイヤー検知後に追跡開始
    • MobAttack: 攻撃開始時に MobAttackHitCollider を有効化し、攻撃ヒット判定を実行
    • CollisionDetector: 共通の衝突判定ロジックとして各オブジェクトで利用

6. 全体のまとめと設計図

6.1 システム全体の特徴

  • モジュール設計:
    各クラスが役割ごとに分離され、再利用性・拡張性が高い設計になっている
  • 状態管理:
    MobStatus を基盤とし、状態遷移(移動、攻撃、死亡)を統一的に管理
  • 連携:
    敵はプレイヤーの接近を検知し、追跡→攻撃へと状態がスムーズに遷移する

6.2 設計図・シーケンス図

  • クラス図:
    各クラスのプロパティ、メソッド、継承関係を視覚化
  • 攻撃シーケンス図:
    MobAttack を中心に、攻撃可能判定→攻撃状態遷移→ダメージ付与→クールダウンの流れを図解
  • プレイヤー移動シーケンス図:
    プレイヤー入力から移動・回転・ジャンプ処理が実行されるまでの流れを図解

このように、まず基本となる状態管理(MobStatus, EnemyStatus)でキャラクターの土台を作り、攻撃制御(MobAttack, AttackRangeDetector, MobAttackHitCollider)で敵の攻撃処理を実現します。次に、移動と入力処理(EnemyMove, PlayerController)で各キャラクターの動きを管理し、CollisionDetectorが各種トリガー判定を統一的に処理。さらに、シーン上では各オブジェクトの配置やInspectorの設定を通じて、スクリプト同士の連携を行うことで、全体の「認知→追跡→攻撃」フローが実現される設計となっています。

この整理された項目順により、コードの役割や連携関係がより明確になり、システム全体の理解やメンテナンスがしやすくなるでしょう。

Unity

Posted by hidepon