70 lines
2.3 KiB
C#
70 lines
2.3 KiB
C#
using System;
|
||
using UnityEngine;
|
||
using BaseGames.Combat;
|
||
using BaseGames.Core.Events;
|
||
|
||
namespace BaseGames.Equipment
|
||
{
|
||
/// <summary>
|
||
/// 命中触发效果类型。
|
||
/// </summary>
|
||
public enum OnHitEffectType
|
||
{
|
||
ApplyPoison,
|
||
ApplyFire,
|
||
KnockbackBoost
|
||
}
|
||
|
||
/// <summary>
|
||
/// 命中触发护符效果(架构 09_ProgressionModule §5)。
|
||
/// 订阅 HitConfirmedEventChannelSO("EVT_HitConfirmed") 并按概率对命中目标施加状态效果。
|
||
/// KnockbackBoost 类型通过 DamageInfo.KnockbackForce 标记,由 HurtBox 流水线读取。
|
||
/// </summary>
|
||
[Serializable]
|
||
public class OnHitEffect : ICharmEffect
|
||
{
|
||
public OnHitEffectType effectType;
|
||
[Range(0f, 1f)]
|
||
public float chance; // 触发概率(0~1)
|
||
|
||
private HitConfirmedEventChannelSO _onHitChannel;
|
||
private EventSubscription? _sub;
|
||
|
||
public void OnEquip(EquipmentContext ctx)
|
||
{
|
||
_onHitChannel = ctx.Events?.Get<HitConfirmedEventChannelSO>("EVT_HitConfirmed");
|
||
_sub = _onHitChannel?.Subscribe(HandleHit);
|
||
}
|
||
|
||
public void OnUnequip(EquipmentContext ctx)
|
||
{
|
||
_sub?.Dispose();
|
||
_sub = null;
|
||
_onHitChannel = null;
|
||
}
|
||
|
||
private void HandleHit(HitInfo info)
|
||
{
|
||
if (UnityEngine.Random.value > chance) return;
|
||
|
||
switch (effectType)
|
||
{
|
||
case OnHitEffectType.ApplyPoison:
|
||
info.HitTransform?.GetComponentInParent<IStatusEffectable>()
|
||
?.ApplyStatusEffect(DamageType.Poison);
|
||
break;
|
||
case OnHitEffectType.ApplyFire:
|
||
info.HitTransform?.GetComponentInParent<IStatusEffectable>()
|
||
?.ApplyStatusEffect(DamageType.Fire);
|
||
break;
|
||
case OnHitEffectType.KnockbackBoost:
|
||
// KnockbackBoost 在 HitBox 构建 DamageInfo 前生效,
|
||
// 此处为命中后的反馈(可在此播放特效;实际击退已在 HurtBox 流水线处理)。
|
||
break;
|
||
}
|
||
}
|
||
|
||
public string GetEffectDescription() => $"命中时 {chance * 100:0}% 概率附加 {effectType}";
|
||
}
|
||
}
|