欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手把手教你在Unity2020中使用Timeline

程序员文章站 2024-02-16 17:15:16
...

一、关于Timeline

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

二、安装Timeline

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

三、如何创建一个Timeline资源

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

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

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

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

三、创建轨道

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

轨道 描述
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

2、Animation Track轨道

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

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

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

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

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

3、Audio Track轨道

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

3.1、 导入音效资源

首先,在工程中导入一个test.ogg音效资源
手把手教你在Unity2020中使用Timeline

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

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

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

我们可以对音轨做裁剪
手把手教你在Unity2020中使用Timeline
还可以将音轨做分割
手把手教你在Unity2020中使用Timeline
分割成两个片段
手把手教你在Unity2020中使用Timeline

4、Control Track轨道

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

4.1 控制粒子特效

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

4.2 嵌套Timeline

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

5、Signal Track轨道

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

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

Hierachy中创建一个空物体,重名名为SignalReceiver
手把手教你在Unity2020中使用Timeline
创建一个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

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

Timeline中创建Signal Track信号轨道
手把手教你在Unity2020中使用Timeline
SignalReceiver物体拖到信号轨道的物体槽中
手把手教你在Unity2020中使用Timeline

5.3、创建信号发射器Signal Emitter

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

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

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

5.5、运行效果

手把手教你在Unity2020中使用Timeline

6、Playable Track轨道

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

6.1、PlayableAsset和PlayableBehaviour脚本

需要写两个类,一个继承PlayableAsset,一个继承PlayableBehaviour
手把手教你在Unity2020中使用Timeline

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
点击轨道上的MoveObjPlayableAsset,可以在Inspector视图中看到对应的参数
手把手教你在Unity2020中使用Timeline

6.3、动态设置PlayableAsset参数

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

相关标签: Unity3D