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

先说结果
两个月前,我突然有个念头:我想做款游戏。
不是那种换皮小游戏,而是真正能上架、能被陌生人下载玩到的游戏。
三个月后,它真的上架了:
- 游戏大小:50MB
- 代码行数:约 8000 行 Rust 代码
- 开发工具:ifAI Editor + Midjourney
- 上架平台:Windows 商店
- 评分:暂无(因为刚上,还没人评价哈哈)
没有美术朋友帮忙,没有投资人给钱,就是我一个人,加一堆 AI 工具。
为什么是 Rust + Bevy?
说实话,这个选择挺冒险的。
Rust 虽然很火,但做游戏的人不多。Bevy 是个年轻的引擎,文档不完善,社区也不大。
朋友问我:为什么不直接用 Unity?
我的理由很朴素:
- 我不想学 C#—— 学生时代就是C#,实在不想回头再用它;Rust 的语法我熟悉,上个独立软件IfAI Editor 就是用它开发的,心里踏实
- Bevy 的 ECS 架构很优雅—— 数据和逻辑分离,代码清晰
- 性能真的很好—— 60FPS 稳定跑,低端电脑也不卡
- 打包体积小—— 50MB 是真的小,Unity 随便就几百 MB
当然,代价也很明显:很多坑只能自己踩。
没有美术怎么办?用 AI 啊
![]()
这是我这个项目最关键的决策。
传统游戏开发,美术资源是大头。角色、场景、UI、特效……每样都要人画。
我没有人。但我有 AI。
角色怎么做?
我用 Midjourney 生成 3D 角色概念图,然后:
- 用提示词迭代几十次,直到满意
- 导出图片,在 Blender 里简单调整
- 写代码处理 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 配合:
- 我问得具体—— 不要问"怎么实现特效",要问"Bevy 里如何用 ECS 实现粒子系统"
- 我读每一行代码—— AI 生成的代码我会仔细看,不懂就追问
- 我写测试—— 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 商店:比想象中简单
我以为上架会很复杂,填一堆表,审好几轮。
实际上:
- 注册开发者账号—— 花 0元,现在windows开发者中心完全sg免费,审核 1-2 天
- 准备材料—— 图标(3 个尺寸)、截图(4-8 张)、隐私政策
- 打包上传—— 用 MSIX 打包,上传到 Partner Center
- 等待审核—— 大约 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。
这三个月,我学到了什么技术层面
- Rust + Bevy 真的可以做游戏—— 虽然小众,但完全可行
- ECS 架构很优雅—— 代码写多了会爱上这种风格
- 程序化生成是独立开发者的救星—— 省美术,省空间,省时间
- 完成比完美重要—— 先上架,再迭代
- AI 是杠杆—— 用好了能放大你的能力,用不好就是浪费时间
- 一个人也能做成事—— 但要选对工具,设定合理目标
如果你也想做款游戏,我的建议:
如果你...
建议
会 Rust
直接用 Bevy,文档少但社区友好
会 Python/JS
考虑 Godot,上手快
完全零基础
从小游戏开始,别一上来就想做 RPG
没有美术
学程序化生成,或者用 AI
想上架
先瞄准 Windows 商店,比 Steam 容易
这游戏到底好玩吗?
说实话,我不知道。
上架一周,下载量还没突破两位数(主要是自己下的哈哈)。
但这个过程本身就很爽了:
- 我学会了 Bevy 引擎
- 我写了一套粒子系统
- 我的游戏真的在商店里能搜到
- 有人(真的!)下载并给了反馈
这对我来说,已经值了。
后续计划
- 等反馈,修 Bug
- 加更多卡牌和技能
- 尝试上架 Steam
- 如果有人玩,就继续更新
这篇文章不是"教你做游戏"的教程,也不是想替AI传教,只是分享一段经历。
如果你读完觉得"我好像也能试试",那我的目的就达到了。
游戏下载:Windows 商店搜索"九界 渡劫"
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.