查找物体
[toc]
常用的方法
- GameObject.Find()
 - Transform.Find()
 - GameObject.FindGameObjectsWithTag()
 - FindObjectsOfType()
 
GameObject.Find()
优点:
使用简单方便 不会因为重名而报错,同时查找的是自上而下的第一个物体 缺点
不能查找被隐藏的物体,否则出现“空引用异常”,这是很多新人在查找出现空引用bug的原因。 全局查找(遍历查找),查找效率低,很消耗性能。 代码演示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameObjectFind : MonoBehaviour {
    private GameObject thing;
    void Start () {
        thing = GameObject.Find("C4");
        thing.name = "thing";
        
    }
}
Transform.Find()
通过Transform组件查找子物体。 用这个方法查找物体时,根节点一定要处于“显示”状态,不能被隐藏。 用它查找孙物体及孙孙物体,一定要使用“绝对路径”,否则出现“空引用异常”。 代码演示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TransformFind : MonoBehaviour {
    private Transform m_Transform;
    private GameObject one;
    private GameObject two;
    void Start () {
        m_Transform = gameObject.GetComponent<Transform>();
        one = m_Transform.Find("D2").gameObject;
        two = m_Transform.Find("D2/D3").gameObject;
        Debug.Log(one.name);
        Debug.Log(two.name);
    }
}
GameObject.FindGameObjectWithTag()和GameObject.FindGameObjectsWithTag()
通过Tag标签查找物体。 GameObject.FindGameObjectsWithTag():通过Tag标签查找到一组物体,返回一个数组。 GameObject.FindGameObjectWithTag():查找到这类tag标签,自上而下第一个物体。
代码演示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TagFind : MonoBehaviour {
    private GameObject thing;
    private GameObject[] things;
    void Start () {
        things = GameObject.FindGameObjectsWithTag("Player");
        thing = GameObject.FindGameObjectWithTag("Player");
        Debug.Log(things.Length);
        Debug.Log(thing.name);
        
    }   
}
FindObjectsOfType()
FindObjectsOfTypeAll():返回指定类型的对象列表。
代码演示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FindObjectOfType : MonoBehaviour {
    private GameObject[] things;
    private GameObject thing;
    void Start () {
        things = FindObjectsOfType<GameObject>();
        thing = FindObjectOfType<GameObject>();
        Debug.Log("第一个" + thing.name);
        for(int i = 0; i < things.Length; i++)
        {
            Debug.Log(things[i].name);
        }   
    }
}
其他
查找子物体
可以得到它的父对象要么是EnemyObject或EnemyObject(克隆)与transform.parent然后使用FindChild来找到敌方的对象。
//First, Find the Parent Object which is either EnemyObject or EnemyObject(Clone) 
Transform parent = transform.parent; 
//Now, Find it's Enemy Object 
GameObject enemy = parent.FindChild("Enemy").gameObject;