转载于http://forum.china.unity3d.com/thread-32200-1-1.html通过demo讲解了timeline更加复杂的使用方式

Timeline是创建过场动画和影片的强大工具。而它的功能远不止这些。这篇文章中,我们将一起来了解如何利用Timeline将游戏性和故事性结合起来,让游戏体验更上一层楼。今天由Unity技术经理Ciro Continisio来为大家分享三个为Timeline创造性地设计脚本的实践。

随着Unity 2017.1的发布,Unity新增了一个强大工具—Timeline。你或许已经看到过创作者利用Timeline制作出的精彩短片,例如: 《ADAM 2》和《ADAM 3》《死者之书》,或许你也也对创作者如何通过使用Timeline给游戏加入故事内容有所了解。

作为一名游戏开发人员,当我看到Timeline时,我脑海中浮现了几个问题:Timeline真的只是个线性序列工具吗?我只能用它创建过场动画吗?我是否可以让它中断游戏,播放推动故事情节的非交互式序列,然后再继续进行游戏?带着这些疑问,我使用Timeline颇具创意地创建了一个小型演示项目,这是个实时战略游戏,在这游戏创作中我使用自定义Timeline轨道实现了一些有趣的效果。在这过程中我也找到了问题的答案:仅需一点点脚本编程,Timeline就可以做到更多事情。

本文资源
在这个演示项目中,我使用的图形资源来自 《A Mighty Kingdom强盛王国》项目,它曾作在 Vision Summit 2017上的主题演讲中使用,所以我把自己所制作的演示项目称为《A Terrible Kingdom糟糕国度》。我将原油项目中的的资源稍作调整,使用在了本文的演示项目中。

本文演示项目下载:
https://github.com/UnityTechnologies/ATerribleKingdom

创意与实践
1、设想一:暂停Timeline
首先来制作一个简单的场景。我希望在Timeline中加入一段对话,让Timeline能根据对话自动暂停,从而使观看者能够阅读屏幕上的文字。

请点击该视频观看场景:https://v.qq.com/x/page/x0630cetpp6.html

由于这个功能与屏幕上的文字密切相关,我创建了一个名为Dialogue Track的自定义轨道,它能与游戏的UI管理器挂接。每个剪辑的属性中都有用于显示的文字,还有布尔变量用来决定Timeline是暂停或继续。这个剪辑在检视窗口中如下图所示。

<ignore_js_op>

这个轨道上的每个剪辑会通知UI管理器显示对话UI,它也会选择所显示的文本和文本大小。此外,它还能游戏管理器暂停Timeline,并决定将引用传给哪条Timeline,这样游戏管理器就可以在玩家按下空格键时,知道该继续播放哪条Timeline。当这个剪辑结束时,它会让UI 管理器隐藏对话框。

这个功能十分简单,我通过Timeline快速构建了对话过程,让它决定动画何时暂停何时继续。下图就是我的Timeline的样子。

<ignore_js_op>

2、设想二:非线性Timeline
如果我想回放Timeline,要怎么办?回放Timeline指的不是在结尾进行回放,而是让Timeline在任意时间点回放,而且只有当特定条件满足时进行。这其实就是个非线性Timeline:有时它们会回放,有时不会。你可以近似地认为Timeline之中包含了一个if-else语句。

这个示例中,我创建了一个Timeline,它会播放暴雨的动画:天色逐渐黯淡,空中现出道道闪光,雷电击向地面,落下倾盆大雨。

<ignore_js_op>

我不只是将暴雨动画创建为一个连续序列,我把它分为了三个部分。暴雨开始时,会有“过渡开始”画面,暴雨结束时,会有个“过渡结束”画面,之后天气恢复正常。

在这中间,我加入了一个Timeline部分,它会在游戏时播放。请注意这里没有使用Cinemachine剪辑,所以Timeline会把镜头控制权交给常规游戏摄像机。

<ignore_js_op>

我打算让暴雨在二只怪兽活着的时候反复播放。还想让Timeline播放前奏画面和游戏部分,并在结束画面开始前,对一个条件进行判断:二只怪兽是否已经死掉?如果没有死,回放游戏部分的Timeline,反复进行播放;如果死了的话,播放结束画面。

于是我打开Time Machine Track。剪辑在此具有二个功能。一个是用作命名标识,即第一个剪辑,另一个用于回放或快进Timeline到某一特定标识处或时间点。我们把这样的行为叫做剪辑的“动作 ”。

剪辑的另一个重要属性是“条件”。条件可以设定为“总是”或“永不”,或是“当一组单位死亡后”。这里要注意,在二个怪兽活着的时候,Timeline是如何进行回放。

<ignore_js_op>

当它们死后,Timeline会继续下去,播放结束画面。

<ignore_js_op>

这个“是否死亡”状态是针对这个游戏而设置的状态,你也可以根据自己的需求去做一些新的想法,将它们加入到游戏逻辑中。例如:玩家是否到达了某个特定位置?玩家是否收集了足够的指定资源?

现在来看看效果,请点击观看视频:https://v.qq.com/x/page/r06307qan4c.html

暴雨开始后,游戏继续进行,而暴雨会随着游戏过程进行多次回放。这是个无缝的回放过程。当怪兽被打倒后过了几秒,暴雨结束,游戏继续进行。

3、设想三:将Timeline插入到游戏系统中
我们已经把动画放到了Timeline上。如果我们将动画放到游戏的其它系统上会怎样?

在这个RTS游戏演示项目中,有一个重要的系统一直保持着激活状态,它就是游戏的AI系统。这个AI系统通过使用NavMesh Agent负责移动游戏单位,它还会控制游戏单位的Animator组件,让单位在正确的时间播放正确的动画,包括行走、闲置、攻击或死亡。

假设现在想设计一场大战。我有二种方法实现,其中一个方法是创建多条轨道,每个游戏单位都有一条轨道,然后给它们加入上百个小动画剪辑,内容包括攻击、移动、攻击、移动、攻击,循环往复,直至单位死亡。所有这些行为都需要根据时间调整,如果我想让它们进行对抗,还要应用一些偏移量。总之,这是非常繁琐的工作。

我在AI Command轨道上使用了另一种方法:AI Command脚本轨道会在绑定中接收一个特殊类型,我把这个类型叫做“Platoon”。Platoon是个小脚本,脚本中的数组包含着游戏单位。当你将一个指令传给Platoon脚本时,它会给所有数组中的单位广播这个指令。我在游戏中选取游戏单位,对所选单位创建了一个Platoon脚本用于发出鼠标指令。

<ignore_js_op>

然后返回到Timeline上。通过把Platoon绑定到AI Command轨道,我创建了表示多个指令的剪辑:移动后停下,移动后驻守,攻击特定目标,甚至是原地死亡。当Timeline进行时,Platoon控制的单位会听从指令,将这些指令优先于之前的行为,从而使Timeline的AI对指令进行排序。

最后使用Cinemachine添加几个摄像机镜头,你就可以只使用3到4个AI Command轨道就创建出一场大战的效果。

<ignore_js_op>

现在来看看效果,点击观看视频:https://v.qq.com/x/page/j0630efc5ok.html

小结
希望通过这篇文章激发开发者们的好奇心和创造力。下次当看到Timeline时,你便会思考:我能用它来干什么呢?是用来创建一个快速反应事件系统?还是精心策划整场战斗?或是在子弹地狱类型射击游戏中设计子弹模式?

我们可以在Timeline上去做很多事情,只需一点创意和一些脚本编程。也欢迎将你的创意在Unity中文官方论坛(UnityChina.cn)上与我们分享!

Timeline高级扩展的更多相关文章

  1. django 高级扩展-中间件-上传图片-分页-富文本-celery

    """ django 高级扩展 一.静态文件 1.css,js,json,图片,字体等 2.配置setting,在最底下设置静态文件目录,写入下面代码 #配置静态文件目录 ...

  2. 使用 Productivity Power Tools 高级扩展 来帮助你提高 VS2012 的工作效率

    Productivity Power Tools 高级工具是帮助开发者提高工作效率的, 用于 Visual Studio 2012 专业版(及以上) 的一组免费扩展. 本文大多数内容译自MSDN:ht ...

  3. [Swift通天遁地]五、高级扩展-(2)扩展集合类型

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. [Swift通天遁地]五、高级扩展-(3)日期和时间类型的扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. [Swift通天遁地]五、高级扩展-(4)快速生成Invert、Mix、Tint、Shade颜色及调整饱和度阶

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. [Swift通天遁地]五、高级扩展-(6)对基本类型:Int、String、Array、Dictionary、Date的扩展

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. [Swift通天遁地]五、高级扩展-(7)UIView(视图类型)的各种扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. [Swift通天遁地]五、高级扩展-(8)ImageView(图像视图)的各种扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  9. [Swift通天遁地]五、高级扩展-(9)颜色、设备、UserDefaults、URL等扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

随机推荐

  1. (poj 3662) Telephone Lines 最短路+二分

    题目链接:http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total ...

  2. 虚拟机网络连接方式导致的p地址为10.0.2.*的问题

    全世界都知道通过 ifconfig 命令查看本机ip地址,我当然希望安装的虚拟机和当前局域网的其他机器一样内网ip为192.168.1.*,如下图所示: 而当我执行该命令时,实际情况却是这样的: 解决 ...

  3. MTK刷机快捷键

    彻底关机后按住音量下键,连接电脑 无法关机的情况下按住音量上+电源键,手机黑屏后松开电源键,连接电脑,出现进度条后松开音量上键

  4. Linux下ansible的group模块

    一.概述 group 模块可以帮助我们管理远程主机上的组. 二.常用参数 name参数:必须参数,用于指定要操作的组名称. state参数:用于指定组的状态,两个值可选,present,absent, ...

  5. Oracle timestamp类型转换成date类型

    今天需要根据时间判断,统一修改某一个字段的数据.然后打开数据库发现,时间类型为timestamp类型.如下: 然后呢,这对我不是喝口水就可以解决的问题吗? 解决方案如下:我需要改这张表某个字段的内容, ...

  6. PS 怎么去掉图片上的文字

    第一步:打开需要去掉文字的图片. 第二步:在左侧工具栏中选择“吸管工具”. 第三步:在文字附近选取颜色. 第四步:在左侧工具栏中选择“矩形选框工具”,并选中要消除的文字. 第五步:在菜单栏“编辑”中选 ...

  7. 在vue 里使用腾讯ditu

    https://www.cnblogs.com/mrer/p/7144705.html

  8. C++继承(一) 三种继承方式

    继承定义 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一. 继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展.原来的类称为基类,继承的类称为派生类,他们的关系就像父子 ...

  9. go实现dgraph的各种操作

    go实现dgraph的各种操作 import "github.com/dgraph-io/dgo" import "github.com/dgraph-io/dgo/pr ...

  10. 多输入select

    目录 多输入select IO模型 select介绍 小demo 注意 引入电子书 title: 多输入select date: 2019/3/20 17:21:34 toc: true --- 多输 ...