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

Unity报错:TreeDestroy跨脚本访问List触发NullReferenceException空引用排查

报错原因分析
  • TreeDestroy中treeGen字段未初始化:你仅声明了TreeGen类型的变量,没有通过Inspector拖拽、FindObjectOfType、GetComponent等方式绑定场景中实际挂载了TreeGen脚本的对象实例,直接访问成员就会触发空引用。
  • TreeGen中TreeCount列表未初始化:你只声明了public List<int> TreeCount;,没有提前给列表分配内存,调用Add方法时本身就会报错,后续TreeDestroy访问TreeCount.Count也会触发空引用。
  • 额外隐藏问题:你贴出的TreeGen代码里用到的tree预制体、position变量均未定义,实际运行也会报错,需要提前赋值。
修复代码

TreeGen.cs 调整

public GameObject tree; // 提前在Inspector面板拖入树的预制体
public GameObject Instree;
int trees;
public List<int> TreeCount;

void Start() {
    // 先初始化列表
    TreeCount = new List<int>();
    trees = Random.Range(100, 300);
    for (int i = 0; i < trees; i++){
        // 这里自行替换为实际的生成位置逻辑
        Vector3 position = new Vector3(Random.Range(-50,50), 0, Random.Range(-50,50));
        Instree = Instantiate(tree, position, Quaternion.identity);
        TreeCount.Add(Instree.GetInstanceID());
    }
}

TreeDestroy.cs 调整

TreeGen treeGen;

void Start() {
    // 初始化treeGen,获取场景中挂载TreeGen脚本的实例
    treeGen = FindObjectOfType<TreeGen>();
    // 如果明确知道TreeGen挂载的对象,推荐用 GameObject.Find("对象名").GetComponent<TreeGen>(),效率更高
}

void Update(){
    // 加判空逻辑,避免极端情况触发空引用
    if(treeGen == null || treeGen.TreeCount == null) return;
    for (int i = 0; i < treeGen.TreeCount.Count; i++) {
        if (treeGen.Instree.GetInstanceID() != treeGen.TreeCount[i])
        {
            //something to do
        }
    }
}
额外注意事项
  • 当前TreeGen里的Instree字段每次生成树都会被覆盖,最终只会保留最后一个生成的树的实例,如果你的逻辑是要对比所有生成的树,建议把List<int>改成List<GameObject>直接存储所有树的实例,使用起来更方便。
  • 遍历逻辑确实不建议放在Update里,每帧执行100-300次遍历没有必要,按需触发即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:18:02