解决资源强制替换-新资源的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类型的成员。所以不看源代码压根没法解决这个问题,还好网上有类似的实现。估计是官方人员发的 要么就是那人反编译了代码。
关于代码 折叠文件夹的实现,在文档笔记-编辑器扩展中脚本,或者看孤狼的那个项目。
来源:麦瑞克博客
链接:https://www.playcreator.cn/archives/unity/1655/
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!