ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Unity获取场景中物体的方法详解,以及如何获取active为false的根节点

Unity获取场景中物体的方法详解,以及如何获取active为false的根节点 下面以如下的测试场景作为例子进行说明。此时测试的脚本是挂载在TestNode1上一、GameObject.Find(string param)根据名字查找最常用的方法是GameObject.Find这里参数可以填物体的名字并且是全局搜索与脚本所在的节点并没有关系比如下面直接查找TestNode111和TestNode22均可以找到对应的点if (GameObject.Find(TestNode111) ! null) { Debug.Log(GameObject.Find TestNode111 true); } else { Debug.Log(GameObject.Find TestNode111 false); } if (GameObject.Find(TestNode22) ! null) { Debug.Log(GameObject.Find TestNode22 true); } else { Debug.Log(GameObject.Find TestNode22 false); }但是由于这个方法查找的是全局的物体所以当物体比较多的时候会消耗较大的性能所以不要过于频繁地调用。还有要注意的一点是如果场景中存在同名节点的话。这里只会返回找到的第一个节点所以要避免重名的情况。还有就是GameObject.Find参数为物体名时无法找到active为false的节点可以尝试将TestNode111的active设为false可以看到这时候就无法找到这个节点了根据路径查找参数还可以填路径这里的路径可以是绝对路径和相对路径通过路径来寻找节点的消耗会比直接根据物体名称要低节点结构还是如下绝对路径是以/开头或者物体名字开头并且场景名称是不在这个路径里面。比如查找TestNode111这个点。绝对路径应该填GameObject.Find(/TestNode1/TestNode11/TestNode111)如果填的是GameObject.Find(/TestScene/TestNode1/TestNode11/TestNode111)或者GameObject.Find(TestScene/TestNode1/TestNode11/TestNode111)都是无法查找到对应节点的。相对路径的时候需要以物体的name开头而不能以/开头比如GameObject.Find(TestNode11/TestNode111) 查找成功而GameObject.Find(/TestNode111)查找失败if (GameObject.Find(TestNode11/TestNode111) ! null) { Debug.Log(GameObject.Find TestNode11/TestNode111 true); } else { Debug.Log(GameObject.Find TestNode11/TestNode111 false); } if (GameObject.Find(/TestNode1/TestNode11/TestNode111) ! null) { Debug.Log(GameObject.Find /TestNode1/TestNode11/TestNode111 true); } else { Debug.Log(GameObject.Find /TestNode1/TestNode11/TestNode111 false); } if (GameObject.Find(TestNode1/TestNode11/TestNode111) ! null) { Debug.Log(GameObject.Find TestNode1/TestNode11/TestNode111 true); } else { Debug.Log(GameObject.Find TestNode1/TestNode11/TestNode111 false); } if (GameObject.Find(TestScene/TestNode1/TestNode11/TestNode111) ! null) { Debug.Log(GameObject.Find TestScene/TestNode1/TestNode11/TestNode111 true); } else { Debug.Log(GameObject.Find TestScene/TestNode1/TestNode11/TestNode111 false); } if (GameObject.Find(/TestNode111) ! null) { Debug.Log(GameObject.Find /TestNode111 true); } else { Debug.Log(GameObject.Find /TestNode111 false); }在用绝对路径找active为false的时候如果被查找的节点active为false而父节点active为true还是可以找到这个节点的。结果如下用相对路径查找则无法找到active为false的节点而当他的父节点active也为false的时候查找就会失败结果如下二、GameObject.FindWithTagGameObject.FindWithTag的逻辑跟GameObject.Find基本相同同样是全局查找。跟GameObject根据名字查找的功能类似只不过查找的是根据Tag属性而且同样无法找到active为false的节点。三.Transform.Findtransform.Find是查找挂载脚本节点的子节点并且只能找到孩子节点直接Find孙子是无法找到的。如果想要找到孙子节点就需要逐级地去调用Find函数。并且transform.Find也可以找到active为false的节点下面是直接查找孩子节点和孙子节点的结果if (this.transform.Find(TestNode11) ! null) { Debug.Log(this.transform.Find TestNode11 true); } else { Debug.Log(this.transform.Find TestNode11 false); } if (this.transform.Find(TestNode111) ! null) { Debug.Log(this.transform.Find TestNode111 true); } else { Debug.Log(this.transform.Find TestNode111 false); }四、获取active为false的根节点的方法因为transform可以通过层级关系查找active为false的节点。所以用transform.Find基本可以找到场景里的所有节点。对于不在这个Transfrom的节点树上的根节点比如例子中的TestNode2如果active为true也可以直接用GameObject.Find来查找。但是这里面还包含一种特殊的情况就是不在同一个节点树上active为false的根节点下图中的TestNode2是active为false的根节点。这时候有两种方法UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects()Resources.FindObjectsOfTypeAll(typeof(GameObject))代码如下GameObject[] allRoot UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects(); for (int i 0; i allRoot.Length; i) { if (allRoot[i].name TestNode2) { Debug.Log(GetRootGameObjects find TestNode2 true); break; } } GameObject[] all Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[]; for (int i 0; i all.Length; i) { var item all[i]; if (item.scene.isLoaded) { if (item.name TestNode2) { Debug.Log(FindObjectsOfTypeAll find TestNode2 true); break; } } }可以看到下方的结果两种方法都可以顺利到找到TestNode2创作不易。如果这篇文章对你有所帮助欢迎关注、点赞、收藏我会持续输出游戏开发相关内容关注不迷路。ღ( ´ᴗ )比心。
返回列表