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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:32:27