热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手把手教你在Unity2020中使用Timeline

文章目录一、关于Timeline二、安装Timeline三、如何创建一个Timeline资源1、方法一(该方法需手动添加PlayableDirector组件ÿ

文章目录

      • 一、关于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、运行效果
      • 五、答疑
        • 1、Timeline如何实现倒放
        • 待续


一、关于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 &#61; new MoveObjPlayableBehaviour();bhv.go &#61; go;bhv.pos &#61; 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&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");}public override void OnGraphStop(Playable playable){base.OnGraphStop(playable);Debug.Log("OnGraphStop&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");}public override void OnBehaviourPlay(Playable playable, FrameData info){// 这里的逻辑是改变物体的坐标&#xff0c;具体逻辑就看具体需求base.OnBehaviourPlay(playable, info);Debug.Log("OnBehaviourPlay&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");if (null !&#61; go){go.transform.position &#61; pos;}}public override void OnBehaviourPause(Playable playable, FrameData info){base.OnBehaviourPause(playable, info);Debug.Log("OnBehaviourPause&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");if (null !&#61; go){go.transform.position &#61; Vector3.zero;}}public override void OnBehaviourDelay(Playable playable, FrameData info){base.OnBehaviourDelay(playable, info);Debug.Log("OnBehaviourDelay&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");}
}

6.2、将PlayableAsset拖到轨道上

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

6.3、动态设置PlayableAsset参数

现在&#xff0c;我们另外写一个脚本&#xff08;Runner.cs&#xff09;&#xff0c;运行的时候动态地给MoveObjPlayableAsset设置GO对象。
首先我们将轨道名字改成MyPlayableTest&#xff0c;因为下面的代码需要通过名字来获取改轨道对象。
在这里插入图片描述
Runner.cs脚本挂到Timeline物体上&#xff0c;并赋值Timeline变量和Cube变量&#xff0c;如下
在这里插入图片描述
Runner.cs代码如下

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;public class Runner : MonoBehaviour
{public PlayableDirector timelinePlayer;public GameObject cube;void Start(){var timeline &#61; timelinePlayer.playableAsset;foreach (var binding in timeline.outputs){// 轨道名var trackName &#61; binding.streamName;if ("MyPlayableTest" &#61;&#61; trackName){// 轨道var track &#61; binding.sourceObject as TrackAsset;// 轨道上的片段&#xff0c;每个片段都是PlayableAsset的子类var clipList &#61; track.GetClips();foreach (var clip in clipList){if (clip.asset is MoveObjPlayableAsset){var moveObjPlableAsset &#61; clip.asset as MoveObjPlayableAsset;// 动态设置go对象的坐标moveObjPlableAsset.go &#61; cube;moveObjPlableAsset.pos &#61; new Vector3(-4.91f, 0, 0);break;}}}}}
}

6.4、运行效果

在这里插入图片描述

五、答疑


1、Timeline如何实现倒放

先看下正放的效果&#xff1a;
在这里插入图片描述

我们可以通过PlayableDirectortime属性&#xff0c;从大到小&#xff0c;即可实现倒放&#xff0c;例&#xff1a;

using UnityEngine;
using UnityEngine.Playables;public class Runner: MonoBehaviour
{public PlayableDirector timelinePlayer;private double m_timer;void Start(){// 获取总时长m_timer &#61; timelinePlayer.duration;timelinePlayer.Play();}void Update(){// 倒放if (m_timer > 0)m_timer -&#61; Time.deltaTime;timelinePlayer.time &#61; m_timer;}
}

运行Unity&#xff0c;倒放效果如下&#xff1a;
在这里插入图片描述

待续

欢迎评论区提问


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
author-avatar
用户9o05le1po7
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有