如何在Bevy中创建窗口后正确获取与设置窗口信息?
解决Bevy中无法修改/读取实时窗口设置的问题
这个坑我踩过!你遇到的问题核心在于:WindowDescriptor只是窗口初始化阶段的配置项,运行时修改它不会同步到实际窗口,它也不会实时反映窗口的动态变化。下面给你详细讲怎么正确操作:
为什么你的代码不生效?
WindowDescriptor是Bevy用来创建窗口的初始参数,当窗口启动后,这个资源就完成了它的使命——Bevy不会再监听它的变化,也不会把窗口的实时状态同步回去。所以你修改win_desc.title只是改了内存里的一个静态值,实际窗口根本没收到更新指令;而手动拖拽窗口改变尺寸时,WindowDescriptor的width也不会跟着变。
正确的做法:操作Window组件
运行时要控制窗口,你需要操作附着在窗口实体上的Window组件(如果是多窗口场景,还可以用PrimaryWindow标记来定位主窗口)。
1. 修改窗口属性(比如标题)
用Query<&mut Window, With<PrimaryWindow>>获取主窗口的可修改引用,直接修改它的字段就会立即生效:
fn update_window_title(mut primary_window: Query<&mut Window, With<PrimaryWindow>>) { if let Ok(mut window) = primary_window.get_single_mut() { // 直接修改标题,窗口会实时更新 window.title = "我是新标题!".to_string(); println!("当前窗口标题: {}", window.title); } }
2. 获取实时窗口尺寸
同样通过Window组件的resolution字段(Bevy 0.10+版本),可以拿到当前窗口的实际宽高:
fn track_window_size(primary_window: Query<&Window, With<PrimaryWindow>>) { if let Ok(window) = primary_window.get_single() { let (width, height) = (window.resolution.width(), window.resolution.height()); println!("当前窗口实时尺寸: {}×{}", width, height); // 如果你需要监听尺寸变化,可以添加Changed<Window>条件: // fn track_window_size(primary_window: Query<&Window, (With<PrimaryWindow>, Changed<Window>)>) } }
完整示例代码
use bevy::prelude::*; fn main() { App::new() .add_plugins(DefaultPlugins.set(WindowPlugin { // 初始化窗口配置(这里可以用Window替代旧的WindowDescriptor) primary_window: Some(Window { title: "初始窗口标题".to_string(), resolution: (800., 600.).into(), ..default() }), ..default() })) .add_system(update_window_title) .add_system(track_window_size) .run(); } fn update_window_title(mut primary_window: Query<&mut Window, With<PrimaryWindow>>) { if let Ok(mut window) = primary_window.get_single_mut() { // 可以加个简单的触发逻辑,比如只在启动时修改一次 static mut HAS_UPDATED: bool = false; unsafe { if !HAS_UPDATED { window.title = "修改后的标题".to_string(); HAS_UPDATED = true; } } } } fn track_window_size(primary_window: Query<&Window, (With<PrimaryWindow>, Changed<Window>)>) { if let Ok(window) = primary_window.get_single() { println!("窗口尺寸变化了!当前: {}×{}", window.resolution.width(), window.resolution.height()); } }
版本兼容提示
- 如果你的Bevy版本低于0.10,没有
PrimaryWindow标记,可以用Query<&mut Window>并取第一个实体,或者使用Res<Windows>资源(不过该资源在新版本已被废弃)。 - 不同版本的Bevy中
Window组件的字段可能略有差异,比如旧版本直接用window.width/window.height而不是resolution。
内容的提问来源于stack exchange,提问作者STF_ZBR
相关产品推荐
相关产品推荐

