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

如何在Bevy引擎中为Rust游戏设置窗口图标?

在Bevy中更改游戏窗口图标

当然可以更改Bevy游戏的窗口图标,以下是适配Bevy 0.12+(当前主流稳定版)的具体实现步骤:

1. 准备图标资源

  • 建议准备多尺寸图标(如16x16、32x32、64x64、128x128),适配不同系统的显示场景
  • 支持PNG等常见格式,若需要透明背景,确保图标本身带透明通道

2. 确认依赖

Bevy 0.10+默认包含所需的bevy_render和bevy_window模块,只需在Cargo.toml中确保基础依赖:

[dependencies]
bevy = "0.12"

3. 实现图标设置

核心是加载图标并转换为WindowIcon类型,再通过Window组件配置。这里提供两种常见实现方式:

方式一:编译时静态加载(推荐用于固定图标)

直接将图标嵌入二进制,启动时同步设置:

use bevy::prelude::*;
use bevy::window::WindowIcon;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins.set(WindowPlugin {
            primary_window: Some(Window {
                title: "我的Bevy游戏".into(),
                ..default()
            }),
            ..default()
        }))
        .add_startup_system(setup_window_icon)
        .run();
}

fn setup_window_icon(mut windows: Query<&mut Window>) {
    // 路径相对于当前.rs文件的位置,根据你的资源结构调整
    let icon_bytes = include_bytes!("../assets/icons/game_icon_64x64.png");
    // 第二个和第三个参数是图标的宽高,要和实际文件匹配
    let icon = WindowIcon::from_rgba(icon_bytes.to_vec(), 64, 64).unwrap();

    if let Ok(mut window) = windows.get_single_mut() {
        window.icon = Some(icon);
    }
}

方式二:运行时异步加载(适合动态切换图标)

通过AssetServer异步加载图标,适合需要后期修改图标的场景:

use bevy::prelude::*;
use bevy::window::WindowIcon;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_startup_system(load_icon_async)
        .add_system(set_loaded_icon)
        .run();
}

// 启动时发起图标加载请求
fn load_icon_async(mut commands: Commands, asset_server: Res<AssetServer>) {
    let icon_handle = asset_server.load("icons/game_icon_64x64.png");
    commands.spawn((icon_handle,));
}

// 监听加载完成事件,设置窗口图标
fn set_loaded_icon(
    mut windows: Query<&mut Window>,
    mut icon_events: EventReader<AssetEvent<Image>>,
    icons: Res<Assets<Image>>,
    query: Query<&Handle<Image>>,
) {
    let icon_handle = query.single();
    for event in icon_events.iter() {
        if let AssetEvent::LoadedWithDependencies(handle) = event && handle == icon_handle {
            if let Some(image) = icons.get(icon_handle) {
                let icon = WindowIcon::from_rgba(
                    image.data.clone(),
                    image.texture_descriptor.size.width,
                    image.texture_descriptor.size.height
                ).unwrap();
                
                if let Ok(mut window) = windows.get_single_mut() {
                    window.icon = Some(icon);
                }
            }
        }
    }
}

注意事项

  • 路径要匹配实际资源位置,include_bytes!是编译时加载,路径相对当前代码文件;AssetServer加载的路径相对项目根目录下的assets文件夹(默认配置)
  • 主流系统(Windows、macOS、Linux)都支持PNG格式图标,Bevy会自动处理格式转换,无需额外转ICO等格式
  • 若使用Bevy 0.9及更早版本,需用WindowDescriptor替代Window组件,核心逻辑一致,但API细节略有不同

内容的提问来源于stack exchange,提问作者LocalTrash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:55:33