GameObject是Unity中一个很重要的角色。对GameObject学习能够让我们更好的进行Unity开发,今天我们就来学习一下GameObject这个概念——

在我们的Unity游戏中每一个对象都是一个GameObject,但是没有我们的指示,这些GameObject对象不会自己做任何事情。GameObject就像一个可以由我们自己定义的容器,我们让它包含什么样的属性,它就是一种什么样的GameObject——一个角色或者一个特效等等。

   好的,这里就有一个问题了,既然游戏中的每个对象都是一个GameObject,我们又是如何来区分它们呢?

   前面我们已经说过,GameObject就是一个容器。在这个空箱子中放不同的东西(属性),就组成了不同的对象类型。也就是说,游戏中需要什么的元素,我们都可以通过向GameObject中添加组件(Component)的方式来实现,当然,我们还可以通过脚本(Script)来创建自定义的组件。

GameObject和组件(Componet)的关系

前面说了,一个GameObject,我们可以根据需要给他添加各种不同的Componet来实现我们预期的效果。当我们创建一个新的GameObject的时候都会自带一个Transform(这个Componet包含了位置,旋转,缩放属性),我们可以修改这些属性。

Transform Component

Transform Component是最重要的一个Component,因为所有的GameObject的使用要涉及到Transform的属性(每个游戏对象在游戏世界中的表现,都要设置其位置,旋转,缩放的)。

unity gameobject对象与component对象区别 unity的gameobject_拖拽


图 1

这里需要说明一下,在Unity游戏场景中,我们不可能创建一个不包含任何Transform的空GameObject。如果一个GameObject而不包含任何Transform Component,那么这个GameObject只能用来存储数据,而不能在游戏场景中显示。

其他组件

Transform Component对GameObject来说是相当重要的一个组件,但是对一个GameObject来说,他除了需要一个Transform组件之外,一般来说,我们还会给他挂上其他的一些组件(比如:button的点击响应、动画效果甚至是我们自己定义的一些组件)

组件的使用

通过上面的学习,我们已经知道了GameObject和Component的一些概念和它们之间的关系。了解只是起步,真正应该怎么去使用它们呢?接下来,我们就来学习一下他们的使用过程。

添加组件

在Unity的菜单栏,我们看到有一项Component,我们可以通过这一菜单项来添加Component给某一个GameObject。

unity gameobject对象与component对象区别 unity的gameobject_菜单项_02

图 2

      在这个菜单项的下拉列表中我们也可以看到具体的Component有哪些。

                                    

unity gameobject对象与component对象区别 unity的gameobject_菜单项_03

图 3

接着Unity的第一篇博客中的例子,我们向之前创建的GameObject中添加一个Rigidbody的Component(一个物理组件Component——Physics——Rigidbody),运行这个例子,看看与添加Rigidbody之前的例子有什么区别呢?(对,当我们运行起来时,发现场景中的GameObject受到重力影响,出现了由慢向快开始下落的效果,OK,添加组件成功!)

编辑组件

      我们可以在Inspector中看到GameObject多了一个Rigidbody的属性信息,在这里,我们可以根据自己的需要去修改新添加Component的属性。

unity gameobject对象与component对象区别 unity的gameobject_拖拽_04

图 4

      当然不同的Component有不同的属性供我们操作,这个我们可以自己去看看。

移除组件

      在开发过程中,当我们需要移除一个Component时,该怎么做呢?其实很简单,鼠标右键点击Component组件

unity gameobject对象与component对象区别 unity的gameobject_拖拽_05

图 5

GameObject和Script的关系

      这里肯定有人会问——如果现有的这个Component不能满足项目需求或者说我如何才能主动控制场景中的GameObject呢?根据Forward对Unity的现有理解,我们可以通过添加Script来达到这个目的。

             

unity gameobject对象与component对象区别 unity的gameobject_缩放_06

图 6

先我们需要创建一个自己的Script,如图6所示,(Assets——Create——JavaScript/C#Script/…)创建我们的目标Script,我们所预期的场景中的GameObject所要做的逻辑都是在这个Script中完成的,这么说,可能有人就糊涂了,新创建的Script是如何跟场景中的GameObject关联起来呢?这就涉及到Unity的操作(或许就是Unity被广泛开发人员肯定的一个重要原因吧,场景中的对象与脚本的关联,不需要过多的添加代码,而只需要使用鼠标拖拽就可以完成!)

这里,我们将新添加的Script——CubeTest用鼠标左键选中(不松开)直接拖拽至Hierarchy窗口中的Cube_Test(目标GameObject)上,然后松开鼠标就可以了,这样我们就对目标GameObject关联到了一个Script上(是不是那句广告语——“So easy”啊?^_^)

               

unity gameobject对象与component对象区别 unity的gameobject_缩放_07

图 7

在目标GameObject的Inspector窗口中查看添加结果,如图8所示——

                          

unity gameobject对象与component对象区别 unity的gameobject_拖拽_08

图 8

这样,我们就可以在新添加的CubeTest Script中控制目标GameObject了。这里我们为了做测试,在CubeTest文件中添加如下代码——

       

unity gameobject对象与component对象区别 unity的gameobject_拖拽_09

图 9

好了,运行起来之后,如我们所预期的,在Console窗口中,我们看到打印了预期log,证明关联是成功的!

        

unity gameobject对象与component对象区别 unity的gameobject_unity3d_10