我试图替换整个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这么多日子来帮忙
答案 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;