
Unity是一个可在Windows和Mac OS X上运行的游戏引擎。它用于制作各种操作系统的游戏,包括但不限于Windows,Mac OS X,Linux,Android和iOS。 话虽这么说,作为一个尝试在不拥有Mac的情况下为Mac制作游戏的人,我建议在开发该操作系统之前先拥有该操作系统。
在大学期间,我作为校园实习的一部分开始与Unity合作。 我和其他六个同龄人在一起,我们的任务是在Unity中制作3D游戏。 那时我还没有安装Unity。 因此,为了为剩下的实习做准备,我安装了Unity,进行了滚球教程,并略读了有关使用C#制作Unity游戏的书。 然后,我在实习的第一周的剩余时间里制作了我的第一个Unity游戏。 我决定制作3D Pong是因为我认为这是一个简单的游戏概念,需要使用游戏引擎的多个部分。
Unity可以制作3D和2D项目。 制作3D游戏的确可以归结为第三个空间轴,但它有一些细微的差异。 对我来说,这主要是学习照明和相机。 一旦我知道如何与他们进行3D交互,以后在2D项目中与他们进行交互就容易得多。 使用3D也使我习惯了使用模型及其一些怪癖,例如裁剪。 要对模型进行任何花哨的工作,我必须去认识Blender的我的一个朋友,Blender是一个非常有用的建模程序,可以很好地与Unity一起使用。 自从出于个人教育目的制作3D Pong以来,我一直在尝试Unity提供的基本3D形状。
Unity提供的一些基本3D形状是球体,立方体和胶囊。 乒乓球是基本球体,桨是胶囊,看上去像维生素药丸。 我用三个立方体(在Unity中也称为盒子)制作了木板,一个用于地板,另一个用于墙壁。 我将相机倾斜到板上,最终弄清楚了如何确定照明方向,然后进行了3D Pong游戏。
好吧,不完全是。 我的空气中悬浮着一些看起来不错的形状,但是什么也没动或做任何事情。 为了使我的游戏更有趣,我需要利用Unity的两个核心元素,脚本和物理引擎。 我以前对C#很熟悉,因为我以前是使用XNA框架(用于使用C#的X-Box)进行游戏的。 但是我从未在Unity上完成过C#。 我不会详细介绍C#,因为Unity也支持JavaScript。 两种编程语言都可以在同一Unity项目中使用,并且无论使用哪种语言,将脚本文件与游戏中的对象相关联的工作方式都相同。 我要讲的是使游戏中的对象具有有趣的功能。
Unity为游戏中的对象命名,它们称为GameObjects。 GameObject是Unity中的基本构建块。 玩家与之交互的Unity游戏中的大多数东西,例如玩家角色,敌人,力量提升,方块等等,都是GameObjects。 我在3D Pong游戏中描述的所有东西,Pong球,桨,地板和墙壁,都是GameObjects。
Unity可以创建所谓的空GameObjects。 顾名思义,它们是空的。 它们甚至不显示在屏幕上。 他们只是隐隐地坐在那里,什么也不做。 但是它们仍然是GameObject。 那么,什么将空的GameObject与我的3D乒乓球GameObject分开呢? 答案是组件。
我的3D Pong球具有3D渲染器组件,特别是球形渲染器。 我从默认GameObjects创建的3D球体带有一些组件,因此不必从头开始生成球体。 如果我想为球体编写一些额外的功能,我将编写一个脚本文件并将其作为脚本组件附加到球体。 我添加的第一个组件是一个脚本文件,当按下箭头键时,该文件使其中一个拨片移动。 我可以像常规Pong一样沿一个轴移动桨。 大! 但是有一个新问题。 划桨向右移动穿过墙壁,因为所有脚本所做的都是平移GameObject在3D空间中的位置。
我需要的是物理引擎。 具体来说,我需要在GameObjects中添加一个物理组件和一个对撞机组件。 我个人认为Unity中的物理引擎很强大。 物理组件上有很多自定义项,并且有许多不同的组件可用于处理GameObjects与物理组件之间的交互。 每当我实现需要移动的GameObject时,在添加任何自己的脚本之前,我会先尝试使用物理组件进行创建。 与其深入探讨物理引擎的各个方面,不如我将介绍帮助我制作3D Pong的三个方面。
首先是能够将GameObjects锁定在适当的位置。 这本身似乎并不重要,因为这是我天生就没有物理学的东西。 关键区别在于,物理学带来了引力。 这意味着我的游戏现在正在模拟3D Pong棋盘掉入空白区域。 为了防止这种情况,我可以将GameObjects(如板子和墙壁)锁定在适当的位置,并且可以限制桨在一个轴上移动。
第二个有用的组件是对撞机。 每个3D形状都有自己的对撞机,因为对撞机是定义GameObject物理边界的一种网或网格。 球体获得球体碰撞器,而胶囊则获得胶囊体碰撞器,依此类推。 对撞机除了可以使物体相互碰撞而使游戏正常运行之外,还可以进行碰撞检测。 这很有用,因为我想跟踪分数。 我在木板的任一端添加了墙壁,并给了它们盒子碰撞器。 一旦我让它们正常工作,我便使它们不可见,而Pong球可以直接穿过它们。 但是,由于撞机的撞击,墙壁可以检测出Pong球何时击中它们,并可以相应地更新比分。 更新分数并将其显示在屏幕上的实际代码由脚本和一些Unity的UI元素处理。 但是onTriggerEnter函数可以通过物理引擎使我的代码在有人得分时运行。
物理引擎提供给我的第三件事是材料。 可以将材料应用于GameObject的物理组件,并负责控制GameObject的摩擦和弹跳。 我想要一场令人兴奋的Pong游戏,所以自然而然地,我将摩擦力一直降低到最低,而反弹力一直提高到最高。 这使得Pong球从墙壁和球拍上弹起。 这样就涵盖了游戏的物理原理。 我什至一直在跟踪得分,并且由于我设置的检测器壁,一旦Pong球从板上掉下来,就可以重设它。
该游戏仍然存在一个小问题,原因是Pong是一个两人游戏,其中一个玩家可以是计算机。 我为一个球拍添加了控件,并对Pong球进行了编码,以便对其进行初步推动。 当我用桨叶挡住Pong球并弹到另一端时,计算机的桨叶看着它过去了。 我没有为计算机添加任何代码来玩游戏。 我可以通过在计算机的键盘上添加一个新的脚本组件来解决此问题。
关于在Unity中编写脚本的有趣之处在于内置的函数库。 这些使我能够从与脚本手动关联或在运行时动态找到的GameObjects中获取属性。 我可以有效地抓住Pong球并查看其在3D空间中的位置。 为了清楚起见,我将说桨板可以沿z轴移动。 因此,我对Pong球沿z轴的位置感兴趣。 然后,我可以指示计算机的拨片沿乒乓球的z轴方向以设定的速度移动。 将脚本组件连接到计算机的桨叶后,我有了一个对手,他将移动以阻止Pong球。
多亏了脚本,物理引擎和Unity内置库的结合,我才有了一个功能丰富的Pong游戏。 3D Pong捕捉了使Pong变得有趣的本质,但其3D图形具有更大的景深。 这是图形的最后一部分,这让我做了两次尝试。 我真正要做的就是用3D图形制作Pong。 乒乓球在基本上是二维平面上滚动。 我对3D Pong的实现并不满意,在给自己学习Unity的那一周,我还有时间。 因此,我的下一个游戏涉及制作一个利用所有三个空间维度的True 3D Pong。 这篇帖子应该是关于我的第一个Unity游戏的,所以我在这里不做详细介绍。 重要的是我从第一款游戏中学到了如何使用Unity基本的内置功能。 那可能是Unity的最大财富。 很容易拿起。 我从事过的未来游戏教会了我该引擎的新方面,但是我通常对如何与它们交互具有直觉。