为非程序员打造的Unity游戏框架:Playground Project
发表于2017-04-30
许多老师可能都在头疼如何为学生提供一个游戏开发入门案例。像Unity这样的工具都太过复杂且应用范围太广。但Unity编辑器会假设学生已经了解很多概念,而这些概念很难通过一两节课讲明白。
我作为Unity的Technical Evangelist,接受的第一个“任务”就是为Brighton附近小镇的一群小孩进行为期2天的Workshop。他们年龄在11到16岁之间,接受过基础编程培训但完全没听说过Unity。向他们介绍Unity最简单的方法就是手把手的步骤教程。但一天下来,我意识到这样完全发挥不出孩子们自身的创意。因此在回去的火车上我开始构思一个框架,即使对编程一窍不通的人们也可以利用这个框架快速创建各种游戏。
“Playground Project”就这样诞生了。
需求与解决办法
开始创建框架时,我心里有几个目标。首先,我想告诉孩子们制作游戏是很有趣的事情。我想给他们一个完整的游戏开发体验,但同时不让技术问题难倒他们。最重要的是,我不想限制他们的创造力。
我还觉得让他们接触游戏的参数应该会很不错,因此允许他们参与游戏的优化和测试(未来的游戏设计师!)
另一个关键目标就是作为老师,我要尽量减少干预,因为我很快发现同时照顾一个班级的25个孩子是不可能的。所以框架必须尽可能的阻止出错,并正确引导孩子。因此我想出了一个小框架并且围绕着几个基本原则,每次做决定之前必须将其考虑进去:
更详细的来说,这些组件大多都是用于执行单个任务的简单脚本,因此他们可以被混合使用以产生更精致的游戏效果。举个例子,你可以使用RotateWithArrows和PushWithButton两个脚本创建一个角色例如宇宙飞船或汽车,使用左右方向键让角色旋转,使用上键控制角色向前移动。
这些组件的检视面板都在编辑器代码的帮助下进行了深度定制,并且提供了大量的设置指导。举个例子,MoveWithArrows组件在检视面板底部显示了一些小提示,并且如果不勾选Orient to direction 则会隐藏选Look axis 。

用户界面
说到UI,我预先制作了Prefab可以直接拖到场景中使用,无需任何设置。它将适应不同类型的游戏并且根据游戏是一个还是两个玩家而做出相应的改变。组件检视面板如下:

UI在游戏中的效果:

另外它会在左下角自动显示一个小的库存信息,显示可以被拾起的对象数量。在这个例子中,玩家有0个硬币和一把钥匙。

条件,行为,属性
在原先的基础上进行第一次迭代后,我一直在试图给Playground Project添加一些额外的结构,因此我想到了一些关键脚本,用于尝试解决特殊类型的问题。
框架的核心就是条件,基本上就是if语句组成的组件。他们用于检查特定条件,如果通过验证就开始执行一些命令。现在可用的条件脚本分别是Area Conditions(基本上用于触发,输入,退出和停留),Collision Condition(碰撞时攻击),和一个用于捕捉输入的可配置 Key Condition。未来可能添加更多。
在第一次迭代中,我将UnityEvent下的动作进行分组。尽管它功能强大,但检视面板中的UnityEvent模块太过庞大且复杂,很难设置,因为它显示了目标对象所有的公共属性与方法。

因此我决定实现一系列只包含一个动作的迷你脚本。条件部分现在有一个简化的模块(使用很实用的RecordList开发,详情请查看Valentin的博文),可以轻松使用拖拽来连接各种条件选项。他们都实现了IGameplayActioninterface接口,放在Gameplay Actions分组下。
遵循这种简化规则,ConditionKeyPress检视面板的Gameplay Actions 模块如下图所示:

布尔值Use custom actions 控制另外一个UnityEvent模块,让一些勇敢的学生可以获取UnityEvent的所有变量或方法。
最后,一些脚本被分配在Attributes一组,他们只是对象为数不多的属性,效率很高。例如,为游戏对象添加 Resource属性可以就会将该对象变成可拾取和可堆叠的,会在UI上显示该对象的图标或数量,后面通过GameplayAction脚本 ConsumeResource来消耗。
示例游戏
Scenes文件夹内包含了一些示例游戏,旨在展示各种可以利用该框架实现的游戏。
Defender这个游戏用于展示如何射击物体(激光发射器)或者随机生成(小行星),也是一个基于生命值的游戏,玩家的生命值脚本不在角色的游戏对象上,而是绑定在游戏环境上。

Football游戏是一款双人足球游戏,展示如何使用ConditionCollision脚本设置目标,以及当玩家得分时重置玩家和球的位置。

Maze游戏用于展示物品收集(这里是硬币),如何设置Area Conditions(环境条件),以及如何使用LoadLevelAction加载其它关卡。

Lander游戏展示了非典型的碰撞设置,只有碰撞到太空船的特定位置才会引发爆炸。

最后,Roguelike游戏展示了如何使用Conditions 和 ConsumeResource创建一个小型“锻造”系统。商人要求3枚硬币(带有Resource脚本)来换取钥匙(另外一个Resource脚本),钥匙可以被拾取并用于打开中间那扇门。

建议将框架发给孩子们之前先移除一部分游戏,防止他们抄袭。框架的的本意就是希望他们尽情地发挥想象力。
下载框架
我们Evangelism团队决定将该框架开源至Github,欢迎大家下载试用。其中包括Wiki文档,详细介绍了如何使用这套框架。如有任何疑问,请访问Unity官方中文社区。
我作为Unity的Technical Evangelist,接受的第一个“任务”就是为Brighton附近小镇的一群小孩进行为期2天的Workshop。他们年龄在11到16岁之间,接受过基础编程培训但完全没听说过Unity。向他们介绍Unity最简单的方法就是手把手的步骤教程。但一天下来,我意识到这样完全发挥不出孩子们自身的创意。因此在回去的火车上我开始构思一个框架,即使对编程一窍不通的人们也可以利用这个框架快速创建各种游戏。
“Playground Project”就这样诞生了。
需求与解决办法
开始创建框架时,我心里有几个目标。首先,我想告诉孩子们制作游戏是很有趣的事情。我想给他们一个完整的游戏开发体验,但同时不让技术问题难倒他们。最重要的是,我不想限制他们的创造力。
我还觉得让他们接触游戏的参数应该会很不错,因此允许他们参与游戏的优化和测试(未来的游戏设计师!)
另一个关键目标就是作为老师,我要尽量减少干预,因为我很快发现同时照顾一个班级的25个孩子是不可能的。所以框架必须尽可能的阻止出错,并正确引导孩子。因此我想出了一个小框架并且围绕着几个基本原则,每次做决定之前必须将其考虑进去:
- 一套易于使用及组合的单任务组件
- 非常简单的场景设置
- 基于物理的游戏玩法(好玩!)
- 简单的2D(孩子们可以从网上导入其他图形资源)
- 自定义检视面板来检测设置中的错误
- 提前做好用于显示生命值和分数的UI
更详细的来说,这些组件大多都是用于执行单个任务的简单脚本,因此他们可以被混合使用以产生更精致的游戏效果。举个例子,你可以使用RotateWithArrows和PushWithButton两个脚本创建一个角色例如宇宙飞船或汽车,使用左右方向键让角色旋转,使用上键控制角色向前移动。
这些组件的检视面板都在编辑器代码的帮助下进行了深度定制,并且提供了大量的设置指导。举个例子,MoveWithArrows组件在检视面板底部显示了一些小提示,并且如果不勾选Orient to direction 则会隐藏选Look axis 。

用户界面
说到UI,我预先制作了Prefab可以直接拖到场景中使用,无需任何设置。它将适应不同类型的游戏并且根据游戏是一个还是两个玩家而做出相应的改变。组件检视面板如下:

UI在游戏中的效果:

另外它会在左下角自动显示一个小的库存信息,显示可以被拾起的对象数量。在这个例子中,玩家有0个硬币和一把钥匙。

条件,行为,属性
在原先的基础上进行第一次迭代后,我一直在试图给Playground Project添加一些额外的结构,因此我想到了一些关键脚本,用于尝试解决特殊类型的问题。
框架的核心就是条件,基本上就是if语句组成的组件。他们用于检查特定条件,如果通过验证就开始执行一些命令。现在可用的条件脚本分别是Area Conditions(基本上用于触发,输入,退出和停留),Collision Condition(碰撞时攻击),和一个用于捕捉输入的可配置 Key Condition。未来可能添加更多。
在第一次迭代中,我将UnityEvent下的动作进行分组。尽管它功能强大,但检视面板中的UnityEvent模块太过庞大且复杂,很难设置,因为它显示了目标对象所有的公共属性与方法。

因此我决定实现一系列只包含一个动作的迷你脚本。条件部分现在有一个简化的模块(使用很实用的RecordList开发,详情请查看Valentin的博文),可以轻松使用拖拽来连接各种条件选项。他们都实现了IGameplayActioninterface接口,放在Gameplay Actions分组下。
遵循这种简化规则,ConditionKeyPress检视面板的Gameplay Actions 模块如下图所示:

布尔值Use custom actions 控制另外一个UnityEvent模块,让一些勇敢的学生可以获取UnityEvent的所有变量或方法。
最后,一些脚本被分配在Attributes一组,他们只是对象为数不多的属性,效率很高。例如,为游戏对象添加 Resource属性可以就会将该对象变成可拾取和可堆叠的,会在UI上显示该对象的图标或数量,后面通过GameplayAction脚本 ConsumeResource来消耗。
示例游戏
Scenes文件夹内包含了一些示例游戏,旨在展示各种可以利用该框架实现的游戏。
Defender这个游戏用于展示如何射击物体(激光发射器)或者随机生成(小行星),也是一个基于生命值的游戏,玩家的生命值脚本不在角色的游戏对象上,而是绑定在游戏环境上。

Football游戏是一款双人足球游戏,展示如何使用ConditionCollision脚本设置目标,以及当玩家得分时重置玩家和球的位置。

Maze游戏用于展示物品收集(这里是硬币),如何设置Area Conditions(环境条件),以及如何使用LoadLevelAction加载其它关卡。

Lander游戏展示了非典型的碰撞设置,只有碰撞到太空船的特定位置才会引发爆炸。

最后,Roguelike游戏展示了如何使用Conditions 和 ConsumeResource创建一个小型“锻造”系统。商人要求3枚硬币(带有Resource脚本)来换取钥匙(另外一个Resource脚本),钥匙可以被拾取并用于打开中间那扇门。

建议将框架发给孩子们之前先移除一部分游戏,防止他们抄袭。框架的的本意就是希望他们尽情地发挥想象力。
下载框架
我们Evangelism团队决定将该框架开源至Github,欢迎大家下载试用。其中包括Wiki文档,详细介绍了如何使用这套框架。如有任何疑问,请访问Unity官方中文社区。