前言

在使用Unity进行开发,我们经常需要让一些代码和对应的物体/组件关联,而大多数开发者会选择直接在编辑器界面通过拖拽来完成这个操作
这个方法简单又简便,但就本人的一点经验而言,有以下弊端
1.有些时候重复拖拽非常麻烦
2.没办法在运行中解决绑定的需求,这一点在切换场景的时候特别容易造成错误

因此,拖拽是有极限的,所以我选择代码

利用代码绑定的方法很多(见文章末尾附录),其中有一个小问题就是如何查找Active为False的物体
如果我们使用一般的方法(直接GameObject.FindXXX系列指令),是无法获得Active为False的物体的
本文就旨在解决利用代码查找Active为False的物体这个问题

Transform.Find

使用

答案就是使用Transform.Find()方法,transfor可以通过曾经关系来查找到active为false的节点
唯一需要注意的是,Transform.Find()进行的是逐层查找,也就是说只能找到子物体,而不能找到孙物体
当我们想要找到孙物体的时候,只能一级一级往下拨

例子

如果,比如此时我们想获得”UI”下的”TextBackGround”物体(可以看到此时它Active == false)

于是我们需要写下(前后文略):

1
2
3
4
5
6
7
8
public GameObject theDialog ; 
public GameObject UI ;

private void Start()
{
UI = GameObject.Find("UI");
theDialog = UI.transform.Find("TextBackGround").gameObject ;
}

此时我们完成了”找到UI物体”->”在“UI”下寻找其子物体”的操作

这里我是由于”UI”这个物体还有用,因此这么写,你也可以尝试直接一步到位

1
theDialog = (GameObject.Find("UI")).transform.Find("TextBackGround").gameObject ;

如果根节点/父节点也是false怎么办

建议直接建个空的gameObject放它们…然后把它设置为Active = true
然后“空gameObjetc” -> “根物体” -> “子物体”

如果不想这么干,就需要使用:

1
2
UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects();
Resources.FindObjectsOfTypeAll(typeof(GameObject)) ;

就不在这里赘述了,如何使用可以详见官方手册,很详细