如何在 bevy 中读取鼠标运动?

问题描述

我想创建一个第一人称相机。 我已经研究了其他几个实现的源代码,比如

https://github.com/mcpar-land/bevy_fly_camera

https://github.com/sburris0/bevy_flycam

但是当我自己实现它时(主要是复制粘贴 tbh),当在 git 上使用最新的 bevy 版本时,它无法编译。

编译输出

error[E0277]: `*mut (usize,PhantomData<MouseMotion>)` cannot be sent between threads safely
   --> src/player_input.rs:151:13
    |
151 |     mut state: ResMut<State>,|                ^^^^^^^^^^^^^ `*mut (usize,PhantomData<MouseMotion>)` cannot be sent between threads safely
    | 
   ::: /home/luca/.cargo/git/checkouts/bevy-f7ffde730c324c74/89a41bc/crates/bevy_ecs/src/resource/resource_query.rs:66:26
    |
66  | pub struct ResMut<'a,T: Resource> {
    |                          -------- required by this bound in `bevy::prelude::ResMut`
    |
    = help: within `player_input::State<'_>`,the trait `Send` is not implemented for `*mut (usize,PhantomData<MouseMotion>)`
    = note: required because it appears within the type `Local<'_,(usize,PhantomData<MouseMotion>)>`
    = note: required because it appears within the type `bevy::prelude::EventReader<'_,MouseMotion>`
    = note: required because it appears within the type `player_input::State<'_>`
    = note: required because of the requirements on the impl of `Resource` for `player_input::State<'_>`

代码如下:

#[derive(Default)]
struct State<'a> {
    mouse_motion_event_reader: EventReader<'a,MouseMotion>,}

fn mouse_motion_system(
    time: Res<Time>,mut state: ResMut<State>,//<-- IMPORTANT LINE (Line 151)

    mouse_motion_events: Res<Events<MouseMotion>>,mut query: Query<(&mut FlyCamera,&mut Transform)>,) {
    //...
}

它只在最新版本的 bevy 上抛出这个错误,而不是在 0.4.0 版本上。

是我做错了什么还是我应该在github上打开一个问题,因为这是引擎的问题?

我需要做什么才能让它发挥作用?

解决方法

您在这里的 EventReader 中根本不应该有 State。也许您想跟踪状态中的最后一个光标位置?

由于 Bevy 0.5 简化了事件 API,因此您只需要 EventReader 作为系统参数; mouse_motion_events: Res<Events<MouseMotion>>, 现在已过时,可以替换为 mut mouse_motion_events: EventReader<MouseMotion>