using System;
using Sirenix.OdinInspector;
using UnityEngine;
namespace SLSUtilities.FunctionalAnimation
{
///
/// (全新) 自定义Attribute,用于为事件指定一个在时间轴上的颜色
///
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class EventColorAttribute : Attribute
{
public Color Color { get; }
public EventColorAttribute(float r, float g, float b, float a = 1.0f)
{
this.Color = new Color(r, g, b, a);
}
}
///
/// 所有技能事件负载(Payload)的抽象基类。
/// 技能事件的具体逻辑和参数都定义在它的子类中。
///
[Serializable]
public abstract class FuncAnimPayloadBase
{
[Tooltip("在时间轴上显示的事件名称 (如果为空,则显示类名)")]
[PropertyOrder(-1)] // 把它显示在最上面
[HideInInspector]
public string eventName;
[Tooltip("是否静默执行该事件(不触发任何反馈)")]
public bool mute = false;
[NonSerialized]
public FuncAnimData parentData;
[NonSerialized]
public RuntimeFuncAnim runtimeFuncAnim;
protected IFuncAnimExecutor character => runtimeFuncAnim?.executor;
protected FuncAnimPayloadBase()
{
}
public virtual void Invoke()
{
}
///
/// 创建此 Payload 的独立副本,使其拥有独立的 runtimeFuncAnim 引用。
/// 子类如果包含运行时可变的引用类型字段(如 List),应 override 此方法进行深拷贝。
///
public virtual FuncAnimPayloadBase DeepClone()
{
return (FuncAnimPayloadBase)MemberwiseClone();
}
public virtual string NameForInspector => GetType().Name;
}
[Serializable]
public abstract class FuncAnimPayloadBase : FuncAnimPayloadBase
{
public T result;
protected FuncAnimPayloadBase()
{
}
public new virtual T Invoke()
{
return result;
}
}
///
/// 一个简单的日志事件,用于调试
///
[EventColor(1.0f, 1.0f, 0.2f)]
public class LogEvent : FuncAnimPayloadBase
{
public string message = "Hello World!";
public override void Invoke()
{
Debug.Log(message);
}
}
}