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

投稿者: | 2020-10-20

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

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

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class AgentStateMachineBehaviour : StateMachineBehaviour
  6. {
  7. public AgentScript2 agentScript2;
  8. bool sent;
  9.  
  10. // OnStateEnter is called before OnStateEnter is called on any state inside this state machine
  11. //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  12. //{
  13. //
  14. //}
  15.  
  16. // OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
  17. override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  18. {
  19. if (!sent && stateInfo.normalizedTime % 1f >= 0.8f)
  20. {
  21. agentScript2.Message();
  22. sent = true;
  23. }else if (sent && stateInfo.normalizedTime % 1f < 0.8f)
  24. {
  25. sent = false;
  26. }
  27.  
  28. //Debug.Log(stateInfo.normalizedTime);
  29. }
  30.  
  31. // ---
  32. // NPCのスクリプト
  33.  
  34. public void Message()
  35. {
  36. Debug.Log(n++);
  37. }

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

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

  1. AgentStateMachineBehaviour agentStateMachineBehaviour;
  2. Animator animator;
  3.  
  4. void Start()
  5. {
  6.  
  7. // ...
  8.  
  9. animator = GetComponent<Animator>();
  10. agentStateMachineBehaviour = animator.GetBehaviour<AgentStateMachineBehaviour>();
  11. agentStateMachineBehaviour.agentScript2 = this;
  12. }

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

  1. private void Awake()
  2. {
  3. animator = GetComponent<Animator>();
  4. }
  5.  
  6. private void OnEnable()
  7. {
  8. agentStateMachineBehaviour = animator.GetBehaviour<AgentStateMachineBehaviour>();
  9. agentStateMachineBehaviour.agentScript2 = this;
  10. }

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

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

コメントを残す

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