敵の攻撃モーションで、何度も接触判定が起きてしまうのを防止
:修正前
敵の攻撃モーションで何回もダメージ判定が起きるのを防ごうと考えた。
まず基本。
手足に当たり判定とスクリプトを付け、OnTriggerEnter,OnTriggerExitをセット。
これで「一度だけ当たり判定に入るのを感知してくれるからOK」だと思っていた。
(hit変数は攻撃モーション前、構えの時点で既に当たり判定に入っていた場合を防ぐ為に用意)
// モーションの前に当たり判定に触れていても大丈夫なように private var hit : boolean = false; function OnTriggerEnter(col : Collider){ hit = true; } function OnTriggerExit(col : Collider){ hit = false; } function Update () { if( isAttacking() && hit ){ player.SendMessage("Damaged"); hit = false; } } function isAttacking(){ var state : AnimatorStateInfo = my_anime.GetCurrentAnimatorStateInfo(0); return state.IsName( "Base Layer." + attack_state); }
しかしだめ。
実際の攻撃モーションは割とがくがくと動き、それに追随する当たり判定も、女騎士にぶつかったり離れたりで結局、数回計測してしまう。
次点。
「女騎士が喰らいモーション中は、ダメージ判定を無視するようにすればいい」と考える。
private var d_hash_val = Animator.StringToHash("damage"); function Damaged(){ // 既にダメージモーション中なら喰らわない var state : AnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0); if(state.tagHash == d_hash_val)return; ...
女騎士側のダメージモーションに付けたタグで判定(関係ないがかなり調べて、ハッシュ値の使い方が初めて分かった…)
一見良さそうだがこれもだめ。
女騎士の喰らいモーションより、ゴブリンの攻撃モーションの方が長い。
攻撃モーションが終わるまでに、これでも2回くらい喰らってしまう。
で、最終形。
「受け手より、攻め手の”1回のモーションにダメージ1回”を徹底させるべき」と頭を切り替える。
すなわち当たり判定の接触と、攻撃モーション変化(終了まで)を監視だ。
// モーションの前に当たり判定に触れていても大丈夫なように function OnTriggerEnter(col : Collider){ if( isAttacking()){ if(! isAlreadyHit()){ player.SendMessage("Damaged"); StartCoroutine("_AttackAnimeEnd"); } } } function isAttacking(){ var state : AnimatorStateInfo = my_anime.GetCurrentAnimatorStateInfo(0); return state.IsName( "Base Layer." + attack_state); } private var one_hit : boolean = false; function isAlreadyHit(){ return one_hit; } function _AttackAnimeEnd(){ // 1回の攻撃でヒットは一回まで one_hit = true; while(isAttacking()){ yield; } one_hit = false; }
一度ヒットしたらコルーチンを呼び出し。
モーションが終わるまで監視する。
モーションが終わってなければ二度目のヒットは無視される。
これで上手くいくようになった。
:修正後