Unity中GetComponent返回Null及NullReferenceException问题求助
问题排查与修复
核心错误点
MonoBehaviour实例化方式错误
假设Steps是继承自MonoBehaviour的Unity组件类,这种类不能直接用new Steps()创建实例。MonoBehaviour必须挂载在GameObject上才能生效,直接new出来的实例不会关联任何GameObject,自然也没有BoxCollider2D组件,调用GetComponent<BoxCollider2D>()必然返回null,触发空引用异常。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
相关产品推荐
相关产品推荐

