在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)