UnityTimeline多预制体嵌套引用丢失问题
现象
出现问题的Unty版本是 2023.3.8f1 Timeline版本是1.7.5,更新的版本有没有这个问题我没测试过,估计是有的
使用Timeline给多层(超过两层)嵌套的预制体中的对象k动画时,一旦你将Timeline给这个对象添加的Animator应用进最底层的预制体,引用就会丢失
为了更好地演示,我创建了一个演示Demo
我创建了一个预制体A和预制体B,预制体B嵌套在预制体A中,是预制体A的子物体,然后我在Timeline中给预制体B中的CubeK了一个动画,下图展示的是刚K好动画,还没有应用的状态,此时引用是没有丢失的
此时我将预制体A进行应用
应用完成之后,查看Timeline,此时引用是没有丢失的
接着我打开预制体A,将修改应用到预制体B
此时再来看Timeline,引用已经丢失了
原因
通过对比应用之前的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!95
:95
是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
此时查看Timeline,引用没有丢失
这个方案只是权宜之计,但是我当前并没有找到更好的办法,只能期待Unity后续修复这个Bug
在预制体应用完成之后手动重新将丢失的引用重新赋回来
虽然这个方法很笨,很费时间,但是很有效,在多人协作时也能避免误操作