天天看點

Unity中GameObject API解析

如何在腳本中擷取自身所在的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爪爪學院查找。

繼續閱讀