//tips
//微調整
パンチモーション開始時のstate遷移とコライダーのオンオフ条件を見直した。
実行してみると、一瞬だけコライダーがオンになり、すぐにwhile (!animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0") || !animator.IsInTransition(0))によってfalseにされてしまっている。
Orではなくandでwhile文を再度確認。
これでOnTriggerStay(Collider col)の場合は正常に機能するように戻った。ログを見ていくとOnTriggerStay(Collider col)とOnTriggerEnter時の違いは受け手側のother.gameObject.tagWeaponが呼ばれているかいないかの違いのように思われる。
つまり、Searchareaの接触でprivate void OnTriggerEnter(Collider other)の稼働が完了してしまい再度メソッドが実行されるタイミングがOnTriggerStayのタイミングになっているのではないかと考える。
確かにonchase = true;にできるのはOnTriggerStay(Collider col)とOnTriggerEnterが実行されたタイミングしかなく、if (playerTransform.position != null)で一度chase状態に入ったら再度trueに変えることはできなくなっている。
if (playerTransform.position != null)部分は特に外して問題なさそうなので、コメントアウトして様子を見る。
コライダーの接触はレイヤーでも制御できるのでHPscriptでプレイヤーがsearchareaを検出しないように設定していく。
searchareaに新たなレイヤーを設定。そしてdeerのコライダーに対して、editのProject SettingsからSearchレイヤーのオブジェクトを感知しないようにチェックを外す。
こうするとchaseされなくなってしまった。プレイヤー側片方のコライダーのみレイヤー判定を受け付けるということができなかった。
デバッグを差し込み再度確認していたらゴーレムのコライダーの方がうまくオンオフできていないことに気がついた。
rightfootcollider.enabled = true;
Debug.Log(animator.GetCurrentAnimatorStateInfo(0));
while (!animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0") && !animator.IsInTransition(0))
{
rightfootcollider.enabled = false;
オンにした後すぐにオフになっているため反応が取れなかったよう。下記を新たに挿入し、trueにした後はパンチアクションが開始するまでコルーチンを中断させる。
yield return new WaitWhile(() => animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"));
ゴーレムの接触反応は呼ばれるが、プレイヤーのものは呼ばれない。
yield return new WaitWhile(() => animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0”));がうまく機能していないのでyield return new WaitForSeconds(1.1f);の形に変更。
これでうまく判定が出るようになった。初期の時間設定のものとの違う点はstateの移行を感知するために時間を条件としたところ。前は時間でコライダーのオンオフを行なっていた。
多少はスムーズな動作と判定になった。