UnityUIPlayables Timeline 拓展方法

自定义Signal Emitter参数

Timeline 自带SignaleEmitter ,可以用来添加关键帧,执行到关键帧时可以触发绑定的事件。类似Animation的关键帧。但是只支持无参数的事件。

SignaleEmitterSignalReceiver 是成对使用的.
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的子类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值