信号轨道,顾名思义就是运行到某处发送一个信号。
普通用法就是没有任何封装的,个人感觉特别难用,但是有必要理解一下工作原理。
我们添加一个信号资源
生成后可以看到资源文件,这个是可以拖到SignalTrack上的。
我们在Timeline上添加两个信号轨道,并拖动信号到轨道上。
然后我们看到两个信号接收器还是空的,我们可以添加信号接收。
我们创建一个普通的接收脚本。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SignalGetTest : MonoBehaviour
{
public void GetSignal(int sig)
{
Debug.Log("接收到信号"+sig);
}
}
然后我们建立两个接收器来接收这两个信号。
这里就是比较麻烦的地方,因为int参数是在接收脚本上的,所以需要两个接收。
把1拖入1,2拖入2。
我们执行看结果.
这就是最基础的用法了,这里因为信号不带参数所以不方便使用,这里我添加了两个接收器,或者可以创建不同的信号来实现,那么如何使用一个信号发送带参数不就很方便了,下面我们来看如何制作。
我们需要3个脚本:
一个自定义接收器,一个带参数的Mark信号,一个自定义轨道。
先贴上脚本:
我的信号需要继承Marker,类似于信号。
using UnityEngine.Playables;
using UnityEngine.Timeline;
using UnityEngine;
using System.ComponentModel;
[DisplayName("我的信号")]
public class MySignal : Marker, INotification, INotificationOptionProvider
{
public string sigName;
public int sigParm1;
public PropertyName id { get; }
NotificationFlags INotificationOptionProvider.flags => NotificationFlags.TriggerOnce | NotificationFlags.TriggerInEditMode;
}
我们可以看到下面就多了Add 我的信号
这里负责处理不同的信号类型,我这里写了如果是MySignal就显示出来,如果你有多个信号类型可以自行扩充。这个脚本挂在一个对象上就可以了。
脚本如下:
using UnityEngine.Playables;
using UnityEngine;
class MySignalReceiver : MonoBehaviour,INotificationReceiver
{
public void OnNotify(Playable origin, INotification notification, object context)
{
if (notification is MySignal)
{
MySignal signal = (MySignal)notification;
Debug.Log(signal.sigName + "," + signal.sigParm1);
}
}
}
然后是我们的轨道,我们看到这个轨道Binding类型就是我们的接收器。
using System.ComponentModel;
using UnityEngine.Timeline;
[TrackBindingType(typeof(MySignalReceiver))]
[DisplayName("我的信号轨道")]
public class MySignalTrack : MarkerTrack
{
}
在Timeline上点击鼠标右键,我们就可以添加轨道了。
然后我们需要把脚本对象拖动上去
然后我们添加两个信号
并且可以输入信号的参数。
我们运行看效果
这样就实现了自定义信号,也不麻烦还很好用。