Unity3D深入浅出 -组件与节点之间的调用关系

一、transform组件用途

1.维护场景树

2.对3D物体的平移,缩放,旋转

二、场景树定义

在Hierarchy视图中显示的:

一个game_scene场景,下面有Main Camera节点,Directional Light节点,game_root节点,game_root节点下又有Cube子节点,Sphere子节点,组成game_scene场景树。

三、组件和节点

1.每个节点都有一个transform组件

2.每一个继承自MonoBehaviour的组件都有一个数据成员指向这个节点的transform组件。

使用this.transform;获得。//可以通过任何一个组件来获得每一个节点的transfrom组件。

同理,由于每一个继承自MonoBehaviour的组件都有一个数据成员gameObject指向组件实例所挂载的场景的节点对象,transfrom它也是一个组件,所以它也有一个gameObject指向它挂的节点。

使用this.transform.gameObject获得。//Debug.Log(this.transform.gameObject.name);

3.每一个继承自MonoBehaviour的组件都有一个数据成员gameObject指向组件实例所挂载的场景的节点对象,使用this.gameObject获得。

Debug.Log(this.gameObject.name);//节点名字
Debug.Log(this.gameObject.layer);//节点所在层名字

Debug.Log(this.gameObject.tag);//节点的标记或标签值
Debug.Log(this.gameObject.activeSelf); // 自己这个属性是否可见,自己节点名字旁边的勾是否打了,结果是true或false
Debug.Log(this.gameObject.activeInHierarchy); // 自己在这个体系里面是否可见,也就是如果它的父节点设置为不显示,自己还是可见的,那么它的activeInHierarchy就是不可见,结果是true或false

this.gameObject.SetActive(true);//设置节点为可见

4.总结

一个节点上挂载的所有组件实例,包括transform组件实例都有一个数据成员(transform)指向transform组件,所有组件实例,包括transform组件实例都有一个数据成员(gameObject)指向该节点。

所以经常用this.tranform,this.gameObject获得。

5.场景树的构成过程

每一个节点都有一个transform组件,一个父transform组件下面有好多子transform组件,而每一个transform组件都指向一个节点,在transform组件构成transform时,另一方面也间接构成了节点树。

五、使用transform组件访问孩子节点

所以可以用transform组件,来访问或者获得节点下面的所有孩子节点
方法1
比如找到game_root节点下的Cube节点,在game_root节点的game_scene组件的start方法里面写
Transform trans = this.transform.Find("Cube");//找到孩子transform组件里节点名叫Cube的transform组件
GameObject cube= trans.gameObject;//通过Cube的transform组件再得到它的gameObject节点
Debug.Log(cube.name);//输出Cube节点名字

方法2
Transform trans = this.transform.FindChild("Sphere");
GameObject sphere= trans.gameObject;
Debug.Log(sphere.name);

方法1和2的区别是
find可以多层嵌套查询,可以查孙子节点,孙子的孙子节点,FindChild只能查自己的子节点。
多层节点查询要写路径
Transform trans = this.transform.Find("Sphere/test");
GameObject test = trans.gameObject;
Debug.Log(test.name);

方法3
this.transform.GetChild(0).gameObject.name;//0代表第一个子节点的transform组件,1代表第二个,以此类推,性能比find好一些,但是我们通常用find

//查找一个父节点到底有多少个子节点,或者叫子transform组件
Debug.Log(this.transform.childCount);

六、使用transform组件访问父亲节点

子节点找父节点也是先找到子节点的transform组件,再得到父亲的transform组件,最后得到父亲的gameObject节点
Transform trans = this.transform.Find("Sphere/test");
Debug.Log(trans.parent.gameObject.name);
所以每一个transform组件实例还有一个数据成员(parent)指向父节点的transform组件。

Main Camera,Directional Light,game_root这些节点都是没有父节点的,他们的transform组件也没有父亲的transform组件

七、使用GameObject查找节点

// 基于GameObject的查找,来找GameObject,全局查找,GameObject.Find静态函数
Debug.Log(GameObject.Find("game_root/Sphere/test").name);

八、使用Tag查找节点
// 基于Tag的全局查找,如果有多个节点的Tag是一样的,那么先找到的,先返回,查找的顺序好像不是是按顺序从上到下的,深的子节点反而先找到
Debug.Log(GameObject.FindWithTag("game_root").name);
Debug.Log(GameObject.FindWithTag("test").name);//多层嵌套的没关系,只要用自己的Tag查找就行了

// 如果有多个节点,都是同样的tag,会发生什么样的事情呢?
GameObject[] game_sets = GameObject.FindGameObjectsWithTag("test");//返回的是一个放着GameObject类型元素的数组
for (int i = 0; i < 2; i++) {
Debug.Log(game_sets[i].name);//先子后父
}

九、绝对坐标和相对坐标(世界坐标和局部坐标)

1.我的家在地球上东经10,北纬10(世界坐标)
2.我在我家往北100米(相对坐标)
1+2=我的世界坐标

获得节点的坐标位置
Debug.Log(this.transform.position);//(0,2,10)//Unity编辑器里面的postion是相对坐标,可是代码里面的postion是绝对坐标,也就是说这里的position是绝对坐标

相对坐标是
Debug.Log(trans.localPosition); // (0, 2, 0)

十、forward,right,up
把物体想象成一个人,本来这个人的x,y,z坐标轴的指向是和世界的x,y,z坐标轴的指向是重合的,x代表right,y代表up,z代表forward
如果把物体旋转一个角度,这时候就像人转一个角度,人的左右上都改变了,所以这时候forward,right,up的方向都变了

Debug.Log(trans.forward);//结果是一个向量,也就是一个三维坐标
Debug.Log(trans.right);
Debug.Log(trans.up);

十一、距离上一次刷新的时间

// Update is called once per frame
void Update () {
float dt = Time.deltaTime; // 距离上一次刷新的时间
}

void FixedUpdate() {
float dt = Time.fixedDeltaTime; // 物理引擎固定更新的时间间隔
}

时间: 2024-10-10 08:13:55

Unity3D深入浅出 -组件与节点之间的调用关系的相关文章

[tty与uart]1.Linux中tty框架与uart框架之间的调用关系剖析

转自:http://developer.51cto.com/art/201209/357501_all.htm 目录 在这期间有一个问题困扰着我,那就是来自用户空间的针对uart设备的操作意图是如何通过tty框架逐层调用到uart层的core驱动,进而又是如何调用到真实对应于设备的设备驱动的,本文中的对应设备驱动就是8250驱动,最近我想将这方面的内容搞清楚. 在说明这一方面问题之前我们先要大致了解两个基本的框架结构,tty框架和uart框架. 1.tty框架 在linux系统中,tty表示各种

Linux中tty框架与uart框架之间的调用关系剖析【转】

转自:http://developer.51cto.com/art/201209/357501.htm 之前本人在"从串口驱动的移植看linux2.6内核中的驱动模型 platform device & platform driver"一文中已经写到了移植的设备是如何通过platform总线来与对应的驱动挂载. 在这期间有一个问题困扰着我,那就是来自用户空间的针对uart设备的操作意图是如何通过tty框架逐层调用到uart层的core驱动,进而又是如何调用到真实对应于设备的设备

oracle处理节点之间的父子关系

通常当与树的结构之间的关系处理,这是一个很复杂的事情,我们可以通过程序代码去逐层遍历父或子节点,这样做的缺点是很明显,效率不高,操作复杂性是比较大的.而当我们使用Oracle当数据库,我们可以有一个简单的解决方法,例如下列: 1.首先创建一张表.保存父子关系 drop table tmp_node; create table tmp_node(id varchar2(500),p_id varchar2(500)); 2.向表中插入数据 insert into tmp_node(p_id,id)

java 深入理解内部类以及之间的调用关系

什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限).内部类主要有以下几类:成员内部类.局部内部类.静态内部类.匿名内部类 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 . (2).内部类不能用普通的方式访问. (3).内部类声明成静态的,就不能随

JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)

利用节点间的层次关系获取节点: 上一节讲了3中获取的方式: * ※※一.绝对获取,获取元素的3种方式:-Element * 1.getElementById(): 通过标签中的id属性值获来取该标签对象 * 2.getElementsByName(): 通过标签中的name属性值来获取该标签对象集合 * 3.getElementsByTagName(): 通过标签名来获取该标签对象集合 现在来看看相对获取的方式: ※※二.相对获取(利用节点之间的层次关系),获取节点:-Node 1.父节点:pa

[原]Unity3D深入浅出 - 摄像机组件(Camera)

在Unity中创建一个Caaera后,除了默认带一个Transform组件外,还会附带Flare Layer.GUI Layer.Audio Listener等4个组件,如下图. ClearFlags:清除标记:决定屏幕中哪部分被清除.一般用于多台摄像机来描绘不同对象的情况,有一下三种模式. Skybox:天空盒(默认项).在屏幕空白处显示当前摄像机的天空盒,如果没有指定天空盒,则会显示默认背景色. Solid Color:如果没有设置天空盒,将默认显示此处设置的背景色. Depth only:

[原]Unity3D深入浅出 - 光源组件(Light)

Unity中提供了四种光源: Directional light: 方向光,类似太阳的日照效果. Point light: 点光源,类似蜡烛. Spotlight: 聚光灯,类似手电筒. Area Light:区域光,无法用作实时光照,一般用于光照贴图烘培. 接下来介绍光源的参数:如下图 Type:可以选择以上介绍的四种光源类型 Range:设置光源范围的大小,从光源对象的中心发射的距离.只有Point和Spotlight有该参数. Color:光源的颜色 Instensity:光源的强度 Co

[原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单

Component(组件)是用来添加到GameObject对象上的一组相关属性,本质上每个组件都是一个实例,比如在Cube上添加一个Mesh网格,即面向对象的思维方式可以理解成Cube对象里包含了一个Mesh对象. Component主要包含以下组件:  Mesh:添加网格类型的组件 Mesh Filter:网格过滤器 Text Mesh:文本网格 Mesh Renderer:网格渲染器 Effects:添加特效类型组件 Particle System:粒子系统 Trail Renderer:拖

[原]Unity3D深入浅出 - 粒子系统(Particle System)

粒子系统是在三维控件渲染出来的二维图像,主要用于烟,火,水滴,落叶等效果.一个粒子系统由例子发射器.粒子动画器和粒子渲染器三个独立的部分组成. Unity中自带了一些粒子效果,在Assets>ImportPackage>Particles,即可将Prticles.UnityPackage导入到项目中,这些粒子效果包括:Dust(沙尘).Fire(火焰).Water(水).Smoke(烟雾).Sparkles(闪光),还有一些粒子资源 Sources.Misc(杂项),如下图 随便拖出来几个 接