Unity中StateMachineBehaviour脚本编译报错,请求解决
解决Unity StateMachineBehaviour脚本编译错误
我编写了一个继承自StateMachineBehaviour的SnorHelmetRemove脚本,目标是禁用HeadParent对象并修改Animator参数IsWearingHelmet,但脚本无法编译。
原脚本代码
public class SnorHelmetRemove : StateMachineBehaviour { protected GameObject headParent; protected Animator animator; protected bool checkHelmet; private void OnEnable() { animator = GameObject.GetComponent<Animator>(); bool checkHelmet = animator.GetBool("IsWearingHelmet"); headParent = GameObject.Find("HeadParent"); } override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { Debug.Log("Helmet is " + checkHelmet); headParent.SetActive(false); } override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (checkHelmet) { Debug.Log("Helmet is " + checkHelmet); animator.SetBool("IsWearingHelmet",false); } else { Debug.Log("Helmet is " + checkHelmet); animator.SetBool("IsWearingHelmet",true); } } }
编译错误信息
- 最初报错:
An object reference is required for the non-static field, method or property GameObject.GetComponent();
- 将
GameObject改为小写gameObject后新错误:
The name 'gameObject' doesn't exist in the current context
问题原因
- StateMachineBehaviour没有内置的gameObject属性,和MonoBehaviour不同,不能直接访问gameObject成员
- OnEnable方法在StateMachineBehaviour中不是合适的初始化时机,此时无法获取到有效的Animator引用
- 原代码中
bool checkHelmet = ...是声明了局部变量,遮蔽了类的成员变量,导致成员变量checkHelmet一直是默认值false
修正后的代码
public class SnorHelmetRemove : StateMachineBehaviour { protected GameObject headParent; protected bool checkHelmet; override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // 通过传入的animator参数获取对应的GameObject var animatorObj = animator.gameObject; // 查找HeadParent(假设是animator对象的子对象,用Transform.Find更高效) headParent = animatorObj.transform.Find("HeadParent").gameObject; // 给成员变量赋值,不要声明局部变量 checkHelmet = animator.GetBool("IsWearingHelmet"); Debug.Log("Helmet is " + checkHelmet); headParent.SetActive(false); } override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (checkHelmet) { Debug.Log("Helmet is " + checkHelmet); animator.SetBool("IsWearingHelmet", false); } else { Debug.Log("Helmet is " + checkHelmet); animator.SetBool("IsWearingHelmet", true); } } }
关键修正点
- 获取GameObject引用:通过OnStateEnter传入的
animator参数,访问animator.gameObject获取挂载Animator的对象 - 高效查找子对象:用
transform.Find替代全局的GameObject.Find,避免场景中重名问题,查找速度更快 - 修正变量遮蔽:去掉局部变量声明,直接给类的成员变量
checkHelmet赋值 - 调整初始化时机:将初始化逻辑移到OnStateEnter中,此时能确保获取到有效的Animator引用
内容的提问来源于stack exchange,提问作者Oscar Martin
相关产品推荐
相关产品推荐

