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
相关产品推荐
相关产品推荐

