Craft
体素游戏 — 3D 世界生成、自定义渲染管线
Craft 是一个 Minecraft 风格的体素游戏,展示了自定义渲染管线、chunk 管理和世界生成。
项目结构
games/craft/
├── src/
│ ├── main.rs # 入口 + 主循环
│ ├── lib.rs # 模块导出
│ ├── block.rs # 方块类型定义
│ ├── chunk.rs # Chunk 数据结构
│ ├── components.rs # ECS 组件
│ ├── mesh.rs # Chunk 网格生成
│ ├── raycast.rs # 射线拾取
│ ├── resources.rs # 游戏资源
│ ├── vertex.rs # 自定义顶点格式
│ ├── world_gen.rs # 程序化地形生成
│ ├── persistence.rs # 世界存档
│ ├── render/ # 自定义 wgpu 管线
│ └── systems/ # 游戏系统
├── assets/
│ ├── voxel.wgsl # 体素着色器
│ └── craft_tonemap.wgsl核心特性
程序化世界生成
使用 Perlin 噪声生成高度图,分层填充方块类型:
- 表面:草方块
- 地下:石头、泥土
- 深处:基岩
- 装饰:树木、花草
Chunk 系统
- Chunk 大小:32 x 256 x 32
- 按玩家位置动态加载/卸载
- 贪婪网格合并减少三角形数量
- 视锥体剔除(bounding sphere 半径 ~130)
自定义渲染管线
绕过 PBR 管线,使用简单的 2 个 bind group:
- Group 0:场景 uniform(视图投影、相机位置、光照方向、雾)
- Group 1:贴图图集 + 采样器
方块操作
- 放置方块 — 右键点击
- 破坏方块 — 左键点击
- 射线拾取 — 从相机发射射线,遍历 DDA 算法找到目标方块
v0.3 新特性
Craft 在 v0.3 中进行了更新,以展示引擎的新系统:
生命系统
玩家拥有 Health 组件(20 HP,被动回血)。环境伤害通过 ECS 事件系统施加:
- 摔落伤害 — 着陆速度转换为
DamageEvent - 溺水 — 浸没在水中时持续扣血
- 生命回复 — 未受伤时缓慢被动治疗
- 死亡与重生 —
DeathEvent触发位置重置和满血恢复
血量条(绿/黄/红)渲染在快捷栏上方。
物品栏
9 格 SlotInventory 支持可堆叠物品,替代了旧的固定方块选择器。破坏方块会将其加入物品栏;放置方块消耗一个。快捷栏 HUD 反映实际物品栏内容。
ActionMap 按键映射
所有按键绑定通过 ActionMap(逻辑动作 → 物理按键)注册,为将来通过 ActionMap::apply_overrides() 支持用户自定义按键打下基础。
数据驱动方块
方块类型在 assets/data/blocks.ron 中使用 DataTable 定义。启动时从表中构建 BlockDefCache,将方块属性与代码解耦。
本地化 / i18n
HUD 文本和方块名称通过 Locale(assets/data/locale_en.ron)查找。系统支持回退链,方便添加更多语言翻译。
玩家持久化
玩家状态(位置、生命值、物品栏、飞行模式、选中槽位、昼夜时间)通过 Ctrl+S 保存和恢复。世界修改(放置/破坏的方块)也会持久化保存。
运行
cargo run -p craft相关文档
- 自定义渲染管线指南 — 详细的管线开发经验