Unity学习笔记(9) Unity材质属性块MaterialPropertyBlock——多个同类实例使用不同材质属性

博客介绍了在Unity里,默认情况下同一预制体的不同实例公用材质,修改一个实例的Shader属性,其他实例也会相应改变。若要不同实例使用不同材质着色器参数,需使用材质属性块,还给出了使用方式示例,并提供性能分析文章链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Unity中,默认情况下对同一个预制体创建出来的不同实例,
是公用同一个Material以及Shader的,

因此对一个实例的Shader属性修改后,
别的实例也会产生相应修改,
有种Shader的参数是静态的感觉。

而如果需要不同实例使用不同的材质着色器参数时,
就需要使用材质属性块MaterialPropertyBlock()

性能分析可以看这一篇,还是优化挺多的。
https://www.jianshu.com/p/eff18c57fa42
使用方式也很简单:

        prop =  new MaterialPropertyBlock();
        GetComponent<Renderer>().GetPropertyBlock(prop);
        prop.SetFloat("_CircleEdge", initEdgeSize);
        GetComponent<Renderer>().SetPropertyBlock(prop);

其中第一、二行只需要执行一次,
后面就用三、四动态修改着色器参数了。


用上一节讲圆环的具体实例,
固定各个大小不同的圆环的环宽值。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FixedEdgeWidth : MonoBehaviour
{
    public float initEdgeSize = 0.04f;
    float rate;
    MaterialPropertyBlock prop;
    void Start()
    {
        rate = initEdgeSize * transform.localScale.x;
        prop =  new MaterialPropertyBlock();
        GetComponent<Renderer>().GetPropertyBlock(prop);
        prop.SetFloat("_CircleEdge", initEdgeSize);
        GetComponent<Renderer>().SetPropertyBlock(prop);
    }

    void Update()
    {       
        prop.SetFloat("_CircleEdge", rate / transform.localScale.x);
        GetComponent<Renderer>().SetPropertyBlock(prop);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值