访问游戏对象和组件

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容