什么方法可以找到场景下unity 搜索所有场景的GameObject

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
现在我的场景中有很多物体,假设是多到使用find来查找会影响效率的程度。
那么我现在已经通过某种方法获取了我想要的那个物体的父物体,但是这个父物体不只是一级父物体。
简单来说就是我想要的物体的父物体或者父物体的父物体或者更向上。或者说是就是知道这个物体有个祖宗,但是第几代不知道。
在这种情况下,我如何通过这个祖宗物体来提高我的搜索效率。
GameObject.Find("祖宗").transform.FindChild("物体").gameO 请问这种写法有效嘛?
GameObject.Find("祖宗").transform.FindChild("a/b/c/d").gameObject
a/b/c/d是祖宗的子对象。。。
这样效率是最快的。。不信可以试下哟。
你可以通过FindWithTag去找。
我觉得……如果只是在父物体和子物体之间,直接用Get就行了,因为你拿到之后也只是需要一部分的组件而已,根本不用Find那么麻烦:
this.GetComponentsInChildren();
this.GetComponentInParent();
要回复问题请先或
浏览: 1089
关注: 4 人Unity3d获取游戏对象的几种方法 - CSDN博客
Unity3d获取游戏对象的几种方法
序列化变量后拖游戏对象的方法就不说了,最简单也是最麻烦的方法。
1.GameObject.Find()
通过场景里面的名子或者一个路径直接获取游戏对象。&
GameObject&root&=&GameObject.Find(“GameObject”);
我觉得如果游戏对象没再最上层,那么最好使用路径的方法,因为有可能你的游戏对象会有重名的情况,路径用“/”符号隔开即可。
GameObject&root&=&GameObject.Find(“GameObject/Cube”);
GameObject.Find()使用起来很方便,但是它有个缺陷如下图所示,就是如果你的这个GameObject天生acive = false的话。那么你用GameObject.Find()是永远也无法获取它的对象的。如果对象都获取不到,那么对象身上脚本啊 组件啊啥的都是获取不到的,变成了没有意义的对象。
就这个问题我查过很多资料,最终也无果。。但是我用另外一个巧妙的办法可以解决它。(后面详解)或者你也可以提前把所有的游戏对象保存在内存中。
GameObject.Find()方法在游戏中的使用频率很高。但是它也很消耗性能,你可以想想它的原理肯定也是用类似递归的形式来做的,那么我们就要尽量更少的调用GameObject.Find()方法,可以把获取的游戏对象,保存在内存里,这是再好不过的选择了。 尤其是在Update方法中不要去 Find()游戏对象!!
2 .Transform.Find()
还记得上面我说过用GameObject无法获取天生acive = false的游戏对象,如果你用Transform.Find()的话就可以很好的获取,另外Unity还提供了一个Transform.FindChind()的方法,这个方法未来会被unity废弃,大家最好就别用了,用Transform.Find()可以取代。
如下代码,我们先获取顶级对象root 。接着用Find()去找它的子节点”xxxx”的对象,无论”xxxx”对象是否active = true 都是可以直接找到对象的。
GameObject root = GameObject.Find(&GameObject&);
GameObject xxxx =&&root.transform.Find(&xxxx&).gameO
xxxx.SetActive(true);
Find()方法只能直接去找子节点,如果你想找 孙节点,那么可以用”/“符号把层级关系隔开,找起来很方便。同样无论”xxxx”对象是否active = true 都是可以直接找到对象的。
GameObject cube =&&root.transform.Find(&xxxx/Cube&).gameO
值得注意的是,unity规定了比如父节点active = true 并且子节点的 active = true 都满足的情况下 才能全部显示。使用Transform.Find()可以很方便的获取游戏对象,因为有了游戏对象,那么它身上的脚本啊组件啊什么的都可以很方便的获取到。
但是Transform.Find()必须要保证你的顶级父对象的activity = true。举个例子,你做了一个场景有一些地图你在场景里面预先activie = false了, 你希望在游戏中的某个时间点把它们都打开 setActive(true)
你可以把“map”节点放在一个active = true的GameObject上,无论是关闭 或者 显示 代码中写起来都很方便。 假如你的map节点就是顶级节点,那么它一旦天生acive = false ,那么你将无法得到它的对象,更无法设置它的属性了。
GameObject&root&=&GameObject.Find(“GameObject”);&&&&&
GameObject&map&=&&root.transform.Find(“map”).gameO&&&&&&
map.SetActive(true);**
3. GameObject.FindGameObjectsWithTag(“tag”)/GameObject.FindWithTag(“tag”)
根据一个标记来获取游戏对象,返回一个 或者 一个数组,我个人觉得这个两个方法没啥用,因为既然需要用到标记那么相比这个游戏对象必然是非常特殊的一个,所以我会把它存在内存中。
Object.FindObjectOfType
Object.FindObjectsOfType
Resources.FindObjectsOfTypeAll&
根据一个类型返回Object,比如 GameObject 、Texture、Animation 、甚至还可以是你自己写的一个脚本 的范型。它找起来很方便,可以返回一个 或者一个数组。 我觉得这几个方法其实游戏中也没啥用,不过在编辑器中使用的确实很频繁,比如你要做批量检查场景的工具,查找场景中有没有使用某个特殊类型的对象。 或者查看内存的占用量,看看当前内存中那些Texture没有被释放掉。 等等。
还有一个方法,如果你知道自对象的索引,还可以用下面的方法来获取,参数是index的索引。
transform.GetChild(0)
找到了一个即使隐藏root节点gameObject也能进行查找的方法。/questions/52560/gameobjectfind-work-on-inactive-objects.html
本文已收录于以下专栏:
相关文章推荐
/archives/2768
tranform.find('子节点名字')
tranform.find()...
开始是找了下U3D的SCRIPT手册,发现找不到这玩意。然后在谷歌搜"unity3d get all child"才找到了答案。很简单的答案,不过挺有意思的,挺好用。
foreach (...
我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我。我看很多人喜欢在类里面去保存GameObject对象。解决G...
可以得到四个目的:
1、获取GameObject的所有子物体;
2、获取场景所有的物体/指定类型的物体;
3、获取项目中Resource目录下的所有文件/指定类型文件;
4、获取项目中任意目录下的所有...
该平台为用户提供了两个输入对象Touch与Input。在unity中使用Touch输入对象来获取触控动作相关的参数。因目前系统多为触屏的,所以我们把Touch 代码写在相应的游戏对象的脚本上即可。其对...
有一次需要在Editor模式下获取任意文件夹下的所有资源对象,包括子文件夹,我尝试了AssetDatabase.LoadAllAssetsAtPath(string assetPath),理想中的Ob...
在游戏开发中动态的创建、设置、销毁游戏对象经常用到,刚刚接触Unity,在此做个笔记吧。
1.如何动态创建对象:调用GameObject的CreatePrimitive方法可以按模型进行创建,Pr...
转载自:http://blog.csdn.net/u/article/details/
unity中提供了获取对象的五种方法:
通过对象名称(...
本来是个很简单的问题,但由于我经验不足绕了一大圈子,详细记录如下:
想实现的效果:Camera 视角跟随游戏对象拍摄,不管游戏对象面向哪个方向,Camera始终在游戏对象正后方。
前一篇分析了如何使Camera一直跟随在游戏对象后面的方法,可详见点击打开链接
前面两步都是一样的,就是:
camera.transform.position = g...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Unity3D学习笔记——递归+非递归遍历GameObject的子物体 - 水煮鱼丸 - 博客园
随笔 - 45, 文章 - 0, 评论 - 206, 引用 - 0
  在Unity3D中没有提供直接的方法获取某个GameObject的子GameObject,但是所有的GameObject都有transform对象,所以,一般是通过获取子GameObject的transform来达到遍历子GameObject的目的。官网手册中&Transform&页面给出了如下示例代码:
1 using UnityE
2 using System.C
4 public class example : MonoBehaviour {
void Example() {
foreach (Transform child in transform) {
child.position += Vector3.up * 10.0F;
  但是,这段代码只能遍历该GameObject的直接子GameObject,而要遍历该GameObject的所有子GameObject,则需要进行递归:
1 using UnityE
2 using System.C
4 public class example: MonoBehaviour {
void Example() {
Recursive(gameObject);
private void Recursive(GameObject parentGameObject){
//Do something you want
foreach (Transform child in parentGameObject.transform){
Recursive(child.gameObject);遍历父物体下所有子物体的几种方式
1、通过标签来寻找
void ForeachObjs()
//GameObject objs[] = GameObject
objs = GameObject.FindGameObjectsWithTag(&Cube_00&);
foreach (GameObject obj in objs)
obj.AddComponent(&OnTiggerEnterSendMessage&);
}2、通过Transform来寻找并附加脚本
&foreach (Transform child in gameObject.transform)
child.gameObject.AddComponent(&OnTiggerEnterSendMessage&);
}3、另外一种方式(转)
//把这个函数放到你的代码中 check代表你要查询的物体 name为名称 如return GetTransform(transform,&bone12&);
Transform GetTransform(Transform check,string name)
foreach (Transform t in check.GetComponentsInChildren&Transform&())
if(t.name==name){}
GetTransform(t,name);
}4、(转)
很多高级游戏代码不仅仅控制单一物体。Unity脚本接口有很多方法获得和访问其他游戏物体和组件。下面我们假设有一个名为OtherScript.js的脚本附属于场景中的游戏物体。
var foo = 5;
function DoSomething ( param : String) {
print(param + & with foo: & + foo);
}
1.使用检视视图指定参数。
你能通过检视视图为一些游戏类型指定变量:
// Translate the object dragged on the target slot
var target : T
function Update () {
target.Translate(0, 1, 0);
}
也能显示参数在其他物体检视视图。下面你能在Inspector面板中拖拽包含OtherScript的游戏物体到target上。
// Set foo DoSomething on the target variable assigned in the inspector.
var target : OtherS
function Update () {
// Set foo variable of the target object
target.foo = 2;
// Call do something on the target
target.DoSomething(&Hello&);
}
2.通过继承结构
你能通过Transform组件获得一个子和父物体到现在的物体。
// Find the child &Hand& of the game object
// we attached the script to
transform.Find(&Hand&).Translate(0, 1, 0);
你只要在hierarchy面板建立了transform,你就能用GetComponent去获取other scripts。
// Find the child named &Hand&.
// On the OtherScript attached to it, set foo to 2.
transform.Find(&Hand&).GetComponent(OtherScript).foo = 2;
// Find the child named &Hand&.
// Call DoSomething on the OtherScript attached to it.
transform.Find(&Hand&).GetComponent(OtherScript).DoSomething(&Hello&);
// Find the child named &Hand&.
// Then apply a force to the rigidbody attached to the hand.
transform.Find(&Hand&).rigidbody.AddForce(0, 10, 0);
你可以循环到它所有的子物体。
// Moves all transform children 10 units upwards!
for (var child : Transform in transform) {
child.Translate(0, 1, 0);
}
查看文档Transform类 可以获得更多信息。
3.通过名字或标签
你能用确定的标签搜索物体,使用GameObject.FindWithTag 和GameObject.FindGameObjectsWithTag。使用GameObject.Find通过名字获得游戏物体。
function Start ()
{
// By name
var go = GameObject.Find(&SomeGuy&);
go.transform.Translate(0, 1, 0);
// By tag
var player = GameObject.FindWithTag(&Player&);
player.transform.Translate(0, 1, 0);
}
你能使用GetComponent获得脚本或组件在找到的游戏物体上。
function Start ()
{
// By name
var go = GameObject.Find(&SomeGuy&);
go.GetComponent(OtherScript).DoSomething();
// By tag
var player = GameObject.FindWithTag(&Player&);
player.GetComponent(OtherScript).DoSomething();
}
一些特殊对象如主摄像机有快捷方式,可以使用Camera.main。
4.传递参数
一些事件中包含详细的事件。例如:扳机事件传递(碰撞)Collider组件到碰撞物体的handler函数。
OnTriggerStay给我们一个碰撞参数.从碰撞体我们能给他赋一个刚体。
function OnTriggerStay( other : Collider ) {
// If the other collider also has a rigidbody
// apply a force to it!
if (other.rigidbody) {
other.rigidbody.AddForce(0, 2, 0);
}
}
或者我们可以获取游戏中碰撞者包含的任意组件。
function OnTriggerStay( other : Collider ) {
// If the other collider has a OtherScript attached
// call DoSomething on it.
// Most of the time colliders won't have this script attached,
// so we need to check first to avoid null reference exceptions.
if (other.GetComponent(OtherScript)) {
other.GetComponent(OtherScript).DoSomething();
}
}
注意上面的例子,使用其他变量上的后缀,你能获取一些碰撞物体里的组件。
5.某个类型的所有脚本
从一个类找到任意对象或脚本,用Object.FindObjectsOfType或获得某个类型的第一个物体使用Object.FindObjectOfType.
function Start ()
{
// Find the OtherScript which is attached to any game object in the scene.
var other : OtherScript = FindObjectOfType(OtherScript);
other.DoSomething();
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5、自己写的深度优先遍历,找物体的孩子并做些什么事情
using UnityE
using System.C
using UnityE
public class ChangeMeshRenderQuality : Editor
[MenuItem(&GameObject/ChangeMeshRenderQuality&)]
static void FindChildMeshRender()
Debug.LogWarning(&Change Now!!!&);
Transform[] selection =
Selection.GetTransforms( SelectionMode.TopLevel | SelectionMode.Editable);
foreach(Transform t in selection)
ChangeQuality(t);
static void ChangeQuality(Transform T)
for(int i = 0 ; i & T.childC i ++)
Transform childTransform = T.GetChild(i);
if(childTransform.GetComponent&SkinnedMeshRenderer&() != null)
childTransform.GetComponent&SkinnedMeshRenderer&().quality = SkinQuality.Bone4;
ChangeQuality(childTransform);
// Disable the menu if there is nothing selected
// 如果什么都没有选择将禁用菜单功能
[MenuItem (&GameObject/ChangeMeshRenderQuality&, true)]
static bool ValidateSelection()
return Selection.activeGameObject !=
共1条评分,
常用的功能。
要评论请先&或者&
常用的功能。
感谢分享!这些代码段够实用!
:常用的功能。 谢谢鹰大的关注~~~
不错的总结,顶起
其实可以考虑用插件来传值
Mark &学习
感谢分享,正在做个多级菜单不知道有什么好方法= =}

我要回帖

更多关于 梦幻西游所有场景 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信