前不久我们为大家介绍了Unity Playground,这是Unity发布首个面向青年学生,教育工作者等用户群体的项目,旨在简化游戏开发的入门学习过程。

Unity Playground是制作基于物理的2D游戏的框架,适合用来教学游戏开发初学者在Unity中无需编码,即可创作游戏,今天我们来进行Unity Playground入门的学习。

请访问Asset Store资源商店下载Unity Playground:
 


unity gameframework框架 unity rpg游戏框架_xml


学习准备

Unity Playground通过提供多个易于使用和组合的单任务组件,避免了编写代码的需求。通过组合脚本组件,你可以制作多种类型的基于物理的2D游戏。Unity Playground也可以用于游戏设计和关卡设计的教学。

Unity Playground旨在简化学习Unity的入门过程,使用它仅需半小时就能熟悉Unity基础知识,你只需要了解项目结构和Playground实现的概念。

如果想查看脚本,建议从Movement分类的脚本开始。如果你想了解特定脚本的详细内容,请查阅参考指南部分,或查看项目中的.pdf文档。

使用Unity Playground前,你必须掌握了Unity的核心概念。你可以在编辑器启动窗口或Unity Hub的Learn标签页下,找到Interactive Tutorials交互式教程进行学习。

如下图所示,编辑器启动窗口的交互式教程。
 


unity gameframework框架 unity rpg游戏框架_https_02


制作自己的第一个游戏

我们将学习制作一个简单的动作游戏。本文中的项目使用Unity 2017.4制作,游戏中有太空飞船,需要在飞行过程中避开小行星。

1、创建玩家

首先,我们从/Images/Spaceships文件夹把太空飞船图片拖到层级窗口,因为该图片已经导入为精灵,Unity会自动创建游戏对象。

该对象将成为玩家,我们把它命名为“Ship”,并在检视窗口上使用Tag下拉列表,给它设置“Player”标签。
 


unity gameframework框架 unity rpg游戏框架_触发器_03


Ship对象的标签被设为Player


现在实现飞船的移动。我们需要二个组件:Move组件用来提供交互功能,Rigidbody2D组件用来确保飞船遵循物理规则。从/Scripts/Movement文件夹把Move脚本拖到飞船的检视窗口。

如果拖拽遇到问题,也可以单击检视窗口底部的Add Component下拉菜单,然后输入“move”,此时该脚本应该会出现在第一个结果。
 


unity gameframework框架 unity rpg游戏框架_https_04


检视窗口的Add Component下拉列表


添加Move脚本的同时,会添加Rigidbody2D组件,这是因为Move脚本需要Rigidbody2D组件才能正常工作。

提示:场景辅助图标

有时,Playground脚本的图标可能会太大,以至于盖住图形。
 


unity gameframework框架 unity rpg游戏框架_触发器_05


Move脚本的图标盖住了整个飞船


如果发生这种情况,我们可以使用场景视图的Gizmos选项来减小图标大小。向左拖动3D Icons的滑块,直到把图标调节为合适大小。
 


unity gameframework框架 unity rpg游戏框架_UI_06


3D Icons滑块控制场景中图标的大小


2、调整物理规则

现在要调整飞船的物理数值。在RigidBody2D组件上,把Gravity改为0,这样飞船不会向下坠落。

我们可以选择自己喜欢的控制方式,方向键或WASD,检查Orient to direction是否适合图形,然后选择方向轴。现在单击编辑器顶部的Play按钮,测试游戏。

我们注意到飞船会大幅飘移,很难进行控制,因此调整Rigidbody2D组件的Friction,设为10。现在运行游戏,会看到飘移效果没了,但对象也移动得更慢了。

这是因为移动飞船的作用力现在受到阻力的作用,因此我们还需要调整Move组件中的Speed参数,把它设为8,然后再次单击Play,现在飞船可以更轻松地控制。

提示:运行模式

如果在运行模式下编辑组件数值,则会在游戏停止运行时丢失改动内容,因此尽量在运行模式外进行改动,我们只有在测试临时数值且不介意丢失数值的时候,才在运行模式下改动数值。

3、添加障碍物和碰撞

我们有了一些可玩内容,但它还不足以成为游戏。现在添加飞船要在游戏时避开的障碍物,把小行星精灵从/Images文件夹拖入场景。和之前一样,Unity会自动创建游戏对象。

我们需要添加二个组件:Rigidbody2D组件和PolygonCollider2D组件。PolygonCollider2D组件会使小行星对象能和其它对象发生碰撞。我们将给飞船添加PolygonCollider2D组件。
 


unity gameframework框架 unity rpg游戏框架_UI_07


飞船和小行星显示绿色边界:即碰撞形状


添加碰撞体后,尝试运行游戏。我们发现,飞船现在可以将小行星推开。别忘了调整小行星的Gravity为0,不然它会向下坠落。

我们随意调整小行星的参数,例如Friction、Angular Friction和Mass,使它按我们希望的方式运动。现在把Mass设为10,使它变重,避免在碰到飞船时弹开。那么大的小行星应该会很重才对。

现在让小行星成为威胁,我们需要给小行星添加/Scripts/Attributes文件夹中的ModifyHealthAttribute脚本。
 


unity gameframework框架 unity rpg游戏框架_触发器_08


ModifyHealthAttribute的检视窗口


然后,我们需要让飞船能够检测倒这种伤害。为此,我们将/Scripts/Attributes文件夹中的HealthSystemAttribute脚本添加到飞船对象。
 


unity gameframework框架 unity rpg游戏框架_UI_09


HealthSystemAttribute检视窗口


HealthSystemAttribute脚本不仅给玩家提供生命值,还允许设置初始值。

最后,我们把小行星做成预制件,使用快捷键:Windows系统下为Ctrl+D,Mac系统下为Command+D复制小行星,在飞船周围创建小行星群。

提示:预制件

复制小行星前,最好把它转为预制件,这样就可以轻松地同时编辑所有小行星副本。

4、添加用户界面

当玩家受到碰撞时,我们没有得到任何反馈,让我们添加UI来显示玩家的生命值。

我们将UserInterface预制件从/Prefabs文件夹拖到场景,查看游戏视图时,UI会自动出现,并显示Score(得分)和Health(生命值)。

如果现在运行游戏,会发现碰撞到一个小行星,飞船会减少1点生命值。如果相碰的次数太多,会出现Game Over,游戏结束。

我们拥有了一个完整的小行星群,现在测试一下,了解飞船是否能在这其中穿行,同时避免碰到太多次小行星。

游戏必须有一定难度,但不能太难。通过调整小行星的位置和测试游戏,你可以处理游戏的平衡性,并有效进行关卡设计。

5、添加目标

那么这个游戏的目标是什么?假设我们希望让飞船收集一些星星,同时避免碰到小行星。当所有星星被收集后,游戏胜利。但如果碰撞到太多次小行星,游戏结束。

现在,我们从/Images文件夹把星星拖到场景中。给星星对象添加/Scripts/Attribute文件夹的Collectable脚本,这会让星星成为可收集物品,每收集一个会给玩家加1分。

但要如何检测星星已被收集呢?我们会在此使用碰撞功能。给星星对象添加PolygonCollider2D组件,这次要使它成为触发器,勾选Is Trigger属性。

提示:触发器

触发器是一种特别的碰撞体类型。触发器使对象变得无法触碰,对象会看似无法与其它对象相碰。但Unity会检测二个对象间的碰撞,以便执行操作。

例如触发器可以检测玩家是否到达关卡终点。我们可以在出口或终点放一个触发器,当玩家碰到触发器时,显示You Win(你胜利了)信息。玩家虽然可能无法看到触发器,但触发器会给开发者提供逻辑来检测胜利条件。

6、胜利条件

现在运行游戏会发现星星能被飞船收集。此时,你可能想把星星变成预制件,然后多次复制星星。假设场景要有5个星星。现在我们要在场景分布星星,使它们易于获取,同时较远的星星也较难获得。这样,我们为游戏实现了逐渐加大的难度。

最后,选择UI游戏对象,在UI脚本上确保Game type为Score,然后所需分数设为5。如果目标分数不符合游戏内的星星数量,那么这可能是一个无法获得胜利的游戏。

再次运行游戏,检查游戏是否能胜利。获取5个星星后,你会看到“Player 1 wins!”的信息。

现在,我们已经制作了自己的第一个游戏。我们可以继续调整游戏,直到自己对游戏操作,难度和关卡布局满意为止。

7、下一步

现在我们对Unity和Unity Playground有了初步了解,可以继续制作更复杂的游戏。

Unity Playground有一定的灵活性,你可以用它制作自己的游戏类型,或仿制现有游戏。

在学习制作游戏时,模仿80年代老游戏,例如《Asteroids》、《Arkanoid》、《Space Invaders》、《Frogger》等是一个不错的想法,因为它们足够简单。随着自己的进步,你可以添加更多细节并改进交互效果。

如果需要灵感,你可以打开Examples文件夹,启动里面的任一游戏。查看游戏对象,了解实现方法,然后尝试自己制作类似内容。

常用概念

在这部分中,我们会简单介绍Unity Playground的基础概念。手机号买号平台如果不熟悉Unity Playground,你可以通过学习这些知识来制作较复杂的游戏。

信息框和警告

Unity Playground概念中所有自定义脚本的顶部都有一个信息框,它会简单介绍脚本功能。


unity gameframework框架 unity rpg游戏框架_https_10


Camera Follow脚本的信息框和警告


类似地,许多脚本有多个警告信息,即带有黄色警告标志的信息,它会在设置不正确时出现。请留意这些信息,它们会提醒你为什么脚本无法工作。

碰撞和触发器

在Unity Playground中,几乎所有逻辑脚本都使用碰撞来实现游戏玩法。这意味着当二个对象彼此碰撞时,或带有碰撞体的对象进入另一对象,该对象也有碰撞体,但被标记为触发器时,会发生事件。

例如,你可以在碰到敌人时产生伤害,碰到某个对象时赢得关卡,通过移动到金币和强化道具的位置来收集它们,或让角色碰到门口来把门打开,条件是你已经拥有正确的钥匙。

类似地,你可以在角色进入另一角色面前的区域时,触发一段对话,类似Roguelike示例场景。

当某个部分不按预期工作时,一定要检查是否添加了合适的碰撞体?

标签

标签允许我们给对象分类,以便脚本只有在碰到合适对象时才能执行动作。没有标签,脚本可能无法区分不同类别的对象。

与碰撞效果一样,许多脚本需要有正确标签的对象才能正常工作。

导入自定义图形

Unity Playground包含许多可以使用的精灵,它们位于Images文件夹。我们也可以随意使用自己找到或绘制的2D图形。

为了在Unity Playground使用自定义图像,我们需要把图像拖到Assets文件夹。图像会被导入为精灵,然后进行使用。把图像拖到场景或层级窗口会创建相应的新游戏对象,然后我们就可以在游戏中使用它。

为了让图像效果更好,非方形图像需要有透明部分,否则它们会显示白色背景。具有透明部分的图片格式有.png和.gif,.jpg格式不包含透明部分。请注意,Unity无法播放动态Gif图。

高级概念

如果你是一位老师或教育工作者,这部分是必须了解的。希望更好地了解Unity Playground的高级用户也了解这部分。

速查表

初次接触时,或许难以了解Unity Playground中的各类脚本。为此Unity Playground提供了一系列“速查表”,其中包含6页的脚本图标和简单介绍。它们按分类Movement、Gameplay等来组织,并用颜色进行标记。
 


unity gameframework框架 unity rpg游戏框架_c#_11


部分页面预览


速查表包含在Unity项目中,有方便打印的.pdf格式和适合屏幕阅读的.jpg格式。在游戏开发学习班中,如果学生对Unity很陌生,你可以把速查表打印出来,把它们发给学生,让学生掌握基础内容,并了解各部分的功能。

此外,速查表第7页有不同的额外挑战。如果你正在举办学习班,可以使用这些挑战来鼓励参与者尝试新东西,或在约束条件下实现游戏作品。

项目结构

为了在学习班中使用项目,你可以让学生从Asset Store资源商店免费下载,或在网络条件不允许时,把Assets文件夹和ProjectSettings文件夹手动传给学生。

Documentation文件夹包含.pdf格式的文档,其中包括现在这部分内容。你可以使用这篇“Getting Started”入门指南作为起点,然后通过“Reference Guide”进阶指南来深入了解脚本细节。最后,“Cheat Sheets”文档可以打印出来并发给学生,让他们快速了解各种脚本和功能,从而得到启发。

Images文件夹和Particles文件夹包含图形资源,它们可以用作角色,敌人或场景的组成部分,开发者也可以随意导入新的图形。

Unity Playground的核心是脚本,它们按照分类组织位于Scripts文件夹,多数脚本可以直接使用,部分脚本需要对象有特别标签才能使用。

项目中还有一个Examples文件夹,你可以在该文件夹找到制作完成的小游戏。你可以使用它们作为学习素材,或作为自定义游戏的起点。

项目中还有名称为INTERNAL的“特别”文件夹。顾名思义,该文件夹不应该随意改动,除非你想修改Unity Playground的内部属性。该文件夹包含基础脚本,字体,图标等和学生无关的内容。它需要存在项目中,以保证Unity Playground正常使用。

这部分深入介绍了Unity Playground的部分内容,以便更好地了解该项目的内部信息。请希望帮助学生解决游戏问题的教育工作者仔细阅读。

标签

部分脚本会使用标签来筛选对象,决定何时产生效果。有的脚本会筛选出带有OnCollisionEnter2D或OnTriggerEnter2D的对象,而其它脚本,例如HealthSystemAttribute脚本会根据对象是否标为Player而产生不同行为。

如果你在开始时导入了ProjectSettings文件夹,部分额外标签已经定义好。其中有:
 

  • Player标签和Player2标签必须在有二个玩家时使用,以保证UI正常工作,实现玩家伤害和计分等功能。
  • Enemy标签虽然未在任何脚本使用,但它可用于定义敌人,例如应用子弹和武器的效果。
  • Bullet标签用于飞弹武器。
  • Ground标签用于在玩家跳跃时检查地面。

除了Player标签外,许多脚本允许你定义需要检查的标签。例如,Jump脚本会要求定义什么对象可视作地面,因此你不必选择“Ground”标签。仅把它们看作建议即可。

你可以筛选Condition脚本中的标签,这样就能仅在碰到特定标签的对象时发生事件。标签列表会自动更新,显示项目中的所有标签,以避免输入标签时拼写错误。

用户界面

UI通过预制件的形式提供,它保存在Prefabs文件夹中。我们只需将UI拖入场景后,会自动显示Player 1的生命值和得分,你也可以选择游戏有二个玩家的状态,然后按游戏模式分别显示二个玩家的得分或生命值。
 


unity gameframework框架 unity rpg游戏框架_触发器_12


空白场景背景的UI Canvas


UI也允许定义游戏模式,包含Score、Life和Endless三个选项:

在Score模式下,如果玩家达到目标得分,会显示胜利画面。当有二个玩家时,UI只会显示得分,第一个达到目标分的玩家会赢得胜利。

在Life模式下,如果玩家生命值达到0,会显示Game Over信息。有二个玩家时,二个玩家的生命值都会显示。该模式没有特别的胜利方式。

在Endless模式下,游戏中不会显示游戏结束画面,而且也没有胜利或失败的方式。

当使用Condition脚本时,你可以指定二个UnityEvent(逻辑事件),分别是UIScript脚本的GameWon和GameOver函数,这样就可以通过利用碰撞等事件来创建胜利和失败的条件。

同样,你可以利用AddOnePoint和RemoveOnePoint函数对“得分”进行类似的处理。

定制检视窗口

Unity Playground大量使用了定制检视窗口,应用于Unity Playground的自带Move,Jump等脚本和默认Transform,Collider和SpriteRenderer等Unity组件。定制检视窗口的目标是减少Unity UI的复杂性,让新用户能更轻松地使用检视窗口。

为此,部分变量名称也进行了改动,例如如Rigidbody2D组件的Drag属性改名为“Friction”。

如果我们需要关闭Playground,可以通过顶部菜单栏开启或关闭定制检视窗口。该选项允许你显示Playground脚本的隐藏内容。你可以进行修改,然后再开启Playground。由于Playground只会修改检视窗口部分,因此它能正常工作。

 


unity gameframework框架 unity rpg游戏框架_c#_13


使用顶部菜单栏关闭Playground


建议老师们掌握这个技巧,以便临时修改Playground隐藏的属性,例如编辑任意类型碰撞体的形状。

Tilemaps

项目的图形资源中有一系列瓦片精灵,包括草地、石块和木板等,它们被用于构建示例游戏,你可以通过利用Unity的Tilemap功能,使用它们来构建自己的关卡。

小结

如果你是一位资深的程序员,并且希望对Unity Playground作出贡献。