Back to list
mutemoon

create-buff

by mutemoon

moon-lol 是一个基于 Bevy 引擎开发的《英雄联盟》复刻项目。该项目利用 Rust 语言的高性能和 Bevy 引擎的现代 ECS 架构,实现了对 LoL 资源文件(WAD, PROP, TEX 等)的解析加载,并初步构建了战斗系统、技能系统以及 UI 界面。

22🍴 3📅 Jan 21, 2026

SKILL.md


name: create-buff description: 创建一个新的 Buff 并实现功能

创建 Buff

创建一个 Buff 组件来实现游戏的功能

例子

以创建 Fiora 的 E 技能为例

1. 创建 Buff 文件

src/buffs 目录下创建一个新的 .rs 文件,文件名以英雄名加技能名命名,此例中文件名为 fiora_e.rs。 如果是通用的 buff 则以功能名命名,名词在前,动词在后,例如 attack_speed_up.rs

2. 编写 Buff 文件

src/buffs/fiora_e.rs 文件中添加插件和 Buff 组件的定义:

use bevy::prelude::*;

use crate::{Buff, Buffs, Lifetime};

#[derive(Default)]
pub struct PluginFioraE;

impl Plugin for PluginFioraE {
    fn build(&self, app: &mut App) {}
}

#[derive(Component, Clone, Debug)]
#[require(Buff = Buff { name: "FioraE" }, Lifetime = Lifetime::new_timer(3.0))]
pub struct BuffFioraE {
    pub left: i32,
}

impl Default for BuffFioraE {
    fn default() -> Self {
        Self { left: 2 }
    }
}

如果 Buff 永远存在,则不需要 require Lifetime 组件

3. 注册 Buff 模块和 Buff 插件

src/buffs.rs 文件中添加 Buff 模块

// ...其它 mod
mod fiora_e;

// ...其它 use
pub use fiora_e::*;

src/lib.rs 文件中注册 Buff 插件

plugin_group! {
    pub struct PluginCore {
        // ...其它 Buff 插件
        :PluginFioraE,
    }
}

4. 实现 Buff 的逻辑

实现 Buff 的逻辑,例如 Fiora 的 E 技能会在每次攻击结束时减少一次,当次数为 0 时移除 Buff。

fn on_event_attack_end(
    trigger: On<EventAttackEnd>,
    mut commands: Commands,
    q_buffs: Query<&Buffs>,
    mut q_buff_fiora_e: Query<&mut BuffFioraE>,
) {
    let entity = trigger.event_target();
    let Ok(buffs) = q_buffs.get(entity) else {
        return;
    };

    for buff in buffs.iter() {
        let Ok(mut buff_fiora_e) = q_buff_fiora_e.get_mut(buff) else {
            continue;
        };

        buff_fiora_e.left -= 1;

        if buff_fiora_e.left <= 0 {
            commands.entity(buff).despawn();
        }
    }
}

在插件添加 observer

impl Plugin for PluginFioraE {
    fn build(&self, app: &mut App) {
        app.add_observer(on_event_attack_end);
    }
}

5. 添加 Buff

在技能效果中添加 Buff

                Behave::trigger(ActionBuffSpawn::new((
                    BuffAttack {
                        bonus_attack_speed: 0.5,
                    },
                    BuffFioraE::default()
                ))),

由于 Fiora 的 E 技能是伴随着攻速增加的,因此将两个 Buff 组合在一起挂载到同一个 Buff 实体上,BuffFioraE 负责管理次数,BuffAttack 负责管理攻速,从而实现了 Buff 效果的组合。

Score

Total Score

60/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

+10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon