94 lines
2.5 KiB
C#
94 lines
2.5 KiB
C#
using System;
|
||
using Sirenix.OdinInspector;
|
||
using UnityEngine;
|
||
|
||
namespace SLSUtilities.FunctionalAnimation
|
||
{
|
||
/// <summary>
|
||
/// (全新) 自定义Attribute,用于为事件指定一个在时间轴上的颜色
|
||
/// </summary>
|
||
[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);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 所有技能事件负载(Payload)的抽象基类。
|
||
/// 技能事件的具体逻辑和参数都定义在它的子类中。
|
||
/// </summary>
|
||
[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()
|
||
{
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 创建此 Payload 的独立副本,使其拥有独立的 runtimeFuncAnim 引用。
|
||
/// 子类如果包含运行时可变的引用类型字段(如 List),应 override 此方法进行深拷贝。
|
||
/// </summary>
|
||
public virtual FuncAnimPayloadBase DeepClone()
|
||
{
|
||
return (FuncAnimPayloadBase)MemberwiseClone();
|
||
}
|
||
|
||
public virtual string NameForInspector => GetType().Name;
|
||
}
|
||
|
||
[Serializable]
|
||
public abstract class FuncAnimPayloadBase<T> : FuncAnimPayloadBase
|
||
{
|
||
public T result;
|
||
|
||
protected FuncAnimPayloadBase()
|
||
{
|
||
|
||
}
|
||
|
||
public new virtual T Invoke()
|
||
{
|
||
return result;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 一个简单的日志事件,用于调试
|
||
/// </summary>
|
||
[EventColor(1.0f, 1.0f, 0.2f)]
|
||
public class LogEvent : FuncAnimPayloadBase
|
||
{
|
||
public string message = "Hello World!";
|
||
|
||
public override void Invoke()
|
||
{
|
||
Debug.Log(message);
|
||
}
|
||
}
|
||
} |