手把手教你在Unity2020中使用Timeline

文章目录

      • 一、关于Timeline
      • 二、安装Timeline
      • 三、如何创建一个Timeline资源
        • 1、方法一(该方法需手动添加Playable Director组件)
        • 2、方法二(该方法会自动添加Playable Director组件)
      • 三、创建轨道
      • 四、具体轨道的使用
        • 1、Activation Track轨道
        • 2、Animation Track轨道
          • 2.1、用法一:直接使用Animation Track来录制动画
          • 2.2、用法二:播放已制作好的Animation Clip
        • 3、Audio Track轨道
          • 3.1、 导入音效资源
          • 3.2、将音效资源拖入到轨道中
          • 3.3、可在轨道上对音效做简单的编辑
        • 4、Control Track轨道
          • 4.1 控制粒子特效
          • 4.2 嵌套Timeline
        • 5、Signal Track轨道
          • 5.1、 响应信号的物体和脚本
          • 5.2、创建Signal Track轨道,设置响应物体
          • 5.3、创建信号发射器Signal Emitter
          • 5.4、给信号发射器设置响应函数
          • 5.5、运行效果
        • 6、Playable Track轨道
          • 6.1、PlayableAsset和PlayableBehaviour脚本
          • 6.2、将PlayableAsset拖到轨道上
          • 6.3、动态设置PlayableAsset参数
          • 6.4、运行效果

一、关于Timeline

Timeline是一套基于时间轴的多轨道动画系统,它支持可视化编辑,实时预览。
这一个技术相对于其他动画系统,最大的区别就是,Timeline可以针对多个游戏物体做出的一系列动画,主要用于过场动画的制作,实现电影级的那种分镜效果。

二、安装Timeline

打开Package Manager,安装TimeLine,Unity2020默认是安装了TimeLine的,可以通过Package Manager进行更新。
手把手教你在Unity2020中使用Timeline_第1张图片

三、如何创建一个Timeline资源

1、方法一(该方法需手动添加Playable Director组件)

Project视图中,右键菜单 - Create - Timeline
手把手教你在Unity2020中使用Timeline_第2张图片
即可创建Timeline资源(格式为.playable
手把手教你在Unity2020中使用Timeline_第3张图片
但这种方式创建的Timeline资源是没有被引用的,需要通过Playable Director组件来引用这个Timeline资源,从而播放它。
我们可以给某个物体手动添加Playable Director组件,然后引用Timeline资源。
手把手教你在Unity2020中使用Timeline_第4张图片

2、方法二(该方法会自动添加Playable Director组件)

点击Unity菜单Window - Sequencing - Timeline
手把手教你在Unity2020中使用Timeline_第5张图片
此时会打开Timeline窗口,并提示你选择一个物体:To start creating a timeline, select a GameObject
手把手教你在Unity2020中使用Timeline_第6张图片
当我们选中Hierachy视图中的某个物体后,Timeline窗口中会出现一个Create按钮
手把手教你在Unity2020中使用Timeline_第7张图片
点击Create按钮即可创建Timeline资源(格式为.playable
手把手教你在Unity2020中使用Timeline_第8张图片
我们还会发现,我们选中的物体,自动挂了Playable Director组件,并自动引用了Timeline资源
手把手教你在Unity2020中使用Timeline_第9张图片

三、创建轨道

Timeline窗口左侧栏右键菜单,可以创建多种轨道
手把手教你在Unity2020中使用Timeline_第10张图片

轨道 描述
Track Group 将不同的轨道进行分类,相当于文件夹功能
Activation Track 控制物体的显示和隐藏
Animation Track 为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation Clip
Audio Track 为动画添加音效,并可对音效进行简单的裁剪和操作
Control Track 在该轨道上可以添加粒子效果,同时也可以添加子Timeline进行嵌套
Signal Track 信号轨道,可以发送信号,触发响应信号的函数调用
Playable Track 在该轨道中用户可以添加自定义的播放功能

四、具体轨道的使用

1、Activation Track轨道

这个轨道是控制物体的显示和隐藏的,使用很简单,创建Activation Track轨道后,把需要控制的物体拖到物体槽中,比如下面是控制一个正方体(Cube)的显示与隐藏,效果如下。
手把手教你在Unity2020中使用Timeline_第11张图片

2、Animation Track轨道

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

2.1、用法一:直接使用Animation Track来录制动画

将物体拖动到Animation Track的物体槽中时,如果物体没有Animator组件,会提示为物体挂一个Animator组件。
比如这里,我们要给一个Cube录制动画,点击Create Animator on Cube
手把手教你在Unity2020中使用Timeline_第12张图片
接着,点击录制按钮,即可开始录制动画
手把手教你在Unity2020中使用Timeline_第13张图片
我们做一个简单的位移动画录制
手把手教你在Unity2020中使用Timeline_第14张图片
我们还可以在轨道上右键菜单 - Edit in Animation Window,打开Animation窗口来编辑动画
手把手教你在Unity2020中使用Timeline_第15张图片
手把手教你在Unity2020中使用Timeline_第16张图片

2.2、用法二:播放已制作好的Animation Clip

首先,我们给Cube创建一个Animation动画
手把手教你在Unity2020中使用Timeline_第17张图片
Cube拖到Animation Track的物体槽中
手把手教你在Unity2020中使用Timeline_第18张图片
然后在轨道上右键菜单 - Add From Animation Clip,选择我们上面制作好的Animation动画
手把手教你在Unity2020中使用Timeline_第19张图片
即可使用Animation Track轨道来播放Animation Clip
手把手教你在Unity2020中使用Timeline_第20张图片

3、Audio Track轨道

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

3.1、 导入音效资源

首先,在工程中导入一个test.ogg音效资源
手把手教你在Unity2020中使用Timeline_第21张图片

3.2、将音效资源拖入到轨道中

Timeline中创建Audio Track轨道,然后再轨道上右键菜单 - Add From Audio Clip
手把手教你在Unity2020中使用Timeline_第22张图片
选择我们上面导入的test.ogg资源
手把手教你在Unity2020中使用Timeline_第23张图片
即可在轨道上看到资源音轨
手把手教你在Unity2020中使用Timeline_第24张图片

3.3、可在轨道上对音效做简单的编辑

我们可以对音轨做裁剪
手把手教你在Unity2020中使用Timeline_第25张图片
还可以将音轨做分割
手把手教你在Unity2020中使用Timeline_第26张图片
分割成两个片段
手把手教你在Unity2020中使用Timeline_第27张图片

4、Control Track轨道

Control Track轨道可以添加粒子效果,同时也可以添加子Timeline进行嵌套。

4.1 控制粒子特效

先创建一个粒子
手把手教你在Unity2020中使用Timeline_第28张图片
然后将粒子拖到Control Track轨道中(或者在轨道上右键菜单 - Add From Game Object,然后选择对应的粒子GameObject
手把手教你在Unity2020中使用Timeline_第29张图片
即可使用Control Track轨道播放粒子
手把手教你在Unity2020中使用Timeline_第30张图片
有趣的是,我们还可以在轨道上倒放预览粒子
手把手教你在Unity2020中使用Timeline_第31张图片
甚至对粒子做裁切分割
手把手教你在Unity2020中使用Timeline_第32张图片
手把手教你在Unity2020中使用Timeline_第33张图片

4.2 嵌套Timeline

先创建一个SubTimeline,在SubTimeline中控制Cube移动
手把手教你在Unity2020中使用Timeline_第34张图片
在后在原来的Timeline(主Timeline)中创建Control Track轨道,并把SubTimeline(子Timeline)拖动到轨道中,这样,就实现了Timeline嵌套
手把手教你在Unity2020中使用Timeline_第35张图片
效果如下
手把手教你在Unity2020中使用Timeline_第36张图片

5、Signal Track轨道

Signal Track信号轨道,可以发送信号,触发响应信号的函数调用。

5.1、 响应信号的物体和脚本

Hierachy中创建一个空物体,重名名为SignalReceiver
手把手教你在Unity2020中使用Timeline_第37张图片
创建一个C#脚本SignalTest.cs,挂到上面的物体上(会自动绑定挂上SignalReceiver组件),用于响应信号
代码如下:

using UnityEngine;
using UnityEngine.Timeline;

[RequireComponent(typeof(SignalReceiver))]
public class SignalTest : MonoBehaviour
{
     
	// 信号的响应函数
    public void OnReceiveSignal()
    {
     
        Debug.Log("OnReceiveSignal: Hello Signal");
    }
}

手把手教你在Unity2020中使用Timeline_第38张图片

5.2、创建Signal Track轨道,设置响应物体

Timeline中创建Signal Track信号轨道
手把手教你在Unity2020中使用Timeline_第39张图片
SignalReceiver物体拖到信号轨道的物体槽中
手把手教你在Unity2020中使用Timeline_第40张图片

5.3、创建信号发射器Signal Emitter

创建一个信号发射器资源(Signal Emitter),在Project视图右键菜单 - Create - Signal
手把手教你在Unity2020中使用Timeline_第41张图片
手把手教你在Unity2020中使用Timeline_第42张图片
将信号发射器拖到轨道上
手把手教你在Unity2020中使用Timeline_第43张图片

5.4、给信号发射器设置响应函数

点击轨道上的信号发射器,在Inspector视图中会显示信号信息,Add Reaction按钮,添加信号的响应函数
手把手教你在Unity2020中使用Timeline_第44张图片
默认信号接收对象就是SignalReceiver组件所在的物体
手把手教你在Unity2020中使用Timeline_第45张图片
点击No Function可以列出物体上的组件和组件中的所有public属性和方法,这里我们设置响应函数为SignalTest脚本的OnReceiverSignal函数。
手把手教你在Unity2020中使用Timeline_第46张图片

5.5、运行效果

手把手教你在Unity2020中使用Timeline_第47张图片

6、Playable Track轨道

Playable Track轨道,可以添加自定义的播放功能。

6.1、PlayableAsset和PlayableBehaviour脚本

需要写两个类,一个继承PlayableAsset,一个继承PlayableBehaviour
手把手教你在Unity2020中使用Timeline_第48张图片

using UnityEngine;
using UnityEngine.Playables;

public class MoveObjPlayableAsset : PlayableAsset
{
     
    public GameObject go;
    public Vector3 pos;

    public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
    {
     
        var bhv = new MoveObjPlayableBehaviour();
        bhv.go = go;
        bhv.pos = pos;
        return ScriptPlayable<MoveObjPlayableBehaviour>.Create(graph, bhv);
    }
}
using UnityEngine;
using UnityEngine.Playables;

public class MoveObjPlayableBehaviour : PlayableBehaviour
{
     
    public GameObject go;
    public Vector3 pos;

    public override void OnGraphStart(Playable playable)
    {
     
        base.OnGraphStart(playable);

        Debug.Log("OnGraphStart=======================");
    }

    public override void OnGraphStop(Playable playable)
    {
     
        base.OnGraphStop(playable);
        Debug.Log("OnGraphStop=======================");
    }

    public override void OnBehaviourPlay(Playable playable, FrameData info)
    {
     
    	// 这里的逻辑是改变物体的坐标,具体逻辑就看具体需求
        base.OnBehaviourPlay(playable, info);
        Debug.Log("OnBehaviourPlay=======================");
        if (null != go)
        {
     
            go.transform.position = pos;
        }
    }

    public override void OnBehaviourPause(Playable playable, FrameData info)
    {
     
        base.OnBehaviourPause(playable, info);
        Debug.Log("OnBehaviourPause=======================");
        if (null != go)
        {
     
            go.transform.position = Vector3.zero;
        }
    }

    public override void OnBehaviourDelay(Playable playable, FrameData info)
    {
     
        base.OnBehaviourDelay(playable, info);
        Debug.Log("OnBehaviourDelay=======================");
    }
}
6.2、将PlayableAsset拖到轨道上

MoveObjPlayableAsset脚本直接拖动到PlayableTrack轨道上,具体的脚本逻辑在MoveObjPlayableBehaviour中实现,本例是设置物体的坐标
手把手教你在Unity2020中使用Timeline_第49张图片
点击轨道上的MoveObjPlayableAsset,可以在Inspector视图中看到对应的参数
手把手教你在Unity2020中使用Timeline_第50张图片

6.3、动态设置PlayableAsset参数

现在,我们另外写一个脚本(Runner.cs),运行的时候动态地给MoveObjPlayableAsset设置GO对象。
首先我们将轨道名字改成MyPlayableTest,因为下面的代码需要通过名字来获取改轨道对象。
手把手教你在Unity2020中使用Timeline_第51张图片
Runner.cs脚本挂到Timeline物体上,并赋值Timeline变量和Cube变量,如下
手把手教你在Unity2020中使用Timeline_第52张图片
Runner.cs代码如下

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;

public class Runner : MonoBehaviour
{
     
    public PlayableDirector timelinePlayer;
    public GameObject cube;

    void Start()
    {
     
        var timeline = timelinePlayer.playableAsset;
        foreach (var binding in timeline.outputs)
        {
     
            // 轨道名
            var trackName = binding.streamName;
            if ("MyPlayableTest" == trackName)
            {
     
                // 轨道
                var track = binding.sourceObject as TrackAsset;
                // 轨道上的片段,每个片段都是PlayableAsset的子类
                var clipList = track.GetClips();
                foreach (var clip in clipList)
                {
     
                    if (clip.asset is MoveObjPlayableAsset)
                    {
     
                        var moveObjPlableAsset = clip.asset as MoveObjPlayableAsset;
                        // 动态设置go对象的坐标
                        moveObjPlableAsset.go = cube;
                        moveObjPlableAsset.pos = new Vector3(-4.91f, 0, 0);
                        break;
                    }
                }
            }
        }
    }
}
6.4、运行效果

手把手教你在Unity2020中使用Timeline_第53张图片

你可能感兴趣的:(Unity3D,unity,timeline,动画,轨道,cg)