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,依赖多了 bevy 的 free_camera feature。
开工。