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); } } }