1.MaterialPropertyBlock
2.通过Material的Set方法
3.Shader全局属性(Global Shader Properties)
1.MaterialPropertyBlock
csharp
运行时修改材质属性, 而不会创建新的材质实例(不会增加内存开销)
csharp
private Renderer renderer;
private MaterialPropertyBlock propertyBlock;
void Start()
{
renderer = GetComponent<Renderer>();
propertyBlock = new MaterialPropertyBlock();
}
void Update()
{
// 获取当前渲染器的属性块
renderer.GetPropertyBlock(propertyBlock);
// 设置颜色属性
propertyBlock.SetColor("_Color", color);
// 设置浮点数属性
propertyBlock.SetFloat("_FloatValue", floatValue);
// 将属性块应用回渲染器
renderer.SetPropertyBlock(propertyBlock);
}
2.通过Material的Set方法
csharp
这种方法会修改材质的属性, 如果材质是共享的, 那么所有使用该材质的对象都会受到影响; 如果不想影响其他对象, 可以
先复制一份材质(使用Material.Instantiate)
csharp
private Material material;
void Start()
{
// 获取渲染器上的材质,这里会创建一份新的材质实例(如果材质不是实例化的,则会实例化)
Renderer renderer = GetComponent<Renderer>();
// 使用material会创建实例,使用sharedMaterial则不会创建实例但会修改共享材质
material = renderer.material;
material.SetColor("_Color", color);
material.SetFloat("_FloatValue", floatValue);
}
3.Shader全局属性(Global Shader Properties)
csharp
这种方法设置的值会对所有Shader中同名的全局属性生效
void Start()
{
Shader.SetGlobalColor("_GlobalColor", color);
Shader.SetGlobalFloat("_GlobalFloat", floatValue);
}