使用Unity 2019.1中的Timeline Signals
自从2017年推出Timeline功能以来,很多开发者一直期待Timeline加入发送事件的方法。从Unity 2019.1版开始,Timeline Signals信号功能可以帮助你发送事件。
本文将介绍使用最新的Timeline Signals信号功能。
Signals信号
下图是Signals信号在Timeline窗口里的样子。
我们开发Signals信号的目的是建立Timeline和外部系统的沟通渠道,你可能会有疑问:这意味着什么?为什么我们决定使用这种方法?
假设我们使用Timeline制作过场动画,在过场动画结束时,如果我们想要加载新场景,并启用物理系统。有如下方法可以进行处理:
当过场动画结束时,使用自定义脚本使Timeline实例与场景管理器和物理系统进行交互。
当过场动画结束时,创建标记和信号,用于发送"Cutscene finished"(过场动画已完成)的信号,并让相关系统对信号作出反应。
Unity Timeline开发团队选择使用第二种方法,因为它可以保持发射器独立于接收器,保持它们各自的独立可以实现更大的灵活性,功能性和重用性。
为了深入了解这种方法,下面我们介绍不同部分如何协作。
协作方式
为了使用信号能够与外部系统沟通,我们需要三个部分:Signal Asset信号资源、Signal Emitter信号发射器和Signal Receiver信号接收器。
Signal Emitter信号发射器:信号发射器包含对信号资源的引用。在Timeline上,信号发射器通过标记来显示。我们可以把标记放到轨道上,或放到Timeline时间标尺下的Markers区域。
Signal Receiver信号接收器:信号接收器是带有一组反应的组件,每个反应都关联到信号资源。
Signal Asset信号资源:信号资源是发射器和接收器之间的联系。我们可以在多个Timeline实例中重用相同的信号资源。
游戏示例
下面视频展示了一个简单的游戏,玩家通过按下屏幕上箭头图像对应的方向键来击败僵尸兔。
箭头图像随着每次音乐节拍而随机变化。如果在图像变化前没有按下正确的方向键,则游戏失败。如果按下一定数量的方向键,则赢得游戏。
在游戏中,GameTimeline实例包含游戏过程,它通过使用信号来随着每次音乐节拍展示新箭头图像,如下图的GameTimeline实例所示。
为了演示如何创建和设置信号,我们从没有创建过信号的项目入手。如果你想跟着文章步骤操作,可以下载项目文件:
https://github.com/Unity-Technologies/TimelineSignalsTutorial/blob/master/Demo
首先,我们查看添加信号的Markers区域,单击Clip Edit模式旁边的Marker图标,Markers区域显示在Timeline时间标尺下。
添加信号发射器,右键单击Markers区域,选择Add Signal Emitter。
信号发射器显示在Markers区域。
选中新添加的信号发射器时,检视窗口会显示它的属性,检视窗口也提供创建其它信号的按钮。
为了联系信号发射器和信号接收器,我们需要添加信号资源。在检视窗口中,单击Create Signal…按钮。因为该信号资源会联系发射器和接收器,以改变箭头图像,所以命名信号资源为“ShowKey”。单击Save后,信号资源会添加到项目中。
我们还要让信号发射器关联信号接收器。单击Add Signal Receiver按钮,检视窗口如下图所示。
我们先讲解一下这些步骤。在按下Add Signal Receiver按钮时,会发生二个行为:新的Signal Receiver组件会添加到关联对象,新反应会添加并关联到刚创建的信号资源。
通过观察发现,“ShowKey”显示为Emit Signal属性,并且被添加到反应列表,因此我们知道它们已经互相关联。
检视窗口显示二个内容:信号发射器属性和Signal Receiver组件定义的反应。
虽然Signal Receiver组件联系的游戏对象关联着Timeline实例,但我们也可以在检视窗口编辑信号接收器,信号接收器接收信号时会激活反应。
最后一步是指定反应的行为。在本示例中,有一个附带ShowRandomKey方法的Manager组件,该方法会显示新的随机方向键。为了让反应调用ShowRandomKey方法,选择该方法为Unity事件,如下图所示。
这样就完成了。在添加信号发射器并定义信号接收器及反应后,我们有了一个和场景沟通的Timeline实例。
Timeline激活信号发射器时会发射ShowKey信号,然后监听ShowKey信号的信号接收器调用ShowRandomKey方法。
更进一步的是,我们还支持多个信号发射器发射相同的信号,例如:下面的Timeline实例有多个相同的信号发射器,它们被复制和移动到不同的时间点,每个音乐节拍都有一个发射器。
我们可以从项目窗口把信号资源直接拖到Timeline窗口,这样会自动创建设置好Emit Signal属性的信号发射器。
下载带有所有信号的完整项目:
https://github.com/Unity-Technologies/TimelineSignalsTutorial/blob/master/CompleteGame
回顾
设置信号时,我们需要完成下面三件事:
右键单击Markers区域或支持信号的轨道,然后选择Add Signal Emitter…。
在检视窗口中,单击Create Signal Asset按钮,设置文件名并按下回车键。
在检视窗口中,单击Create Reaction…按钮,给刚创建的信号定义关联的反应。
常见问题
Q:是否可以在单个游戏对象上有多个接收器?
A:可以,对象上的所有信号接收器都会接收发送到该对象的信号。
Q:信号资源是否可以在多个Timeline实例间重用?
A:可以,信号资源可以用在多个Timeline实例上。
Q:信号资源是否可以扩展和自定义?
A:可以,信号资源、信号发射器和信号接收器都可以进行扩展,我们会后溪的文章中进行介绍信号资源自定义和扩展内容。
Q:信号是否一定会发射?
A:是的,信号不会被跳过,无论游戏帧数如何,信号都会发射到下一帧。
Q:如果复制包含信号发射器的Timeline资源,会发生什么?
A:信号发射器会保留对信号资源的引用,但信号资源不会被复制。
小结
Unity 2019.1最新的Timeline Signals功能与使用方法就介绍到这里,更多Unity新功能介绍,尽在Unity Connect平台(Connect.unity.com)。
下载Unity Connect APP,请点击此处。 观看部分Unity官方视频,请关注B站帐户:Unity官方。
推荐阅读
Unity 2019.1中的Animation Rigging资源包
有奖调查
Unity Hub 2.0中文版以及Unity中文版文档已发布,请参与有奖调查,反馈你的意见,以便我们进一步改进。更多详情,请访问此处。
点击“阅读原文”访问Unity Connet