Cinemachine&Timeline实践
使用前:
- Cinemachine 为Unity 2017新功能,2018使用时在新建项目时选择导入对应的包,直接在商店里导入资源包可能会报编译错误
- Timeline 直接集成在编辑器中,可以在Project中直接创建Timeline,放入场景中
相关参考博客:
https://blog.csdn.net/beihuanlihe130/article/details/79233320
Timeline
Timeline可以创建不同的Track,实现对应类型资源的管理,包括:
- Track Group
同一游戏对象的Timeline的各个Track可以集中在同一个Group内管理 - Activation Track
控制游戏对象的显示与隐藏 - Animation Track
动画轨道,可以添加指定的AnimationClip,或者游戏对象的Transform属性的关键帧生成动画,同时可以添加Override Track将不同类型的动画(如 AniamtionClip和Transform属性关键帧等)进行融合 - Audio Track
声音轨道 - Control Track
主要控制与时间有关的元素,如粒子效果、Timeline等 - Playable Track
添加自定义播放控制脚本 - Cinemachine_Timeline
添加Cinemachine片段
同一Track的不同片段之间可以融合,进行插值过渡
Timeline资源可以自定义触发播放
playableDirector.Play();
//TimelineAsset 为 PlayableDirector类型
Cinemachine
-
Dolly Camera with track
创建一个虚拟相机和轨道,轨道中可以添加点位,通过设置虚拟相机的Body属性中PathPosition的值(0-index)控制相机随轨道移动
一般配合Timeline使用,实现相机的推拉,添加Animation Track指定对应的虚拟相机(with track),改变PathPosition的值,同时将虚拟相机添加到Cinemachine Track中,配合完成相机沿轨道运动。 -
Playable Track
Playable Track可以自定义相关动画效果,在Default Playables资源包中包含了一部分自定义的功能轨道,包括文字、时间、灯光、位置、寻路、淡入淡出等效果,用户也可以根据自己的需要进行定制化开发,以实现更加复杂的效果。
自定义脚本继承自 PlayableBehaviour 类,用户通过重写对应方法实现自定义效果:public class PlayableBehaviour : ScriptableObject, IPlayableAsset, IPlayableBehaviour { public BasicPlayableBehaviour(); public virtual double duration { get; } public virtual IEnumerable<PlayableBinding> outputs { get; } public virtual Playable CreatePlayable(PlayableGraph graph, GameObject owner); public virtual void OnBehaviourPause(Playable playable, FrameData info); public virtual void OnBehaviourPlay(Playable playable, FrameData info); public virtual void OnGraphStart(Playable playable); public virtual void OnGraphStop(Playable playable); public virtual void OnPlayableCreate(Playable playable); public virtual void OnPlayableDestroy(Playable playable); public virtual void PrepareFrame(Playable playable, FrameData info); public virtual void ProcessFrame(Playable playable, FrameData info, object playerData); }
例如控制播放的速度:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
public class PlayableTime : BasicPlayableBehaviour {
//动画曲线,通过曲线控制取值
public AnimationCurve mCurve;
//已播放时间
private float havePlayedTime;
//曲线总间隔时间
private float allTime;
//当playable停止播放时,将Game的时间播放速度重置为1
public override void OnGraphStop(Playable playable)
{
Time.timeScale = 1;
}
//当playable播放时,获得该片段的完整时长
public override void OnBehaviourPlay(Playable playable, FrameData info)
{
allTime = (float)PlayableExtensions.GetDuration(playable);
}
//在playable播放时的每一帧,获取累计已播放时间,除以总间隔,
//对应到曲线的x轴,从曲线上取得对应播放速度值
public override void PrepareFrame(Playable playable, FrameData info)
{
havePlayedTime += info.deltaTime;
Time.timeScale = mCurve.Evaluate(havePlayedTime/allTime);
}
}
有个小问题,在Unity2018.2.3f1中使用Playable Track创建自定义效果时,如果继承自 PlayableBehaviour ,Playable Track将不能识别该脚本,只好使用过时的 BasicPlayableBehaviour 不影响使用。
最终实现效果:
相关参考: