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