UnityTimeline多预制体嵌套引用丢失问题

现象

出现问题的Unty版本是 2023.3.8f1 Timeline版本是1.7.5,更新的版本有没有这个问题我没测试过,估计是有的

使用Timeline给多层(超过两层)嵌套的预制体中的对象k动画时,一旦你将Timeline给这个对象添加的Animator应用进最底层的预制体,引用就会丢失

为了更好地演示,我创建了一个演示Demo

我创建了一个预制体A和预制体B,预制体B嵌套在预制体A中,是预制体A的子物体,然后我在Timeline中给预制体B中的CubeK了一个动画,下图展示的是刚K好动画,还没有应用的状态,此时引用是没有丢失的

image-20241106160526141

此时我将预制体A进行应用

image-20241106160852434

应用完成之后,查看Timeline,此时引用是没有丢失的

image-20241106161005804

接着我打开预制体A,将修改应用到预制体B

image-20241106161041951

此时再来看Timeline,引用已经丢失了

image-20241106161111408

原因

通过对比应用之前的Unity场景与应用之后Unity场景的YAML文本发现

Unity使用以下代码来存储Timeline创建的Animator组件

 --- !u!95 &778708489 stripped
Animator:
m_CorrespondingSourceObject: {fileID: 5484468110646260413, guid: 9c19b195f24acbf489d5124be61bb7c7,
type: 3}
m_PrefabInstance: {fileID: 6946424208332181355}
m_PrefabAsset: {fileID: 0}

--- !u!95 &778708489 stripped:

  • ---:表示YAML文档的开始。
  • !u!9595是Unity内部用来标识对象类型的整数ID。在这个例子中,95代表Animator组件。
  • &778708489:这是该对象在这个文件中的唯一标识符(instance ID),用于在文件中引用。
  • stripped:表示该对象可能是一个精简版本,通常在Prefab或场景中,某些数据可能被剥离以减少存储空间。

以上引用自ChatGPT

在我这个案例中 PlayableDirector组件使用 778708489这个唯一ID来索引这个Animator,这个唯一ID是场景用来引用对象的ID,只能存储在场景里,并不能被应用到预制体中

当我第一次应用到预制体时,此时场景是激活的状态,因为我第一次应用预制体A是在场景的Hierarchy面板应用的,此时这个Animator的信息是从场景文件中传送到预制体A里,场景就知道这个唯一ID实际上对应那个Animator组件,这个ID就会保存在场景文件中.

但是当我要应用第二层预制体时,问题就出现了,我的预制体B是嵌套在A中的,我此时想要将这个Animator应用到B时,我必须打开A才行,当我打开预制体A,将Animator应用到预制体B时,这个时候有趣的就来了,此时这个Animator的信息会从A传输到B,那么实际上在YAML文本中,就是A删除了Animator的信息,B增加了Aniamtor的信息.但是此时场景不知道呀,等你再次打开场景的时候,他就会认为,原本在A身上的Animator删除了,那他那个唯一ID就没用了,那他就会自动删除掉这个唯一ID,然后PlayableDirector组件的引用就丢失了

解决方案

在场景中将修改直接应用到最底层Profab

既然在预制体中应用,会导致其找不到引用,那么我直接在场景中,将修改应用到最底层的预制体不就行了吗

此时我直接应用到了预制体B

image-20241106161637256

此时查看Timeline,引用没有丢失

image-20241106161809772

这个方案只是权宜之计,但是我当前并没有找到更好的办法,只能期待Unity后续修复这个Bug

在预制体应用完成之后手动重新将丢失的引用重新赋回来

虽然这个方法很笨,很费时间,但是很有效,在多人协作时也能避免误操作

最后修改:2024 年 11 月 06 日
如果觉得我的文章对你有用,请随意赞赏