unity3d 浅析控制游戏对象脚本

在unity中,能够在监视器面板中改动物体的组件属性,可是很多其它的时候,须要使用脚本来进行这些操作。

1 訪问组件

最常见的一个情形是须要使用脚本訪问附加到同样游戏对象上的还有一个组件(当前脚本就是一个组件,其它的组件也就是还有一个组件了)。在引言中提到过,一个组件实质上是一个类的实例,因而首先须要做的是获取想要操作的组件实例的引用。这个通过GetComponent函数来实现。典型的,可能会想要将一个组件赋值给一个变量,例如以下代码所看到的

void Start () {
Rigidbody rb = GetComponent<Rigidbody>();
}

一旦获取了组件实例的引用,就能够对它的属性进行想要的操作,同一时候也能够调用它之上的一些功能函数。

假设想要訪问还有一个的脚本文件,也能够使用GetComponent,仅仅需使用脚本的类名作为该函数的组件类型參数(由于脚本本来就也是一个组件)。

假设想要去获取一个并没有加入到当前游戏对象的组件,GetComponent函数会返回null,假设试图去改变一个null对象上的不论什么值,将会发生null引用错误。

因为一些组件类型常常使用,unity提供了一些内置的变量来訪问它们,比如能够使用以下的代码

void Start () {
transform.position = Vector3.zero;
}

而不用使用GetComponent去获得Transform组件,全部的内置组件变量列表在 MonoBehaviour类的參考手冊里面有。

2 訪问其它对象

尽管游戏对象有的时候都是各自处理,使用代码进行跟踪其它物体是常有的事。比如,一个追赶的敌人可能须要知道玩家的位置,unity提供了一系列不同的方法来获取其它对象,各适合不同的场合。

<1> 将对象链接到变量

最直接的办法是将一个游戏对象加入到脚本的公有成员变量上,直接在编辑器中将须要訪问的游戏对象拖到相应脚本组件的那个公有成员变量上,unity会自己主动依据变量的类型将加入的游戏对象中同样的组件类型映射到该变量。

比如将一个游戏对象拖给一个Transform的成员变量,就会自己主动的将游戏对象的Transform组件和该变量映射起来。

直接将对象和变量链接起来在处理须要有永久链接的对象的时候是最实用的方法。同一时候也能够使用一个数组变量和几个同样类型的对象链接起来,可是这样的链接必须在unity编辑器中完毕,而不能在执行时进行。通常使用以下的两种方法来在执行时定位对象。

<2> 查找子物体

有的时候,一个游戏场景中可能会用到非常多同一类型的对象,比如敌人、路点(waypoints)和障碍物。这些对象在游戏中须要由一个特定的脚本来监视和响应。这个时候使用变量来链接这些对象太过麻烦不好操作。对于这样的情况,通常更好的方法是将一系列的对象加入到一个父对象以下,这些子对象能够通过使用父对象的Transfrom组件来获得。

public class WaypointManager : MonoBehaviour {
public Transform waypoints;

void Start() {
waypoints = new Transform[transform.childCount];
int i = 0;

for (Transform t in transform) {
waypoints[i++] = t;
}
}
}

同一时候也能够使用Tranfrom.Find来查找某个详细的子对象。使用Transform来进行对象查找操作是由于每个游戏对象都有Transfrom组件。

<3> 通过名称或标签訪问对象

仅仅要有一些信息,在层级场景中的不论什么位置定位到该游戏对象是可能的。单个对象能够通过GameObject.Find函数进行查找。例如以下:

 

GameObject player;

void Start() {
player = GameObject.Find("MainHeroCharacter");
}

某个对象或者一系列的对象也能够分别通过GameObject.FindWithTag和GameObject.FindObjectsWidthTag函数进行定位。

<4>查找特定类型的对象

static ObjectFindObjectOfType(Type type)

返回指定类型对象中的第一个活动的载入对象

须要注意的是这个函数非常慢(可能是因为要在整个场景中进行遍历),不推荐每一帧都使用这个函数,在大多数情况下能够使用单件模式

比如

Camera cam = FindObjectOfType(typeof(Camera)) as Camera;

因为该函数返回的类型是Object,所以须要使用as进行一下强制转换。

static Object[] FindObjectsOfType(Type type);

返回指定类型的载入活动对象的列表,速度也慢

 HingeJoint[] hinges = FindObjectsOfType(typeof( HingeJoint)) as  HingeJoint[];

 

未经允许不得转载:Unity3D » unity3d 浅析控制游戏对象脚本

赞 (1)