Unity3D从GameObject更改Mesh Renderer

时间:2014-11-19 15:02:48

标签: c# unity3d

我试图替换整个Mesh或GameObject(没有实例化或禁用并启用其他),因为我的Mesh与GameObject不同,其他位置和脚本是相同的,所以,这就是为什么我需要更改只有网格(我猜这是正确的方法)。

所以,这是C#中的代码

public GameObject MyMainGameObject;
public GameObject[] OtherMeshMaterials;

int maxMaterials;
int arrayPos = 0;

void Start ()
{
    maxMaterials = OtherMeshMaterials.Length-1;

    Debug.Log ( "Total = "+ maxMaterials );
}

void updateMaterials()
{
    //Cycle forward
    if (Input.GetKeyDown (KeyCode.U)) {
        if (arrayPos == maxMaterials)
            arrayPos = 0;
        else
            arrayPos++;

        MyMainGameObject.GetComponent<MeshRenderer>().material = OtherMeshMaterials[arrayPos].GetComponent<MeshRenderer>().material;
        MyMainGameObject.GetComponent<MeshFilter>().mesh       = OtherMeshMaterials[arrayPos].GetComponent<MeshFilter>().mesh;

        Debug.Log ( "NAME = "+ MyMainGameObject.transform.name );
    }



    //Cycle backwards
    if (Input.GetKeyDown (KeyCode.Y)) {            
        if (arrayPos == 0)
            arrayPos = maxMaterials;
        else
            arrayPos--;

        MyMainGameObject.GetComponent<MeshRenderer>().material  = OtherMeshMaterials[arrayPos].GetComponent<MeshRenderer>().material;
        MyMainGameObject.GetComponent<MeshFilter>().mesh        = OtherMeshMaterials[arrayPos].GetComponent<MeshFilter>().mesh;

        Debug.Log ( "NAME = "+ MyMainGameObject.transform.name );
    }
}



void Update ()
{
    updateMaterials ();
}

当我换到另一个时,网格比另一个小(但不是问题)并且不再改变,名称改变了,但是网格的改变发生了一次,再也没有了......

我使用4个或更多 OtherMeshMaterials 来测试更多选项,但只更改了一次。

感谢您的帮助!

EDITED 脚本转到ARCamera 这里有2个游戏对象的图像:http://www.loverde.com.br/temp_files/Unity_MeshsToChange.png
1 - Hexa_GO&gt; it_hex_3450&gt; pms_hexa5034(这是我链接到脚本的游戏对象)
2 - Eko_GO&gt; it_eko_3450&gt; pms_eko_5034(这是我也链接到脚本的游戏对象)

我尝试将pms_hexa5034更改为pms_ekoxxx,反之亦然。只改变一个,永远不会回头,永远不会前行。

EDITED
请查看已批准答案的评论以找到我的工作。
感谢@ gunnar-b这么多日子来帮忙

1 个答案:

答案 0 :(得分:1)

[请参阅编辑3了解解决方案]

好吧,我尝试过这样的代码:

我创建了一个空的游戏对象并将该脚本附加到它上面。然后我创建了一个立方体并将其分配给“myMainGameObject”。之后我创建了一个球体,一个胶囊,一个圆柱体和另一个立方体以及四种材料(只有四种不同的颜色),每种材料都添加了一种,立方体添加到立方体中。我将“otherMeshMaterials”的大小设置为4并分配了4个额外的游戏对象(0:立方体,1:球体,2:胶囊,3:圆柱体)。

通过此设置,骑行可以正常,前进和后退。虽然没有名称更改(因为它现在不在代码中),当然大小会更改,因为默认情况下这些对象具有不同的大小。

此外,只是将四个参考游戏对象与文件夹中的预制件一样,并且未在场景中实例化。但

因此,据我所知,问题与代码本身无关。我们需要有关脚本周围内容的更多信息。这是如何设置的?

编辑: 哦,我现在可以复制你的问题了。我没有完全复制你的脚本,我在几点改变了大写:所有变量名都以小写字母开头(不仅是私有字母,还有公开字母)和带大写字母的方法。 将它们全部更改为再次匹配您的代码,并出于某种原因将其杀死。即使还原它也不再有效。

编辑2: 好的,我发现了问题:目前参考对象也发生了变化,因此他们失去了指定的网格和材质。如果您选择一个参考对象并在检查器中观察它,您将在运行时看到“类型不匹配”,并且“缺失(网格)”不是运行时。

编辑3: 好的,找到了解决方案:您需要使用“sharedMaterial / sharedMesh”而不是“material / mesh”。

因此调整以下内容(对于U和Y或将这两行放在一个单独的方法中并调用它):

myMainGameObject.GetComponent<MeshRenderer>().material = otherMeshMaterials[arrayPos].GetComponent<MeshRenderer>().sharedMaterial;
myMainGameObject.GetComponent<MeshFilter>().mesh       = otherMeshMaterials[arrayPos].GetComponent<MeshFilter>().sharedMesh;