Skip to content

Picking 与相机控制

前面几章把 3D 世界的家当——网格、材质、光照——都备齐了。道具上台,灯也打好了,但看客还只能隔着屏幕干瞪眼:鼠标点上去没反应,相机也不能自己走。本章补上最后一里路:交互

Bevy 的 Picking 系统是一套统一的指针事件框架——不管你点的是 UI 面板、2D 精灵还是 3D 网格,事件模型一模一样:Pointer<Click>Pointer<Over>Pointer<Drag>……只需一行 .observe(...) 就能接住。相机控制则是独立的 bevy_camera_controller crate,往相机实体上挂一个 FreeCamera 组件,WASD 就能飞。

本章的工序:

  • 架构总览——Picking 系统的分层:后端(谁负责射线检测)、事件(发生了什么)、Observer(怎么接);
  • 点选 3D 物体——MeshPickingPlugin 不在 DefaultPlugins 里,手动加一行;Click 观察者起步;
  • 悬停反馈——Over/Out 事件切换材质,鼠标掠过就有颜色变化;
  • 拖拽移动——Drag 事件的 delta 字段,屏幕像素到世界坐标的转换;
  • 拖放——DragEnter/DragDrop/DragLeave 三件套,在容器之间搬运物体;
  • 事件冒泡——Pointer<E> 自动向父级传播,父级观察者也能接住子级的事件;
  • FreeCamera 控制器——features = ["free_camera"],挂组件、加插件,WASD 飞行。

配套 crate 是 code/ch25-picking,依赖多了 bevyfree_camera feature。

开工。