
在本文中,将了解运行时如何在Unity应用程序中更改材质及其属性。
在这里3D天堂准备了一个简单的场景,刚才在空场景中添加了一个球形游戏对象(Sphere GameObject)。

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

要在运行时更改材质,请将以下脚本添加到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;
}
}

还可以从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;
在运行时更改材质属性
材质属性与附加到材质的着色器直接相关,可以在检查器窗口中看到附加到材质的着色器。

如果创建一个新材质,那么Unity已经将标准着色器附加到它上面。
但是…附加到材质的着色器可以从检查器窗口更改,也可以在运行时更改。
可以通过编辑着色器属性来更改材质的属性,可以在Inspector中看到Shader属性的详细列表。

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


改变材质的纹理
更改主要纹理
using UnityEngine;
public class MaterialDemo : MonoBehaviour {
public Texture2D SampleTexture;
private void Start()
{
MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
GetComponent<MeshRenderer>().material.mainTexture = SampleTexture;
}
}

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;
}
}
最终结果

启用着色器属性
改变排放值
正如之前提到的,应该首先启用一些属性,那么只有它可以改变。例如,要更改发射颜色,首先需要启用发射属性,然后才能更改它的颜色。
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着色器的着色器属性。

因此,在运行时更改着色器属性时,始终使用正确的属性名称。
例如,要更改颜色,请使用_BaseColor属性。
MeshRenderer mr = TestGameObject.GetComponent<MeshRenderer>();
mr.material.SetColor("_BaseColor", Color.green);
此外,在创建材质时确保传递正确的着色器名称。
…
以上是3D天堂关于在运行时更改材质及其属性的全部内容,如果你有任何反馈,请随时在本页面下方留言。