如何获得没有父母的所有孩子?

Dan*_*Lip 4 c# unity-game-engine

Transform[] drawns = GetComponentsInChildren<Transform>()
Run Code Online (Sandbox Code Playgroud)

这还包括父级,但我只想获取脚本所连接的转换的子级。

问题是它在循环中也破坏了父级。绘制数组中的第一项是父项:

case DrawStates.DrawOnGizmosRuntime:
drawOnce = true;
if (line != null && drawOnGizmos == false)
{
    Transform[] drawns = GetComponentsInChildren<Transform>();
    if (drawns.Length > 0)
    {
        foreach (Transform drawn in drawns)
        {
            Destroy(drawn.gameObject);
        }
    }
}
if (boxCollider == null)
{
    boxCollider = boxColliderToDrawOn.GetComponent<BoxCollider>();
}
drawOnGizmos = true;
break;
Run Code Online (Sandbox Code Playgroud)

Kiy*_*ynL 5

实际上有几种方法可以找到没有父母的孩子。

foreach (var child in children) Debug.Log(child);
Run Code Online (Sandbox Code Playgroud)

使用Where扩展:

使用 后system.linq,您可以分离不是原始变换的子项,如下所示。

var children = transform.GetComponentsInChildren<Transform>().Where(t => t != transform);
Run Code Online (Sandbox Code Playgroud)

删除索引 0:

由于索引 0 始终是主要转换,因此您可以在将子项转换为列表后将其删除。

var children = transform.GetComponentsInChildren<Transform>().ToList();

children.RemoveAt(0);
Run Code Online (Sandbox Code Playgroud)

使用跳过(1)

感谢亲爱的@Enigmativity,另一个解决方案是使用Skip(1),这实际上避免了主要的转换成员。

var children = transform.GetComponentsInChildren<Transform>().Skip(1);
Run Code Online (Sandbox Code Playgroud)

  • 看起来 `transform.GetComponentsInChildren&lt;Transform&gt;().Skip(1).ToList();` 也是一个不错的选择。 (2认同)