C# 获取数组中父对象及其子对象的所有材质(少数除外)

C# 获取数组中父对象及其子对象的所有材质(少数除外),c#,unity3d,C#,Unity3d,我从父对象及其子对象获取所有材质,并将其存储在数组中。不过,我想忽略列表中要添加的几个游戏对象。我是否可以添加一个字符串作为要忽略的游戏对象的名称,以便除了这些游戏对象之外,所有内容都可以添加 另一件事是,我如何从每个游戏对象中获取所有和每个材质?很少有游戏对象有5个,其他的只有1个。使用下面的代码,我只能从每个游戏对象接收一个材质 public Renderer[] allChildRenderers; public Material[] allMaterials; p

我从父对象及其子对象获取所有材质,并将其存储在数组中。不过,我想忽略列表中要添加的几个游戏对象。我是否可以添加一个字符串作为要忽略的游戏对象的名称,以便除了这些游戏对象之外,所有内容都可以添加

另一件事是,我如何从每个游戏对象中获取所有和每个材质?很少有游戏对象有5个,其他的只有1个。使用下面的代码,我只能从每个游戏对象接收一个材质

    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);        
}