unity中提供了获取对象的五种方法:
- 通过对象名称(Find方法)
- 通过标签获取单个游戏对象(FindWithTag方法)
- 通过标签获取多个游戏对象(FindGameObjectsWithTags方法)
- 通过类型获取单个游戏对象(FindObjectOfType方法)
- 通过类型获取多个游戏对象(FindObjectsOfType方法)
Find方法:
static GameObject
Find
(string
name
)
传入的name可以是单个的对象的名字,也可以是hierarchy中的一个路径名,如果找到会返回该对象(活动的),如果找不到就返回null。
var cubeF = GameObject.Find("/CubeFather");
if (null != cubeF)
{
Debug.Log("find cube father~");
}
cubeF = GameObject.Find("CubeFather");
if (null != cubeF)
{
Debug.Log("find cube father, no /~");
}
var cubeS = GameObject.Find("/CubeFather/CubeSon");
if (null != cubeS)
{
Debug.Log("find cube son~");
}
cubeS = GameObject.Find("CubeFather/CubeSon");
if (null != cubeS)
{
Debug.Log("find cube son, no /~");
}
cubeS = GameObject.Find("CubeSon");
if (null != cubeS)
{
Debug.Log("find cube son, no one /~");
}
结果如上,可见不论参数是对象名字还是对象的路径,只要对象存在都会查找到,但是建议最好是写详细的路径名例如CubeFather/CubeSon,这样的话,在unity查找的过程中会省很多事,效率高;另外不要在每一帧都执行的函数中调用该函数,可以看上图结果中会执行好多次,用到某个对象时可以在Start这种只执行一次的函数中定义变量获取Find的返回值,再在每帧都执行的函数中使用该变量即可~
FindWithTag方法:
static GameObject FindWithTag (string tag)
返回一个用tag做标识的活动的对象,如果没有找到则为null。
var sphere = GameObject.FindWithTag("Sphere");
if (null != sphere)
{
Debug.Log("Sphere~");
}
将hierarchy中某个对象的Inspector面板上面的Tag自定义一个,然后为其选择自定义(上述例子中用的Sphere)
,当然没有的话,利用下拉列表中的AddTag构建
FindGameObjectsWithTag方法:
static GameObject[] FindGameObjectsWithTag (string tag)
返回一个用tag做标识的活动的游戏物体的列表,如果没有找到则为null。具体代码略过~
FindObjectOfType方法:
static Object FindObjectOfType(Type type)
返回类型为type的活动的第一个游戏对象
FindObjectsOfType方法:
static Object FindObjectsOfType(Type type)
返回类型为type的所有的活动的游戏对象列表
注意:一定保证对象是active的才会找到
为了效率高,一定要保证别在每帧都调用的函数中使用上述函数