如何在脚本中获取自身所在的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爪爪学院查找。