当前Unity版本:2018.4.13f1
Timeline普通的挂载特效的轨道是:UnityEngine.Timeline.ControlTrack
轨道里的clip类型是:UnityEngine.Timeline.ControlPlayableAsset
正常设置特效,就直接将特效预制拖动到Prefab哪里(就是这里的VFX_hongzhajismoke),ParentObject是设置特效生成的挂接点,也是拖动预制中的节点上去即可,代码中对Prefab也很好获取,因为只要获取到ControlPlayableAsset对象,这里面就有一个属性prefabGameObject,就能通过代码轻松获取到面板上拖上的Prefab,可是ParentObject就要稍微麻烦些了。
?
因为项目采用的Spine,而特效可能是挂在Spine骨骼下的(比如这里的centre),而spine文件在迭代之后是需要重新导入的,而在Spine导入的时候骨骼是很有必要重新展开的(保持最新的骨骼信息),所以就会在导入的时候原来引用的这个centre点被删掉了,引用丢失了。
?
所以就需要在通过代码,在自己的导入工具中重新设置这里的ParentObject。那么问题来了,这个ParentObject又是存在哪里的呢?
其实答案就是上面的 sourceGameObject,只是他不像prefabGameObject那么直接就可以获取到(如果有尝试过用代码去获取或修改应该能体会到)。需要绕个弯子,都需要通过引用操作,具体代码如下:
//加载这个预制
GameObject timelinePrefab = GameObject.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>(files[i]));
//找到预制上存在的所有timeline
PlayableDirector[] playableDirectors = timelinePrefab.GetComponentsInChildren<PlayableDirector>();
//遍历所有timeline,每个轨道,每个clip都要遍历到
for (int j = 0; j < playableDirectors.Length; j++)
{
//当前timeline
PlayableDirector playableDirector = playableDirectors[j];
//遍历当前timeline里面的所有轨道
foreach (var output in playableDirector.playableAsset.outputs)
{
//找到今天的主角 就是通常挂特效那个轨道 UnityEngine.Timeline.ControlTrack
if(output.sourceObject != null && output.sourceObject.GetType() == typeof(UnityEngine.Timeline.ControlTrack)){
UnityEngine.Timeline.ControlTrack controlTrack = output.sourceObject as UnityEngine.Timeline.ControlTrack;
//遍历这个轨道中的所有片段
foreach (var timelineClip in controlTrack.GetClips())
{
UnityEngine.Timeline.ControlPlayableAsset clip = timelineClip.asset as UnityEngine.Timeline.ControlPlayableAsset;
bool isvalid;
//关键!!!获取:通过引用找到ParentObject对象
Object obj = playableDirector.GetReferenceValue(clip.sourceGameObject.exposedName, out isvalid);
//关键!!!修改:通过设置引用的方式设置ParentObject
// PropertyName propertyName = clip.sourceGameObject.exposedName;
// playableDirector.SetReferenceValue(propertyName, obj);
}
}
}
}
|