Unity 2019.1中新推出的Timeline Signals信号功能。
新功能:Marker标记
Marker标记功能可以向Timeline添加的新内容,它用于表示一个时间点。
标记可以在Timeline上和剪辑一样添加和处理,能够使用选取,复制粘贴和编辑模式等功能。就像剪辑一样,标记也有具体类型,例如:剪辑分为动画剪辑、激活剪辑、控制剪辑等类型。
在Unity 2019.1中,Timeline提供了首个内置标记:Signal Emitter信号发射器标记。
Signal Emitter信号发射器
Signal Emitter信号发射器用于在Timeline经过特定时间点的时候,触发场景状态的改动。
我们使用了信号(Signal)而不是事件(Event),因为信号有“广播”的特点,而不会混淆已有的Unity事件和动画事件。
1、如何添加Signal Emitter信号发射器
Signal Emitter信号发射器可以添加到Timeline和轨道上,但会有某些限制。
添加到Timeline上:这是Unity 2019.1版本的新概念,信号可以添加到Timeline本身,此时不需要使用轨道。
添加到轨道上:信号也可以添加到任意轨道,只要轨道接受绑定即可。我们也加入了新的轨道类型,即Signal Track信号轨道。这类轨道只接受信号,不接受剪辑。
注意:下图中Demo和TimeLineCtr都有一个SignalEmitter和SignalRecevier,并且都是通过同一个SignalAsset链接的发射器和接收器,但是信号发射器执行时候只查找自身物体上所带有的SignalRecevier中绑定的监听事件。
即:
1、直接在TineLine上添加信号发射器:TimeLineCtr(带有PlayableDirector组件)中Markers一行对应一个SingalEmitter,这个只把信号发给TimeLineCtr上的SignalRecevier.
2、在TimeLine中创建SignalTrack轨道Demo,并在轨道上创建SignalEmitter,这个信号发射器只发送事件到Demo上的SignalRecevier组件。
3、和Animator动画事件类似,消息只发送到自身组件响应(假如有事件监听组件)。
信号响应回调方法只可以是public、无参或者一个参数(float、int、string、bool、object)。
2、工作原理
为了在Timeline上正确设置信号,我们需要三个部分:
•Signal Asset信号资源:信号资源是发射器和接收器之间的联系。通常信号资源会用作标识符。
•Signal Emitter信号发射器: 信号发射器会放在Timeline上,它包含对信号资源的引用。运行信号发射器时,如果当前时间比发射器的时间大,发射器会被触发,发射器会把信号资源发送到信号接收器。
•Signal Receiver信号接收器:信号接收器是带有一组反应的组件,每个反应都关联到信号资源。当接收器知道信号已被触发时,它会激活关联到对应信号资源的反应。
如下图所示,当关联到同一信号资源的发射器触发时,相应反应会被激活。
我们主要的设计思路是,使发送信号的部分即发射器,尽可能独立于监听并对信号作反应的部分即接收器。这种设计会提高灵活性,而且非常强大。
使用Singal Emitter信号发射器
创建Timeline,单击编辑模式按钮附近的图钉按钮。
此时会显示Timeline Marker区域,在时间标尺下的区域单击右键,选择Add Signal Emitter进行添加信号发射器。
在Signal Emitter信号发射器检视窗口中,单击Create Signal…,在项目中创建新的信号资源。单击Add Signal Receiver进行添加信号接收器,检视窗口如下图所示。
Add Signal Receiver添加信号接收器有以下行为:
它会添加新的Signal Receiver 组件到关联对象。如果信号发射器位于轨道上,该组件会添加到轨道的关联对象。如果信号发射器位于Timeline那么带有PlayableDirector的游戏对象会得到新的Signal Receiver组件。
它会添加新反应,该反应关联着刚创建的信号资源。
我们可以使用Unity Event UI来定义在信号发射器触发时激活的事件。
重要的是,Signal Emitter检视窗口首先会先显示与信号发射器相关的属性,它也会显示接收信号的信号接收器。
如下图所示,启用Retroactive属性时,如果Timeline开始播放信号时间点后的内容,它会触发信号。启用Emit Once属性时,在Timeline循环播放时,它只会触发信号一次。
使用Signal Receiver信号接收器
现在查看Signal Receiver信号接收器组件,单击带有Signal Receiver组件的游戏对象。
它会显示我们之前看到的内容,Explosion信号关联着空白的UnityEvent。
假设我们想要添加一个新的信号资源,我们可以单击Add Reaction按钮。新的反应添加了,但它未关联任何内容。
现在单击下拉列表,选择Create Signal...。
下面是创建新资源的结果。
Signal Receiver组件现在已经设置好,它能在接收Explosion和Load Scene信号时激活反应。
如果我们返回到Timeline,可以添加发送Explosion或Load Scene信号的信号发射器,我们也可以轻松切换二个发射器。