[RS] Timeline踩坑(1):Track cannot be loaded

记录环境

  • Unity 2020.3.25f1
  • Timeline 1.4.8

问题描述

轨道丢失
  1. TML在AB包模式下,某条轨道加载不出来
  2. 模拟模式下使用正常,TML编辑模式直接看也正常
  3. 在出问题的TML里新加一条相同的轨道,打AB后新加的轨道正常,如上图:
  • 原有的 “Mole Override Animator Track” 显示 Track cannot be loaded
  • 后加的 “Mole Override Animator Track (1)” 正常
  1. 一同出现的,还有Console里的警告:The referenced script (Unknown) on this Behaviour is missing!
  2. 双击警告,Inspector显示的信息,恰好与出问题的轨道相关。
Missing 警告
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的内部机制,具体为什么这么做,我们搞不清楚。

这个问题有多种解决途径,但没一个优雅的:

  1. 将有这种错误依赖关系的资源放在同一个AB包里:会破坏项目的资源管理规范
  2. 在加载含有TML资源的AB包时,执行LoadAll操作:一方面破坏项目资源管理方式;一方面导致不需要到资源被加载进内存,浪费空间
  3. 找到被复制出来的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


【2023-06-25】补充
  最近在做的项目,又发现了轨道加载不出来的问题,原因跟上面不同。问题并不复杂,但同类问题还是记录一下。
  先说结论:轨道所属的程序集改变后,不同版本的AB包与代码相遇,会出现Track cannot be loaded
  问题经过:我们在内部测试版本,某一次修改把在package中的轨道,挪到了项目里(Assets)维护。虽然脚本的GUID没变,但它们所属的程序集变了。之前打的内部测试包,更新了改变后的AB补丁,出现轨道加载失败。

你可能感兴趣的:([RS] Timeline踩坑(1):Track cannot be loaded)