想要明白如何在脚本中访问游戏对象或者组件,首先就要知道Unity中的脚本都是继承自MonoBehaviour,它定义了基本的脚本行为,必然事件也是从MonoBehavior继承而来。除了必然事件,MonoBehavior还定义了对各种特定事件(例如模型碰撞、鼠标移动等)的响应函数,这些函数名称均以On作为开头。下面介绍几个常用的事件响应函数:
事件响应函数 | 说明 |
---|---|
OnMouseEnter | 鼠标移入GUI控件或者碰撞体时调用 |
OnMouseOver | 鼠标停留在GUI控件或者碰撞体时调用 |
OnMouseExit | 鼠标移除GUI控件或者碰撞体时调用 |
OnMouseDown | 鼠标在GUI控件或者碰撞体上按下时调用 |
OnMouseUp | 鼠标按键释放时调用 |
三种前面讲过的碰撞检测方法 | 不再赘述 |
三种前面讲过的触发检测方法 | 不再赘述 |
OnControllerColliderHit | 当控制器移动时与碰撞体发生碰撞时调用 |
OnBecameVisible | 对于任意一个相机可见时调用 |
OnBecameInvisible | 对于任意一个相机不可见时调用 |
OnEnable | 对象启用或者激活时调用 |
OnDisable | 对象禁用或者取消激活时调用 |
OnDestroy | 脚本销毁时调用 |
OnGUI | 渲染GUI和处理GUI消息时调用 |
这些函数都是在写脚本代码中经常用到的,下面就在明白了这些事件响应函数的基础上介绍如何访问游戏对象和组件。
一、访问游戏对象
在Unity场景中出现的所有物体都属于游戏对象(GameObject),游戏对象和脚本是紧密联系的,游戏对象间的交互通常是通过脚本来实现的。可以使用以下两种方法来访问游戏对象:通过名称查找和通过标签查找。如图1.1就是游戏对象的名称和标签信息:
图1.1其中名称可以在Inspector视图中改变,也可以直接在Hierarchy视图中单击选中游戏对象后按F2键来改变;而标签系统自带了几种,如上图所示,如果需要自己添加一个标签可以通过点击Add Tag按钮来添加,点击Add Tag按钮后如图1.2:
图1.2此时直接把New Tag改成想要的标签名称就可以了。
1、通过名称来查找
使用函数GameObject.FInd,如果场景中存在指定名称的游戏对象,那么返回该对象的引用,否则返回空值null,如果存在多个重名的对象,那么返回第一个游戏对象的引用。示例代码片段如下:
GameObject player;
void Start()
{
player = GameObject.Find("hero");
}
2、通过标签来查找
GameObject.FindWithTag,如果场景中存在指定标签的游戏对象,那么返回该对象的引用,否则返回空值null,如果多个游戏对象使用同一标签(都是用同一个预设体生成的,或者手动改成同一标签),那么返回第一个对象的引用。如果场景中有多个相同标签的游戏对象,可以通过FindGameObjectsWithTag()方法获取游戏对象数组。示例代码片段如下:
GameObject player;
GameObject [] enemies;
void Start()
{
player = GameObject.FindWithTag("hero");
enemies= GameObject.FindGameObjectsWithTag("enemy");
}
需要注意的是:上述几个函数比较耗时,应避免在Update方法中调用这些获取组件的函数,而是应该在初始化时把组件的引用保存在变量中。
二、访问组件
在Unity中,脚本可以被认为是由用户自定义的组件,并且可以添加到游戏对象上来控制游戏对象的行为,而游戏对象则可以被视为容纳各种组件的容器。
一个游戏对象可能由多个组件构成,这些组件相互协作我们才能在场景中看到游戏对象应有的效果。而编写脚本的目的就是用来定义游戏对象的行为,因此我们会经常需要访问游戏对象的各种组件并设置组件参数。对于系统内置的常用组件,Unity提供了非常便利的访问方式,只需要在脚本里直接访问组件对应的成员变量即可,这些成员变量定义在MonoBehavior中并被脚本继承。下面介绍一些常用的组件和其对应的变量:
| 组件名称| 变量名 |组件作用
| ------------- |:-------------:|
|Transform|transform|设置对象位置、旋转、缩放
|Rigidbody|rigidbody|设置物理引擎的刚体属性
|Renderer|renderer|渲染物体模型
|Light|light|设置灯光属性
|Camera|camera|设置相机属性
|Collider|collider|设置碰撞体属性
|Animation|animation|设置动画属性
|Audio|audio|设置声音属性
如果游戏对象身上不存在某组件,那么该组件对应的变量值为空值(null)。
如果要访问的组件不属于上面常用的组件,或者访问的是游戏对象上的脚本(脚本属于自定义组件),可以通过下表中的函数来得到组件的引用:
函数名 | 作用 |
---|---|
GetComponent | 得到组件 |
GetComponents | 得到组件列表,返回的是一个数组 |
GetComponentInChildren | 得到对象或对象子物体上的组件 |
GetComponentsInChildren | 得到对象或对象子物体上的组件列表 |
下面给出一个简单示例:
void Start()
{
Example script = GetComponent<Example>();//得到游戏对象上的Example脚本组件
Transform t = GetComponent<Transform>();//得到游戏对象上的Transform组件
}
同样的,调用GetComponent函数比较耗时,因此要避免在Update中调用这些获取组件的函数,而应该在初始化时把组件的引用保存在变量中。
如果需要在一个游戏对象(设为A)的脚本中访问另一个游戏对象(设为B)上的组件,我们可以通过声明访问权限为Public的变量然后将需要访问的组件对象-B复制到A的脚本变量。示例代码如下:
public GameObject cube;//声明一个GameObject成员变量
public Transform spheretransform;//声明一个Transform成员变量
void Start () {
}
void Update () {
}
然后在Unity界面中把创建的Cube物体和Sphere分别拖到Plane的脚本中(上述脚本添加在Plane上),如图1.3:
图1.3需要注意的是:拖动的游戏对象要有脚本中Public修饰的变量组件,如果没有该组件,则不可用拖动到脚本的Public成员变量中。
网友评论