
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()にするとエラーが出ました。