【AI笔记】【UE5】小巧的伤害系统设计笔记


一、 系统概述

伤害系统是游戏玩法的核心骨架——它是一个 Actor 身上的**”血条字典”(组件)外加一张“通用信用卡”**(接口),让攻击方不管面对的是玩家、敌人还是可破坏物,都能用同一套语言对话。

核心设计理念:Component 管数据 + Interface 管通信

  • Component:统一管理生命值数据,保证”什么是血、怎么扣血”在所有实体上是一致的
  • Interface:对外提供统一的行为契约,保证”任何能攻击的东西”不需要区分目标类型

二、 核心组件:伤害组件 (DamageComponent)

伤害组件是整个系统的数据和逻辑中枢,所有血量计算都在这里完成。

属性/函数 核心机制 设计用途
CurrentHealth 当前生命值 实时血量,受击时扣减;可绑定 UI 血条
MaxHealth 生命值上限 用于血量比例计算(血条百分比)、治疗上限钳制
GetCurrentHealth() 返回当前生命值 供 UI 绑定、AI 决策(如低于阈值逃跑)
GetMaxHealth() 返回生命值上限 供 UI 显示、伤害比例计算
TakeDamage(float Damage) 扣血 + 钳制到 [0, MaxHealth] + ≤0 触发死亡标记 所有伤害的最终落点
Heal(float HealAmount) 回血 + 钳制到 MaxHealth 所有治疗的最终落点

💡 设计原则:Component 只做纯数据计算,不碰表现层逻辑。

比如:Component 知道”血扣到0了”,但不负责决定角色是播放死亡动画还是直接消失——那是每个实体自己的事。


三、 可被伤害接口 (DamageableInterface)

接口是外部系统和被伤害实体之间的通信契约——攻击方只需要问一句”你能挨打吗?”,无需知道对方是敌是友、是人是物。

1. 接口定义

函数 职责定位 与 Component 的关系
TakeDamage(float Damage) 伤害入口,供攻击方调用 🔄 内部转发到 Component 的 TakeDamage()
Heal(float HealAmount) 治疗入口,供治疗逻辑调用 🔄 内部转发到 Component 的 Heal()

💡 设计价值:把”调用伤害”和”伤害目标是什么”解耦。

  • 武器系统不需要知道目标是玩家还是敌人——只要目标实现了这个接口,就能造成伤害
  • 新增一个可被伤害的实体类型(如可破坏木箱),无需改动任何攻击方代码

四、 接口实现层:不同实体的差异化设计

同一个 Component,同一个接口,不同的 Actor 可以插入不同的自定义逻辑。这是伤害系统设计中最灵活的一层。

伤害处理流程

1
【外部攻击】 → 接口函数 → 【自定义逻辑前】 → Component 计算 → 【自定义逻辑后】

各实体类型差异化示例

实体类型 伤害输入前 伤害输入后
玩家角色 无敌帧拦截、护盾吸收 受击UI闪红、伤害飘字、手柄震动
普通敌人 护甲减伤、属性克制修正 受击动画、仇恨值累加、血条更新
Boss 阶段锁血、部位破坏判定 阶段切换演出、弱点暴露提示
可破坏物 伤害类型过滤(如只接受爆炸伤害) 碎裂特效、掉落物生成

💡 核心价值:接口给了你一个**”插槽”**,每个实体可以在同一个插槽上插不同的行为。设计新实体时,核心血量逻辑不用重写,只需设计前后自定义行为即可。


五、 设计拓展思路

基于这套 Component + Interface 架构,可以在不破坏现有结构的前提下,轻松拓展以下战斗系统:

拓展方向 设计思路 依赖的现有结构
伤害类型系统 TakeDamage 中增加伤害类型参数(物理/魔法/火焰等),由 Component 统一计算抗性减免 Component 的 TakeDamage
护盾/Armor 系统 在接口实现层中,调用 Component 之前先做护盾吸收逻辑 接口实现层的”自定义逻辑前”插槽
受击反应系统 在接口实现层中,调用 Component 之后根据伤害大小触发不同受击表现(轻受击/重受击/击飞) 接口实现层的”自定义逻辑后”插槽
击杀/仇恨系统 在接口实现层中,记录最后一次攻击者,供 AI 仇恨和击杀统计使用 接口实现层
伤害来源反馈 传递攻击方信息(谁打的、用什么打的),供 UI 提示、仇恨系统、成就统计 伤害入口参数扩展