多轮审查和修复
This commit is contained in:
28
Assets/Scripts/Equipment/Effects/AttackSpeedEffect.cs
Normal file
28
Assets/Scripts/Equipment/Effects/AttackSpeedEffect.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace BaseGames.Equipment
|
||||
{
|
||||
/// <summary>
|
||||
/// 攻击速度加成护符效果(架构 09_ProgressionModule §5)。
|
||||
/// 修改 PlayerStats.AnimatorSpeedMultiplier,动画控制器查询该倒数应用速度。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class AttackSpeedEffect : ICharmEffect
|
||||
{
|
||||
[Range(0.1f, 2.0f)]
|
||||
public float speedMultiplier = 1.2f; // 动画速度倍率(1.2 = 加速 20%)
|
||||
|
||||
public void OnEquip(EquipmentContext ctx)
|
||||
{
|
||||
ctx.Stats?.AddAnimatorSpeedBonus(speedMultiplier - 1f);
|
||||
}
|
||||
|
||||
public void OnUnequip(EquipmentContext ctx)
|
||||
{
|
||||
ctx.Stats?.RemoveAnimatorSpeedBonus(speedMultiplier - 1f);
|
||||
}
|
||||
|
||||
public string GetEffectDescription() => $"攻击速度 +{(speedMultiplier - 1f) * 100:0}%";
|
||||
}
|
||||
}
|
||||
11
Assets/Scripts/Equipment/Effects/AttackSpeedEffect.cs.meta
Normal file
11
Assets/Scripts/Equipment/Effects/AttackSpeedEffect.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0496fa028b434bb4aa5a8db318949418
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
69
Assets/Scripts/Equipment/Effects/OnHitEffect.cs
Normal file
69
Assets/Scripts/Equipment/Effects/OnHitEffect.cs
Normal file
@@ -0,0 +1,69 @@
|
||||
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}";
|
||||
}
|
||||
}
|
||||
11
Assets/Scripts/Equipment/Effects/OnHitEffect.cs.meta
Normal file
11
Assets/Scripts/Equipment/Effects/OnHitEffect.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e37498b992275324896706fb0237f9ca
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using BaseGames.Skills;
|
||||
|
||||
namespace BaseGames.Equipment
|
||||
{
|
||||
/// <summary>
|
||||
/// 技能数值修改护符效果(架构 09_ProgressionModule §5)。
|
||||
/// 通过 SkillModifierRegistry 对指定技能的数值加成。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class SkillNumericModifierEffect : ICharmEffect
|
||||
{
|
||||
public string TargetSkillId;
|
||||
public SkillStat Stat;
|
||||
public float Delta;
|
||||
public bool IsPercent;
|
||||
|
||||
public void OnEquip(EquipmentContext ctx)
|
||||
=> ctx.SkillMods?.Register(TargetSkillId, Stat, Delta, IsPercent);
|
||||
|
||||
public void OnUnequip(EquipmentContext ctx)
|
||||
=> ctx.SkillMods?.Unregister(TargetSkillId, Stat, Delta, IsPercent);
|
||||
|
||||
public string GetEffectDescription()
|
||||
=> $"{TargetSkillId}.{Stat} {(Delta >= 0 ? "+" : "")}{Delta}{(IsPercent ? "%" : "")}";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa27d39b594b954449a14cfab572255c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
30
Assets/Scripts/Equipment/Effects/SkillSlotOverrideEffect.cs
Normal file
30
Assets/Scripts/Equipment/Effects/SkillSlotOverrideEffect.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using BaseGames.Skills;
|
||||
|
||||
namespace BaseGames.Equipment
|
||||
{
|
||||
/// <summary>
|
||||
/// 技能插槽替换护符效果(架构 09_ProgressionModule §5)。
|
||||
/// 将指定形态的某技能槽替换为另一技能。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class SkillSlotOverrideEffect : ICharmEffect
|
||||
{
|
||||
public SkillSlotOverride overrideData;
|
||||
|
||||
public void OnEquip(EquipmentContext ctx)
|
||||
=> ctx.SkillMods?.AddSlotOverride(overrideData);
|
||||
|
||||
public void OnUnequip(EquipmentContext ctx)
|
||||
=> ctx.SkillMods?.RemoveSlotOverride(overrideData);
|
||||
|
||||
public string GetEffectDescription()
|
||||
{
|
||||
string formStr = overrideData.targetForm != null
|
||||
? overrideData.targetForm.name : "所有形态";
|
||||
string skillName = overrideData.replacementSkill != null
|
||||
? overrideData.replacementSkill.displayNameKey : "null";
|
||||
return $"{formStr}的 {overrideData.targetSlot} 替换为 [{skillName}]";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 337f2ae2dd788c5489eb13d19db1bbbc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
36
Assets/Scripts/Equipment/Effects/SoulSpellEffect.cs
Normal file
36
Assets/Scripts/Equipment/Effects/SoulSpellEffect.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
|
||||
namespace BaseGames.Equipment
|
||||
{
|
||||
/// <summary>
|
||||
/// 法术资源类型。
|
||||
/// </summary>
|
||||
public enum SpellType
|
||||
{
|
||||
SoulAttack,
|
||||
HealingWave
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 灵魂法术强化护符效果(架构 09_ProgressionModule §5)。
|
||||
/// 装备时减少灵力消耗,卸下时还原。SpellManager 消耗时查询 PlayerStats.SoulCostReduction。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class SoulSpellEffect : ICharmEffect
|
||||
{
|
||||
public SpellType spellType;
|
||||
public int soulCostReduction; // 减少消耗的灵力点数
|
||||
|
||||
public void OnEquip(EquipmentContext ctx)
|
||||
{
|
||||
ctx.Stats?.AddSoulCostReduction(soulCostReduction);
|
||||
}
|
||||
|
||||
public void OnUnequip(EquipmentContext ctx)
|
||||
{
|
||||
ctx.Stats?.RemoveSoulCostReduction(soulCostReduction);
|
||||
}
|
||||
|
||||
public string GetEffectDescription() => $"{spellType} 消耗减少 {soulCostReduction} 灵力";
|
||||
}
|
||||
}
|
||||
11
Assets/Scripts/Equipment/Effects/SoulSpellEffect.cs.meta
Normal file
11
Assets/Scripts/Equipment/Effects/SoulSpellEffect.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7d2819daddf61c54890ee8bfd55c0093
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
28
Assets/Scripts/Equipment/Effects/StatModifierEffect.cs
Normal file
28
Assets/Scripts/Equipment/Effects/StatModifierEffect.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
|
||||
namespace BaseGames.Equipment
|
||||
{
|
||||
/// <summary>
|
||||
/// 属性加成护符效果(架构 09_ProgressionModule §5)。
|
||||
/// 装备时通过 PlayerStats.AddModifier 叠加固定/百分比属性加成。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class StatModifierEffect : ICharmEffect
|
||||
{
|
||||
public StatType statType;
|
||||
public float flatBonus; // 固定加成(如 +1 HP)
|
||||
public float percentBonus; // 百分比加成(如 +0.2 = +20%)
|
||||
|
||||
public void OnEquip(EquipmentContext ctx)
|
||||
{
|
||||
ctx.Stats?.AddModifier(statType, flatBonus, percentBonus);
|
||||
}
|
||||
|
||||
public void OnUnequip(EquipmentContext ctx)
|
||||
{
|
||||
ctx.Stats?.RemoveModifier(statType, flatBonus, percentBonus);
|
||||
}
|
||||
|
||||
public string GetEffectDescription() => $"{statType}: +{flatBonus} +{percentBonus * 100:0}%";
|
||||
}
|
||||
}
|
||||
11
Assets/Scripts/Equipment/Effects/StatModifierEffect.cs.meta
Normal file
11
Assets/Scripts/Equipment/Effects/StatModifierEffect.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a360d87b54b496f448a78f9abf2ef5c0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
29
Assets/Scripts/Equipment/Effects/WeaponOverrideEffect.cs
Normal file
29
Assets/Scripts/Equipment/Effects/WeaponOverrideEffect.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using BaseGames.Player;
|
||||
|
||||
namespace BaseGames.Equipment
|
||||
{
|
||||
/// <summary>
|
||||
/// 武器替换护符效果(架构 09_ProgressionModule §5)。
|
||||
/// 通过 WeaponManager 将指定形态的武器替换为另一武器。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class WeaponOverrideEffect : ICharmEffect
|
||||
{
|
||||
public string targetFormId; // 目标形态 ID(留空 = 所有形态)
|
||||
public WeaponSO replacementWeapon; // 替换武器 SO
|
||||
|
||||
public void OnEquip(EquipmentContext ctx)
|
||||
=> ctx.WeaponMgr?.SetOverride(targetFormId, replacementWeapon);
|
||||
|
||||
public void OnUnequip(EquipmentContext ctx)
|
||||
=> ctx.WeaponMgr?.ClearOverride(targetFormId);
|
||||
|
||||
public string GetEffectDescription()
|
||||
{
|
||||
string formStr = string.IsNullOrEmpty(targetFormId) ? "所有形态" : targetFormId;
|
||||
string wName = replacementWeapon != null ? replacementWeapon.displayName : "null";
|
||||
return $"{formStr}的武器替换为 [{wName}]";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0f78ad8b20f68db4d9673de1a7cb5a58
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user