【问题标题】:Force Unity to save prefabs to disk强制 Unity 将预制件保存到磁盘
【发布时间】:2016-11-15 18:52:13
【问题描述】:

使用 Unity 5.4.2。

我创建了一个编辑器脚本,当您按下导出按钮时,该脚本会为某些预制数据实现导出器。它递归地在其自己的目录下查找与某种类型匹配的所有预制文件并加载这些预制件,以便可以以自定义方式导出它们。

我遇到的问题是磁盘上的预制件加载了

var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(file);

与编辑器中的当前状态不匹配。也就是说,如果您在编辑器中修改了一些预制数据,它实际上并没有保存到磁盘。请注意,这不需要将任何对象添加到场景中,我只是直接从附加到预制件的组件中导出数据。

我尝试将AssetDatabase.SaveAssets(); 添加到我的导出函数的顶部,这应该保存所有资产,但是当我编辑一个值然后记录从预制件加载的值时,它们不是最新的。到目前为止,我发现有两种(非编程)方法可以使我的导出器能够看到修改后的数据:

  • 如果我退出 Unity 并重新启动它,预制件似乎会在此时保存,并且导出器会看到更新的数据。
  • 如果我播放并停止任何场景,然后导出,导出器可以看到更新的数据,但奇怪的是(根据 git 状态)它们还没有写入磁盘,所以我怀疑 LoadAssetAtPath 实际上加载了一些缓存版本在“播放”时更新。

有没有办法强制 Unity 将所有内容保存到磁盘,以便我的导出器可以对最新值进行操作?

【问题讨论】:

  • 注意:我实际上已经解决了我遇到的问题,但最初的问题仍然存在,因为在我的实验过程中,我已经确认 SaveAssets 实际上并没有按照它在锡上所说的那样做并将内容写入磁盘。我还发现LoadAssetAtPath 也没有按照它在锡上所说的去做(如果它已经加载,它实际上会返回资产的编辑器内存版本)。

标签: unity3d


【解决方案1】:

以下应该可以解决问题

// Your changes go here

AssetDatabase.Save();
AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); // perhaps even ForceSynchronousImport?

// You loading should go here

有关ImportAssetOptions 的更多信息,请参阅此文档https://docs.unity3d.com/ScriptReference/ImportAssetOptions.html

【讨论】:

  • 这不起作用。此外,我发现播放场景并停止会导致导出器看到更新的资产。见编辑。
【解决方案2】:

注意:这并不能回答最初的问题,但确定并解决原因可能会对遇到相同/相似问题的任何人有所帮助。

我的问题是在附加到预制件的组件中导出计算和缓存的属性时。我假设LoadAssetAtPath 会从磁盘加载一个新实例是错误的,它会返回编辑器内存中已经存在的版本,这意味着缓存的值不会像新加载那样失效。

我使用的解决方案是在编辑器中运行时从不缓存,使用#ifdef UNITY_EDITOR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2014-01-08
    • 2016-07-22
    • 2013-12-19
    • 2010-09-23
    • 2014-12-01
    相关资源
    最近更新 更多