解决资源强制替换-新资源的GUID修改为原GUID后引用丢失问题

思路

json ScriptableObject互相转换的实现中,涉及到新建的ScriptableObject的GUID与原文件的GUID不同的问题,导致资源引用丢失。

为解决这一问题,我尝试将GUID记录到json中,在生成新的ScriptableObject asset文件后 把新ScriptableObject的meta GUID替换为原GUID。这样就保证引用上了。

问题一:资源强制替换后Scene中关联的引用为Null

当旧资源删除后 新资源guid设置为旧资源guid后  scene中的游戏对象所引用的为 null:

这结果并没按照我预期那样,真让人窒息。我替换GUID后,在scene中原本引用该ScriptableObject的游戏对象脚本中 却发生了丢失 miss 或者直接为null。可是经过查看 prefab当中的GUID存在,且与ScriptableObject guid相同。

解决方案:

所以并不是引用不到,但是无论怎么刷新都还是missing,后面发现每次需要重启项目才能正常。于是做了个强制自动重启 算是解决了。

解决了这个,又出现了其他的问题。

问题二:资源强制替换后配置文件中关联的引用为null

当旧资源删除后 新资源guid设置为旧资源guid后  project中的配置文件所引用的新资源也为 null:

Project资源面板中 引用这些scriptableobject 的 配置文件 也发生了暂时的missing,同样也是要重启。

但是偶然间发现 只要折叠新资源所在的文件夹  project引用这些新资源的 配置文件就立马正常了。

或者用代码选中“引用新资源”的配置文件 也能正常显示,但是之后手动再选中,还是missing

UnityEditor.Selection.activeObject = itemContainerAssetObject;
UnityEditor.EditorGUIUtility.PingObject(itemContainerAssetObject);

于是我在每次生成完新资源后 对新资源的文件夹进行了自动折叠

这个折叠的实现,也挺恶心的,绕了很大弯。unity对于project这些面板的代码 全部都给限制为internal  内部类,压根就访问不了 project面板的 类 - UnityEditor.ProjectBrowser。只能通过反射从UnityEditor.ProjectBrowser一步一步 深入成员  反射到 设置折叠的方法。

恶心的是,中间的很多成员都是private类型的 而f12查看定义 压根就看不了 private类型的成员。所以不看源代码压根没法解决这个问题,还好网上有类似的实现。估计是官方人员发的 要么就是那人反编译了代码。

关于代码 折叠文件夹的实现,在文档笔记-编辑器扩展中脚本,或者看孤狼的那个项目。

 

作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/unity/1655
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
解决资源强制替换-新资源的GUID修改为原GUID后引用丢失问题
思路 在json与 ScriptableObject互相转换的实现中,涉及到新建的ScriptableObject的GUID与原文件的GUID不同的问题,导致资源引用丢失。 为解决这一问题,我尝……
<<上一篇
下一篇>>
文章目录
关闭
目 录