本文共 6969 字,大约阅读时间需要 23 分钟。
文章目录
一、关于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"); }}
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.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
中实现,本例是设置物体的坐标
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; } } } } }}
6.4、运行效果
五、答疑
1、Timeline如何实现倒放
先看下正放的效果:
我们可以通过PlayableDirector
的time
属性,从大到小,即可实现倒放,例:
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; }}
运行Unity
,倒放效果如下:
待续
欢迎评论区提问
转载地址:https://linxinfa.blog.csdn.net/article/details/108374878 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!