上个月,个人的独立游戏《九界 渡劫》悄悄登陆了 Windows 商店。没有团队,没有美术,只有我和一些 AI 工具。这篇文章想和大家聊聊这段经历。

打开网易新闻 查看精彩图片

先说结果

两个月前,我突然有个念头:我想做款游戏

不是那种换皮小游戏,而是真正能上架、能被陌生人下载玩到的游戏。

三个月后,它真的上架了:

  • 游戏大小:50MB
  • 代码行数:约 8000 行 Rust 代码
  • 开发工具:ifAI Editor + Midjourney
  • 上架平台:Windows 商店
  • 评分:暂无(因为刚上,还没人评价哈哈)

没有美术朋友帮忙,没有投资人给钱,就是我一个人,加一堆 AI 工具。

为什么是 Rust + Bevy?

说实话,这个选择挺冒险的。

Rust 虽然很火,但做游戏的人不多。Bevy 是个年轻的引擎,文档不完善,社区也不大。

朋友问我:为什么不直接用 Unity?

我的理由很朴素:

  1. 我不想学 C#—— 学生时代就是C#,实在不想回头再用它;Rust 的语法我熟悉,上个独立软件IfAI Editor 就是用它开发的,心里踏实
  2. Bevy 的 ECS 架构很优雅—— 数据和逻辑分离,代码清晰
  3. 性能真的很好—— 60FPS 稳定跑,低端电脑也不卡
  4. 打包体积小—— 50MB 是真的小,Unity 随便就几百 MB

当然,代价也很明显:很多坑只能自己踩

没有美术怎么办?用 AI 啊

打开网易新闻 查看精彩图片

这是我这个项目最关键的决策。

传统游戏开发,美术资源是大头。角色、场景、UI、特效……每样都要人画。

我没有人。但我有 AI。

角色怎么做?

我用 Midjourney 生成 3D 角色概念图,然后:

  1. 用提示词迭代几十次,直到满意
  2. 导出图片,在 Blender 里简单调整
  3. 写代码处理 AI 模型的"固有偏差"

AI 生成的模型朝向经常不对,我写了个补偿算法:

// AI 模型的朝向和游戏坐标系不一致,需要补偿const BIAS_COMPENSATION: f32 = std::f32::consts::PI / 2.0;let to_enemy = (enemy_pos - player_pos).normalize();let target_angle = to_enemy.y.atan2(to_enemy.x) + BIAS_COMPENSATION;

就这一行代码,解决了所有朝向问题。

特效怎么做?

游戏里最酷的"万剑归宗"技能,粒子效果全是代码生成的:

// 程序化生成水墨晕染贴图for y in 0..height {for x in 0..width {let dist = (dx*dx + dy*dy).sqrt() / 64.0;// 用噪声模拟墨迹的自然扩散let noise = (angle * 4.0).sin() * 0.12+ (angle * 7.0).cos() * 0.08;let alpha = (1.0 - dist * dist).powi(2);data[idx + 3] = (alpha * 255.0) as u8;}

不需要美术出图,改代码就能调效果。

万剑归宗:四相位,剑气纵横

这是我花最多时间打磨的技能。你可以把它想象成一场"飞剑表演":

第一阶段(0-20%):飞剑从虚空中"撕裂"而出,像被一股力量弹射上天第二阶段(20-45%):飞剑在空中排成三层螺旋,像巨大的剑轮在呼吸第三阶段(45-55%):突然一静,所有飞剑调头指向敌人第四阶段(55-100%):极速穿心,每把剑留下长长残影

核心是这段贝塞尔曲线代码:

// 第四阶段:飞剑沿着贝塞尔曲线突刺let p0 = current_pos;           // 起点let p1 = current_pos + tangent * 200.0;   // 控制点1let p2 = enemy_pos - tangent * 100.0;     // 控制点2let p3 = enemy_pos;             // 终点let t = (progress - 0.55) / 0.45;let pos = cubic_bezier(p0, p1, p2, p3, t);

简单的数学,震撼的效果。

AI 帮我写代码?是的

这里要坦诚:AI 帮了我大忙

我不是 Rust 大神,很多 Bevy 的 API 我不熟悉。但我学会了如何和 AI 配合:

  1. 我问得具体—— 不要问"怎么实现特效",要问"Bevy 里如何用 ECS 实现粒子系统"
  2. 我读每一行代码—— AI 生成的代码我会仔细看,不懂就追问
  3. 我写测试—— 17 个测试用例,确保 AI 写的代码没问题

比如那次 NaN Bug:

// AI 写的代码let delay = 0.06 - (i as f32 * 0.015);  // i=11 时 = -0.105,崩溃// 我加的防护let delay = (0.06 - (i as f32 * 0.015)).max(0.0);

AI 不是我的"代写",而是我的"高级搜索引擎"。它让我可以更快地尝试想法,但最终质量还是要靠我自己把控。

打开网易新闻 查看精彩图片

上架 Windows 商店:比想象中简单

我以为上架会很复杂,填一堆表,审好几轮。

实际上:

  1. 注册开发者账号—— 花 0元,现在windows开发者中心完全sg免费,审核 1-2 天
  2. 准备材料—— 图标(3 个尺寸)、截图(4-8 张)、隐私政策
  3. 打包上传—— 用 MSIX 打包,上传到 Partner Center
  4. 等待审核—— 大约 1~2 天

隐私政策我写得非常简单:

我们不收集任何个人数据。所有游戏进度、存档、设置均存储在您的本地设备上。

就这样,过了。

当然,也有小插曲。第一次提交被拒了,原因是我忘了声明"应用可能请求网络权限"(用于 DRM 验证)。改了隐私政策,重新提交,就过了。

那些踩过的坑

说说几个印象深刻的坑吧。

坑一:Commands 是延迟执行的

Bevy 的 commands.entity().despawn() 不会立即删除实体,只是把删除命令放入队列。

我一开始这样写:

// ❌ 错误if p.is_dead() {commands.entity(entity).despawn_recursive();// 下面的代码还在执行!transform.translation = Vec3::new(x, y, z);

结果就是已删除的实体还在更新 Transform,直接崩溃。

改成这样就好了:

// ✅ 正确if p.is_dead() {commands.entity(entity).despawn_recursive();continue;  // 立即跳出,别再碰这个实体}
坏二:浮点数 NaN 会传播

那个 NaN Bug 让我调试了一整天。教训是:永远不要假设计算结果在预期范围内

// 防御性编程let value = some_calculation();if !value.is_finite() {return;  // 直接返回,别让 NaN 传播}
坑三:Bevy 特性不能全开

一开始我直接 bevy = "0.15",结果编译出来体积大,性能也差。

后来改成精准控制:

bevy = { version = "0.15", default-features = false, features = ["bevy_render", "bevy_asset", "bevy_audio","multi_threaded", "png", "jpeg", "vorbis", "mp3"] }

体积减了一半,FPS 稳定 60。

这三个月,我学到了什么技术层面

  1. Rust + Bevy 真的可以做游戏—— 虽然小众,但完全可行
  2. ECS 架构很优雅—— 代码写多了会爱上这种风格
  3. 程序化生成是独立开发者的救星—— 省美术,省空间,省时间
非技术层面
  1. 完成比完美重要—— 先上架,再迭代
  2. AI 是杠杆—— 用好了能放大你的能力,用不好就是浪费时间
  3. 一个人也能做成事—— 但要选对工具,设定合理目标
给想尝试的朋友

如果你也想做款游戏,我的建议:

如果你...

建议

会 Rust

直接用 Bevy,文档少但社区友好

会 Python/JS

考虑 Godot,上手快

完全零基础

从小游戏开始,别一上来就想做 RPG

没有美术

学程序化生成,或者用 AI

想上架

先瞄准 Windows 商店,比 Steam 容易

这游戏到底好玩吗?

说实话,我不知道。

上架一周,下载量还没突破两位数(主要是自己下的哈哈)。

但这个过程本身就很爽了:

  • 我学会了 Bevy 引擎
  • 我写了一套粒子系统
  • 我的游戏真的在商店里能搜到
  • 有人(真的!)下载并给了反馈

这对我来说,已经值了。

后续计划

  • 等反馈,修 Bug
  • 加更多卡牌和技能
  • 尝试上架 Steam
  • 如果有人玩,就继续更新

这篇文章不是"教你做游戏"的教程,也不是想替AI传教,只是分享一段经历。

如果你读完觉得"我好像也能试试",那我的目的就达到了。

游戏下载:Windows 商店搜索"九界 渡劫"