【问题标题】:Unity3D change MeshRender form a GameObjectUnity3D将MeshRender改成GameObject
【发布时间】:2014-11-28 21:34:44
【问题描述】:

我正在尝试替换整个 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 来测试更多选项,但只更改了一次。

感谢您的帮助!

已编辑 脚本转到 ARCamera。
这是 2 个游戏对象的图像:http://www.loverde.com.br/temp_files/Unity_MeshsToChange.png
1 - Hexa_GO > it_hex_3450 > pms_hexa5034(这是我链接到脚本的游戏对象)
2 - Eko_GO > it_eko_3450 > pms_eko_5034(这也是我链接到脚本的游戏对象)

我试图将 pms_hexa5034 更改为 pms_ekoxxx,反之亦然。只换一个,永不回头,永不前进。

已编辑
请查看已批准答案上的 cmets 以了解我的工作。
感谢@gunnar-b 一直以来的帮助

【问题讨论】:

    标签: c# unity3d


    【解决方案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;
    

    【讨论】:

    • 其他对象(网格)附加到主游戏对象?比如,只有一个游戏对象吗?
    • 我有一个空对象,上面有脚本。然后我有一个被改变的立方体(分配给“myMainGameObject”)。其他四个对象(一个额外的立方体,与变化的对象相同)首先也在场景中,但我将它们制作为预制件并移除它们(然后将预制件分配给脚本)。对帖子进行了更改,请参阅编辑。如果我能找到问题,我会尝试。
    • 是的,我也不使用大写字母作为首字母,但要快速进入这里,我会这样做并且不会注意到! rsrsr 谢谢你的帮助!!!如果可以或不能,我将等待您的评论,再次感谢!
    • 谢谢,我现在就试试!如果对您有帮助,请参阅我的版本部分。谢谢
    • 嗯,对我来说现在一切正常。这是该项目的链接(忽略其中的其他内容,该项目用于测试东西):file-upload.net/download-9872226/CodeTests.zip.html
    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多