Files
Cielonos/Assets/Scripts/MainGame/Base/FunctionalAnimation/Payloads/RemoveBuff.cs

53 lines
2.0 KiB
C#
Raw Normal View History

2026-06-27 12:52:03 -04:00
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。");
}
}
}
}