GameObject.Find
通过name查找一个GameObject并返回它。此函数仅返回active的GameObject。如果名字中包含了“/”,它将像路径名一样遍历层次结构查找。
接下来我将创建一个场景,并进行此函数的运用。
创建TestFind脚本
//查找一个显示的物体 GameObject_01在子节点中也能找到
GameObject go1 =GameObject.Find("GameObject_01");
print(go1.name);
//如果名字中包含了“/”,它将像路径名一样遍历层次结构查找
GameObject go2 = GameObject.Find("/GameObject/GameObject_01");
print(go2.name);
像这样,都能正确的返回GameObject。出于性能原因,建议不要在Update方法使用此功能。将GameObject分配给MonoBehaviour.Start中的变量,并使用MonoBehaviour.Update中的变量。
注意:如果您希望找到一个子GameObject,通常使用Transform.Find更好。
Transform.Find
找到一个孩子name并将其归还。如果找不到子name项,则返回null。如果name包含’/'字符,它将像路径名一样访问层次结构中的Transform。
注意:Find不会在Transform层次结构中执行递归下行。
还是接着刚刚的场景,在GameObject_01下又创建了一个Gameobject_01_01。在TestFind脚本里的Start方法添加代码。
//Find不会在Transform层次结构中执行递归下行查找,所以如果在子子物体上,name要填“***/***”
GameObject go3 = this.gameObject.transform.Find("GameObject_01").gameObject; //该脚本挂在GameObject_01的父物体上
print(go3.name);
// GameObject go4 = this.gameObject.transform.Find("GameObject_01_01").gameObject; //返回将为空
GameObject go4 = this.gameObject.transform.Find("GameObject_01/GameObject_01_01").gameObject;
print(go4.name);
因此GameObject.Find和TransForm的不同一点就是前者可以在层次结构中递归查找,而后者只能查找子物体,因此我写了一个工具类,TransForm也能递归查找。
Transform查找工具类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace SUIFW
{
public class UnityHelper : MonoBehaviour {
/// <summary>
/// 查找子节点对象
/// 内部使用“递归算法”
/// </summary>
/// <param name="goParent">父对象</param>
/// <param name="chiildName">查找的子对象名称</param>
/// <returns></returns>
public static Transform FindTheChildNode(GameObject goParent,string chiildName)
{
Transform searchTrans = null; //查找结果
searchTrans=goParent.transform.Find(chiildName);
if (searchTrans==null)
{
foreach (Transform trans in goParent.transform)
{
searchTrans=FindTheChildNode(trans.gameObject, chiildName);
if (searchTrans!=null)
{
return searchTrans;
}
}
}
return searchTrans;
}
/// <summary>
/// 获取子节点(对象)脚本
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="goParent">父对象</param>
/// <param name="childName">子对象名称</param>
/// <returns></returns>
public static T GetTheChildNodeComponetScripts<T>(GameObject goParent,string childName) where T:Component
{
Transform searchTranformNode = null; //查找特定子节点
searchTranformNode = FindTheChildNode(goParent, childName);
if (searchTranformNode != null)
{
return searchTranformNode.gameObject.GetComponent<T>();
}
else
{
return null;
}
}
/// <summary>
/// 给子节点添加脚本
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="goParent">父对象</param>
/// <param name="childName">子对象名称</param>
/// <returns></returns>
public static T AddChildNodeCompnent<T>(GameObject goParent,string childName) where T:Component
{
Transform searchTranform = null; //查找特定节点结果
//查找特定子节点
searchTranform = FindTheChildNode(goParent, childName);
//如果查找成功,则考虑如果已经有相同的脚本了,则先删除,否则直接添加。
if (searchTranform!=null)
{
//如果已经有相同的脚本了,则先删除
T[] componentScriptsArray=searchTranform.GetComponents<T>();
for (int i = 0; i < componentScriptsArray.Length; i++)
{
if (componentScriptsArray[i]!=null)
{
Destroy(componentScriptsArray[i]);
}
}
return searchTranform.gameObject.AddComponent<T>();
}
else
{
return null;
}
//如果查找不成功,返回Null.
}
/// <summary>
/// 给子节点添加父对象
/// </summary>
/// <param name="parents">父对象的方位</param>
/// <param name="child">子对象的方法</param>
public static void AddChildNodeToParentNode(Transform parents, Transform child)
{
child.SetParent(parents,false);
child.localPosition = Vector3.zero;
child.localScale = Vector3.one;
child.localEulerAngles = Vector3.zero;
}
}
}