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

Unity中如何将GameObject数组转为Transform列表/数组?空引用问题求助

解决Unity C#中GameObject数组转Transform列表的空引用问题

嘿,你遇到的NullReferenceException其实原因很简单——你只声明了List<Transform> transformlist,但完全没有初始化这个列表!

在C#里,像List<T>这种引用类型的变量,默认值是null,直接调用transformlist.Add()自然会触发空引用错误。咱们来一步步修复这个问题:

方法1:修复原有的foreach写法

只需要在声明列表的时候或者Start()方法里,给它创建一个实例就行:

GameObject[] targets;
// 声明时直接初始化列表
List<Transform> transformlist = new List<Transform>(); 

void Start () { 
    targets = GameObject.FindGameObjectsWithTag("target"); 
    Debug.Log(targets.Length); 

    foreach (GameObject obj in targets) { 
        transformlist.Add(obj.transform); 
    } 

    Debug.Log(transformlist.Count); 
}

或者也可以在Start()里初始化:

void Start () { 
    transformlist = new List<Transform>(); // 在这里初始化
    targets = GameObject.FindGameObjectsWithTag("target"); 
    // ... 后续代码不变
}

方法2:用LINQ简化转换(更简洁)

如果你觉得foreach写法有点繁琐,可以用LINQ直接把GameObject数组转换成Transform列表/数组,记得在脚本顶部引用using System.Linq;:

using System.Linq; // 必须引用这个命名空间

GameObject[] targets;
List<Transform> transformlist; 

void Start () { 
    targets = GameObject.FindGameObjectsWithTag("target"); 
    Debug.Log(targets.Length); 

    // 一行代码完成转换
    transformlist = targets.Select(obj => obj.transform).ToList();

    Debug.Log(transformlist.Count); 
}

如果想要Transform数组而不是列表,就改成:

Transform[] transformArray = targets.Select(obj => obj.transform).ToArray();

额外小贴士

  • 尽量避免在Start()里用GameObject.FindGameObjectsWithTag,如果你的目标对象是固定的,直接在Inspector面板把它们拖进targets数组里,性能会更好,还能避免因tag拼写错误找不到对象的问题。
  • 可以加个判断,如果targets.Length为0,提前做个提示,比如Debug.LogWarning("没有找到任何带target标签的对象!");,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:33:16