振り向いている時に敵からプレイヤーが見えたら再度歩きのステートに遷移させる処理をStateMachineBehaviourで行います。
まず、敵のアニメーターコントローラーのBaseレイヤーのインスペクタでAdd Behaviourをクリックして新しいスクリプトを作りました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class EnemyAnime : StateMachineBehaviour
{
public Transform player;
public NavMeshAgent agent;
// OnStateEnter is called before OnStateEnter is called on any state inside this state machine
//override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//}
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (stateInfo.IsName("TurnLeft") || stateInfo.IsName("TurnRight"))
{
Vector3 pos = player.position;
pos.y = animator.transform.position.y;
float d = Vector3.Dot(Vector3.Normalize(pos - animator.transform.position), animator.transform.forward);
// 敵がプレイヤーの方を向いたとき
if (d >= 0.7f)
{
agent.isStopped = false; // 動きを再開
animator.SetBool("EndTurn", true);
}
else if (stateInfo.normalizedTime >= 0.95f)
{
agent.isStopped = false; // 動きを再開
animator.SetBool("EndTurn", true);
}
}
}
// OnStateExit is called before OnStateExit is called on any state inside this state machine
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (stateInfo.IsName("Armature|Walk"))
{
animator.SetBool("EndTurn", false);
}
}
// OnStateMove is called before OnStateMove is called on any state inside this state machine
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateIK is called before OnStateIK is called on any state inside this state machine
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateMachineEnter is called when entering a state machine via its Entry Node
//override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
//{
//
//}
// OnStateMachineExit is called when exiting a state machine via its Exit Node
//override public void OnStateMachineExit(Animator animator, int stateMachinePathHash)
//{
//
//}
}
攻撃が終わった後の振り向くステートの中で、プレイヤーへのベクトルと敵の正面へのベクトルの角度が小さいとBoolパラメーターをtrueにして歩くステートに遷移させます。
個々の敵のトランスフォームは、animator.transformでわかります。敵が複数いても問題ありません。
歩くステートが終わった時にこれをfalseに戻しています。trueのままだと2回目から振り向かなくなります。
プレイヤーのトランスフォームはインスペクタからアタッチできないようなので、敵につけたスクリプトで渡しました。
EnemyAnime enemyAnime;
// Start()
enemyAnime = animator.GetBehaviour<EnemyAnime>(); // StateMachineBehaviourを取得
enemyAnime.player = player;
enemyAnime.agent = agent;