在我的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;
}
}
}
不幸的是,这四个(注释)都没有为我工作。我希望有人可以告诉我我该怎么做。
非常感谢
答案 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;
}