RPGのキャラクタ当たり判定の処理

的のテリトリーに入ってきたら追いかける、目の前にきたら攻撃開始する、攻撃が当たったら相手にダメージを与えるという一連の処理を考えています

キャラクタのオブジェクト関連図

敵からみてプレイヤーがテリトリーに入って来れば追いかける

自分のテリトリーに入ってくる時に特定の処理を実行したい

敵の周りに大きなコライダーをアタッチして、ここの中にプレイヤーが入ってきたらイベントを発生させます
OnTriggerStayを使いますが、トリガーイベントが発生する処理をドラッグ&ドロップで選択できるような共通のスクリプトを使っています

レイヤー毎による特定のオブジェクトとの当たり判定設定

レイヤー設定がDefaultです
ここでは、プレイヤーとの当たり判定はしていません

EnemyMoveスクリプト


プレイヤーとの当たりを判定するために、CompareTagメソッドを使っています

public void OnDetectObject(Collider collider)
{
    if (collider.CompareTag("Player")){}
}

敵からみてプレイヤーが攻撃範囲にに入って来れば攻撃する

自分の攻撃範囲に入ってくる時に特定の処理を実行したい

敵の前面に小さなコライダーをアタッチして、ここの中にプレイヤーが入ってきたらイベントを発生させます
OnTriggerStayを使いますが、トリガーイベントが発生する処理をドラッグ&ドロップで選択できるような共通のスクリプトを使っています

レイヤー毎による特定のオブジェクトとの当たり判定設定

レイヤー設定がEnemyAttackなので、Playerとだけ当たり判定が実行されます

MobAttackスクリプト

イベントハンドラは次のようになります
1つのメソッドが呼び出されています(直訳すると、もし可能ならアタックする)

public void OnAttackRangeEnter(Collider collider)
{
    AttackIfPossible();
}

攻撃判定

攻撃イベントハンドラ

攻撃アニメーションの動き

攻撃中に敵が範囲内であれば、相手にダメージを与える

自分の攻撃中に特定の処理を実行したい

敵の前面に小さなコライダーをアタッチして、ここの中にプレイヤーが入ってきたらイベントを発生させます
このコライダーは、攻撃アニメーション中に有効になったり無効になったりさせています
OnTriggerStayを使いますが、トリガーイベントが発生する処理をドラッグ&ドロップで選択できるような共通のスクリプトを使っています

レイヤー毎による特定のオブジェクトとの当たり判定設定

レイヤー設定がEnemyAttackなので、Playerとだけ当たり判定が実行されます

MobAttackスクリプト

イベントハンドラは次のようになります

衝突相手のMobStatusスクリプトを取得して、Damageメソッドを呼び出します

public void OnHitAttack(Collider collider)
{
    var targetMob = collider.GetComponent<MobStatus>();
    if (null == targetMob) return;
        
    // プレイヤーにダメージを与える
    targetMob.Damage(1);
}

ダメージを与えるメソッド

フローチャートの代わりに箇条書きとしています(チャート作成にチャレンジしてみてもいいですね)

  1. 状態が「死んでいる」なら、このメソッドは終了
  2. ライフを1減らす
  3. ライフが0より大きければ、このメソッドは終了
  4. 状態を「死んでいる」に変更
  5. 死んでいくアニメーションを実行
  6. 死んだ時のその他処理を実行
public void Damage(int damage)
{
    if (_state == StateEnum.Die) return;

    _life -= damage;
    if (_life > 0) return;

    _state = StateEnum.Die;
    _animator.SetTrigger("Die");

    OnDie();
}

死んだ時の処理メソッド

今は空ですね

protected virtual void OnDie()
{
}

Unity

Posted by hidepon