You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        }
    }
}

编译错误信息

  1. 最初报错:

An object reference is required for the non-static field, method or property GameObject.GetComponent();

  1. 将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);
        }
    }
}

关键修正点

  1. 获取GameObject引用:通过OnStateEnter传入的animator参数,访问animator.gameObject获取挂载Animator的对象
  2. 高效查找子对象:用transform.Find替代全局的GameObject.Find,避免场景中重名问题,查找速度更快
  3. 修正变量遮蔽:去掉局部变量声明,直接给类的成员变量checkHelmet赋值
  4. 调整初始化时机:将初始化逻辑移到OnStateEnter中,此时能确保获取到有效的Animator引用

内容的提问来源于stack exchange,提问作者Oscar Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:18:34