unity3d实现找到unity 查找父物体体下的子物体

3245人阅读
Unity3D(70)
Unity3D_技术(62)
很多人把游戏物体的active改成false后,用GameObject.Find()就找不到游戏对象了。
我来告诉大家一个巧妙的方法,借鉴的是雨松大神的方法~
首先创建一个父级OBJ,OBJ的active不能为false
然后将我们隐藏的游戏物体放在OBJ下~
代码如下:
&span style=&white-space:pre&& &/span&GameObject GObj = GameObject.Find(&OBJ&);
GameObject obj = GObj.transform.Find(&OBJ01&).gameO
obj.SetActive(true);
运行后,会发现OBJ01的active就会变为true。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:349051次
积分:4169
积分:4169
排名:第7817名
原创:55篇
转载:58篇
评论:56条
???☆一起努力学习3D引擎☆??? ?????如果有问题或者其他事情,大家可以随时联系我?????
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'原创文章如需转载请注明:转载自&&QQ群:【Unity3D(AR/VR) 】【Unity3D(游戏) 】&本文链接地址:&
之前写过一篇“Unity3D NGUI动态创建按钮”不少人按照我文章中介绍的方法来动态创建按钮,文章那种做法并不好。现在写一遍新的文章来教大家用Prefab的方式来动态创建NGUI按钮(也可以是任何GameObject)。
1.首先要预制好我们要创建的物体:
a.首先创建一个游戏物体。
b.自定义样式并添加自己需要的脚本。
我添加了一个测试代码,当点击按钮的时候把按钮文字替换为buttonID。
using UnityE
using System.C
public class TestButton : MonoBehaviour
public int ButtonID = 0;
//点击把按钮问题替换为ButtonID
void OnClick()
UILabel buttonLable = GetComponentInChildren&UILabel&();
buttonLable.text = ButtonID.ToString();
c.讲制作好的物体创建为Prefab。
2.动态创建脚本。
using UnityE
using System.C
using System.Collections.G
public class TestCreat : MonoBehaviour
public GameObject ButtonP
public int CreatCount = 3;
public float PosY = 0;
public float Padding = 40;
//存储所有动态添加的按钮
[HideInInspector]
public List&TestButton& Buttons = new List&TestButton&();
void Start()
CreatButton();
void Update()
//按下空格键,删除id为1的按钮
if (Input.GetKeyDown(KeyCode.Space))
//不能在foreach里面直接删除元素,所以把要删除的元素先记录下来,foreach结束后再删除。
TestButton deleteTB =
foreach (TestButton item in Buttons)
if (item.ButtonID == 1)
deleteTB =
if (deleteTB != null)
Destroy(deleteTB.gameObject);
void CreatButton()
Buttons.Clear();
for (int i = 0; i & CreatC i++)
Buttons.Add(AddButton());
TestButton AddButton()
GameObject go = NGUITools.AddChild(this.gameObject, ButtonPre);
go.name = &动态& + Buttons.C
go.transform.localPosition = new Vector3(go.transform.localPosition.x, PosY + Padding * Buttons.Count, go.transform.localPosition.z);
TestButton tb = go.GetComponent&TestButton&();
tb.ButtonID = Buttons.C
b.赋值。
将TestCreat脚本绑定在要创建动态物体的父级。
将做好的Prefab绑定到ButtonPre属性。
之后隐藏掉场景内手动设置的那个原始物体。
3.结果测试。
a.开始运行,创建了CreatCount个按钮,分别取名,Y轴由PosY开始,每个按钮间距Padding。
b.点击按钮,按钮Label改变为ButtonID。
c.按下空格键删除ButtonID为1的按钮。
本文已收录于以下专栏:
相关文章推荐
克隆游戏对象与创建预制
//首先先分配一个内存(随便起个名字都可以看需要)加载一个实例,这个实例名字就是我们需要的物体,这个物体必须是个预制体Prefab
//接着将这个物体实例化成GameObject,让他具有GameO...
using System.C
using System.Collections.G
using UnityE
public class BrickWa...
本次教程,我们来创建一个简单的Prefab组件。
教程参考自人人素材翻译组出品的翻译教程《Unity游戏引擎的基础入门视频教程》。
说到Prefab,中文翻译为预设体,在Unity官方的书本《U...
在unity中实例化prefab
生成器这东西在游戏中很常见,不如我们要随机产生敌人,就需要用到这东西。说白了,我就是需要一个东西在我的要求下,产生大量的对象。在Unity3D直接就提供接口能够轻松完成这一些,我开始还以为生成器是用U...
在进行一些功能开发的时候,我们常常将一些能够复用的对象制作成.prefab的预设物体,然后将预设体存放到Resources目录之下,使用时再动态加载到场景中并进行实例化。例如:子弹、特效甚至音频等,都...
用处:一般当场景出现两个及两个以上,或者会出现重复的物体的时候,用实例化比较方便
目标:鼠标点击后,在鼠标点击的位置出现一个小球
涉及到:预制件,Instantiate(预制件,newVector...
Prefabs(预设)是一种资源类型,可被重复使用的游戏对象。它可以被置入多个场景中,又或者能够在一个场景中被多次置入。当你在一个场景中增加一个Prefabs,你就实例化了一个Prefabs。所有Pr...
Instantiating Prefabs at runtime
By this point you should understand the concept of Prefabs at a ...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在父物体下创建预制子物体【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:76,924贴子:
在父物体下创建预制子物体收藏
以下是个人写的代码,效果可以达到,在父物体下创建预制子物体。新手可参考。大神求指教
有没有更好的方法呢。还有在贴吧里有没有发代码的模块啊,如图:
优秀品质 坚固耐用 各类款项供您选择欢迎新老客户咨询
没有,这已经很好
登录百度帐号推荐应用我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我。我看很多人喜欢在类里面去保存GameObject对象。解决GameObject.Find()无法获取天生activie = false的问题。
& & &private&GameObject&root&;
我觉得你最好不要保存GameObject ,而是去保存Transform ,因为Transform下的方法要比GameObject多,使用频率也要高很多。
& &&private&Transform&root&;
其实我心里一直有个疑问,为什么unity不把GameObject和Transform合并成一个对象。
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
GameObject.Find(&GameObject&);&&&&&&
GameObject
=&&root.transform.Find(&xxxx&).gameObject;
&&&&&&&&&&xxxx.SetActive(true);
Find()方法只能直接去找子节点,如果你想找 孙节点,那么可以用”/“符号把层级关系隔开,找起来很方便。同样无论”xxxx”对象是否active = true 都是可以直接找到对象的。
&&&&GameObject
=&&root.transform.Find(&xxxx/Cube&).gameObject;
值得注意的是,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. unity 还提供了几个获取游戏对象的方法,但是我个人觉得使用频率不高,这里也简单说两句。
GameObject.FindGameObjectsWithTag(“tag”)
GameObject.FindWithTag(“tag”)
根据一个标记来获取游戏对象,返回一个 或者 一个数组,我个人觉得这个两个方法没啥用,因为既然需要用到标记那么相比这个游戏对象必然是非常特殊的一个,所以我会把它存在内存中。
Object.FindObjectOfType
Object.FindObjectsOfType
Resources.FindObjectsOfTypeAll&
根据一个类型返回Object,比如 GameObject 、Texture、Animation 、甚至还可以是你自己写的一个脚本 的范型。它找起来很方便,可以返回一个 或者一个数组。 我觉得这几个方法其实游戏中也没啥用,不过在编辑器中使用的确实很频繁,比如你要做批量检查场景的工具,查找场景中有没有使用某个特殊类型的对象。 或者查看内存的占用量,看看当前内存中那些Texture没有被释放掉。 等等。
还有一个方法,如果你知道自对象的索引,还可以用下面的方法来获取,参数是index的索引。
transform.GetChild(0)
本文已收录于以下专栏:
相关文章推荐
个人比较喜欢制作策略类的第三人称游戏,可以召唤怪物,不知道大家喜不喜欢!如果喜欢的话就支持我一下吧!当然,如果你有一些好的功能和想法,可以一起讨论研究!欢迎大家来这里做客!
        所以今天来...
上周接触到了委托,这周终于在自己的项目中用到了,现在准备用委托和事件的方案替换掉之前的一些使用不足的解决方案!
  在此感谢前辈们的优秀文章,我是根据在网上阅读的文章,通过自己的见解,并在自己的项目...
今天遇到一个很困扰我的问题,我想把敌人给预制,并且进度条一起预制,但是发现不能实例化,且连绑定都不行,哎~~~~明天再解决吧,今天就只能说说进度条和游戏对象的移动了。
注意:以下操作是用iGUI做的...
2.3指示器图片高亮显示shader
新建shader,代码如下
Shader &Custom/SkillHintBg& {
Properties {
_MainTex (&Base Tex...
【unity 代码升华篇】委托进阶、回调函数(三) ...
/thread-.html
(出处: -游戏开发者社区【游戏蛮牛】...
本文固定链接:
/archives/1427
雨松MOMO 日 于 雨松MOMO程序研究院 发表
在同步加载游...
GameObjectFindTransformFind查找游戏对象
前置条件相关API
1 GameObjectFind2 TransformFind3 其他查找
实际测试即使隐藏roo...
在Unity3D 中单例是一个设计模式,可以方便在一个工程中,对单一的游戏对象的脚本组件的控制与调用.
     相比大多数的人都会使用伪单例来解决.虽然,伪单例使用起来非常的简单方便,但只适用于一...
1     对象池代码实现
       在理解 Unity3D游戏架构设计之对象管理【一】和Unity3D游戏架构设计之对象管理【二】中理论基础和设计模式的基础,编写代码就比较容易了。
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
大家好!最近在写一个父子关系的效果,木有思路,特此来求助,非常感谢!目标效果:
两物体cube和sphere非父子关系。移动cube,sphere跟着移动,转动cube,sphere跟着转动,两个物体的相对位置不变。
直观效果和unity中父子关系移动和旋转时一样。(旋转效果如同在hirearchy中修改cube的rotation一样)
本帖最后由 keischan 于
17:41 编辑
感谢! 问题已经解决!其实就是自身坐标系和世界坐标系的转换,还有四元数的使用!代码就几行,贴上来,为有相同问题的朋友提供思路:using UnityE
using System.C
public class Parent : MonoBehaviour {
Vector3 relativeP
Quaternion originalR
void Start()
relativePos = transform.InverseTransformPoint(child.position);
originalRotate = child.
void Update()
child.position = transform.TransformPoint(relativePos);
child.rotation = transform.rotation * originalR
,要想保证相对位置不变,只要能获取到速度和方向就可以了。。明白否,拥有相同的速度和方向,在同一时间做相同的事情即可。。。
代码中 修改 持有的对象不就得了。。。。
要回复问题请先或
浏览: 1069
关注: 0 人

我要回帖

更多关于 unity 设置父物体 的文章

 

随机推荐