You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity游戏结束后如何将材质属性重置为默认值?

问题分析与解决方案

核心理解误区

  • 混淆了材质实例和原始材质资源的差异:通过image.material获取材质时,Unity会自动生成该材质的运行时实例(相当于独立副本),你用代码修改的是这个副本的属性。场景关闭后,Unity会把修改后的实例材质绑定到Image组件上保存,下次打开场景直接加载该实例,不会自动换回原始材质。而Transform坐标属于对象的临时运行时状态,默认不会被场景保存,所以重启后会恢复,这是两者的本质区别。
  • 错误认为运行时修改会自动重置到原始默认值:原始材质的默认值存储在材质资源文件中,但你修改的是实例化后的副本,场景保存时会记录这个副本的状态,不会自动还原到原始资源的属性。

恢复属性值的解决方法

方法1:用MaterialPropertyBlock临时修改(推荐)

这是最安全的方式,不会创建材质实例,仅临时覆盖对象属性,运行时修改不会被序列化到场景中,重启游戏后自动恢复原始默认值。代码示例:

private MaterialPropertyBlock _propBlock;
private Image _image;

void Start()
{
    _image = GetComponent<Image>();
    _propBlock = new MaterialPropertyBlock();
}

// 调用此方法修改颜色
public void UpdateColor(Color newColor)
{
    _image.GetPropertyBlock(_propBlock);
    _propBlock.SetColor("_MainColor", newColor);
    _image.SetPropertyBlock(_propBlock);
}

方法2:手动保存原始值并在退出时恢复

如果必须使用material.SetColor,可以在游戏启动时保存原始颜色,在场景卸载或游戏退出时恢复:

private Color _originalColor;
private Image _image;

void Start()
{
    _image = GetComponent<Image>();
    // 保存原始材质的颜色(通过sharedMaterial获取资源本身的属性)
    _originalColor = _image.sharedMaterial.GetColor("_MainColor");
}

void OnDestroy()
{
    // 恢复颜色到原始值
    _image.material.SetColor("_MainColor", _originalColor);
    // 销毁运行时生成的材质实例,避免残留
    Destroy(_image.material);
    // 换回原始材质
    _image.material = _image.sharedMaterial;
}

方法3:直接操作原始材质(不推荐)

用image.sharedMaterial.SetColor("_MainColor", colorNew)代替image.material.SetColor,但此操作会直接修改原始材质资源文件,所有使用该材质的对象都会同步变化,且修改会永久保存到资源中,仅适合需要永久修改材质的场景。

内容的提问来源于stack exchange,提问作者dezzcore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:25:16