Timeline是Unity2017版本中新加入的功能,可以非常方便的对场景资源进行修改、整合,包括物体、声音、粒子、动画、特效、自定义Playable以及子Timeline。该功能非常适合玩法推演,过场动画,游戏中的影视化语言和预告片的制作。

Timeline目前已经能够与Cinemachine、Post Processing Stack完美的结合,来满足更高级的画面、运镜需求。

1.创建自己的第一个Timeline文件

1.1 在project窗口,右键->Create->Timeline 创建Timeline文件。Timeline文件以.playable为后缀。

Unity如何管理时间 unity的timeline_Timeline

1.2 需要将Timeline拖动到场景中的节点上,才可以对Timeline文件进行播放、编辑等操作。将Timeline拖动到某个节点上,则该节点会自动添加Playable Director组件,该组件的Playable保存了对Timeline文件的引用。

Unity如何管理时间 unity的timeline_Unity_02

2.认识Timeline视窗

【Timeline视窗】是主要的编辑Timeline的地方,基于时间轴的多轨道式编辑方式。Timeline由多段平行的轨道组成,每个轨道都是创作内容的基础。每个轨道上都有各种片段,不同片段之间可以进行混合。

Unity如何管理时间 unity的timeline_游戏开发_03

Unity如何管理时间 unity的timeline_Time_04

3.编辑器自带的轨道类型

点击【Timeline视窗】上的Add按钮可以添加新的轨道,编辑器自带了以下6中轨道(Unity2018.4.0)

Activation Track(控制物体的显示和隐藏)

Animation Track(为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation Clip)

Audio Track(为动画添加音效,并可对音效进行简单的裁剪和操作)

Control Track(在该轨道上可以添加粒子效果,同时也可以添加子Timeline进行嵌套)

Playable Track(在该轨道中用户可以添加自定义的播放功能)

Track Group(将不同的轨道进行分类,相当于文件夹功能)

Unity如何管理时间 unity的timeline_Time_05

4.官方提供Playable模板

Assets Store上资源包Default Playables集合了官方提供的一些Playable模板,程序同学可以以这些详细的案例为参考,自定义自身项目需要的Playable。

Unity如何管理时间 unity的timeline_Timeline_06

5.自定义Playable(轨道)

将Default Playables资源包导入我们工程后,可看到TextSwitcherTrack的实现代码主要由以下5个文件组成(文件名后缀非固定,建议按照以下规则)。

xxxTrack(轨道类,主要指定了轨道片段类、轨道关联对象类型、指定并创建轨道逻辑类)

xxxMixerBehaviour(轨道逻辑类,可同时对轨道中的所有片段进行操作)

xxxClip(片段类,指定并创建片段逻辑类,指定片段的覆盖方式)

xxxBehaviour(片段逻辑类,定义各片段的参数与逻辑)

Editor/xxxDrawer(片段的视窗绘制类)

Unity如何管理时间 unity的timeline_Timeline_07

程序若想在轨道逻辑类或者片段逻辑类中对Timeline进行播放、暂停、设置时间等操作,可通过轨道类将PlayableDirector对象传递到逻辑类中。可参考VideoScript模板。

public class VideoScriptPlayableTrack : TrackAsset
{
    public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int     
    inputCount)
    {
        PlayableDirector playableDirector = go.GetComponent<PlayableDirector>();

        ScriptPlayable<VideoSchedulerPlayableBehaviour> playable =
            ScriptPlayable<VideoSchedulerPlayableBehaviour>.Create(graph, inputCount);

        VideoSchedulerPlayableBehaviour videoSchedulerPlayableBehaviour =
                playable.GetBehaviour();

        if (videoSchedulerPlayableBehaviour != null)
        {
            videoSchedulerPlayableBehaviour.director = playableDirector;
            videoSchedulerPlayableBehaviour.clips = GetClips();
        }

        return playable;
    }
}