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減らす
- ライフが0より大きければ、このメソッドは終了
- 状態を「死んでいる」に変更
- 死んでいくアニメーションを実行
- 死んだ時のその他処理を実行
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()
{
}
ディスカッション
コメント一覧
まだ、コメントがありません