PuttPlot

Overview

2019 Fall

这是一个CMU 53-451课程的团队项目。课程名称为:游戏开发中的科研问题:XR的设计。这是一门由Tom Corbett教授教授的游戏设计/研究课程,我们将以团队的形式在VR/AR中设计电子游戏。

在这个项目中,我们设计了一个高尔夫约会模拟游戏PuttPlot。可以理解为一个日式的2D约会模拟游戏,但你可以通过将球打到相应的洞中来选择你的反应。这个项目既具有挑战性又有趣,因为我们需要在VR中模拟3D高尔夫动作和物理,同时通过2D动画讲述一个有趣的故事。

在这个为期6周的项目中,我是游戏的制作人/程序员。我们将为游戏进行6次迭代,每周开发一个样板,并在每周五展示一个Demo。

这就是我们的故事。

Table of Contents

Week 1 - 脑洞大开

我们的项目有很大的自由度。教授对我们的唯一的要求是它必须是一个可玩的VR游戏,并且灵感要来自任何野餐聚会游戏。当然,它还需要在6周内由,可以由一个5-6人的团队开发出来。

我们在8月30日星期五组成了我们的团队。第二天,我们举行了第一次会议。在会议中,我们花了大约4个小时讨论游戏理念。我们的讨论范围很广,从技术挑战性强的 HallBall,到美式黑色幽默游戏 Catch With Dad。我提出的游戏理念是一款环境教育沙盒游戏,名为《树木》(Tree),你可以在其中种植并摧毁树木,从而影响全球气温。遗憾的是,对于一个为期6周的项目来说,它有点超出了scope,所以我们最终没有实践它。

经过几轮投票,我们最终产生了一个约会模拟高尔夫游戏的想法:PuttPlot

Producing

在我们决定了游戏理念后,我们需要在下一个周五展示一个可玩的Demo。我们合作把任务分配给团队中的每个人。这些任务包括演示板设计、2D艺术和击球机制。所有单独的任务都要在周三晚上完成。我们会用周四晚上的时间来合并所有单独的部分,成为一个游戏。

Programming

在我们的第一个演示中,我们只是在球上使用刚体的代码,并在高尔夫球杆上添加了一个collider。每当球被击中时,我们都会在球棒的方向上给球加上一个力。因此,Unity引擎自带的物理将处理碰撞和高尔夫球将如何飞行。

我们第一周做得很好。我们的Demo运行的很正常,听众们都挺喜欢它。我们也收到了很多建设性的反馈。

Concept Art for the game

Week 2 - 前期制作

为了让事情顺利进行,我们这周做了很多前期准备工作。

Producing

首先,我们决定了游戏的三大支柱:

  1. 笑:游戏应该非常非常有趣/颠覆预期
  2. 吸引人的故事:玩家的决定很重要
  3. 2D和3D的融合:球击中的板子需要与到对话选项难度相呼应

我们的游戏主要由两个部分组成:一个是高尔夫力学,另一个是一个有趣的故事。所以在第二周,我们的作家Gus负责撰写故事,最后得到了一堆索引卡,里面全是他写的有趣的故事。我们的美工家Angelina负责设计概念图和角色艺术。我们的程序员Carter和Ann力于高尔夫球的挥杆动作。我负责3D板的设计和制作工作。

我们仍然使用星期四融合到星期五展示的方法。由于我们做的很多工作都是前期制作,所以我们在周五展示的demo与前一周并没有太大的不同。

Draft story tree for the game

Programming

本周,我们将尝试模拟高尔夫球在现实世界中的工作原理。在现实生活中,高尔夫球与球杆接触后不会立即飞走,而是会被球杆稍稍抬起一点,然后飞走。

因此,我们试图在游戏中做到这一点,即在接触球后立即将球添加为球杆的子对象,这样球就会粘在球杆上。当球向挥杆的方向移动几毫秒后,我们将释放球并增加一个力使它飞起来。

这个概念很好,但是最终的结果并不像我们希望的那样成功。球还是跑得太快,没有落在玩家期望的位置。

Feedback for this week

和上周一样,我们在周五的demo之后收到了很多反馈,我们总结为四点:

遗憾的是,我们忘记在前两个迭代中记录游戏视频,所以你将无法看到它们。


The second iteration

Week 3 - 艰难的一周:(

在游戏的第三个迭代中,事情开始变得有点困难。这周我们召开了技术机会大会,这是CMU每年最大的招聘会。很多队友都在周一、周二和周三的招聘会中度过了他们所有的空闲时间。

Producing

这意味着我们周三的checkpoint没有达到。所以我们只能在最后一分钟把所有东西放到一起。Carter、Gus和我在Hunt图书馆地下室一直呆到午夜以后。即使在那之后,我们提交的版本仍然有很多bug。

我为游戏设计了几个关卡。而是因为我们没能及时实现对话过渡。我们从来没有机会达到新的关卡。因此,我们周五的演示并不理想。

Programming - 一个斜坡的建立

好在我们有一个坡道。我们上周得到的反馈之一是,仅仅把球打到洞里的感觉并不好。我们通过增加一个加速坡道来解决这个问题。在这种情况下,玩家只需要把球推到斜坡上,球就会飞到板上。

希望下周我们能做得更好。

写于2019年9月28日。

The ramp

Week 4 - 游戏试玩

6周的时间只剩下3周了,但是我们仍然没有准备好核心游戏循环。所以本周只有一个目标:完成游戏循环。

Producing

从上周的经验中,我们试图在一周中添加更多的检查点和迭代。与其只在周四整合代码和游戏,我们这周在周二晚上进行了整合和试玩,并在周三和周四晚上再次进行了代码整合。这意味着我们至少可以在一周内迭代两次:一次是周二的游戏测试,另一次是周五的演示。

周二,我们在邀请人们进行游戏测试的同时修复了很多bug。在游戏测试接近尾声的时候,我们修复了上周遗留下来的所有bug,特别是一个阻止对话转移到下一个面板和选项的bug。

Week4 Player's View

A “Small” Bug

然后我们又发现了一个小虫子。与其创造一个新球并摧毁旧球,我们循环使用10个高尔夫球。这意味着我们在游戏开始时创建了这些球,当你击出9号球时,0号球就会回来。

但是因为我们只改变了它的位置,所以如果球员非常快的打出所有的球,刚刚回来的球会仍然在上一次击球的受力作用下自己运动。因为我们是在进行游戏测试,所以没有时间去重写脚本,我们就直接在编辑器中把10改成了100000000,我们认为一个玩家不可能如此快速地打出100000000个球。

我们不假思索地按下播放键。但显然,在游戏开始时在for循环中初始化100000000个游戏对象是个坏主意……

Unity停止了响应。

我们心想:“Cool… 我重新打开Unity,把数字改回来就可以了。”

但是我们在输入这个巨大的数字之前忘记了保存项目……

所以那晚我们做的所有修改都没了…

Producing (CONT)

All was not lost。我们在周三再次整合的时候,以恢复周二所做的所有更改。周四我们还整合了更多的功能,比如背景、声音和对话。在周四晚上11:20左右,当我们试图将所有对话脚本对象和声音整合到我们的主游戏中时,游戏再次崩溃了,因为我的队友用了一个较老版本的事件系统(上周的版本),而我们更改了系统……

我们花了10-20分钟来解决这个问题。这意味着我们只剩下20分钟去整合游戏。我们必须做出一个艰难的选择,要么我们将所有的对话都放进去,这样玩家可以在没有配音的情况下玩较长的完整的游戏,要么我们将第一个场景的对话和配音放入,这样玩家可以玩一个完整的较短的游戏循环。

作为制片人,这对我来说是一个艰难的选择。因为双方今晚都花了很多时间在工作上,他们都希望自己的努力可以呈现在游戏里。但我决定选择后者,因为一个简短快照可以让人们更好地理解游戏以及游戏完成后的样子。

Programming - 那个斜坡着火了

我们移动了高尔夫球的位置,但没有时间重新校准助推坡道。所以在我们周五的演示中,当我们的TA Adrian测试游戏时,斜坡的推力太大了,他的球飞出了很多。

Lesson Learned

如果可能出错的事情,都会出错…… 所以要定期保存文件。

Written on Oct 5, 2019.

Week4 the environment behind the player

Week 5 - 事情终于正常了

还有两周的时间,我们终于确定了我们的核心游戏循环。这周我们的游戏整合了所有的主要元素:故事,推杆,环境和一些配音。

Producing

自从上周我们进行了组织上的调整后,我们在周二晚上再次进行了用户测试,并在周三和周四晚上进行了代码整合。

因为我们的游戏是以对话为中心的,一旦我们搭建好了对话系统,游戏就可以正常运行了。因此,本周我们看到之前所有的调试和编码工作终于有了回报(特别感谢我们的首席程序员Carter!)。我们还在玩家的侧面添加了聊天记录,这样玩家可以看到之前的聊天记录。

Programming - 斜坡从未被开启过

还记得在第3周我们添加了一个斜坡吗?而在第4周,我们发现斜坡会让玩家的球飞的非常高吗? 这实际上有点奇怪,因为在第三周斜坡不会像在第4周那样造成那么多的偏差。所以这周我们试着通过重新调整斜坡和球在板上的落地位置来解决这个问题。

我整个晚上都戴着VR头盔,而Carter在调整斜坡的参数。每次他一修改一些参数,我就会击球致斜坡,看看球落在什么地方。每次我们这么做的时候,我们都会说服自己,我们已经快成功了,只是还需要再做一些微调。

Recalibrating the Ramp

过了一段时间,我们有点沮丧,因为不管我们怎么调整参数,斜坡总是会把球送到过高的地方。等等,不管我们怎么改变参数…结果不会改变……这只能是……但那是不可能的……

是的,斜坡的collider从来没有被开启。这个用来检测和加速高尔夫球的collider,这个我们一直以为我们在修改的collider,根本就没有开。我们一定是在测试的时候把它关掉了,然后忘了再打开。因为它是关闭的,所以在游戏中没有任何效果。而我们还花了快一个小时来“维修”它……

当我们把它打开后,一切都很正常了。在周五的演示中,我们的游戏测试者似乎对我们的游戏印象深刻、好评不断,尤其是推杆时候的感觉。

Lesson Learned

一旦你排除了所有的不可能,剩下的,无论多么不可能,一定是真相。

Written on Oct 11, 2019.

Week 6 - 游戏发布

这是我们的最后一周。

Producing

在周二的游戏测试后,我们列出了10-12个我们想要添加到游戏中的额外特点。我们这周最大的挑战是把所有的声音和对白都放进去。正如我之前所说的,一旦我们让主对话系统正常工作,只需点击并拖动所有音频文字文件即可。但由于我们试图创造一个有趣的约会模拟器,我们有一个很长的故事(由7个带有少量分支的短篇故事组成)。我们花了很长时间才把所有的台词和相应的配音都放进去。

周四晚上9点半左右,我们成功地让整个游戏运转起来(但没有配音)。我测试了整个游戏,同时我们的作者Gus正在把配音放入每个对话的脚本对象。令人惊讶的是,因为我们有太多的笑话和故事,我花了20-30分钟才玩完整个游戏。我们现在的版本是我们的Last Know Good,以防万一事情变糟。

我们在晚上10:50 - 11:00完成了所有声音的添加,比最后期限的一个小时前。然后,事情变糟糕了。

Programming - 斜坡又坏了

Programming部分的编写是为了讨论我们在游戏开发过程中所面临的技术挑战。但我刚意识到几乎所有的都是关于这个斜坡。

晚上11点左右,离最后期限还有一个小时时,我们决定重新校准斜坡。这是因为我们在游戏中添加了一个教程。该教程将要求玩家击球到板子的最左边和最右边,这样玩家就知道如何控制推杆。但是,目前,向侧面射击会在斜坡上引发一个bug,使高尔夫球永远不会落在板上。上周我们没有注意到这个问题,因为我们直到这周才添加了这个教程。而现在,我们还有还有一个小时,我们开始调试。

Carter和我开始了我们的经典合作: 他会在斜坡上调整不同的参数,而我会在VR设备里打高尔夫球,并给他反馈。但我们遇到了和上周同样的问题: 无论我们如何调整参数,落在斜坡的远侧的球都不会激活助推效果。

我们检查了collider,是的,它是开着的。

晚上11点40分左右,气氛紧张。一方面,通过斜坡击球是我们的核心游戏机制,我们有义务让它工作。另一方面,我们不知道是否可以在12点前解决这个bug。

晚上11点50分,我们发现了Bug。ramp脚本中的一行代码缩小了检查冲突的范围。在我们简单地注释掉它之后,事情就很顺利了。

星期五,我们向全班同学展示了我们的游戏。尽管我们在推杆上还有一些问题,但展示进行得很顺利。

事后看来,我在这里犯了一个错误。我应该在添加了所有的配音之后和调试斜坡之前build游戏。这是因为我们的Last Known Good是晚上9点30分左右的版本。它没有让所有的声音都参与进来。所以如果调试工作失败,并且游戏在午夜之前无法编译,那么所有录制语音表演并将其添加到游戏中的工作都将白费。

Lesson Learned

Last-Known-Good 是你的好朋友


Credits

这是我第一次担任游戏制作人。这对我来说真的是一次学习的经历。所以我非常感谢有一个支持我的团队。我想特别感谢我们的程序员Carter Williams,我们的作家Gus Saalfeld和我们的艺术家安Angelina Shi。没有他们和所有其他队友的贡献,这个项目是不可能完成的。

Contact Me