用途
本技能用于把已经运行在桌面窗口上的 Bevy 游戏改造成可接受触摸输入、并适配更小屏幕布局的版本。它关注的是输入、UI 与 DPI 三个层面的适配,而不是平台打包或商店上架。当桌面窗口游戏需要接受触摸并采用更紧凑的布局时,可以加载本技能。平台相关功能由 bevy-platform-mobile 负责。
主要能力
输入
使用 Touches 资源列出当前活动触点。示例中通过 touches.iter().next().map(|touch| touch.position()) 记录最近一次触摸位置,存入自定义的 LastTouch 资源。桌面窗口上的指针位置则通过 Window::cursor_position 获取。动作映射不在本技能内,属于 bevy-input-handling。
UI
放大 Node 的点击目标:示例将带 TouchTarget 组件的节点 min_width 与 min_height 设为 88 像素。为 HUD 根节点添加安全内边距:通过 SafeInsets 资源(含 top、bottom 字段)设置 Node 的 padding,左右固定为 12 像素。
窗口与 DPI
WindowResolution 用于设置逻辑尺寸,并可选地覆盖缩放因子。示例中 window.resolution.set(720.0, 1280.0) 设置逻辑尺寸,set_scale_factor_override(Some(2.0)) 覆盖缩放因子。WindowScaleFactorChanged 事件用于报告实时的 DPI 变化,示例中读取该事件并更新 UiScale 资源。
纹理
ASTC 是面向移动 GPU 的压缩纹理格式,上传仍然通过 Assets<Image> 进行。
使用方式
技能以 Bevy ECS 系统形式给出示例代码,包括:
configure_window:查询&mut Window,设置分辨率与缩放因子覆盖。track_touch:读取Res<Touches>,写入ResMut<LastTouch>。enlarge_targets:查询带TouchTarget的&mut Node,设置最小宽高。pad_hud:读取Res<SafeInsets>,为带HudRoot的&mut Node设置 padding。follow_dpi:读取MessageReader<WindowScaleFactorChanged>,更新ResMut<UiScale>。
依赖声明为 bevy = "0.20"。
适配选择对照:
- 指针:触点用 Touches;桌面窗口指针位置用
Window::cursor_position。 - 仅悬停菜单:需要悬停状态的动作也要提供按下或点击路径。
- 安全边距:用
SafeInsets资源作为 Node padding 应用。
ECS 所有权与调度规则
技能强调状态归属与调度顺序:
- 单个实体上的数据由 Component 承载,通过 Query 由单个系统修改,运行在 Update 或 FixedMain。
- 整个应用共享的一个值由 Resource 承载,由单个系统修改;Startup 插入,之后由读取它的调度使用。
- 生成由 Commands 负责,由生成系统执行;初始世界在 Startup,运行时生成在后续调度。
- 不能竞态的顺序用
.chain()约束,仅作用于被链式的系统,且在同一调度内。 - 插件边界由 Plugin 的 build 注册系统与资源,在应用运行前完成。
借用规则:两个系统若都可变查询同一组件,必须用 .chain() 排序,或拆分使只有一个写入;无关系统保持并行。
决策对照:
- 每实体数据:用 Component + Query,不要把脚本字段复制到实体上。
- 应用级配置或时钟:用 Resource,不要把值复制到每个实体。
- 稳定模拟步长:用 FixedMain 与 Fixed 时钟,不要把模拟绑定到原始帧 Update。
- 启动生成:在 Startup 中用 Commands,不要从渲染系统生成。
- 非共享状态的跨系统通知:使用 bevy-events-messaging 中的 Message 或 observer 槽位,不要在本文件中新造事件类型。
- 文档集之外的 API:先查官方文档,不要使用虚构的 crate 或 API。
适用场景
- 桌面窗口游戏需要接受触摸输入。
- 需要为小屏幕重新布局 HUD,并处理安全边距。
- 需要跟随设备 DPI 变化调整 UI 缩放。
- 需要放大触摸点击目标以适配手指操作。
限制
- 商店列表与操作系统权限对话框不在本技能范围内。
- 平台打包仍由 bevy-platform-mobile 负责。
- 本技能只命名有文档的 Bevy crate 与模块,不涉及物理、导航、网络或 XR crate。
- 不在 Bevy 代码中使用导出预设或触摸模拟名称;Touches、Window、UiScale 才是文档化的 Bevy 部件。
- 文档 URL 不要固定
/0.20.0/,链接保持指向最新版,0.20 目标只在正文中说明一次。 - 不要从两个无序系统可变查询同一组件。
相关技能
前置:bevy-master(枢纽与调度)、bevy-ecs-composition(组件与系统)、bevy-platform-mobile(Android 与触摸功能)、bevy-ui-layout(重排 HUD)。
互补:bevy-adapt-mobile-to-desktop(反向适配)、godot-adapt-desktop-to-mobile(Godot 路线上的同一主题)。
下游消费者:暂无。
主技能:bevy-master(Bevy 路由)。