美文网首页
访问游戏对象和组件

访问游戏对象和组件

作者: S_H_C | 来源:发表于2016-12-21 00:18 被阅读0次

想要明白如何在脚本中访问游戏对象或者组件,首先就要知道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成员变量中。

相关文章

  • 访问游戏对象和组件

    想要明白如何在脚本中访问游戏对象或者组件,首先就要知道Unity中的脚本都是继承自MonoBehaviour,它定...

  • unity游戏对象,组件,Prefabs

    创建游戏对象和组件 任何游戏对象都是由组件组成,不同的组件有不同的功能,不同组件之间的互相组合以及组件属性之间的差...

  • 创建游戏对象和组件

    http://www.maiziedu.com/course/540/ 组件教程 prefabs教程http://...

  • 游戏对象、组件和Perfabs

    任何游戏对象都由组件组成,组件是实现一切功能所必需的,不同的组件有不同的功能,不同组件之间的相互组合以及组件中相应...

  • 刚体组件-Rigidbody

    刚体组件为游戏对象提供了物理属性,让游戏对象在场景中可以受到物理引擎的作用。当游戏对象添加了Rigidbody组件...

  • 21. withRouter

    withRouter 你可以通过 withRouter 高阶组件访问 history 对象的属性和最近(UI 结...

  • 访问其他游戏对象

    1、通过属性查看器指定参数 2、确定对象的层次关系游戏对象在游戏组成对象列表中存在父子关系,在代码中科院通过获取T...

  • 面向对象:论封装的重要性

    面向对象的基本概念包括对象、类、抽象、封装、继承、多态、接口、消息、组件、复用和模式等。 封装 访问权限的控制常被...

  • Transform组件

    Transform组件用于控制游戏对象在Unity场景中的位置、旋转和大小比例,每一个游戏对象都包含一个Trans...

  • 18.Spring的数据访问

    1.数据访问对象DAO或者Repository组件为了避免持久化的逻辑分散到应用中的各个组件中,最好是将数据访问的...

网友评论

      本文标题:访问游戏对象和组件

      本文链接:https://www.haomeiwen.com/subject/cvwfvttx.html