第一次教女儿学编程做游戏

我在这次长假中完成了一个长久以来的梦想,就是和女儿一起开发一个小游戏。我希望通过做游戏来帮助她开始学习编程并锻炼解决问题的能力。

这是女儿第一次接触编程,我希望她可以体验到一个小项目的完整开发流程。这次我没有选择小朋友编程启蒙时常用的Scratch语言,因为我希望女儿可以一开始就接触比较专业的工具。我自己试了一下Unity和Unreal游戏引擎,最终决定用Unity作为开发工具(我感觉Unreal对小朋友相对更难上手一点)。

第一天来做项目计划。我先和女儿来了一场头脑风暴,让她想象做一个什么样的游戏。可能是由于我和她在一起学钢琴,她说要做一个控制大象来弹钢琴的游戏(是的,这就是博客名字的由来)。之后我和她详细讨论了游戏的玩法,并写下了项目计划的初稿。女儿很认真的“审查”我的项目计划,并提出了一些建议。比如

  1. 游戏目标:快速移动大象来弹奏好听的旋律 “没有目标,只为好玩”
  2. 游戏策略:难度逐渐提高,弹错10次就结束 “保持相同的难度,No Game Over ,Just fun!!!”

最后我把项目任务细分成子任务,女儿完成了游戏界面的初始设计。

第二天开始3D建模,我没有给她介绍其他3D建模软件(比如Blender),而是让她直接在Unity下拿基本的3D图形来搭建场景。我先让她看我用立方体做了一个钢琴的模型,然后让她来拖拽材质上色。之后让她自己来按照我的方法给大象建模,她用了四个立方体建造了第一版的大象模型。

下一步是采集声音,原本我想录制一下家里钢琴的声音,再导入Unity。后来懒了一下,直接从网上找了现成的采样。给女儿演示了如何导入声音文件并且绑定到钢琴的琴键上。

第三天,终于开始编程了。我的目标是让女儿写一行代码来移动大象。我先给她建好了ElephantController脚本和负责移动大象的方法,并用注释描述了如何来移动大象。然后教她打出了第一个关键字,并在IDE的帮助下完成了她人生中的第一行代码。

transform.Translate(Vector3.right)

虽然她不知道什么是Vector3,但是可以根据关键字的大概意思理解这会让大象向右移动。当她按下Play键后,看到大象快速向右侧移动并飞出了屏幕后超级兴奋。之后她又反复玩了好几次,每次都嘎嘎的笑个不停。好不容易才让她平静下来,给她讲了要想更好的控制大象需要加入速度参数,并考虑屏幕刷新率,和判断方向键触发。她耐着性子听完后,按照我说的把剩下的变量加上了,完成了这一行代码。

transform.Translate(Vector3.right * Time.deltaTime * speed * horizontalInput)

不过很遗憾,后来她就开始不耐烦了。有可能是她理解不了之前那一大堆变量的作用。正好我让她休息一下,自己把使用大象鼻子控制按键播放声音的部分直接写了。

第四天吃晚饭时,我让她来给妈妈演示一下我们的成果。女儿超级开心,尝试控制大象来弹奏她刚学会的曲子。之后我们开始迭代添加新功能。我问女儿如何可以让游戏变得更好玩,她的想法是当琴键按下时,大象或钢琴会把琴键的颜色喷涂到后面的墙上(可能是受了最近看我玩Splatoon3的启发)。

我觉得这个设计很好,不过有点麻烦需要对物体材质编程。而且就算我实现了,女儿也没办法参与到其中。于是我引入了MVP的概念,给她讲解Trade Off的选择。为了“完成”我们的游戏,经常会牺牲掉一些功能。最后她同意了我们打算用射灯的灯光来模拟喷漆的效果。

第五天迭代改进。我给女儿展示了如何添加调整灯光,并让她来编写把琴键颜色同步到灯光颜色的代码。这次我尝试让她来自己写,启发她想象如果电脑可以听懂她说话,她需要怎么样描述才可以把键盘的颜色传递给射灯。再反复的启发下,终于完成了下面这行代码。

spotlight.color = keyColor;

当她试玩时发现她的代码真的会让灯光的颜色产生变化,超级开心,又开始玩个不停。最后我又收了一下尾,多加了两个灯和一些随机移动、渐变的效果,最终完成了下面的MVP版本。

这可能是我近年来做的最有成就感的一件事了。小时候我就梦想可以自己写游戏,但当时没有足够的知识和能力实现,所以这次也算是在女儿身上圆了一下梦。我想当女儿将来看到很多人是通过HelloWorld来编程入门时,再回想起自己的第一个项目应该会很骄傲吧。

《“第一次教女儿学编程做游戏”》 有 1 条评论

留下评论