使用传统的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);
}
}