Unity3D场景搭建2. 使用组件(Using Components)

组件是游戏中一个物体的行为和核心。它们是游戏物体的功能性模块。如果你还不理解游戏物体和组件之间的关系,请参考游戏物体部分。

一个游戏物体包含许多不同的组件。缺省情况下。所有的游戏物体都包含一个变换(Transform)组件。这是因为变换表示物体的位置,旋转和缩放。没有变换组件,游戏物体将不会有位置。尝试创建一个空的游戏物体。单击 GameObject->Create Empty菜单项。选择新游戏物体,并查看检视面板。




每一个空的游戏物体都有一个变换组件

可以使用检视面板来查看都有什么组件附加在游戏物体上。但一个组件被加入或删除的时候,检视面板将显示当前附加的组件。可以使用检视面板来改变任何组件的属性 (包括脚本)。

添加组件

可以通过组件菜单为当前的游戏物体添加一个组件。尝试添加一个刚体(Rigidbody)到刚创建的物体上。选择该物体并从菜单中选择 Component->physics->Rigidbody。现在你将会发现刚体属性显示在检视面板中,如果在该物体被选中的情况下按下播放键(Play)你将会有惊喜的发现。注意刚体是如何在一个空物体上添加功能的。




附加了刚体组件的空物体

可以附加任意数量的组件到一个游戏物体。一些组件可以与其他一些组件一起工作。例如,刚体可以和任何碰撞物一起工作。刚体通过 Ageia PhysX物理引擎控制变换,并且碰撞器允许刚体与其它的碰撞器碰撞和交互。一个不同的组件组合例子是一个粒子系统 (Particle System)。它们使用一个粒子发射器 (Particle Emitter),粒子动画 (Particle Animator)和粒子渲染器(Particle Renderer)来创建一组移动的粒子。

可以通过点击位于检视面板头部的问号访问组件的参考页。

编辑组件一个组件重要的方面是其可扩展性。当你添加一个组件到一个物体上时,它有不同的可以调整的值或者属性(Properties),也可以在游戏中通过脚本来调整它。有两种不同类型的属性:值(Values)和引用(References)。

下图中是一个具有音频源 (Audio Source)组件的空游戏物体。在检视面板中所有音频源的值都是缺省的。这个组件包含一个单一的引用属性和七个值属性。音频剪辑 (Audio Clip)是一个引用属性。当这个音频源开始播放时,它将尝试播放 Audio Clip属性所引用的音频文件。如果没有添加引用属性,将会出现一个错误因为没有音品将被播放。你必须在检视面板中引用音频文件。你可以非常简单的从工程视图中将音频文件拖动到引用属性中。

 

 

现在一个音效文件在音频剪辑属性中被引用

组件可包含任何其它类型组件的引用,文件或游戏物体。你只需拖动适当的引用到这个属性上。引用类型是非常有用和强大的,尤其是在使用脚本时。参考脚本教程。

音频剪辑中剩下的七个都是值属性。都可以通过单击并按下 Enter键来调整它们。使用键盘输入值,并按 Enter保存它。你也可以通过使用 option-或 right-click或拖动数字属性来快速滚动这些值。

音频剪辑中的值属性都是数字,但是一些属性也可以是字符串。例如,文本网格(Text Mesh)组件包含一个文本(Text)属性,这个属性可以接受字母数字字符。


一些值可以包含字符,例如文本网格中的 Text属性

测试属性

当你的游戏处在播放模式 (Play Mode)中时,你可以在游戏物体的检视面板中修改它的属性。例如,你或许想试验不同的跳跃高度。如果你在一个脚本中创建了一个跳跃高度 (Jump Height),你可以进入播放模式,改变这个值,并按跳跃键查看结果。然后不需要退出播放模式就可以再次改变这个值。当你退出播放模式时你的属性值将恢复到播放前的值,因此,你不会丢失任何工作。这个工作方式,提供给你难以置信的方便来试验,调整,精简你的游戏而不必要花费大量的时间。

移除组件

如果你想移除一个组件,在检视面板的头部使用 option-或右击然后选择移除组件(Remove Component)。或者你可以单击位于组件头部问号旁边的选项图标。所有的属性值都将丢失并且是不可恢复的。因此在移除组件前请确认你要这样做。

组件-脚本关系

尽管脚本(Scripts)看起来都与组件不同,事实是脚本是组件的一种类型。它是一种你自己创建的组件。你可以定义能够显示在检视面板中的成员,并且它将执行你写出的任何功能。

脚本组件

有很多组件可以通过任何脚本直接访问。例如,如果你想访问变换组件的变换(Translate)功能,你只需要使用 transform.Translate()或 gameObject.transform.Translate()。因为所有的脚本都是附加在游戏物体上的,所以当你写 transform的时候就暗示要访问当前脚本所在的物体的变换组件。当然这两者完全等价的。

使用 GetComponent()

有许多组件不能成为一个游戏物体类的成员。因此你不能隐式访问它们,必须显式访问它们。通过调用 GetComponent(“component name”)并存储一个引用到结果中。当你需要引用附加到该游戏物体上的其它脚本时这个方法是昀常用的。

假设你在写脚本 B并且你想做一个脚本 A的引用,而这两者是附加在相同的游戏物体上的。你可以使用 GetComponent()来引用脚本。在脚本 B中你可以使用 scriptA = GetComponent(“ScriptA”); 然后你就能够在脚本 B中通过 scriptA.variableName来访问任何脚本 A中的变量。