【问题标题】:Accessing array/list of game object by name in hierarchy在层次结构中按名称访问游戏对象的数组/列表
【发布时间】:2016-10-25 02:07:50
【问题描述】:

我有一个相当简单的问题(除了我)...我已经创建了一个牌手数组,我想通过一个数组按照层次结构中出现的顺序访问他们的名字:

例如,在层次结构中它显示:

Canvas
   Hand
    card1
    card2
    card3
    card4

我已经创建了这段代码:

players = GameObject.FindGameObjectsWithTag("Player");
foreach (GameObject go in players)
{
    Debug.Log("Player  " + go + " is named " + go.name);
}

我可以访问牌手,但顺序错误。有什么建议吗?

谢谢

马龙

【问题讨论】:

  • 你必须自己排序

标签: c# arrays unity3d unity5


【解决方案1】:

永远不要依赖 FindGameObjectsWithTag 返回的项目的顺序,因为这在文档中没有指定并且可能是不可预测的。您必须添加一个自定义函数,该函数循环遍历数组并通过与GameObject.name 属性进行比较来找到您指定的游戏对象。

GameObject[] players;
void test()
{
    players = GameObject.FindGameObjectsWithTag("Player");
    foreach (GameObject go in players)
    {
        Debug.Log("Player " + go + " is named " + go.name);
    }
}

GameObject getGameObject(string gameObjectName)
{
    for (int i = 0; i < players.Length; i++)
    {
        //Return GameObject if the name Matches
        if (players[i].name == gameObjectName)
        {
            return players[i];
        }
    }

    Debug.Log("No GameObject with the name \"" + gameObjectName + "\" found in the array");
    //No Match found, return null
    return null;
}

用法

GameObject card1 = getGameObject("card1");
GameObject card2 = getGameObject("card2");
GameObject card3 = getGameObject("card3");
GameObject card4 = getGameObject("card4");

编辑

如果您的目标是按顺序对数组中的项目进行排序,那么应该这样做:

players = GameObject.FindGameObjectsWithTag("Player");
players = players.OrderBy(c => c.name).ToArray();

【讨论】:

  • 这个答案很好,但是说你永远不应该依赖项目的顺序不是:统一 UI(在 4.6 中实现)基于层次结构顺序 => 层次结构中的最后一个将绘制在顶部.根据情况,这可能非常有用/令人沮丧;)
  • @Kardux 我说的是FindGameObjectsWithTag 函数。订单是undefined。也许 Unity 发生了一些我不知道的变化。如果在调用FindGameObjectsWithTag 之前禁用其中一个游戏对象,比如card3 怎么办?整个订单的事情现在搞砸了。我了解记录的 UI 渲染顺序,但这与FindGameObjectsWithTag 无关。如果你有一个链接,上面写着FindGameObjectsWithTag 现在正在像你一样工作
  • 提到,请贴出来。
  • 我的错...我以为您是在笼统地谈论FindGameObjectsWithTag 方法,而不是专门谈论:在这种情况下,依赖层次顺序将是最糟糕的主意! (我的猜测是那些方法使用统一给游戏对象的 ID,类似于组件的 Instance ID
  • 很有可能。至于 UI,我认为 Unity 的 UI 使用 GameObject.transform.GetChild(indexNumber); 函数来进行渲染。对此不确定100p,但很可能。如果这是 OP 正在寻找的,我修改了我的答案以添加以对其进行排序。
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多