在编辑模式下更新材质的属性

问题描述 投票:0回答:1

我创建了一个简单的颜色交换着色器,然后从中创建了一个材质。现在,我想看看编辑模式下的效果。

但是,我收到以下错误:

在编辑模式下调用 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);
    }
}
unity-game-engine shader shader-graph
1个回答
0
投票

您可以尝试使用

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.