【Unity】StateMachineBehaviourに付けたものが外れる

投稿者: | 2020-10-20

NPCに追加したスクリプトを、NPCのアニメーターコントローラーのStateMachineBehaviourのフィールドに入れて、NPCを非アクティブにすると、インスペクタの変数の欄にNoneと表示されてしまいます。

StateMachineBehaviourでは、NPCのスクリプトのメソッドを呼んで、デバッグログを表示していますがエラーになってしまいます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AgentStateMachineBehaviour : StateMachineBehaviour
{
    public AgentScript2 agentScript2;
    bool sent;

    // 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 (!sent && stateInfo.normalizedTime % 1f >= 0.8f)
        {
            agentScript2.Message();
            sent = true;
        }else if (sent && stateInfo.normalizedTime % 1f < 0.8f)
        {
            sent = false;
        }

        //Debug.Log(stateInfo.normalizedTime);
    }

// ---
// NPCのスクリプト

public void Message()
{        
    Debug.Log(n++);
}

同じステートで歩くモーションを繰り返すので、stateInfo.normalizedTimeは1を超えます。そこで、メソッドを呼ぶ条件を作るときに、1で割った余りを使っています。

NPCのスクリプトでは、Start()でStateMachineBehaviourのフィールドに自分自身を入れるようにしていました。

AgentStateMachineBehaviour agentStateMachineBehaviour;
Animator animator;

void Start()
{

    // ...

    animator = GetComponent<Animator>();
    agentStateMachineBehaviour = animator.GetBehaviour<AgentStateMachineBehaviour>();
    agentStateMachineBehaviour.agentScript2 = this;
}

これだと上のようにエラーが出たので、非アクティブにして再度アクティブにした時に、OnEnable()でもう一度入れ直すようにしました。

private void Awake()
{
    animator = GetComponent<Animator>();
}

private void OnEnable()
{
    agentStateMachineBehaviour = animator.GetBehaviour<AgentStateMachineBehaviour>();
    agentStateMachineBehaviour.agentScript2 = this;
}

これでエラーがでなくなりました。

アニメーターコンポーネントを取得をStart()にしたり、StateMachineBehaviourの取得をAwake()にするとエラーが出ました。

コメントを残す

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