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