Unity 将游戏对象乱序存储在我的数组中
Posted
技术标签:
【中文标题】Unity 将游戏对象乱序存储在我的数组中【英文标题】:Unity is storing the gameobjects in my arrays out of order 【发布时间】:2021-07-29 08:05:23 【问题描述】:我正在制作一个统一的塔防游戏。老实说,我很新,而且很糟糕哈哈。无论如何,我希望我的敌人穿过一个航路点系统。我做了一个数组这是代码。
public GameObject[] wpoints;
public int currentindex;
// Start is called before the first frame update
void Start()
wpoints = GameObject.FindGameObjectsWithTag("wpoints");
在犯了一堆愚蠢的错误之后,我让他们动了起来!但他们以一种非常奇怪的方式移动。事实证明,unity 将我所有的航路点乱序存储在数组中。而不是 point1,point2,point3... 它的点 8,point15,point2。帮忙?
【问题讨论】:
我只会使用 linq 对航路点进行排序。wpoints = wpoints.OrderBy(x => x.name);
您可以实际上将它们从层次结构手动拖放到 Inspector 而不是“FindGameObjectsWithTag”,因为它是一个公共数组。重要提示:您需要将元素拖放到数组名称/文本上。
@KYL3R daiiim 刚刚学到了一些东西 ^^ 我等了多久:D
@derHugo 我一个接一个地拖着它们,直到 reddit 上有人向我指出。这真的很方便,因为层次结构的顺序保持不变!
【参考方案1】:
FindGameObjectsWithTag
不保证以任何有意义的方式排序结果。
如果你想要它们,例如按照它们出现在层次结构中的顺序,我宁愿给它们一个专用组件,例如
// Doesn't have to do anything, just used to identify waypoints
public class Waypoint : MonoBehaviour
将它们全部放在某个对象下并使用例如GetComponentsInChildren
这个是保证按层次顺序从上到下返回对象。
如果它们在您的场景中分布在多个不同的父对象下而没有共同的根,您也可以使用 Scene.GetRootGameObjects
遍历所有根对象并执行
var waypoints = new List<Waypoint>();
foreach(var root in SceneManager.GetActiveScene().GetRootGameObjects())
waypoints.AddRange(root.GetComponentsInChildren<Waypoint>(true));
wpoints = waypoints.ToArray();
或者无论使用什么Linq OrderBy
,都可以按名称对它们进行排序
using System.Linq;
...
wpoints = GameObject.FindGameObjectsWithTag("wpoints").OrderBy(wp => wp.name).ToArray();
【讨论】:
【参考方案2】:问题是FindGameObjectsWithTag
不返回任何有用的对象排序。据我所知,Unity 的许多FindAll
方法如何对它找到的数据进行排序,这是没有记录的。如果您想在找到航点后对数据进行排序,您可以这样做。
public class WaypointSorter : IComparer
int IComparer.Compare( System.Object x, System.Object y)
return((new CaseInsensitiveComparer()).Compare(((GameObject)x).name, ((GameObject)y).name));
private void Start()
IComparer newComparer = new WaypointSorter();
wpoints[] gameobjects = GameObject.FindGameObjectsWithTag("wpoints");
Array.Sort(wpoints, myComparer);
编辑:我将留下我的答案作为替代方案,但使用 derHugo 提到的 Linq
或 GetComponentsInChildren
是一种更简单/更清洁的解决方案。
【讨论】:
以上是关于Unity 将游戏对象乱序存储在我的数组中的主要内容,如果未能解决你的问题,请参考以下文章