你好,关于我的前几篇帖子(最后一篇)(https://www.reddit.com/r/aigamedev/comments/1tz7zc3/update_on_my_3d_space_exploration_game_rendered/))。快速回顾:Spascii是一个3D太空探索游戏,运行在浏览器中,使用three.js构建,整个场景都以ASCII字符呈现。
在深入技术更新之前,我想分享一个快速的元信息,说明这个项目如何改变了我的工作流程。对于我来说,这些工具的真正超能力不是编写最终代码,而是降低好奇的成本。它允许我在几小时内快速原型化复杂的机制或疯狂的想法,只要看看它们是否有趣,而不是花费几天时间在一个潜在可抛弃的特性上。
例如,我花了很多时间实验不同的过程音乐系统,我最初测试了一个快速的、Freelancer-inspired的游戏循环。最终,我意识到它没有带来任何新东西,决定放弃它,转而专注于一个舒适的探索氛围。AI没有设计游戏,它只是给了我失败快速、过滤掉无灵感的部分、找到游戏真正核心的能力,而不需要耗尽精力。
这个工作流程是至关重要的,因为,诚实地说,这个项目的最难的部分不是技术实现,而是找到每个游戏机制的正确平衡和“感觉”。有了技术框架快速建立起来,我就可以花费我的实际精力进行迭代循环,调整,这才是游戏真正被制作的地方。
TL;DR:Spascii现在是一个慢的、舒适的太空探索谜题,类似于Outer Wilds。它在浏览器中运行100%,使用本地音频合成、确定性的过程生成、以及本地语义NPC对话树,通过在Web Worker中运行的小型ONNX嵌入模型。您可以在这里玩最新版本:https://spascii.com
—
自从上次没有真正的技术变化:项目最终找到了它想要成为什么样的。它是一个慢的、舒适的探索游戏,引擎不是一个任务循环,而是理解一个谜团,更加接近Outer Wilds,而不是一个任务列表。殖民者在这里沉默了,通过探索、阅读他们留下的东西、询问幸存者,你们重建了他们发生了什么。最后一部分推动了下面的所有技术。
上次我说我想自然语言对话与NPC,但不需要部署LLM,我会告诉你更多的信息。下面是如何实现的。您可以在NPC面前输入普通英语,一个小型嵌入模型(bge-small-en-v1.5,int8量化到ONNX,约34MB)在Web Worker中运行,通过onnxruntime-web在WASM中。模型将您的句子转换为384维向量。每个NPC都有一个隐藏的对话树,其分支包含一些预写的“种子短语”,预先嵌入并缓存在浏览器中(IndexedDB)。路由只是余弦相似度:您的输入与候选分支进行评分,如果分支得分高于阈值,就会获胜。每个回复都是预写的,而不是在飞行中生成的,所以模型只会被问“玩家意味着哪个已知话题”。
几个东西比我预期的要少机械化。分支可以携带“反短语”,如果您的句子匹配反短语更好,那么该话题就会被拒绝,这会杀死很多假阳性。还有总是可用的社会意图(辱骂、威胁、奉承、感谢)它们不需要导航树:它们移动一个隐藏的NPC心情值。推动某人太远,他们会沉默或断开通讯,并且心情会被保存在一起与您的进度一起。
为了让那些对话更有感染力,每个NPC都需要一个面孔、一个名字和一个声音。身份是从32位种子中生成的,使用一个小型种子PRNG:名字、年龄、职业和一个短期背景,始终保持与年龄一致(一个21岁的人不会被表现为老练的外科医生)。同样的种子总是给出相同的人,无论他们在哪里出现,所以我只会持久保存种子并在需求时重建人物(大约4亿种可能)。对于肖像,我采用了一个不同的路线:我在离线中使用一个本地扩散模型预先生成它们。确定性的提示语法构建了一个整个演员阵容,根据性别、年龄和角色分类,每个图像都有自己的扩散种子,导出为小型WebP并在游戏中懒加载。NPC的特征选择正确的桶,种子选择肖像。声音是前几次提到的多人演讲者Piper模型(约900个演讲者嵌入):它是从种子中确定性地选择的,并且受到角色性别的约束。
在音乐方面,我继续构建了上次的过程实验。生成引擎(三声部在一个时钟上,一个跟随真实和弦进展的会话密钥,一个自动DJ做填充、滤波和断裂,所有这些都在Tone.js上)现在由游戏驱动。每个区域都有一个音乐风格,根据您的空间位置确定性地选择,从而使一个给定的区域始终听起来像自己。您的巡航速度、加速和采矿都会产生一个连续的“强度”值,打开滤波器并淡出鼓声(它故意不碰速度,因为这听起来像一张正在加速的唱片),并在进入另一个区域时进行渐变而不是突然切换。它仍然需要大量的调整,但它终于整合起来了。
一个线索将所有这些联系起来:所有东西,包括小行星场、NPC、一个地方的起始音乐,都是从种子中确定性的。所以保存文件就会很小。它存储一个世界种子以及您的进度增量,并在加载时重新计算其他所有东西,因为世界是重建的,而不是随机化的。加载一个保存会将精确的同一个小行星放在您停靠下它的相同位置。
接下来,我将我的注意力转向构建实际的故事情节并扩展宇宙。目前,只有计划中的32个部门中有3个完全可访问,所以下一个重大步骤是编写核心故事并填充剩下的星系。
评论 (0)