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

Unity中GetComponent返回Null及NullReferenceException问题求助

问题排查与修复

核心错误点

  1. MonoBehaviour实例化方式错误
    假设Steps是继承自MonoBehaviour的Unity组件类,这种类不能直接用new Steps()创建实例。MonoBehaviour必须挂载在GameObject上才能生效,直接new出来的实例不会关联任何GameObject,自然也没有BoxCollider2D组件,调用GetComponent<BoxCollider2D>()必然返回null,触发空引用异常。

  2. GenerateRow中的笔误
    创建steep实例后,你把step(而非steep)添加到了_inActiveSteps列表中,这属于逻辑错误,虽不是本次空引用的直接原因,但会导致非活跃步骤数据错误,需要一并修正。

修正后的代码示例

public void GenerateRow(){
    foreach(Vector3 pose in _row){
        // 创建活跃步骤的GameObject并挂载组件
        GameObject activeStepObj = new GameObject("ActiveStep");
        activeStepObj.transform.position = pose;
        Steps activeStep = activeStepObj.AddComponent<Steps>();
        // 替换原构造逻辑,用Init方法初始化参数(需在Steps类中实现)
        activeStep.Init(true);
        // 添加BoxCollider2D(如果Steps预制体或类中未默认包含)
        activeStepObj.AddComponent<BoxCollider2D>();
        _ActiveSteps.Add(activeStep);

        // 创建非活跃步骤的GameObject并挂载组件
        GameObject inactiveStepObj = new GameObject("InactiveStep");
        inactiveStepObj.transform.position = pose;
        Steps inactiveStep = inactiveStepObj.AddComponent<Steps>();
        inactiveStep.Init(false);
        inactiveStepObj.AddComponent<BoxCollider2D>();
        _inActiveSteps.Add(inactiveStep);
    }
}

补充说明

如果Steps是普通C#类(非MonoBehaviour),那它本身没有GetComponent方法,此时你需要:

  • 让Steps类持有对应的GameObject引用,通过引用获取碰撞体;
  • 或者将碰撞体相关逻辑直接整合到Steps类内部。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:45:29