Unity编辑模式下脚本修改的物体名场景重载后未保存如何解决
问题根因
Unity编辑器仅会对用户手动操作的修改自动标记为待保存状态,脚本在编辑模式下直接修改GameObject属性时,若未主动通知编辑器有改动,修改内容不会被写入场景的序列化数据,切换场景、重启编辑器时改动就会丢失。
修复方案
调整OnValidate逻辑,完成名称修改后主动标记对象和所属场景为脏状态,完整代码如下:
using UnityEditor; using UnityEngine; public class MyBehaviour : MonoBehaviour { #if UNITY_EDITOR private void OnValidate() { // 过滤运行时状态,避免进入播放模式时触发非预期逻辑 if (EditorApplication.isPlayingOrWillChangePlaymode) return; if (!name.Contains("_")) { name = $"{name}_{GenUID()}"; // 标记当前组件关联的GameObject已修改 EditorUtility.SetDirty(this); // 标记GameObject所属场景为待保存状态 UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(gameObject.scene); } } // 此处为GenUID的示例实现,可替换为你自身的UID生成逻辑 private string GenUID() { return Random.Range(1000, 9999).ToString(); } #endif }
注意事项
- 如果该脚本挂载在预制体实例上,需额外添加
PrefabUtility.RecordPrefabInstancePropertyModifications(this),才能将修改同步到预制体实例的属性覆写 - 代码修改后,按
Ctrl+S(Mac为Command+S)保存场景,即可将名称改动永久写入场景文件 - 避免在
OnValidate中编写高频执行的复杂逻辑,防止编辑器出现卡顿
内容的提问来源于stack exchange,提问作者user12653758
相关产品推荐
相关产品推荐

