通过 Start 中的方法访问另一个添加的组件内部的添加组件会导致 NullReferenceException

Accessing added component, inside of another added component through a method at Start causes NullReferenceException

提问人:Michael Atorn WAT 提问时间:7/8/2023 更新时间:7/8/2023 访问量:23

问:

我重命名了类并简化了这篇文章的内容。 点击开始后,level2 和 spriteRenderer 在检查器中都可见,但在调用 fill 方法时似乎没有加载 spriteRenderer。检查后,在 Level2 的 Start() 中在 AddComponent 之后使用时为 false,但在 fill() 中调用时为 true。Debug.Log(spriteRenderer==null);

一级班:

class Level1:MonoBehaviour{
  Level2 level2;
  void Start(){
    level2 = this.AddComponent<Level2>();
    level2.enabled = true;
    level2.fill(Color.red); //nullReference
  }
}

二级班:

class Level2:MonoBehaviour{
  SpriteRenderer spriteRenderer;
  void Start(){
    spriteRenderer = this.AddComponent<SpriteRenderer>();
    spriteRenderer.enabled = true;
    //spriteRenderer!=null
  }
  
  public void fill(Color color){
    Texture2D texture = new Texture2D(16, 16);
    texture.filterMode = FilterMode.Point;
    for (int y = 0; y < 16; y++)
    {
      for (int x = 0; x < 16; x++)
      {
                texture.SetPixel(x, y, color);
      }
    }
    texture.Apply();
    Rect rect = new Rect(new Vector2(0.0f, 0.0f), new Vector2(16, 16));
    //spriteRenderer==null
    spriteRenderer.sprite = Sprite.Create(texture, rect, Vector2.zero, 8);//nullReference
  }
}

尝试通过同一类中的另一个方法访问生成的 spriteRenderer,该 spriteRenderer 添加到 MonoBehaviour-Class 中。MonoBehaviour 类在 Start 时被添加到另一个 MonoBehaviour 类中,之后也会调用 fill-Method。Start()

C# unity-game-engine nullreferenceexception unity-components

评论

4赞 Nima 7/8/2023
您面临的问题是,在类的方法中为其赋值之前,您正在尝试访问方法中的变量。若要解决此问题,可以使用该方法而不是在类中,以确保在方法中访问变量之前对其进行初始化。spriteRendererfill()Start()Level2Awake()Start()Level2spriteRendererfill()

答: 暂无答案