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