如何在Unity C#脚本中将材质设置给游戏物体?

5

我正在尝试为我的游戏对象设置材质,我是通过脚本创建的对象,因此无法通过Unity手动设置。所有这些都必须在脚本中完成。我的代码如下:

void Start()
{


    GameObject cube2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cube2.transform.position = new Vector3(12f, -3f, -82.5f);


}

我将我创建的立方体命名为"cube2"。我的目标是将其设置为红色,我已经创建了一个名为"red"的材质。谢谢。

3个回答

5

首先,您需要获取物体的引用。您可以在组件上使用公共变量public Material yourMaterial;并将材质拖放到界面上,或者通过以下代码获取它:

// in the Start() method
Material yourMaterial = Resources.Load("red", typeof(Material)) as Material;

然后,您可以将其分配给一个GameObject,使用renderer.material字段:
cube2.renderer.material = yourMaterial;

注:我年纪渐长.......renderer已经过时,应该像@Chopi建议的那样使用.GetComponent<Renderer>()
编辑:
为了使Resources.Load正常工作,您的材质red.mat必须位于Resources文件夹中。如果它位于子文件夹中,比如“Resources/materials/red.mat”,那么会发生以下情况:
Material yourMaterial = Resources.Load("materials/red", typeof(Material)) as Material;

我差不多也快完成我的回答了! :) - Chopi
@Chopi,嗯,完成并发布也没有什么坏处;) - Pac0
我收到了一个错误,这是我的代码:public class ObjectCreate : MonoBehaviour { Material yourMaterial = Resources.Load("red", typeof(Material)) as Material; void Start() { GameObject cube2 = GameObject.CreatePrimitive(PrimitiveType.Cube); cube2.transform.position = new Vector3(12f, -3f, -82.5f); cube2.renderer.material = yourMaterial; }} - jonesmax
我正在使用给定的代码,但现在它打印出了一个粉色的立方体?哈哈,在编程时我没有收到任何错误,但当我运行它时,我收到了这个错误:http://prntscr.com/j5o1ek和http://prntscr.com/j5o1ii。 - jonesmax
是的,这是可能的。查看其他类似于此处的问答:https://answers.unity.com/questions/881890/load-material-from-assets.html ,您可能需要指定您的材质所在的文件夹。 - Pac0
显示剩余9条评论

2
你可以通过公共变量在代码中进行设置。
public Material myMaterial;
void Start()
{
    GameObject cube2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cube2.transform.position = new Vector3(12f, -3f, -82.5f);
    cube2.GetComponent<Renderer>().material = myMaterial;
}

正如Pac0所说,您也可以使用Resource.Load来避免使用公共变量,但在这种情况下,您需要将材料存储在“资源”文件夹中。

它仍然在进行白盒测试。我不认为我正确使用了你的建议...我的代码看起来像这样: public Material myMaterial; Material yourMaterial = Resources.Load("red", typeof(Material)) as Material; void Start() { GameObject cube2 = GameObject.CreatePrimitive(PrimitiveType.Cube); cube2.transform.position = new Vector3(12f, -3f, -82.5f); GetComponent<Renderer>().material = yourMaterial; } - jonesmax
如果您使用公共变量来存储材质,就可以避免使用Resource.Load并且可以从检视面板中进行赋值。只需双击“none”选项并选择您的材质即可。请确保所选的材质不是白色:P。此外,我看到“yourMaterial”是通过Resources.Load设置的,这样您就有两个材质了。 - Chopi
如果我没记错的话,GetComponent<Renderer>()将获取当前游戏对象的渲染器,而不是创建的另一个cube2对象的渲染器。 - Pac0
@Pac0 你是对的!!我刚刚编辑了我的答案,谢谢 =) - Chopi

0

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅仅是一个链接的答案可能会被删除 - Rajesh Pandya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接