Files
zeling_v2/Assets/Scripts/Equipment/Effects/OnHitEffect.cs
2026-05-12 21:50:49 +08:00

70 lines
2.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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}";
}
}