//tips
//微調整
ゴーレムの挙動修正部分を確認する。先のコードを使用したところフリーズしてしまった。whileから脱出できなくなった。
if (animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"))
{
rightfootcollider.enabled = true;
Debug.Log("rightfootcollider.enabled = true");
}
上記にに変更してみると、無事に動作は確認できるようになった。
ただ、パンチモーション以外でもダメージは発生しており、コライダーチェックが入っていない状態またはほんの一瞬入ることでダメージを与えているよう。
また、プレイヤーがいない場合でもパンチモーションを行なってしまうようになった。これはif (punchflag == false && onchase == true)に原因があり、onchase = falseの実行がコルーチン内のメソッドでうまくいっていないようなので下記のように追加修正した。
while (!animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"))
{
rightfootcollider.enabled = false;
punchflag = false;
onchase = false;
yield return null;
}
Udpdateでは、wait状況から移行しているが、コルーチンではモーションの実行が続いているときに、walkとpunchモーションが同時に重なり、タイミングにずれが生じていそう。elapsedTimeをうまく調整してこの重なりを起こさないように試す。
if (elapsedTime > waitTime)
{
//Debug.Log("Waittime");
navMeshAgent.speed = 3.5f;
navMeshAgent.acceleration = 8;
SetState(EnemyState.Walk);
animator.SetBool("Walk Forward", true);
elapsedTime = 1.5f;に変更。
実行してみるとパンチモーションanimator.SetBool("PunchAttackB", true)が行われなくなり、下記のデバッグも見られなかった。
if (animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"))
{
rightfootcollider.enabled = true;
Debug.Log("rightfootcollider.enabled = true");
}
while (!animator.GetCurrentAnimatorStateInfo(0).IsName("Punch Attack 0"))
{
rightfootcollider.enabled = false;
punchflag = false;
onchase = false;
yield return null;
}
パンチのアニメーションクリップについていたfixeddurationを0にしてすぐに遷移させるように変更。
なぜかパンチアクションが実行されなくなり要因を探していたら変更する時間はelapsedTimeではなくwaitTimeの方であることに気づいた。if (elapsedTime > waitTime)でelapsedTimeが常にwaitTimeより大きかったのですぐにwalkアクションに遷移してしまっていた。
waitTimeを3.5にすることによりかなり改善された。パンチモーションが出るようになり、パンチモーション中に当たり判定ができるようになった。
だが、歩いているときにまだ反応が出る。また、chase中からwaitへの遷移が甘かったように感じたので、chaseコードの中にも距離を条件にwaitに移行するコードを追加した。
if (state == EnemyState.Chase)
{
if (navMeshAgent.pathStatus != NavMeshPathStatus.PathInvalid)
{
if (playerTransform.position != null)
{
setPosition.SetDestination(playerTransform.position);
navMeshAgent.SetDestination(setPosition.GetDestination());
onchase = true;
if (Vector3.Distance(transform.position, setPosition.GetDestination()) < 1.5f)
{
SetState(EnemyState.Wait);
}
}
}
これで実行して確認してみたところ2つの問題が確認できた。
1つ目は、至近距離でもwait状態に移行せずwalkを続ける場合がある
2つ目は、到着地点で攻撃を続けること
至近距離になった場合でもターゲット設定ができない場合があることはゴーレムの子要素にあるサーチ用のコライダーがうまく機能していない恐れがあるので、SearchCharacterスクリプトを確認していく。
OnTriggerStay(Collider col)で別のオブジェクトを取得している可能性があるので、デバッグでそちらを確認する。
確認すると確かにテラインも接触反応に含まれてしまっていたがプレイヤーもきちんと認識していたのでサーチエリアの方は問題なさそう。
Wait状態にあるにもかかわらずUpdate()によりひたすらanimator.SetBool("Walk Forward", true);が呼ばれているのが問題。
各インスペクターのwaittimeも再設定し、デバッグも設定しておく。
これによりupdateメソッドの中身であるif (state == EnemyState.Walk || state == EnemyState.Chase)とelse if (state == EnemyState.Wait)が同時に呼ばれていることがわかり、state設定の仕組みに問題があることがわかった。
State管理の見直しを行なっていく。