using System; using UnityEngine; using BaseGames.Combat; using BaseGames.Core.Events; namespace BaseGames.Equipment { /// /// 命中触发效果类型。 /// public enum OnHitEffectType { ApplyPoison, ApplyFire, KnockbackBoost } /// /// 命中触发护符效果(架构 09_ProgressionModule §5)。 /// 订阅 HitConfirmedEventChannelSO("EVT_HitConfirmed") 并按概率对命中目标施加状态效果。 /// KnockbackBoost 类型通过 DamageInfo.KnockbackForce 标记,由 HurtBox 流水线读取。 /// [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("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() ?.ApplyStatusEffect(DamageType.Poison); break; case OnHitEffectType.ApplyFire: info.HitTransform?.GetComponentInParent() ?.ApplyStatusEffect(DamageType.Fire); break; case OnHitEffectType.KnockbackBoost: // KnockbackBoost 在 HitBox 构建 DamageInfo 前生效, // 此处为命中后的反馈(可在此播放特效;实际击退已在 HurtBox 流水线处理)。 break; } } public string GetEffectDescription() => $"命中时 {chance * 100:0}% 概率附加 {effectType}"; } }