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

