问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity 如何更改单个物体的颜色-MaterialPropertyBlock

创作时间:
作者:
@小白创作中心

Unity 如何更改单个物体的颜色-MaterialPropertyBlock

引用
CSDN
1.
https://blog.csdn.net/weixin_46146935/article/details/139467444

在Unity开发中,有时需要更改场景中单个物体的颜色,但使用传统的gameObject.renderer.material.color方法会改变所有使用该材质的物体颜色。本文将介绍如何使用MaterialPropertyBlock来解决这一问题,实现对单个物体颜色的独立控制。

使用传统的gameObject.renderer.material.color=?无法更改单个对象材质的颜色,它会让所有附有该material的物体一起变更,因为material是共享的。

如何更改单个物体的颜色,而不更改使用该材质的所有其他对象的颜色呢?

可以通过脚本干净利落地解决,使用MaterialPropertyBlock :

Unity - Scripting API: MaterialPropertyBlock (unity3d.com)
https://docs.unity3d.com/ScriptReference/MaterialPropertyBlock.html它为每个物体提供单独的材质锁,以下是简单的随机颜色变更脚本,将随机颜色替换为指定颜色即可(注意,不同的material内的属性名称不同,这里“_BaseColor”表示URP的默认材质颜色):

using UnityEngine;
public class CargoDisplay : MonoBehaviour
{
    public MeshRenderer cargoRenderer;
    private MaterialPropertyBlock _propertyBlock;
    private static readonly int CargoColor = Shader.PropertyToID("_BaseColor");
    private void Start()
    {
        _propertyBlock = new MaterialPropertyBlock();
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            SetRandomColor();
        }
    }
    /// <summary>
    /// random color
    /// </summary>
    private void SetRandomColor()
    {
        _propertyBlock.SetColor(CargoColor, UnityEngine.Random.ColorHSV());
        cargoRenderer.SetPropertyBlock(_propertyBlock);
    }
    /// <summary>
    /// change color to the given color
    /// </summary>
    /// <param name="color"> the color to change to</param>
    public void SetCargoColor(Color color)
    {
        _propertyBlock.SetColor(CargoColor, color);
        cargoRenderer.SetPropertyBlock(_propertyBlock);
    }
}  

通过上述代码,你可以轻松实现对单个物体颜色的独立控制,而不会影响使用相同材质的其他物体。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号