我正在寻找通过他们的名字获取ComponentsInChildren的最佳方式。情况是这样的,在我的游戏对象中,我有几个游戏对象,它们的名称都相同。
我想通过搜索名称然后更改它们的材料来访问所有这些。更改材料部分已经在代码中进一步完成。
gameobject.GetComponentInChildren<Transform>().Find(Name).GetComponent<MeshRenderer>().material = newMaterial;
上面的代码用于获取其中一个游戏对象并更改材质。我的问题是如何获取所有游戏对象并更改材料。
(游戏对象的数量并不总是相同)
就像你现在所拥有的那样,它没有什么意义。
GetComponentInChildren
只返回一个对象 ->调用它相同,因为GetComponentInChildren
也会在自身上查找组件!Find
再次只返回一个嵌套在该对象下方的单个对象。
为什么还要使用GetComponentInChildren<Transform>
,而您以后还是想要一个MeshRenderer
参考?
我认为您要做的是获取所有MeshRenderer
组件,然后按名称过滤它们。
foreach(var meshRenderer in gameobject.GetComponentsInChildren<MeshRenderer>(true))
{
if(meshRenderer.name == Name)
{
meshRenderer.material = newMaterial;
}
}
请注意GetComponentsInChildren
-> 中的s
这将返回嵌套在此对象下的所有MeshRenderer
引用(包括此对象)。通过将true
作为参数传入,这还包括非活动游戏对象和禁用的组件。
你也可以使用 LinqWhere
foreach(var meshRenderer in gameobject.GetComponentInChildren<MeshRenderer>(true).Where(meshRenderer => meshRenderer.name == Name))
{
meshRenderer.material = newMaterial;
}