53 lines
2.0 KiB
C#
53 lines
2.0 KiB
C#
|
|
using System;
|
|||
|
|
using Cielonos.MainGame.Buffs.Character;
|
|||
|
|
using Cielonos.MainGame.Characters;
|
|||
|
|
using Sirenix.OdinInspector;
|
|||
|
|
using SLSUtilities.FunctionalAnimation;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace Cielonos.MainGame.Base.FunctionalAnimation.Payloads
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// FuncAnim Payload:在动画事件触发时,检测当前的动画执行者身上是否存在指定类型的 Buff,如果存在则将其移除。
|
|||
|
|
/// 完全兼容 ICharacterBuffFactory 的 Odin 多态编辑架构(但仅将其作为类型选择器)。
|
|||
|
|
/// </summary>
|
|||
|
|
[Serializable]
|
|||
|
|
[EventColor(0.9f, 0.3f, 0.3f)]
|
|||
|
|
public class RemoveBuff : FuncAnimPayloadBase
|
|||
|
|
{
|
|||
|
|
public override string NameForInspector => "Remove Buff";
|
|||
|
|
|
|||
|
|
[Tooltip("选择要移除的 Buff 类型(你在下拉菜单里填写的持续时间等参数会被忽略,这里仅作类型匹配依据)。")]
|
|||
|
|
[SerializeReference]
|
|||
|
|
public ICharacterBuffFactory buffFactory;
|
|||
|
|
|
|||
|
|
public override void Invoke()
|
|||
|
|
{
|
|||
|
|
if (buffFactory == null)
|
|||
|
|
{
|
|||
|
|
Debug.LogWarning("[RemoveBuffPayload] 未配置 Buff 工厂,无法移除 Buff。");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (Executor is CharacterBase characterBase)
|
|||
|
|
{
|
|||
|
|
// 通过 Factory 生成一个临时的 DummyBuff 仅用于获取我们需要匹配的具体子类 Type
|
|||
|
|
CharacterBuffBase dummyBuff = buffFactory.Create();
|
|||
|
|
Type targetBuffType = dummyBuff.GetType();
|
|||
|
|
|
|||
|
|
// 在角色当前的 Buff 列表中寻找到同类型实例
|
|||
|
|
CharacterBuffBase existingBuff = characterBase.buffSm.buffList.Find(x => x.GetType() == targetBuffType);
|
|||
|
|
|
|||
|
|
if (existingBuff != null)
|
|||
|
|
{
|
|||
|
|
existingBuff.Remove();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.LogWarning("[RemoveBuffPayload] 动画执行者不是 CharacterBase,无法移除 CharacterBuff。");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|