使用 Unity 2019.1 中的 Timeline Signals

作者:转载小公举
2019-06-19
10 11 0

本文转载自 Unity 官方平台,已获得授权。

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 实例所示。

为了演示如何创建和设置信号,我们从没有创建过信号的项目入手。如果你想跟着文章步骤操作,可以下载项目文件:

项目文件

github 下载

首先,我们查看添加信号的 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 属性的信号发射器。

下载带有所有信号的完整项目:

完整项目

github 下载

回顾

设置信号时,我们需要完成下面三件事:

  1. 右键单击 Markers 区域或支持信号的轨道,然后选择 Add Signal Emitter…。
  2. 在检视窗口中,单击 Create Signal Asset 按钮,设置文件名并按下回车键。
  3. 在检视窗口中,单击 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 官方。