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 提到的 LinqGetComponentsInChildren 是一种更简单/更清洁的解决方案。

【讨论】:

以上是关于Unity 将游戏对象乱序存储在我的数组中的主要内容,如果未能解决你的问题,请参考以下文章

来自 CKAsset 的图像在 Swift 中乱序加载

XSLT 表在输出中乱序

您如何处理消息队列中乱序的消息?

Algs4-1.1.36乱序检查

js 对象数组乱序

iOS小技能:对象数组按照日期分组和排序,使用块代码实现数组排序和乱序。