带C#的Unity3D彩色多子游戏对象

时间:2019-12-04 07:56:38

标签: c# unity3d

在我的Unity项目中,我希望有多个红色的子游戏对象。 在服务器论坛中,我找到了使用c#做到这一点的解决方案,但不幸的是,我找不到适合我的解决方案。

我所有的子对象都带有标签“ colorChild”。

这是我到目前为止尝试过的:

using UnityEngine;

public class ColorChildObject : MonoBehaviour
{
    public GamObject PartentColor;
    public GameObject[] coloredChilds;
    public Material red;

    void Start()
    {
        if(coloredChilds == null)
           // coloredChilds = ParentColor.transform.FindChild("ChildName")
           // coloredChilds = ParentColor.transform.FindChild("colorChild")

           // coloredChilds = GameObject.FindGameObjectswithTag("colorChild")
           // coloredChilds = ParentColor.FindGameObjectswithTag("colorChild") 

        foreach (GameObject colorChild in colorChilds)
        {
            colorChild.GetComponent<Renderer>().material = red;
        }
    }
}

不幸的是,这四个(注释)都没有为我工作。我希望有人可以告诉我我该怎么做。

非常感谢

1 个答案:

答案 0 :(得分:3)

请注意

if(coloredChilds == null)

从不在这里true

public GameObject[] coloredChilds;

是一个序列化字段,因为它是public,因此由Unity Inspector自动初始化为空数组并存储在您的场景文件中!


要么将其设为private,以使其不再序列化

private GameObject[] coloredChilds;

或更改您的支票,例如长度像

if(coloredChilds.Length == 0)
    ...

第一个绝对更安全,因为您可能会通过检查器将甚至没有Renderer组件的对象添加到数组中,并最终出现异常;)


然后前两个甚至无法编译

coloredChilds = ParentColor.transform.FindChild("ChildName");
coloredChilds = ParentColor.transform.FindChild("colorChild");

因为FindChild返回单个引用,并且您想将其分配给数组。 (我不知道您使用的是哪个Unity版本,但是它也已被删除,您可能还是应该使用transform.Find。)

第二个取决于您想要的东西

coloredChilds = GameObject.FindGameObjectsWithTag("colorChild");

将在整个场景中搜索这些孩子!

coloredChilds = ParentColor.FindGameObjectswWthTag("colorChild");

仅在ParentColor下。

两个都只返回活动游戏对象!在这两种情况下,W应该是大写字母。


现在我实际上不会使用您显然找到的任何解决方案,而是使用GetComponentsInChildren并做类似的事情

// returns all Renderer references of any children (also nested) of ParentColor
// including the Renderer of ParentColor itself if exists
// by passing true this also returns inactive/disabled Renderers
Renderer[] coloredChildren = ParentColor.GetComponentsInChildren<Renderer>(true);

foreach(var child in coloredChildren)
{ 
    child.material = red; 
}

直接输入,而无需输入对象名称。

如果需要,您还可以进一步过滤子项,例如仅使用以ParentColor作为父母的孩子->只有头等孩子会上色

foreach(var child in coloredChilds)
{
    if(child.transform.parent != ParentColor.transform) continue;

    child.material = red;
}

或按已分配的标签

foreach(var child in coloredChilds)
{
    if(!child.CompareTag("colorChild")) continue;

    child.material = red;
}