[Unity]Timeline动态绑定Track和Cinemachine

在dll项目中用到,需要首先引入UnityEngine.Timeline。

Tmeline基础知识主要参考了:

https://caihua.tech/2017/11/02/%E6%B5%85%E6%9E%90Timeline%E7%BB%93%E6%9E%84/

Timeline动态加载主要参考了:

https://zhuanlan.zhihu.com/p/29585350

记录上面文章的步骤如下:

1、建立Track索引表

       foreach (var at in mDirector.playableAsset.outputs)
       {
           if (!bindingDict.ContainsKey(at.streamName))
           {
               bindingDict.Add(at.streamName, at);
           }
       }

2、索引表的Track绑定Animator

mDirector.SetGenericBinding(bindingDict["Player"].sourceObject, playerControl.mAim);

3、Cinemachine的Track中每个Clips对应虚拟相机,注意有两种改法

       foreach (var info in CinemachineTrack.GetClips())
       {
           if (info.displayName == "CinemachineShot")
           {
               var cameraInfo = info.asset as Cinemachine.Timeline.CinemachineShot;
               var vcam1 = GameObject.Find("CM vcam1").GetComponent<CinemachineVirtualCameraBase>();
               var setCam = new ExposedReference<CinemachineVirtualCameraBase>();
               setCam.defaultValue = vcam1;
               cameraInfo.VirtualCamera = setCam;
           }
           if (info.displayName == "CM vcam2")
            {
                var cameraInfo = info.asset as Cinemachine.Timeline.CinemachineShot;
                var vcam2 = cameraInfo.VirtualCamera.Resolve(mDirector.playableGraph.GetResolver());
                vcam2.LookAt = mControl.transform.Find("Tran_Chest").transform;
                vcam2.Follow = mControl.transform;
            }
        }

 

取Track绑定的GameObject

GameObject obj=director.GetGenericBinding(at.sourceObject) as GameObject;

为Track绑定GameObject

director.SetGenericBinding(at.sourceObject,gameObject);

 

 

我最后的方案如下:

1、场景里添加一个节点全局控制

2、每段剧情作为一个节点,节点里面添加Playable Director,绑定指定timeline,下面添加子节点放置Cinemachine brain camera,下面再放置各种virtual camera,这样整个节点载入之后Cinemachine的Track中每个Clips就不用再动态绑定虚拟相机了。最后把这个节点存为预制体。注意存预制体的时候需要删除动态绑定的角色GameObject,否则无法保存。

3、加载剧情预制体,绑定角色,打开rootMotion供Animation Track的override控制位移,绑定虚拟相机的LookAt和Follow。角色绑定完成后再开始播放。

3.1 动态绑定表建立时,Track名约定为角色名,同一个角色可能有多个track,所以绑定表的value定义为一个list: private Dictionary<string, List<PlayableBinding>>

3.2 参考文章里面判断类型用的是类型的name,我直接用is,例如:if (srcObject.sourceObject is AnimationTrack)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值