unity3d - 在MeshRenderer中,更改材质

  显示原文与译文双语对照的内容
0 0

我的项目中有许多材质,并列出了如下所示的路径:

  • Assets/3DModels/Materials/01 - white.mat
  • Assets/3DModels/Materials/02 - black.mat
  • Assets/3DModels/Materials/03 - red.mat
  • Assets/3DModels/Materials/04 - green.mat
  • Assets/3DModels/Materials/05 - blue.mat
  • Assets/3DModels/Materials/06 - purple.mat

我还使用 3ds max创建了 3D 个模型并导入到 Unity 。 模型有组件网格渲染器,它包含一个名为材质的array 。 在 3ds max中设置,所有模型都使用 01 - white.mat 作为 array 材质中的Element0.

运行时,我希望将 array 材质的Element0更改为 04 - green.mat 使用 C# 脚本。 因此,我有以下代码:

public void changeMaterial(){
 MeshRenderer mr = this.Transform.GetComponent<MeshRenderer>();
 mr.material = Resources.Load("3DModels/Materials/04 - green.mat", typeof(Material)) as Material;
}

当我运行它时,对象的Element0变成 None(Material) 。 我想我的代码中有一些错误。 请帮助,谢谢 !

时间:原作者:2个回答

0 0

如果你希望资产在运行时可以用,并通过 Resources.Load() 调用加载它们,则必须将它们放入资源文件夹。 所以把它们放在

Assets/Resources/3DModels/Materials
之类的东西里

另外,你的代码还有一个小问题。 Unity中的某些属性以意想不到的方式表现。 在这种情况下,设置材质将不起作用。 你必须创建一个 array的材质( 即使它只有一个元素) 并将它的分配给 mr.materials

我相信这些修正应该能正常工作。

原作者:
0 0

首先多亏了 Bart 。

如Bart所述,我将文件夹 3DModel 放在 Resources 文件夹下。 在我的程序中,我改变了一点,所以我

Resources.Load("3DModels/Materials/04 - green", typeof(Material)) as Material;

不需要将 Assets/Resources/ 放在前面,因为 Resources.Load 总是在这个文件夹中搜索资产。 也不需要放 .mat,现在我可以改变材质。

还有,多亏了 Bart

原作者:
...