当前位置:   article > 正文

手把手教你在Unity2020中使用Timeline_u3d2020timline详解

u3d2020timline详解

一、关于Timeline

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

二、安装Timeline

打开Package Manager,安装TimeLine,Unity2020默认是安装了TimeLine的,可以通过Package Manager进行更新。
在这里插入图片描述

三、如何创建一个Timeline资源

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

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

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

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

三、创建轨道

Timeline窗口左侧栏右键菜单,可以创建多种轨道
在这里插入图片描述

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

四、具体轨道的使用

1、Activation Track轨道

这个轨道是控制物体的显示和隐藏的,使用很简单,创建Activation Track轨道后,把需要控制的物体拖到物体槽中,比如下面是控制一个正方体(Cube)的显示与隐藏,效果如下。
在这里插入图片描述

2、Animation Track轨道

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

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

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

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

首先,我们给Cube创建一个Animation动画
在这里插入图片描述
Cube拖到Animation Track的物体槽中
在这里插入图片描述
然后在轨道上右键菜单 - Add From Animation Clip,选择我们上面制作好的Animation动画
在这里插入图片描述
即可使用Animation Track轨道来播放Animation Clip
在这里插入图片描述

3、Audio Track轨道

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

3.1、 导入音效资源

首先,在工程中导入一个test.ogg音效资源
在这里插入图片描述

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

Timeline中创建Audio Track轨道,然后再轨道上右键菜单 - Add From Audio Clip
在这里插入图片描述
选择我们上面导入的test.ogg资源
在这里插入图片描述
即可在轨道上看到资源音轨
在这里插入图片描述

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

我们可以对音轨做裁剪
在这里插入图片描述
还可以将音轨做分割
在这里插入图片描述
分割成两个片段
在这里插入图片描述

4、Control Track轨道

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

4.1 控制粒子特效

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

4.2 嵌套Timeline

先创建一个SubTimeline,在SubTimeline中控制Cube移动
在这里插入图片描述
在后在原来的Timeline(主Timeline)中创建Control Track轨道,并把SubTimeline(子Timeline)拖动到轨道中,这样,就实现了Timeline嵌套
在这里插入图片描述
效果如下
在这里插入图片描述

5、Signal Track轨道

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

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

Hierachy中创建一个空物体,重名名为SignalReceiver
在这里插入图片描述
创建一个C#脚本SignalTest.cs,挂到上面的物体上(会自动绑定挂上SignalReceiver组件),用于响应信号
代码如下:

using UnityEngine;
using UnityEngine.Timeline;

[RequireComponent(typeof(SignalReceiver))]
public class SignalTest : MonoBehaviour
{
	// 信号的响应函数
    public void OnReceiveSignal()
    {
        Debug.Log("OnReceiveSignal: Hello Signal");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

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

Timeline中创建Signal Track信号轨道
在这里插入图片描述
SignalReceiver物体拖到信号轨道的物体槽中
在这里插入图片描述

5.3、创建信号发射器Signal Emitter

创建一个信号发射器资源(Signal Emitter),在Project视图右键菜单 - Create - Signal
在这里插入图片描述
在这里插入图片描述
将信号发射器拖到轨道上
在这里插入图片描述

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

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

5.5、运行效果

在这里插入图片描述

6、Playable Track轨道

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

6.1、PlayableAsset和PlayableBehaviour脚本

需要写两个类,一个继承PlayableAsset,一个继承PlayableBehaviour
在这里插入图片描述

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
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=======================");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
6.2、将PlayableAsset拖到轨道上

MoveObjPlayableAsset脚本直接拖动到PlayableTrack轨道上,具体的脚本逻辑在MoveObjPlayableBehaviour中实现,本例是设置物体的坐标
在这里插入图片描述
点击轨道上的MoveObjPlayableAsset,可以在Inspector视图中看到对应的参数
在这里插入图片描述

6.3、动态设置PlayableAsset参数

现在,我们另外写一个脚本(Runner.cs),运行的时候动态地给MoveObjPlayableAsset设置GO对象。
首先我们将轨道名字改成MyPlayableTest,因为下面的代码需要通过名字来获取改轨道对象。
在这里插入图片描述
Runner.cs脚本挂到Timeline物体上,并赋值Timeline变量和Cube变量,如下
在这里插入图片描述
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;
                    }
                }
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
6.4、运行效果

在这里插入图片描述

五、答疑

1、Timeline如何实现倒放

先看下正放的效果:
在这里插入图片描述

我们可以通过PlayableDirectortime属性,从大到小,即可实现倒放,例:

using UnityEngine;
using UnityEngine.Playables;

public class Runner: MonoBehaviour
{
    public PlayableDirector timelinePlayer;
    private double m_timer;

    void Start()
    {
    	// 获取总时长
        m_timer = timelinePlayer.duration;
        timelinePlayer.Play();
    }

    void Update()
    {
        // 倒放
        if (m_timer > 0)
            m_timer -= Time.deltaTime;
        timelinePlayer.time = m_timer;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行Unity,倒放效果如下:
在这里插入图片描述

待续

欢迎评论区提问

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/95431
推荐阅读
相关标签
  

闽ICP备14008679号