我和一位 DEV 朋友如何让两个 Avatar 复活
Source: Dev.to
您提供的内容中只有来源链接,没有需要翻译的正文。请把要翻译的文本粘贴在这里,我会为您翻译成简体中文并保持原有的格式。
合作的开始
我在 DEV Community 上认识了 @webdeveloperhyper,像大多数优秀的网络合作一样,这段合作最初是随意的。
几条信息。一些反馈。宝贵的指导。
随后在某个时刻,话题从“这看起来很酷”转向了“我们一起做点有趣的事吧”。
我们没有过度规划,只是直接开始构建。
他们在日本,我在印度。这意味着整个项目大多在零星的时间里进行——深夜、白天的随机 20 分钟窗口、相隔数小时的消息。进展看起来并不惊人,却在悄悄累积。
不知为何,它成功了。
从基本形状到真实化身
The project 并不是从精致的角色开始的,而是从场景中的简单形状开始的,这些只是用于测试定位、摄像机和基本交互的占位符。
想法很简单:两个角色,一段简短的对话,一些动画。
简单的想法往往隐藏着有趣的问题。
我的第一个真正任务是使用 VRoid Studio 创建化身本身。这本身就是一个学习曲线。导入后,化身并不像角色那样行为——它表现得像一个静态对象。
默认姿势是 T‑pose:手臂伸展开,完全没有生命感。解决这个问题是 第一个小小的胜利——让化身进入中立姿势,手放下,自然站立。
听起来微不足道,但那一刻它不再像模型,而是开始像角色。
从此我们开始叠加手势:
- 打招呼动画
- 告别动画
- 对话中的小动作
- 一个叹气动画,成了我最喜欢的细节之一
还有一次直接覆盖默认手势的失败尝试,这让我很快意识到动画系统有自己的规则。
编写对话比预期更难
令人惊讶的是,最困难的部分并不是技术层面——而是对话本身的编写。
- 简短。
- 自然。
- 稍带幽默。
- 不机械。
当对话太长时,会显得生硬;太短则显得空洞。太严肃会失去魅力,太搞笑又会失去可信度。
找到这种平衡比预想的要多次迭代。我仍然觉得笑点可以更好,但也许这正是好事——它留下了演进的空间。
当渲染头像成为系统性问题
使用现代工具渲染头像本身很简单。真正的挑战在于协调行为。
我们需要让场景管理:
- who 说话者
- what 播放的动画
- when 动画开始的时机
- when 动画结束的时机
- when 下一个角色接管的时机
我们没有硬编码行为,而是将对话定义为结构化数据:
const DIALOGUE = [
{
speaker: "A",
text: "I'm Web Developer Hyper. I like to make fun things.",
animation: "VRMA_03_peace_sign.vrma",
},
{
speaker: "B",
text: "Hello! I'm Itsugo. And I like turning ideas into something real.",
animation: "VRMA_04_shoot.vrma",
},
];
场景只需解释这段序列。这种分离让系统更易于控制、扩展和理解。我们不是强行规定行为,而是对其进行编排。
协调问题
动画并不会自然地告知你的应用何时结束,但时机很重要。下一行不应过早中断,若出现问题系统也不应卡死。
因此,对话系统会等待 either:
- 动画完成 or
- 安全的超时回退
以先出现者为准。
这个微小的决定让系统具备了弹性。像这样的系统级思考往往比大型功能更为关键。
您可以在此查看!
合作的无形部分
让这个项目有意义的并不仅仅是最终成果——而是过程。
- 修复动画时序
- 清理不必要的代码
- 提升可读性
- 调整手势强度
- 添加适合初学者的注释
所有这些跨越时区完成。
特别感谢@webdeveloperhyper搭建基础、推动项目进展,并在我们对话中容忍我那拙劣的日语 (ˉ▽ˉ;)… 这个项目正是因为这份共同的努力和耐心而存在。
未来可能的方向
现在只有两个化身在对话,但已经感觉像是更大事物的开端:
- 交互式角色
- 故事系统
- 动态对话
- 也许还有我们尚未想到的东西
而这把我们带到了真正的问题:
我们应该如何推进?
一些关于接下来可能发展的想法,但我们想听听各位粉丝的意见
你会如何在这个项目中玩得开心?
无论听起来多么不切实际,让我们一起在这个副项目中玩得开心吧。
结束语
这最初是两位在网上相遇的开发者之间的小实验。
它提醒了我们为什么副项目很重要。
- 并不是因为它们完美。
- 而是因为它们有生命力。
有时,这就足以开启一件有意义的事。


