记录环境
- Unity 2020.3.25f1
- Timeline 1.4.8
问题描述
轨道丢失- TML在AB包模式下,某条轨道加载不出来
- 模拟模式下使用正常,TML编辑模式直接看也正常
- 在出问题的TML里新加一条相同的轨道,打AB后新加的轨道正常,如上图:
- 原有的 “Mole Override Animator Track” 显示
Track cannot be loaded
- 后加的 “Mole Override Animator Track (1)” 正常
- 一同出现的,还有Console里的警告:
The referenced script (Unknown) on this Behaviour is missing!
- 双击警告,Inspector显示的信息,恰好与出问题的轨道相关。
碎言
上面是所有能直接拿到的信息,看到问题的第一反应是AB包里的脚本引用丢失了。于是解出AB里的信息检查,发现问题轨道与正常轨道,没有任何差别:Track关联的脚本及它被PlayableDirector引用的情况,全都一样。所以从能看到的信息里根本查不到任何问题,也理不出头绪 Orz...
原因说明
其实,这个看上去出错的TML本身就是没有任何问题(为了后面说明清楚,将这条TML记为TML-01)。从资源制作来说,是另一个TML(记为TML-02)出错了。
TML-02是从TML-01复制出来,然后修改得到的。它里面的Animator Track用到了TrackBindingType
特性。用了这个特性后,会在PlayableDirector中记录Bindings信息,复制TML的时候,Bindings信息不会被清理掉。这种情况下,需要让TML-01跟TML-02被打进同一个AB包,否则就会出错。这是Unity的内部机制,具体为什么这么做,我们搞不清楚。
这个问题有多种解决途径,但没一个优雅的:
- 将有这种错误依赖关系的资源放在同一个AB包里:会破坏项目的资源管理规范
- 在加载含有TML资源的AB包时,执行LoadAll操作:一方面破坏项目资源管理方式;一方面导致不需要到资源被加载进内存,浪费空间
- 找到被复制出来的TML,把它PlayableDirector中记录的无用Bindings信息删掉:很繁琐
我们选择的方案3,虽然繁琐但不会对项目结构产生影响。现阶段因为资源少,可以发现问题手动删除,后续准备进行工具化的处理。
顺便一提,Unity很多序列化的资源都存在复制引用不清理的问题。我们不能说这是Bug,只能说它是Unity的一种管理机制。但它确实给开发者造成了很多麻烦,在TML问题处理后不久,又发现AnimatorController复制后修改,有部分State引用无法删除在界面上也不可见!
这里推荐一个好用的库:unityparser ,它是一个Python的package,可以完美的读取、修改Unity的YAML文件。我用这个库实现了清理AnimatorController的工具~~
拓展阅读
Timeline架构
解决PlayableDirector由于复制粘贴导致的Scenes Binding没有被清理的问题
(Unity Forum) Track cannot be loaded
网友评论