Unity中GameObject与List<GameObject>的区别及数组转列表方法咨询
解答你的Unity GameObject相关问题
先帮你理清两个类型的核心区别,再解决数组转列表的问题,顺便给你的代码提个小建议~
一、UnityEngine.GameObject 和 System.Collections.Generic.List<GameObject> 的区别
UnityEngine.GameObject:这是Unity引擎里代表单个游戏对象的类型,场景里的每一个物体(比如玩家角色、敌人模型、UI按钮)都是一个GameObject实例,它包含组件、变换信息等,是实实在在的单个实体。System.Collections.Generic.List<GameObject>:这是C#的泛型列表容器,它本身不是游戏对象,而是用来存储多个GameObject实例的集合。你可以把它想象成一个可动态调整大小的“篮子”,里面装着多个单个的游戏对象,支持添加、删除、查找等操作,比固定长度的数组灵活得多。
二、如何将UnityEngine.GameObject[]转换为System.Collections.Generic.List<GameObject>
有两种常用的方法,根据你的需求选择:
方法1:使用List的构造函数
直接利用List<T>的构造函数,它接受任何实现了IEnumerable<T>的类型(数组刚好满足这个条件):
// 先获取GameObject数组 GameObject[] playerArray = GameObject.FindGameObjectsWithTag("Player"); // 转换为List List<GameObject> playerList = new List<GameObject>(playerArray);
方法2:使用LINQ的ToList()扩展方法
这种方法代码更简洁,但需要先在文件顶部引用System.Linq命名空间:
using System.Linq; // 记得添加这个引用 // 一行完成转换 List<GameObject> playerList = GameObject.FindGameObjectsWithTag("Player").ToList();
给你的代码提个关键小建议
看你写的排序代码:
pList.OrderBy(obj=>Vector3.Distance(FindLocalPlayer().transform.position, obj.transform.position)).ToList();
这里要注意:LINQ的OrderBy方法不会修改原列表,而是返回一个新的排序后的集合,所以你需要把返回值重新赋值给pList,否则排序操作等于白做:
// 修正后的完整代码 public void FindClosestEnemy() { // 先把数组转成List List<GameObject> pList = GameObject.FindGameObjectsWithTag("Player").ToList(); // 接收排序后的新列表 pList = pList.OrderBy(obj=>Vector3.Distance(FindLocalPlayer().transform.position, obj.transform.position)).ToList(); // 现在pList就是按距离从近到远排序后的玩家列表了 }
内容的提问来源于stack exchange,提问作者succ mcbucc
相关产品推荐
相关产品推荐

