transform.Find()仅查找当前对象的子层级,效率远高于全局查找;- 支持嵌套路径(如
"A/B/C"),可以直接定位深层子对象;- 核心优势 :能找到非激活(SetActive (false))的子对象(这是和
GameObject.Find()的最大区别)。
cs
using UnityEngine;
public class FindChildObject : MonoBehaviour
{
private GameObject childObject;
void Start()
{
// 方式1:查找直接子对象(当前对象的一级子物体)
Transform childTrans = transform.Find("DirectChildName");
// 方式2:查找嵌套子对象(通过路径,支持多层嵌套)
// Transform nestedTrans = transform.Find("ParentChild/SubChild/GrandChild");
if (childTrans != null)
{
childObject = childTrans.gameObject;
Debug.Log("成功找到子对象:" + childObject.name);
}
else
{
Debug.LogError("未找到指定的子对象!");
}
}
}
全局查找(GameObject.Find ())
适用于查找场景中任意位置的激活状态游戏对象,是最基础的全局查找方式。
cs
using UnityEngine;
public class FindGlobalObject : MonoBehaviour
{
// 缓存找到的对象,避免重复查找
private GameObject targetObject;
void Start()
{
// 核心代码:通过名称全局查找游戏对象
targetObject = GameObject.Find("TargetObjectName"); // 替换为你要找的对象名
// 判空处理(避免空引用报错)
if (targetObject != null)
{
Debug.Log("成功找到对象:" + targetObject.name);
// 示例操作:修改找到对象的位置
targetObject.transform.position = new Vector3(0, 2, 0);
}
else
{
Debug.LogError("未找到名为【TargetObjectName】的游戏对象!");
}
}
// 后续使用缓存的对象(比如在Update中)
void Update()
{
if (targetObject != null)
{
// 执行你需要的逻辑
}
}
}
GameObject.Find()会遍历场景中所有激活状态(SetActive (true)) 的游戏对象,性能开销较大;- 名称大小写敏感(比如 "Player" 和 "player" 是两个不同名称);
- 绝对不要在
Update/FixedUpdate等高频调用的函数中直接使用,务必在Start/Awake中查找并缓存。