我创建了一个简单的颜色交换着色器,然后从中创建了一个材质。现在,我想看看编辑模式下的效果。
但是,我收到以下错误:
在编辑模式下调用 renderer.material 来实例化材质。这会将材质泄漏到场景中。您很可能想使用 renderer.sharedMaterial 来代替。
我不想更新
sharedMaterial
,因为我希望能够为不同的游戏对象设置不同的颜色,并且使用该属性会更改基础材质中的值,这是我不想要的。
请问我需要更改什么来解决该错误?
这是我的脚本:
[ExecuteInEditMode]
public class ColorSwap : MonoBehaviour
{
[SerializeField] private Color color;
private SpriteRenderer spriteRenderer;
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
}
void Start()
{
spriteRenderer.material.SetColor("color", color);
}
}
MaterialPropertyBlock
,而不是创建新材料。这使您可以修改单个渲染器的材质参数,而无需创建新材质(这可能会在编辑模式下导致问题,因为材质预计会保存在某处......)
[ExecuteInEditMode]
public class ColorSwap : MonoBehaviour
{
[SerializeField] private Color color;
private SpriteRenderer spriteRenderer;
private MaterialPropertyBlock mpb = new();
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
// Copy the existing material properties into the MaterialPropertyBlock
// to ensure that the default values are properly handled
spriteRenderer.GetPropertyBlock(mpb);
}
void Start()
{
// Set the "color" property for this object.
mpb.SetColor("color", color);
spriteRenderer.SetPropertyBlock(mpb);
}
}