ue3dUnity在运行时更改材质及其属性

Unity在运行时更改材质及其属性

分类:
ue3d - Unity在运行时更改材质及其属性

在本文中,将了解运行时如何在Unity应用程序中更改材质及其属性。

在这里3D天堂准备了一个简单的场景,刚才在空场景中添加了一个球形游戏对象(Sphere GameObject)。

ue3d - Unity在运行时更改材质及其属性

在运行时更改材质

在Unity中可以在一个游戏对象上应用多种材质,也可以在GameObject的Mesh Renderer组件中看到这些材质。

ue3d - Unity在运行时更改材质及其属性

要在运行时更改材质,请将以下脚本添加到Sphere GameObject。

using UnityEngine;

public class MaterialDemo : MonoBehaviour {
    Material SphereMaterial;

	// Use this for initialization
	void Start () {
        SphereMaterial = Resources.Load<Material>("SphereMaterial");
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
        // Get the current material applied on the GameObject
        Material oldMaterial = meshRenderer.material;
        Debug.Log("Applied Material: " + oldMaterial.name);
        // Set the new material on the GameObject
        meshRenderer.material = SphereMaterial;
	}
}
ue3d - Unity在运行时更改材质及其属性

还可以从MeshRenderer组件更改材质数组。实际上,GetComponent .material属性仅返回材质数组的第一个元素。

Material[] materials = meshRenderer.materials;
// Get the current material applied on the GameObject
Material oldMaterial = materials[0];
// Set the new material on the GameObject
Material[] newMaterials = new Material[] { SphereMaterial};
meshRenderer.materials = newMaterials;

在运行时更改材质属性

材质属性与附加到材质的着色器直接相关,可以在检查器窗口中看到附加到材质的着色器。

ue3d - Unity在运行时更改材质及其属性

如果创建一个新材质,那么Unity已经将标准着色器附加到它上面。

但是…附加到材质的着色器可以从检查器窗口更改,也可以在运行时更改。

可以通过编辑着色器属性来更改材质的属性,可以在Inspector中看到Shader属性的详细列表。

ue3d - Unity在运行时更改材质及其属性

Inpector窗口中单击EditShader(编辑着色器)后,可以看到着色器属性名称及其类型(int、float、color等)。

ue3d - Unity在运行时更改材质及其属性
ue3d - Unity在运行时更改材质及其属性

改变材质的纹理

更改主要纹理

using UnityEngine;

public class MaterialDemo : MonoBehaviour {
    public Texture2D SampleTexture;

    private void Start()
    {
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
        GetComponent<MeshRenderer>().material.mainTexture = SampleTexture;
    }
}
ue3d - Unity在运行时更改材质及其属性

Material.mainTexture是主要的漫反射纹理,这也可以通过Unity的内置标准着色器中纹理的_MainTex属性名称进行更改。

许多着色器使用不止一种纹理,在这种情况下,请确保使用正确的纹理属性名称在运行时更改它。

using UnityEngine;

public class MaterialDemo : MonoBehaviour {
    public Texture2D SampleTexture;

	// Use this for initialization
	void Start () {
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
        meshRenderer.material.SetTexture("_MainTex", SampleTexture);

    }
}

可以使用GetTexture属性获取材质的当前主纹理。

meshRenderer.material.GetTexture("_MainTex")

更改法线贴图

也可以通过材质的SetTexture属性更改法线贴图,_BumpMap是Unity标准着色器中纹理的属性名称。

using UnityEngine;

public class MaterialDemo : MonoBehaviour {
    public Texture2D NormalMapTexture;

	// Use this for initialization
	void Start () {
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
        meshRenderer.material.SetTexture("_BumpMap", NormalMapTexture);
    }
}

使用标准着色器设置材质纹理时,有时可能需要在调用SetTexture属性之前使用EnableKeyword启用着色器的功能。

meshRenderer.material.EnableKeyword("_NORMALMAP");

改变金属质感

// if not enabled
m_Renderer.material.EnableKeyword ("_METALLICGLOSSMAP");
// set texture
meshRenderer.material.SetTexture("_MetallicGlossMap", SampleTexture);

改变材质的颜色

改变主材质的颜色,使用Material.color属性获取和设置主材质颜色。

MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
// change color to blue
meshRenderer.material.color = Color.blue;

同样也可以通过SetColor属性进行更改,_Color是标准着色器中颜色的属性名称

 // get color
meshRenderer.material.GetColor("_Color");
// set color
meshRenderer.material.SetColor("_Color", Color.blue);

实时更改材质颜色

将以下代码附加到游戏对象。

using UnityEngine;

public class MaterialDemo : MonoBehaviour {
    public Color newColor;

    private void Update()
    {
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
        meshRenderer.material.color = newColor;
    }
}

最终结果

ue3d - Unity在运行时更改材质及其属性

启用着色器属性

改变排放值

正如之前提到的,应该首先启用一些属性,那么只有它可以改变。例如,要更改发射颜色,首先需要启用发射属性,然后才能更改它的颜色。

using UnityEngine;

public class MaterialDemo : MonoBehaviour {
  
    private void Start()
    {
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
        meshRenderer.material.EnableKeyword("_EMISSION");
        meshRenderer.material.SetColor("_EmissionColor", Color.blue);
    }
}

更改浮动值

可以使用Material.SetFloat属性更改许多着色器属性,例如金属范围、UVs设置。

改变金属范围

meshRenderer.material.SetFloat("_Metallic", 0.9f);

在运行时更改着色器

使用以下代码在运行时更改着色器,确保着色器名称正确,否则会抛出空引用异常。

Shader specularShader = Shader.Find("Standard (Specular setup)");

MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
meshRenderer.material.shader = specularShader;

HDRP材质

HDRP着色器具有与标准Unity着色器不同的属性名称,下面是HDRP/Lit着色器的着色器属性

ue3d - Unity在运行时更改材质及其属性

因此,在运行时更改着色器属性时,始终使用正确的属性名称。

例如,要更改颜色,请使用_BaseColor属性。

MeshRenderer mr = TestGameObject.GetComponent<MeshRenderer>();
mr.material.SetColor("_BaseColor", Color.green);

此外,在创建材质时确保传递正确的着色器名称。

以上是3D天堂关于在运行时更改材质及其属性的全部内容,如果你有任何反馈,请随时在本页面下方留言。

相关信息

  • 类型:知识
  • 字数:841
  • 字符:5560
  • 适用软件:Unity
  • 说明:无
  • 编号:156284

热门内容

提示:3D天堂作为服务提供者,尊重网络版权及知识产权,对某些行为的发生不具备充分的监控能力,若无意间侵犯到您的权利,请 联系我们,我们会在收到信息后尽快给予处理。

本站文章版权归本站自创作者所有,未经允许不得转载!