Unity中GameObject API解析

  1. 云栖社区>
  2. 博客>
  3. 正文

Unity中GameObject API解析

二哈卖豆腐 2019-03-20 16:22:19 浏览8037
展开阅读全文

如何在脚本中获取自身所在的GameObject?

我们知道脚本必须挂在一个GameObject上面才能执行,那么如何知道当前脚本所挂载的GameObject是哪一个呢?

这就需要用到gameObject属性了。

gameObject属性可以在所有继承MonoBehaviour的类中获取到,因为脚本必须要挂在到一个物体上才能执行,这个gameObject就是脚本挂到的物体。

using UnityEngine;

public class Test : MonoBehaviour

{

void Start ()

{

Debug.Log(gameObject.name, gameObject);

}

}

上面的代码就会打印出脚本所挂物体的名字。

注意这里Debug.Log传入了两个参数,这是为什么呢?

遇到这种问题,我们首先查一下Unity的文档。
为什么要查Unity的文档呢?

从图中可以看到,将光标移到Debug上面时,显示Debug类是属于UnityEngine这个命名空间的,也就是Unity提供的API。

Debug.Log有两种形式:

public static void Log(object message);public static void Log(object message, Object context);

第二种形式中可以传入一个Object类型的参数,传入这个参数时,在Console中显示的log会与脚本所在的物体关联。点击Console中这条信息时,会在Hierarchy中高亮这一个物体。

如何通过物体名字查找物体?
GameObject类中有一个静态(static)方法Find,用于通过名字查找场景中的物体。

什么是静态方法?
静态方法是标记为static的方法。静态方法独立于实例对象存在。即使没有类的实例,仍然可以通过类名.静态方法调用。静态方法中不能访问实例成员,可以访问其他静态成员。

静态方法在定义时需要在返回值类型前面加上static修饰符,比如:

static void Walk(){

Debug.Log("Walking");

}

访问时,可以直接通过类名.方法名调用。比如查找物体的方法就是GameObject.Find("cat")。

查找的名称字符串中可以包含“/”,比如GameObject.Find("animals/cat")就只会查到父物体名字为animals的cat物体。如果“/”字符在字符串中最开始的位置,那么会在根节点开始找,比如GameObject.Find("/animals/cat")就只会查到根节点为animals物体的子物体cat。

查找过后,一定要判断一下是否为空,因为Find有可能找不到你想找的物体。

特别注意1
这个方法的效率比较低,不要在Update中调用此方法,否则可能会造成游戏卡顿。一般的做法是,在Awake或Start方法中通过Find找到,然后保存到成员变量中。

特别注意2
这个方法无法找到active为false的物体。
那么如何查找active为false的物体呢?
1、不要使用Find,直接在代码中通过public的变量关联物体。
2、不要设置物体的active为false,先在游戏最开始时通过代码找到物体,然后通过代码设为false
3、通过transform.Find,我们明天会讲到。

更多unity2018的功能介绍请到paws3d爪爪学院查找。

网友评论

登录后评论
0/500
评论