【Unity】代码获取Timeline中ControlPlayableAsset面板上的ParentObject以及动态修改

当前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);
            }
        }
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值