using System; using UnityEngine; namespace BaseGames.Enemies { /// /// 受击分级配置(KnockUp 击飞门槛 & 飞行参数)。 /// 挂载在 EnemyStatsSO.HitTiers 中。 /// [Serializable] public struct HitTierConfig { [Tooltip("击飞(KnockUp)触发伤害阈值;需同时设置 DamageFlags.Launch;0 = 仅依赖 Launch 标志")] [Min(0)] public int launchThreshold; [Tooltip("击飞纵向冲量")] [Min(0f)] public float launchUpForce; [Tooltip("击飞横向冲量(沿受击反方向)")] [Min(0f)] public float launchHorzForce; [Tooltip("无 KnockUp 动画时的状态持续时长(s)")] [Min(0f)] public float knockUpDuration; } /// /// 敌人属性配置 SO(架构 07_EnemyModule §2)。 /// [CreateAssetMenu(menuName = "BaseGames/Enemies/EnemyStats")] public class EnemyStatsSO : ScriptableObject { [Header("生命")] [Min(1)] public int MaxHP = 50; [Header("防御")] [Min(0)] public int Defense = 0; [Header("移动")] [Min(0f)] public float WalkSpeed = 2f; [Min(0f)] public float RunSpeed = 4f; [Header("战斗")] [Min(0f)] public float AttackCooldown = 1f; [Header("攻击选招策略")] [Tooltip("到攻击范围内如何从多个候选招里选一个")] public BaseGames.Enemies.Abilities.AttackSelectionMode attackSelectionMode = BaseGames.Enemies.Abilities.AttackSelectionMode.WeightedRandom; [Tooltip("WeightedRandomAntiRepeat 模式下,上一次选中的招的权重折扣系数。" + "0 = 有替代招时绝不连续重复;1 = 不惩罚。仅该模式生效")] [Range(0f, 1f)] public float attackAntiRepeatFactor = BaseGames.Enemies.Abilities.EnemyAttackSelector.DefaultAntiRepeatFactor; [Header("追击 & AI 阶段")] [Tooltip("是否有警觉状态:勾选=未发现态进入视野先进警觉(朝向+警觉动画)再追击;不勾选=进入追逐感知直接追击")] public bool HasAlertState = true; [Tooltip("最大追击距离(m);超出后放弃追击切换搜查阶段")] [Min(0f)] public float MaxChaseDistance = 15f; [Tooltip("视线丢失判定超时(s);超过此时长无视线则切换搜查")] [Min(0f)] public float LoseLinkTimeout = 2f; [Tooltip("归位到达判定半径(m)")] [Min(0.01f)] public float HomeRadius = 0.5f; [Header("受击分级")] [Tooltip("Stagger / KnockUp 伤害阈值及击飞参数")] public HitTierConfig HitTiers; } }