该部分将解释用于创建游戏场景的核心元素。
1. 游戏物体(GameObject)
在 Unity中最重要的就是游戏物体。理解什么是游戏物体如何使用它是非常重要的。该部分就将解释这个概念。
什么是游戏物体?在你的游戏中的任何东西都是游戏物体。然而,游戏物体自身并不能做所有的事情。在它们成为角色,环境或者特定的效果之前它们需要特定的属性。但是物体中的每一个都会做许多不同的事情。如果每一个物体都是一个游戏物体,我们怎么从一个静态房间中区分一个具有强大交互能力的物体?是什么使得游戏物体相互不同呢?
答案就是游戏物体是一个容器。他们是一个空的可以容纳不同块的盒子,而这些块组成了一个带有光照贴图的岛或是一个物理驱动的汽车。为了真正理解游戏物体,你需要理解这些块;这些块被称为组件(Components)。根据你要创建的物体的不同,你可以添加不同组件到一个游戏物体中。将游戏物体想象为一个空的烹调罐,组件为不同的组成游戏的配料。
游戏物体与组件的关系现在我们知道游戏物体包含组件。我们将通过使用昀常用的组件——变换组件(Transform)来讨论这两者之间的关系。打开任意一个场景,创建一个新的游戏物体(使用 Shift-Command-N),选择他并查看检视面板(Instpector)
物体的检视面板
你可能注意到了这里有两个完全不同的部分。”GameObject”和”Transform”。属于游戏物体部分的是关于游戏物体自身的信息。这里只有物体的名称。变换部分显示变换组件的信息。当你创建一个新的物体时,将会自动包含一个变换组件。所有的物体都会有一个变换组件。在 Unity中你不可能创建一个没有变换组件的物体,变换组件为所有物体提供了独特的功能。
变换组件变换组件是昀重要的组件之一。它定义了游戏物体在场景视图中的位置,旋转,和缩放。如果游戏物体没有旋转组件,那么它将不会存在世界中。参考变换组件部分。变换组件也可以使用一个被称为父子化(Parenting)的功能,这个功能被编辑器(Unity Editor)利用并且是使用游戏物体昀关键的部分。
父子化父子化的意思是你可以使一个游戏物体的变换值完全依赖于另一个不同游戏物体。简单来说,就是一个物体随着另一个物体移动。当一物体是另外一些物体的父(Parent)物体时,这个物体的旋转将影响所有的子(Child)物体。你可以在层次视图 (Hierarchy View)中通过拖动任何物体到另一个物体上来创建一个父。这将在两个物体之间创建父子关系。这种功能非常类似于文件夹树的功能,一个游戏物体包含在另一个游戏物体中。
需要指出的是所有子物体的变换值都是相对于父物体的,这个被称为局部坐标(Local Coordinates)。通过脚本你可以访问全局坐标(Global Coordinates)和局部坐标。
一个游戏物体可以有任意多个子物体,但是只能有一个父物体。子物体也可以是其它物体的父物体。你可以很容易的在层次视图中分辨一个物体是不是一个父物体。如果在它名称的左边有一个箭头,那么它就是一个父物体。
一个真实的父子层次树,所有带有箭头的物体都是父物体
记住所有的父子化的功能都是通过游戏物体的变换组件执行的,而不是游戏物体自身。
游戏物体-脚本关系当你创建一个脚本(script)并将其附加到一个游戏物体上时,这个脚本将在检视面板中作为一个组件显示。这是因为当它们被保存时脚本就变成一个组件。从技术角度来说,脚本是作为组件的一种来编译的,就像其它组件一样。
任何在脚本中申明的公有变量都将在游戏物体的检视面板中显示为可编辑或可连接。编写脚本的时候,你能够直接访问任何游戏物体类的成员。你可以在这里看到一个游戏物体类的成员列表。如果任何一个类作为一个组件附加在一个游戏物体上,你就可以在脚本中使用成员名来直接访问这个组件。例如键入 transform等同于 gameObject.transform。前面的gameObject是编译器自动加入的,除非你要指定一个不同的物体。
使用 this可以访问当前的脚本组件。使用 this.gameObject可以访问该脚本所依附的游戏物体,当然你可以简单的使用 gameObject来访问此游戏物体。逻辑上来说,键入 this.transform与 tansform是相同的,如果你想访问一个组件而该组件并没有作为一个游戏物体成员包含在其中,你需要使用 gameObject.GetComponent() 。