Unity运行时修改.asset文件后如何实现刷新更新?
解决Unity运行时修改.asset文件后无法刷新的问题
首先明确核心问题:Unity运行时不会自动监测.asset文件的磁盘修改,且编辑器的AssetDatabase.Refresh()无法在运行时使用。要让修改生效,必须手动卸载旧的资源缓存并重新加载。
可行方案
方案1:卸载旧资源后重新加载(针对直接修改YAML格式的情况)
直接修改.asset的YAML文本后,需要让Unity放弃内存中缓存的旧资源实例,再从磁盘重新读取:
// 假设你之前加载的资源实例是targetAsset(比如ScriptableObject) // 1. 卸载旧资源实例 Resources.UnloadAsset(targetAsset); // 若资源不是通过Resources加载,用更彻底的方式卸载未被引用的资源 AsyncOperation unloadOp = Resources.UnloadUnusedAssets(); yield return unloadOp; // 2. 从修改后的文件重新加载资源(以PersistentDataPath下的文件为例) string assetPath = Application.persistentDataPath + "/YourAsset.asset"; byte[] assetBytes = File.ReadAllBytes(assetPath); AssetBundle tempBundle = AssetBundle.LoadFromMemory(assetBytes); // 替换为你的资源类型,比如你的ScriptableObject子类 YourAssetType newAsset = tempBundle.LoadAsset<YourAssetType>(Path.GetFileNameWithoutExtension(assetPath)); tempBundle.Unload(false); // 仅卸载Bundle本身,保留已加载的资源实例
方案2:改用JSON序列化(更安全可靠)
直接修改YAML格式容易因Unity版本序列化规则变化导致资源损坏,推荐直接操作内存中的资源实例,再用JSON保存:
// 1. 修改内存中的资源实例(以ScriptableObject为例) YourAssetType targetAsset = ...; // 已加载的资源实例 if (Something) { // 对应你之前替换" []"的操作,比如清理空列表 targetAsset.TargetList = targetAsset.TargetList.Where(item => item != null).ToList(); } // 2. 保存为JSON格式到文件 string json = JsonUtility.ToJson(targetAsset, prettyPrint: true); File.WriteAllText(pathToAsset, json); // 3. 重新加载时直接解析JSON YourAssetType loadedAsset = ScriptableObject.CreateInstance<YourAssetType>(); JsonUtility.FromJsonOverwrite(File.ReadAllText(pathToAsset), loadedAsset);
关键注意事项
- 运行时仅能修改可写目录下的文件,比如
Application.persistentDataPath,安装包内的资源是只读的,无法修改。 - 若你的资源原本在编辑器Assets目录下,需要先将其复制到可写目录,再修改副本。
- 卸载资源时要确保没有其他代码引用该资源实例,否则
UnloadUnusedAssets无法正确释放缓存。
内容的提问来源于stack exchange,提问作者Temeos
相关产品推荐
相关产品推荐

