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
相关产品推荐
相关产品推荐

