使用Unity进行游戏开发教学:当你从未编写过游戏时
摘要
游戏无处不在,我们的学生希望学习如何制作它们。作为计算机科学教授,我们认为将游戏融入课程体系是提高学生积极性、提升留存率以及培养沟通技能的绝佳方式。然而,我们许多人面临的问题是:当你从未编写过游戏时,该如何教授游戏开发?查阅其他高校的相关论文和课程设置,并不能清楚地说明此类课程的最佳教学环境。经过多次尝试,我们找到的解决方案是围绕Unity游戏引擎构建一门游戏开发课程。本文将阐述我们做出这一决策的过程。Unity易于学习、免费、支持跨平台,是一款真正的游戏引擎,在游戏开发领域广为人知,但在计算机科学文献中却鲜有关于此类课程的讨论。
1. 介绍
游戏设计与开发课程不断出现在计算机科学项目中。开设这些课程的原因多种多样,包括提高项目留存率[1, 3, 15, 18, 19]、团队建设[2, 16]、以及教授项目管理[1, 3]等。此类课程的价值在于教授一项学生需要的技能可能显而易见,但如果你被指派去构建这样一门课程,而你本人却没有开发过游戏,你该如何着手呢?
本文旨在尝试为构建独立的游戏开发课程提供一些见解,以便下一个缺乏相关背景但需要构建此类课程的人能够避免我们曾犯过的错误。我们的经验表明,从零开始设计这门课程可能令人望而生畏。你是让学生从头开始制作游戏,还是使用游戏开发软件?你希望你的课程侧重于设计、开发,还是两者的结合?对于一个从未制作过游戏的人来说,他们能否快速掌握足够的知识来教授学生游戏制作的基础内容?
本文描述了我们使用Unity[20]游戏引擎1构建独立游戏开发课程的经验,以及促使我们决定使用Unity的失败经历。我们提出了一个课程结构,该结构可以轻松修改,以强调特定院系希望侧重的内容,无论是设计还是开发。Unity在游戏开发社区内广为人知,但在社区之外却鲜有人知,或许正因它在业内如此知名,以至于没有人认为有必要向圈外人记录这一点。Unity在游戏开发项目之外知名度很低的一个证明是,当里茨豪普特试图在2009[17]组建一门低成本游戏课程时,甚至没有考虑过Unity,而是选择了Torque游戏引擎[7],因为其旧版本仅需100美元,尽管Unity对教育免费,但他从未考虑过。进一步证明Unity在游戏开发社区之外并不知名的是,在计算机科学出版物数据库中搜索时,关于它的参考文献极少。
Unity并非行业标准,相比虚幻引擎[12]而言,更不容易与游戏行业雇主的需求直接对应,通常也不会用于专门的游戏开发项目中,因为它不是行业标准。然而,Unity是一门独立游戏开发课程的绝佳选择,原因是其学习曲线较为平缓。如果你仅开设一门与游戏制作相关的课程,并希望学生在学期结束时能够成功开发出游戏,那么你确实需要使用一款学习曲线平缓的游戏引擎,以便学生能够专注于游戏的构建。
1 游戏开发引擎是一种处理游戏开发所有方面的软件框架,包括声音、渲染、物理等。
Unity也是一个不错的选择,因为它是跨平台的、免费的,并且可以用来开发真正的游戏,而不仅仅是为课堂制作的简单游戏。
2. 背景
在权衡如何设置一门适合计算机科学课程体系的游戏开发课程时,首先需要了解有哪些可选方案以及相关术语的含义。首要问题是课程的重点。在美国,游戏设计通常指游戏的设计,侧重于故事、机制、外观等方面,这些内容本身已足够支撑一整个学期的教学,且无需过于深入细节。游戏开发则是与设计相对应的部分,侧重于实现游戏设计,更接近软件工程。如果你的目标是让学生在课程结束后能够完成一个可玩的游戏,那么课程必须更加侧重于开发。
在本文中,我们经常提到学生创建“可玩的游戏”。当学生开发不同类型的游戏时,很难量化其成功程度。在三分之二的学期内,学生可以构建一个能持续玩数小时的扫雷的3D版本,也可以制作一个包含5到10分钟内容的冒险游戏;这两者都被视为成功的游戏。当我们描述一个游戏为可玩时,指的是学生已经创建了一个具备基本游戏机制的游戏,仅有少量漏洞,并将美术资源与该机制结合,同时设计了一些介绍性内容(如故事或游戏控制说明),以引导玩家如何进行游戏。这意味着一个方块射击圆形目标、目标被击中后消失并增加分数的游戏并不算可玩的游戏;但若同一游戏具备多个关层,每个关卡在限定时间内需要击中的目标数量逐渐增加,并包含操作说明和记分板,则属于可玩的游戏。
在我们院系,我们开设了一门面向非专业学生的游戏设计课程,该课程不能计入计算机科学学位;此外还有一门3D游戏开发课程,专业学生和非专业学生均可选修,且可计入计算机科学学位。本文讨论的是3D游戏开发课程。该课程被视为独立课程,因为游戏设计课程并非其先修课程,且其教学内容对本课程几乎没有影响。该开发课程的先修课程为游戏设计课程或CS1,意味着学生无需具备编程经验即可选修本课程。该开发课程是我们提供的游戏开发辅修专业的一部分,课程中有一小部分学生希望在毕业后从事游戏开发工作。
本课程的目标是让学生接触使用与行业中至少相似的软件进行游戏开发。我们注重问题解决、项目规划、使用软件开发工具包以及团队合作,并将本课程视为一种激发和激励那些对传统计算机科学课程兴趣不高的学生的方式。在讨论我们为何选择使用游戏开发引擎之前,我们将先简要介绍背景,因为使用开发引擎的优势是我们在此过程中学到的重要经验之一。
在决定开设游戏开发课程后,面临的第一个主要问题是使用什么环境来制作游戏。你是使用专为课堂易用性设计的简易引擎,例如使用GameMaker[3]、RPG Maker[1]、或Alice[22]?还是尝试自行构建引擎,如Labyrinth那样?[5] 或CAGE[21]?你是使用Flash[6] 来制作游戏,还是决定采用完整的开发环境如XNA[10, 13],或使用像虚幻引擎这样的完整引擎[12]?
如果这门课程的目标是让学生获得游戏开发经验,那么你必须给他们提供一个游戏开发引擎来使用;否则,正如我们所发现的,整个学期都可能被用来搭建基础架构。虽然可以构建一个学生能够使用的引擎[5, 21],但他们最终会学习一个在课程结束后再也用不到的系统。我们希望学生能够接触真正的引擎,以便他们在决定从事游戏开发工作时具备真正实用的技能。因此,可供选择的引擎包括虚幻引擎[12]、XNA[14]、和Unity[20]。这三种引擎均可免费用于学术环境。
虚幻引擎可用于创建精美的游戏,并且被广泛应用于许多AAA2级作品中,但其学习曲线3较为陡峭。我们尚未见到它被用于非游戏开发专业学生的课程中的示例,而我们那些曾自行使用该引擎开发的学生对其评价也不高。微软的XNA具备诸多优势,可用于Xbox平台的游戏开发,并已在学术环境中得到应用[10, 13],但它更像一个开发环境而不仅仅是一个游戏引擎。与Linhoff的交流表明,在使用XNA开设的首门高级游戏开发课程中,只有少数学生成功将他们的游戏部署到Xbox上;我们不希望我们的学生在整个学期努力实现这一目标后却无法达成。此外,XNA要求学生运行Visual Studio,而由于我们一半的学生使用Mac,这对我们来说并不方便。
我们决定使用Unity,因为它是跨平台的,而且曾使用过它的学生对其评价很高。Unity还可用于开发任何平台的游戏(针对特定平台的编译需支付相应的授权费用),并且已被学术界用于开发休闲游戏[4]。它是一款3D引擎,但可通过插件将其用作2D引擎。其缺点在于,它并非行业主流,目前仅有一些接近AAA级别的游戏作品使用该引擎开发发布。与其他游戏引擎类似,使用Unity不需要院系教师专门开发特定工具或模块,学生即可直接用来制作游戏。Unity支持使用C#或JavaScript进行脚本编写,因此不会受限于某个可能不适合院系需求的编程语言。
3. 如何不教游戏开发
我们最初三次尝试开设游戏开发课程的机构,其学生对这类课程表现出极大兴趣,且该机构此前没有其他与游戏制作相关的课程。这并非本文所描述的成功游戏开发课程所在的机构。
2 AAA用于指代使用最大预算制作的最高制作价值的游戏。这类游戏通常仅由大型游戏工作室推出,并且都伴随大规模宣传。
3 虚幻4相比该引擎的以前的版本,其学习曲线更为平缓。它于2014年3月面向公众发布,并于2014年9月起免费用于教育领域。在本文被接受之后,虚幻4于2015年3月起向公众免费开放。我们尚未对虚幻4进行实验。
3.1 第一次尝试,Xcode 和 iPhone
我们第一次开设游戏开发课程时,决定为移动设备开发是最佳选择。我们的想法是,使用输入受限的设备可以防止学生过于雄心勃勃。我们认为,学生已有的C/C++背景将使他们能够轻松掌握Objective-C,并直接为iPhone进行开发。此外,学生可以很方便地向他人展示自己的作品,这会激励他们在课程中更加努力。然而,任何有iPhone开发或游戏开发经验的人都会认为,这种逻辑以及我们期望在学期之内实现目标的想法十分可笑,因为选修该课程的许多学生仅仅学过CS1。
需要说明的是,当时是2009年,应用开发在学术界才刚刚兴起。
学生在这门课程中学到了大量知识;不幸的是,这些知识主要集中于iPhone开发以及与硬件协作固有的问题上。尽管许多学生最终做出了半可玩、勉强能称为游戏的作品,但这门课程实际上并不是关于游戏开发的。最成功的一组学生设法构建了一个用于制作塔防类游戏的引擎。我们强烈建议避免走这条路。
这种方法的问题在于,学生若要真正体验游戏开发,就需要一个易于使用的环境来创建游戏,从而将重点放在让游戏中的内容正常运作为目标,而不是仅仅实现基本运行。即使我们的学生之前有iPhone应用开发背景,他们仍会花费整个学期的大部分时间去搭建一个带有资源素材的基本游戏循环,而非真正做出一款可玩的游戏。
3.2 第二次尝试,Bali 和 iPhone
我们第二次开设游戏开发课程的经历表明,从第一次尝试中我们得出了错误的结论:我们认为更简单的应用开发环境才是解决方案。我们仍然被学生能在手持设备上展示自己的应用程序这一想法所吸引。我们使用的软件名为Bali(后来更名为Cabana,在公司被Twitter收购后该软件已停止维护),它允许通过在可视化编程环境中连接模块的方式来构建应用程序。使用Bali,仅需5分钟即可讲授原本在Xcode中需要一小时才能完成的基础应用开发内容。
学生虽然能够更成功地开发游戏,但却一直在与开发软件作斗争。许多学生小组将大部分时间花在尝试将其美术作品与游戏中的资源进行连接上。同样,学生花费更多的时间是在构建游戏环境,而不是开发游戏本身。很明显,如果希望学生将时间用在游戏开发上,就必须使用一款游戏开发引擎。实际上,我们此前真正进行的是一门糟糕的游戏引擎开发课程。
3.3 第三次尝试,Unity
第三次尝试是一门为期3周的强化游戏开发课程,面向参加过前两次尝试的学生。学生仅修读这一门课程,全班共同合作开发一款游戏。我们决定使用游戏开发引擎,因为我们的借鉴了我们前两次尝试的经验,我们决定使用Unity,因为课程中的一些学生之前使用过它。结果出人意料地好,所有学生都认为使用真正的游戏引擎比使用通用软件要好得多。
与之前学期的学生相比,尽管这些学生必须在短时间内学习和使用Unity,但他们在这个游戏上的进展更大。游戏引擎包含了连接玩家、美术和环境所需的一切,这对学生能够实现的目标产生了巨大影响。学生们第一次真正理解了开发一款游戏意味着什么。对于任何有此领域经验的人来说,这一结论显而易见,甚至可能在我们进行首次尝试之前就应意识到这一点,但当时我们并未意识到,而且文献中也没有明确提及这一点。
4. 如何教授游戏开发
在经历了前三次尝试并迁移到一个新的机构后,我们找到了一种成功的游戏开发教学方法,即以Unity游戏引擎为核心来设置课程。由于身处新的机构,我们重新思考了课程的目标;在我们的案例中,目标是游戏开发而非游戏设计。有资格选修该课程的学生已经完成了我们的CS1课程,或主要面向非专业学生的游戏设计课程。我们之前的尝试表明,使用游戏引擎是此类课程的正确决策。
在决定使用游戏引擎后,我们重新审视了可用的选项。我们希望确保这门课程所使用的环境是学生未来可能再次使用的,我们的选择包括Unity、XNA和虚幻引擎。我们校园中Mac用户占很大比例,至少有50%选修我们游戏开发课程的学生使用Mac。因此,我们决定不认真考虑XNA,因为让学生为电脑配置双系统会带来软件上的问题。我们也没有选择虚幻引擎,尽管它在行业中应用广泛,但其学习曲线过于陡峭。我们游戏开发课程中的大多数学生仅修过我们的Python版CS1课程。
我们并非技术类院校,我们的CS1课程内容比普通CS1课程更精简(我们的CS2课程才涵盖技术类院校CS1课程的全部概念,且使用Java语言)。我们认为,如果使用虚幻引擎授课,那些没有正式编程经验的非专业学生将难以完成该课程。
基于我们过去使用Unity的经验和上述逻辑,我们决定在课程中使用Unity。我们认为Unity足够易于学习,以便学生在学期的大部分时间里能够专注于游戏开发。本文将介绍我们如何学习Unity,并在一个学期内构建一门实现我们目标的课程。
4.1 学习Unity
我们希望围绕一本具有扎实示例的书籍来开发我们的课程,这本书可以作为我们和学生们的指导。我们找到的关于Unity的最佳书籍是 Unity 3.x Game Development Essentials [8]。这本书通过一个游戏的逐步构建过程展开,每一章介绍一个新的概念和游戏的某个方面。所有代码示例均使用JavaScript和C#编写。该书已过期,因为Unity现在已是4版本,但该书作者一直在他的网站[9]上及时更新书籍内容。对于有编程经验的人来说,这本书阅读起来非常快,即使是毫无或几乎没有编程经验的初学者程序员也能获得足够的细节信息。
对于没有游戏开发经验的人而言,本书快速介绍了碰撞体、粒子系统等内容,同时又不会让那些已经了解自己在做什么的读者感到被轻视。即使不完整阅读全书,我们也能够直观地理解Unity在游戏开发中的工作原理。通过学习本书,足以获得教授Unity课程所需的背景知识。
上文已部分提及的一个问题是Unity的快速发展,以及这给寻找最新配套资料带来的影响。Unity的发展速度已经开始超过本书作者的更新速度。不过,Unity活跃的在线社区使得查找相关教程来更新书中代码以适应Unity的新功能和变化变得相对容易。如果该书的新版本迟迟未能推出,一个可行的替代方案是围绕一系列能够构建完整游戏的在线教程来设计课程。这些教程中的许多都包含了所需的所有资源,并以类似当前这本书的方式帮助理解Unity的工作原理,尽管详细程度稍低。
4.2 课程结构
课程的基本结构如下所示。所做出的决策基于我们的学生以及本课程的目标,可以在保持相同基本结构的前提下轻松进行调整。本课程的目标是让学生体验游戏开发,同时强调项目管理、团队合作、使用软件开发工具包以及问题解决能力。课程的第一部分重点在于教授学生如何使用Unity,第二部分则侧重于学生分组开发真实游戏。该课程每周上课4次:在学生学习Unity期间,每周安排3次讲座和1次实验课;在学生进行期末项目游戏开发期间,每周安排2次讲座和2次课堂工作日。
4.2.1 学生学习Unity
我们让学生学习Unity的方法与我们自己学习Unity的方法类似:让学生通过阅读书籍来学习。具体来说,我们让学生学习第1–9章的内容。这些章节涵盖的概念包括3D基础、脚本编写、构建3D环境、玩家控制器、交互(碰撞和刚体)、物品栏、实例化、粒子系统以及菜单。每周都会引入一个新的章节/概念,并重新实现书中的示例,同时解释相关操作背后的原理。学生需要在实验作业中重现课堂上完成的内容以获得80%的分数,并添加新的创造性元素以获得剩余的20%分数。
在得分方面采用80%/20%的比例划分非常成功,无论你在课程中侧重什么内容,我们都建议尝试这种方法。被游戏开发吸引的学生往往更具创造性倾向。最后的20%部分因其自由度而让这些学生感到非常兴奋。例如,有一项作业要求他们建造一堵可以射击倒塌的墙。在最后20%的部分,学生被允许修改这个游戏,每做一项更改可获得10%的分数,最多可获得20%。我的学生中有人让枪表现为机枪,发射棕榈树,发射多个弹丸,以及改变被击中方块的颜色。在每种情况下,学生都需要深入研究代码的不同部分是如何工作的,以确定如何进行修改。在整个学期的前半段,学生们为了能够添加有趣的功能而主动学习更多知识,这教会了他们在开始制作需要这些技能的期末项目游戏之前,如何查找资料并使用Unity解决问题。
在此学习各章节的过程中,学生们构建了一个基本游戏,在该游戏中他们可以控制一个角色在自己搭建的岛屿上奔跑,并能够玩各种小游戏。
4.2.2 期末项目游戏
在课程的第二部分(约学期的三分之二时间),学生以小组形式合作开发期末项目游戏。我们让学生自主决定想要开发的游戏,并以3–4人小组的形式协作。该项目以基于项目的课程中常见的标准方式进行,要求学生制定项目计划、提交里程碑(在本课程中为垂直切片5)、进行可用性测试并展示最终成果。该部分课程的讲座涵盖了多种主题,包括学生在游戏开发过程中可能需要了解的具体内容,以及对建模软件Maya[11]的简要介绍,该软件可用于为任何游戏引擎创建资源。
此外,课程还讨论了游戏开发行业的相关方面,例如开发团队角色和开发流程。
每个小组都确定了各自成员的角色分工以及完成游戏所需的各项任务。对于那些在课程第一部分(学习编程)中可能遇到困难的非专业学生来说,这意味着他们可以转向开发中自己擅长的其他方面,而将编码工作交给背景更强的同学,从而不影响小组的整体进度。
本课程这一部分的作业都与督促学生按时完成期末项目游戏有关。这些作业包括学生提交游戏创意、项目计划、垂直切片、可用性测试、最终游戏,以及关于各自完成情况的每周进度报告。
5. 结果
该课程现已讲授了两次,每次课程中班级的每个小组都成功地为最终项目构建了一个可玩的游戏,这明显优于之前课程中不到50%的小组取得成功的比例。在两个学期中,共有38名学生,其中2名学生退课(1名学生从学院退学),另有1名不及格;这些学生中没有一个是计算机科学专业学生。该课程似乎对专业留存率没有产生影响或在招收专业学生方面没有影响,但该课程中有多名学生加入了我们院系的辅修专业。由于我们统计辅修专业的方式,无法提供具体的辅修人数。我们未发现学生将注意力从其他课程转移的迹象。
所有学生都将游戏构建为网页版本,尽管Unity支持编译到更多平台6。学生们制作了平台游戏(图1)、休闲游戏(图2)以及生存恐怖游戏(图3)等。
这些游戏的多样性表明,学生可以自由地构建自己选择的游戏,而不局限于修改第一人称射击游戏或类似风格的游戏。决定自行创建资源的小组(图1)与决定购买资源的小组(图3)之间在游戏上的差异显而易见,也让全班认识到美术作品的重要性,以及在游戏开发流程中为资源开发进行规划的必要性。
6. 讨论与结论
根据我们的经验,Unity是开设独立游戏开发课程的一个不错的选择。如果不使用游戏引擎来教授游戏开发,那将是一个糟糕的想法,除非你的学生具备较强的技术背景,或者课程的目标是构建一个游戏开发引擎。由于Unity易于学习,学生可以在不到半个学期的时间内掌握,从而留出超过一半的学期时间来专注于你认为重要的任何主题(游戏设计、项目管理等)。使用Unity使得每位参加该课程的学生都有可能在课程结束时完成一个真正的游戏。我们认为,对我们此前创建游戏开发课程失败尝试的简要讨论,对于构建此类课程时把握重点具有借鉴意义。
6万+

被折叠的 条评论
为什么被折叠?



