UnityUIPlayables 拓展方法
自定义Signal Emitter参数
Timeline 自带SignaleEmitter ,可以用来添加关键帧,执行到关键帧时可以触发绑定的事件。类似Animation的关键帧。但是只支持无参数的事件。
SignaleEmitter
和SignalReceiver
是成对使用的.
SignaleEmitter
实现了接口INotification
,SignalReceiver
实现了接口INotificationReceiver
SignalEmitter
弄明白这些就简单了,首先拓展SignalEmitter.
using UnityEngine.Timeline;
public class SignalEmitterWithBool : ParameterizedEmitter<bool> { }
public class SignalEmitterWithString : ParameterizedEmitter<string> { }
public class SignalEmitterWithInt : ParameterizedEmitter<int> { }
public class SignalEmitterWithFloat : ParameterizedEmitter<float> { }
public class ParameterizedEmitter<T> : SignalEmitter
{
public T parameter;
}
SignalEmitter
实现的有往Timeline 菜单添加按钮的功能,这里我们可以直接继承SignalEmitter
,上面几个类实现了常用的数据类型参数

如图,已经有了可添加参数的SignalEmitter
组件,

以bool为例,图中的参数便是发射器传出的参数
SignalReceiver
接下来拓展SignalReceiver
基础泛型类:
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Playables;
using UnityEngine.Timeline;
[Serializable]
public class ParameterizedEvent<T> : UnityEvent<T>
{
}
public class SignalReceiverWithParams<T> : MonoBehaviour, INotificationReceiver
{
public SignalAssetEventPair[] signalAssetEventPairs;
[Serializable]
public class SignalAssetEventPair
{
public SignalAsset signalAsset;
public ParameterizedEvent<T> events;
}
public void OnNotify(Playable origin, INotification notification, object context)
{
if (notification is ParameterizedEmitter<T> emitter)
{
var matches = signalAssetEventPairs.Where(x => ReferenceEquals(x.signalAsset, emitter.asset));
foreach (var m in matches)
{
m.events.Invoke(emitter.parameter);
}
}
}
}
Inspector 挂载.
public class SignalReceiverWithBool : SignalReceiverWithParams<bool>
{
}
public class SignalReceiverWithFloat : SignalReceiverWithParams<float>
{
}
public class SignalReceiverWithInt : SignalReceiverWithParams<int>
{
}
public class SignalReceiverWithString : SignalReceiverWithParams<string>
{
}
使用
添加发射器,修改参数
自定义测试类
using UnityEngine;
public class TestTimeLineSignal : MonoBehaviour
{
public void OnBoolEvent(bool value)
{
Debug.LogError("接收Bool信号:" + value);
}
}

如图,在Inspector挂载Bool类型接收器SignalReceiverWithBool
,挂载测试类TestTimeLineSignal ,将自己创建的发射器填入键值对Key位置,value拖入自己的测试类.
注意:一定要从上图Dynamic参数列表里选,不然传入的值会是Inspector面板的值
运行测试完成.
自定义组件拓展

打开TimeLine面板,右键创建快捷Track。如上图所示,有这些快捷创建。 如果治理的组件不能满足需求,需要拓展。

如图,这里文件夹对应的是快捷创建的动画Track。仿写是最简单的,找类似的组件,创建对应脚本,修改内容即可。

如上图,仿照RectTransform 写的transform。这样就可以用来控制非UI的资源

仿写完成多出了如上图所示按钮。

注意:核心类继承自Component,所以只能用拓展Component的子类