You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:22:55