Unity是否已有对时间表的支持?


13

我正在计划开发Unity3D中的游戏,并试图与引擎已经提供的功能以及我必须自己编写的功能保持一致。

游戏本身将是一种节奏游戏,这意味着同步音频和图形事件,以便它们始终在应有的时间播放。我要避免的是潜在的滞后情况,其中音频或图形开始比其他速度更快。

当我们回到大学时,在我的游戏设计课程中讨论这种类型的协调系统时,我的教授将此类型的设计称为“时间轴”课程。这样的想法是,您可以实例化这些对象中的一个或多个,以不同的速度进行进度,安排将来发生的事情,并同步周期性事件。但是,将其称为“时间轴”类似乎仅限于我的教授本人,因为一直在搜寻某个API是否具有“时间轴”功能是徒劳的。

这种功能是否有更通用的名称?Unity是否有任何预先存在的方法来协调此类事件的调度,或者这是需要在引擎上构建的东西吗?如果可以的话,希望您能接受一些教程!


我还使用了类似的时间轴类(它们甚至具有相同的名称)。我不知道该模式的更通用名称,但是它可能通常是通过功能响应编程,协程或其他异步概念来实现的。
interphx

Answers:


10

尽管Unity中没有此功能,但这样的时间轴的基本实现应该不难做到。

这是我的处理方式:

  • 您的时间轴类在内部使用优先级队列作为数据结构来存储事件。
  • 一个事件可能只是时间和回调。因此,添加事件的时间表将是简单:timeline.AddEvent(0.25f, MyCallback)
  • 对于each Update,时间轴类将:

    1. 将播放头(一个简单的float)增加经过的时间
    2. 检查优先级队列的开头并删除并调用所有优先级(例如时间)小于或等于当前播放头的事件的回调。

如果需要某种倒带重放功能,从队列中删除所有事件当然是愚蠢的(这意味着倒带时必须再次添加它们)。相反,您也可以使用保存事件的数组。事件将包括一个TimeCallback。您必须将数组排序为Time

然后,您不必跟踪当前数组索引,而不必从数组中删除项目,并且每次更新都从该索引中查找并执行所有回调,Playhead >= Time同时还要相应地增加索引。

实现更快的播放速度可同时用于两种实现,并且非常简单:

Playhead += Time.deltaTime * playbackSpeed

2
“将播放头(一个简单的浮点数)增加所经过的时间” -如果这样做,将得到聚合的浮点错误。您应该改用Time.time (游戏开始以来的时间)
BlueRaja-Danny Pflughoeft 2014年

4

不,Unity3D没有现成的API。

不过,它确实支持协程,我建议您对它们进行研究。协程通常使安排和同步事件变得非常容易。


1

自2012年的答案以来,我不确定这是否是新功能,但Unity实际上确实支持通过(旧版)动画编辑器进行时间轴控制。

尽管此功能主要用于用曲线为对象参数设置动画,但它还具有在Animation Events上触发脚本的功能。这些脚本可以驱动您的图形和音频。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.