为了账号安全,请及时绑定邮箱和手机立即绑定

UnityEngine.GameObject与Generic.List

UnityEngine.GameObject与Generic.List

C#
慕无忌1623718 2021-04-02 22:18:57
public void FindClosestEnemy(){    List<GameObject> pList = GameObject.FindGameObjectsWithTag("Player");                                 pList.OrderBy(obj=>Vector3.Distance(FindLocalPlayer().transform.position, obj.transform.position)).ToList();}我不明白两个列表之间的区别。如何将“ UnityEngine.GameObject []”列表转换为System.Collections.Generic.List> UnityEngine.GameObject <
查看完整描述

2 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

GameObject.FindGameObjectsWithTag返回一个GameObjects数组。


C#中的数组是一种数据结构,用于存储相同类型的多个对象。


一个列表是对象的泛型集合。


尽管数组和列表在概念上非常相似,但是两者在数据访问和使用方面有所不同。通常,数组在创建时只会填充一次,之后只能读取,而List可以随时更改其元素(有一些注意事项)。


这个StackOverflow问题总结了为什么您可能想要另一个:Array vs List <T>:何时使用哪个?


在您的特定情况下,您想对您的GameObject集合应用一些Linq排序,因此您需要将接收FindGameObjectsWithTag到的数组转换为列表。


您可以通过多种方式来执行此操作。最简单的方法是在列表上使用构造函数重载来一次分配整个数组:


GameObject[] gameObjectArray = GameObject.FindGameObjectsWithTag("Player");

List<GameObject> gameObjectList = new List<GameObject(gameObjectArray);

其他一些选项在这里可用:System.Array到List的转换


查看完整回答
反对 回复 2021-04-17
?
LEATH

TA贡献1936条经验 获得超6个赞

正如史蒂夫(Steve)正确解释的那样,但我想以不同的方式回答:

实际上,在您的代码中,您是将数组类型对象(GameObject.FindGameObjectsWithTag("Player"))分配给列表类型(List<GameObject> pList)对象,而编译器并不隐式支持该对象。您必须将列表转换为数组类型:

List<GameObject> pList = new List<GameObject>(GameObject.FindGameObjectsWithTag("Player"));

之后,您将可以使用您的代码。

现在问题的第一部分

我不明白两个列表之间的区别。

实际上,您是在询问不同的黑白数组和列表,并且需要记住的主要区别是,当您具有固定长度的数据时,则应使用数组,如果数据长度可变,则应使用列表。


查看完整回答
反对 回复 2021-04-17
  • 2 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信