【Unity】StateMachineBehaviourを取得

投稿者: | 2020-07-11

振り向いている時に敵からプレイヤーが見えたら再度歩きのステートに遷移させる処理を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;

コメントを残す

メールアドレスが公開されることはありません。