C# 获取数组中父对象及其子对象的所有材质(少数除外)
我从父对象及其子对象获取所有材质,并将其存储在数组中。不过,我想忽略列表中要添加的几个游戏对象。我是否可以添加一个字符串作为要忽略的游戏对象的名称,以便除了这些游戏对象之外,所有内容都可以添加 另一件事是,我如何从每个游戏对象中获取所有和每个材质?很少有游戏对象有5个,其他的只有1个。使用下面的代码,我只能从每个游戏对象接收一个材质C# 获取数组中父对象及其子对象的所有材质(少数除外),c#,unity3d,C#,Unity3d,我从父对象及其子对象获取所有材质,并将其存储在数组中。不过,我想忽略列表中要添加的几个游戏对象。我是否可以添加一个字符串作为要忽略的游戏对象的名称,以便除了这些游戏对象之外,所有内容都可以添加 另一件事是,我如何从每个游戏对象中获取所有和每个材质?很少有游戏对象有5个,其他的只有1个。使用下面的代码,我只能从每个游戏对象接收一个材质 public Renderer[] allChildRenderers; public Material[] allMaterials; p
public Renderer[] allChildRenderers;
public Material[] allMaterials;
public string[] GameObjects_ToIgnore;
void Start () {
allChildRenderers = GetComponentsInChildren<Renderer> ();
allMaterials = new Material[allChildRenderers.Length];
for (int i = 0; i < allChildRenderers.Length; i++) {
allMaterials[i] = allChildRenderers[i].GetComponent<Renderer> ().material;
}
}
}
public呈现程序[]所有儿童呈现程序;
公共材料[]所有材料;
公共字符串[]游戏对象\u ToIgnore;
无效开始(){
allchildrenders=getcomponentsinchildrenders();
allMaterials=新材质[AllChildRenders.Length];
for(int i=0;i
是
不包括姓名的列表;
int-materialIndex=0;
用于(所有儿童渲染器中的渲染器){
如果(!exludedNames.Contains(currenderer.gameObject.name)){
foreach(材质currRenderer.materials中的材质currMaterial){
所有材料【材料指数】=当前材料;
materialindex++;
}
}
}
编辑如果假定每个渲染器的所有材质都有一个条目,则该条目应为材质[]或渲染器[]
Material[][] allMaterials;
List<string> excludedNames;
int rendererIndex = 0;
for (Renderer currRenderer in allChildRenderers){
if(!exludedNames.Contains(currRenderer.gameObject.name)){
int materialIndex = 0;
foreach(Material currMaterial in currRenderer.materials){
allMaterials[rendererIndex][materialIndex] = currMaterial;
materialindex++;
}
rendererIndex++;
}
}
Material[][]所有材料;
不包括姓名的名单;
int renderindex=0;
用于(所有儿童渲染器中的渲染器){
如果(!exludedNames.Contains(currenderer.gameObject.name)){
int-materialIndex=0;
foreach(材质currRenderer.materials中的材质currMaterial){
所有材料[RenderIndex][materialIndex]=currMaterial;
materialindex++;
}
renderindex++;
}
}
如果你想忽略一些游戏对象,你应该使用标签,这比游戏对象本身的名称更难更改(这意味着如果你更改游戏对象的名称,你的代码可能会中断,至于标签,你不会经常更改)。为应该忽略的对象指定一个新标记以指示它
对于同一对象中的多个材质,请使用
allchildrenders[i].materials
获取对象正在使用的材质数组allchildrenders[i],material
仅返回第一个材质,而allchildrenders[i]。materials
返回包含所有使用材质的数组
试试这个: 首先,更改列表而不是数组的
allMaterials
:
public List<Material> allMaterials = new List<Material>();
public List allMaterials=new List();
然后,试试这个:
for (int i = 0; i < allChildRenderers.Length; i++) {
if(allChildRenderers[i].gameObject.CompareTag("ignored_tag")) continue;
foreach(Material mat in allChildRenderers[i].materials)
allMaterials.Add(mat);
}
for(int i=0;i
您是如何编译的?allMaterials[i]返回材质,但渲染器()返回。材质返回材质数组(材质[])。@SeLeCtRa yes它应该是GetComponent().material代码>但我想从每个游戏对象获取所有材料。例如,我提到过,你应该把allMaterials数组改为List allMaterials。然后使用allMaterial.add(Renderer.materials)@SeLeCtRa好的,我会试试你的方法。还有,我如何忽略带有字符串的游戏对象?为了不添加这些游戏对象?只需使用if(Renderer.gameObject.name!=“ignoredName”){allMaterials.add(Renderer.materials);}allMaterials数组长度是渲染器计数。但您正在使用Renderer.materials作为输入。除非每个渲染器只有1个材质,否则它将抛出错误,事实并非如此。那么应该将材质[]设置为me material[],但如果这是您也应该添加父材质的点,我将创建一个更正。使用GetComponent().materials。那么你的答案是解决方案。对不起,它不起作用。我甚至在代码中添加了foreach而不是for。但是材料没有被选中。Selectra,GetComponentsInChildren还返回调用它的游戏对象中的组件。嗨,丹尼尔。我以前在代码中使用过材质,但出现错误无法将类型“UnityEngine.Material[]”隐式转换为“UnityEngine.Material”
您可能正在设置allMaterials[I]=AllChildRenders[I]。材质,您必须保证allMaterials
数组的长度是所有对象的所有材质的总和。然后,您应该将allchildrenders[i].materials
的每种材质放在allMaterials
的单个插槽中。是的。那么我该如何解决这个问题呢?我在答案的末尾添加了一个可能的解决方案。
allMaterials[i] = allChildRenderers[i].GetComponent<Renderer> ().material;
allMaterials[i] = allChildRenderers[i].material;
public List<Material> allMaterials = new List<Material>();
for (int i = 0; i < allChildRenderers.Length; i++) {
if(allChildRenderers[i].gameObject.CompareTag("ignored_tag")) continue;
foreach(Material mat in allChildRenderers[i].materials)
allMaterials.Add(mat);
}