SuperAPI AI 工具集

bevy-combat-system

编程与开发

查看项目

更新于 10-16 06:08

技能介绍

用途

本技能用于在 Bevy 引擎的 ECS 架构下实现战斗系统,核心场景是:当一次命中需要改变生命值时加载使用。它聚焦于生命值、伤害、无敌状态与队伍标识这几个机制,并说明体积重叠检测仍由 bevy-physics-2d 和 bevy-physics-3d 负责;在尚未接入物理求解器时,用 Transform 上的距离检测(reach check)即可满足近战判定。

主要能力

  • 组件定义:Health(含 current 与 max 字段)、Team(队伍 id)、Invuln(剩余无敌时间)均为自定义组件,不依赖引擎内置战斗组件。
  • 消息机制:一次性事实(命中、拾取、任务推进)通过 bevy-events-messaging 传递,本技能不新增事件类型名。
  • 系统编排:在 Update 或固定时间步上修改组件;当伤害必须先于死亡结算时使用 .chain() 保证顺序。
  • 资源:全局范围的表存放在 resource 中(bevy-data-resources)。
  • 近战判定:通过 Transform 的 translation 距离与 Melee 组件的 reach 比较来生成 Hit 消息。

使用方式

示例代码展示了完整的插件结构:

#[derive(Component)]
struct Health {
    current: i32,
    max: i32,
}

#[derive(Component)]
struct Team(u32);

#[derive(Component)]
struct Invuln {
    remaining: f32,
}

#[derive(Message)]
struct Hit {
    target: Entity,
    amount: i32,
    source_team: u32,
}

命中结算系统 apply_hits 读取 Hit 消息,跳过同队、无敌中或非正伤害的目标,扣减生命值并设置 0.25 秒无敌;tick_invuln 在固定时间步递减无敌剩余时间;despawn_dead 销毁生命值归零的实体。三者通过 .chain() 串联,确保死亡判定能看到更新后的生命值:

app.add_message::<Hit>().add_systems(
    FixedUpdate,
    (tick_invuln, apply_hits, despawn_dead).chain(),
);

近战系统 melee_hits 遍历攻击者与目标,跳过同队目标,当距离小于等于 reach 时写入 Hit 消息。生成战士时同时挂载 Health、Team、Invuln 与 Transform。

适用场景

  • 需要基于 ECS 组件管理生命值与队伍关系的 Bevy 游戏。
  • 需要无敌帧、命中消息驱动伤害结算的战斗逻辑。
  • 尚未接入物理求解器、希望先用 Transform 距离做近战判定的原型阶段。

限制与约束

  • 目标版本为 Bevy 0.20+。
  • 体积重叠检测不在本技能范围内,仍归 bevy-physics-2d 与 bevy-physics-3d。
  • 不得从两个无序系统可变查询同一组件,否则需用 .chain() 排序或拆分。
  • 不得在本技能中虚构物理、导航、网络或 XR crate,也不得使用未命名的第三方 crate 作为求解器。
  • 不使用场景树节点或信号总线,代码保持惯用 ECS 风格并仅使用有文档的 Bevy API。
  • 文档 URL 中不要固定 /0.20.0/,链接保持指向最新版本。

相关技能

前置:bevy-master(路由与调度)、bevy-ecs-composition(组件与系统)、bevy-spatial-queries(投射,求解器未定)、bevy-rpg-stats(攻击数值)、bevy-data-resources(表与定义)、bevy-events-messaging(一次性事实)。互补:bevy-state-machines(模式标志)。下游消费者:暂无。