Bevt Event

事件让我们可以在System之间通信,我们可以在一个系统中发送事件,然后在另一个系统中接收事件以触发我们的游戏逻辑。

添加事件

我们先定义我们的事件:

rust 复制代码
#[derive(Event)]
struct PlayerDetected(i32);

事件只需要derive(Event)即可,同时事件也是一个普通的结构体,它可以包含数据,也可以不包含。

在我们声明了事件类型之后,我们需要添加到App中:

rust 复制代码
// other code...
App::new().add_event::<PlayerDetected>()
// other code...

需确保 add_event::<PlayerDetected>() 在注册相关系统之前调用,否则事件无法被识别。

此时,我们就可以在我们的系统中使用事件了。

发送事件

rust 复制代码
fn send_player_detected(mut events: EventWriter<PlayerDetected>) {
    events.send(PlayerDetected(1));
}

发送事件需要定义一个可变的EventWriter,泛型参数填入我们的事件类型,当我们需要触发事件的时候,调用EventWriter.send发送事件。

读取事件

rust 复制代码
fn on_player_detected(mut events: EventReader<PlayerDetected>) {
    events
        .read()
        .for_each(|ev| info!("detected player: {}", ev.0));
}

读取事件稍显特殊,使用EventReader读取事件,调用函数read()会返回一个读取事件的迭代器,如果有事件触发,会进入到for_each中,当然,使用for循环也是一样的。

注册系统

别忘了,把两个系统添加到我们的App中:

rust 复制代码
// other code...
.add_systems(
    Update,
    send_player_detected.run_if(input_just_pressed(KeyCode::Space)),
)
.add_systems(Update, on_player_detected)
// other code...

注意这里我们在触发send_player_detected系统的时候,判定了是否按下空格键。

此时,当我们按下空格键的时候,便会触发PlayerDetected事件。

总结

总体来讲,Bevy 的事件使用起来是比较简单的。事件是将发生的事情应该发生的事情分离的主要方式,通过事件能够让我们的游戏更具可扩展性。

相关推荐
TDengine (老段)9 小时前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
魔力女仆12 小时前
【RUST AI】把 TTS 搬进浏览器:kokoroi-rs 的 WASM 实践
人工智能·rust·wasm
Python私教13 小时前
Godot 4 CharacterBody2D 角色移动:输入、碰撞与八方向控制实战
人工智能·游戏引擎·godot·gdscript·游戏开发
米尔的可达鸭14 小时前
UDP 通信深度实验:从 Windows FastPath 到 ICMP 端口不可达的完整排查
windows·websocket·网络协议·rust·udp·wireshark·tcpdump
SmalBox14 小时前
【节点】[BranchOnInputConnection节点]原理解析与实际应用
unity3d·游戏开发·图形学
jinshw15 小时前
自己实现GIS配图软件(二)
前端·后端·rust
行走的陀螺仪16 小时前
从 nvm 到 fnm:更快、更省心的 Node.js 版本管理器迁移指南
rust·node.js·nvm·fnm
逻极1 天前
Rust 从入门到精通:内存安全与高性能系统编程实战
rust·系统编程·性能·内存安全
Yeauty1 天前
渲染成图再 CLI 拼接,还是进程内直推?Rust 帧到视频的两条路
开发语言·rust·音视频
SmalBox2 天前
【节点】[Branch节点]原理解析与实际应用
unity3d·游戏开发·图形学