【问题标题】:Unity finding child's transform component vs traversing parent's transformUnity 查找子组件的变换组件与遍历父组件的变换
【发布时间】:2015-12-08 18:53:17
【问题描述】:

所以我的想法是我想使用我自己的称为FindChildWithTag() 的方法获得一个带有特定标签的GameObject,它是GameObject 的子代。下面有两种不同的方法,我相信它们的目的相似。

第一

void GameObject FindChildWithTag(string tag)
{
    GameObject temp = GetComponentsInChildren<Transform>().
        Select(x => x.gameObject).
        FirstOrDefault(x => x.tag == tag && x != transform);

    return temp;
}

第二次

void GameObject FindChildWithTag(string tag)
{
    foreach (Transform item in transform)
    {
        if (item.tag == tag)
        {
            return item.gameObject;
        }
    }

    return null;
}

但奇怪的是,第一个返回 null 时,第二个返回正确。

知道我的错在第一个吗?因为我的想法告诉我这两种方法有着相同的目标。

谢谢。

【问题讨论】:

  • 我认为您的条件x != transform 是错误的,因为您将x 归因于x.gameObject
  • @RicardoReiter 我不认为。
  • 但是你会比较一个游戏对象引用和一个变换引用......或者不是?
  • @RicardoReiter afaik,相同级别的 lambda 表达式不会相互影响。所以,如果我把FirstOrDefault() 放在Select() 表达式中,你的意见就会完成。
  • 也许你的 lambda 表达式是错误的。如果您使用第二种算法但使用foreach (Transform item in GetComponentsInChildren&lt;Transform&gt;()) 而不是foreach (Transform item in transform),会起作用吗?

标签: unity3d lambda unity5


【解决方案1】:

脚本之间的主要区别在于,第二个脚本仅查找您正在搜索的 Transform 的子代。 (深度 1)第一个使用 GetComponentsInChildren 搜索所有孩子,即使深度更大。

在我的测试用例中,如果有一个正确标记的孩子,则两者都返回正确的对象@

在第二个测试用例中,只有第一个脚本返回对象,第二个脚本返回 null

【讨论】:

  • 但这没有意义,因为第二个找到它而第一个没有。
  • @RicardoReiter 是的。这是奇怪的事情
  • 当我(不知何故)再次尝试时,它起作用了。我也不确定为什么它们不同。所以,是的,也许我错字或什么的。 (不同的是我上次用名字而不是标签)
  • 它们是不同的,因为 GetComponentsInChildren 返回孩子和“childrens-children”(在第二种情况下,它将是“NotTagged”和“CorrectlyTagged”),如果你用 foreach 迭代你只会得到直接的孩子这将是“未标记”。这是因为Transform的“GetEnumerator()”函数是Unity这样实现的。
猜你喜欢
  • 2020-01-31
  • 2017-07-10
  • 2017-11-03
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2021-04-06
  • 2020-10-17
相关资源
最近更新 更多