//tips
//AIモンスターへの挙動追加
キャラクターと同様にMotionを行う際にのみコライダーを有効にし、ダメージ判定を生じさせられるようにスクリプトを調整する。
EnvPlaymove4 スクリプトを参考に下記にWaitAnimationfin()スクリプトを追加する。
if (navMeshAgent.remainingDistance < 1.5f)//0.5f
{
SetState(EnemyState.Wait);
animator.SetTrigger("Punch Attack");
}
それによりコライダーのオンオフは確認できた。ただ、アニメーションの状態変化がpunch状態のままwalkに切り替わらない問題が出ているのでそちらを確認する。
Aniamtorを確認したらHasexittimeのチェックがされているにもかかわらず、Punch Attackのモーションから抜け出せなくなっている。
なぜかモーション後の遷移が連続して発生して挙動がおかしくなっている。
順を追って理解していく、まず初期時点ではSetState(EnemyState.Walk);であるため、void Update()内では、if (state == EnemyState.Walk || state == EnemyState.Chase)内部が実行され、その内容はanimator.SetBool("Walk Forward", true);となっている。
ここまでは問題ない。
if (navMeshAgent.remainingDistance < 1f)で目的地との距離が1未満の場合にSetState(EnemyState.Wait);に遷移させている。
state == EnemyState.Wait内では、目的地付近でanimator.SetTrigger("Punch Attack”);でパンチの挙動を行わせ、その際に、StartCoroutine("WaitAnimationfin”);も実行させている。その際hasexittimeで自動的にwalkforwardに遷移を返していたのだが、Waitの際はIdleの場所に状態を戻すのが妥当だと考え、ルートを変更。
また、punchflagを立てて一度のメソッド実行で一回の攻撃モーションになるようにした。
これでかなりまともになった。
次に腕のコライダーにアタッチするAttackスクリプトを作成する。
下記のスクリプトをアタッチしたところなぜか胴体が接触してもダメージ判定が出てしまっている。Searchareaオブジェクトのistriggerにも反応しているのではないかと考えたが、Debugログで確認するとanimator.SetTrigger("Punch Attack”);の実動作とStartCoroutine("WaitAnimationfin”);が噛み合っていないことが原因であることがわかった。"Punch Attack”は発生から実際のパンチまで時間の余裕がある一方でWaitAnimationfinは即座に実行しているため、歩いている段階で腕のコライダーが外れて当たり判定が出ている。
なので、WaitAnimationfin()メソッドの発動時間を遅くしてあげることで意図した形になった。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GolemAttackManager : MonoBehaviour
{
public float powerEnemy = 1; //攻撃力
HPScript hPScript;
[SerializeField]
GameObject ParentObject;
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Player" && other.gameObject != ParentObject)
{
hPScript = other.gameObject.GetComponent<HPScript>();
hPScript.hp -= powerEnemy;
if (hPScript.hp <= 0)
{
Destroy(other.gameObject); //ゲームオブジェクトが破壊される
}
}
}
}
ゴーレムの基礎攻撃力は1だがアクションの際に多段ヒットとなってしまう現象が起きている。damageflagを作成し、punchflagと同様のタイミングで動作が行われるようにしたが効果なし。
WaitAnimationfin()メソッドの最後にyield return new WaitForSeconds(0.5f);を追加した画効果なし。
elapsedTime > waitTimeの部分が問題なのかと、elapsedTime == waitTimeに変更したが、それでも複数回発生している。
WaitAnimationfin()メソッドの中身に(!animator.IsInTransition(0) && !animator.GetCurrentAnimatorStateInfo(0).IsName("RabbitWalk3”))などのstate遷移も入れて考えていく。