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; // 物理引擎固定更新的时间间隔
}
Unity3D深入浅出 -组件与节点之间的调用关系的更多相关文章
- [tty与uart]1.Linux中tty框架与uart框架之间的调用关系剖析
转自:http://developer.51cto.com/art/201209/357501_all.htm 目录 1.tty框架 2.uart框架 3.自底向上 4.自顶向下 5.关系图 在这期间 ...
- [uart]1.Linux中tty框架与uart框架之间的调用关系剖析
转自:http://developer.51cto.com/art/201209/357501_all.htm 目录 1.tty框架 2.uart框架 3.自底向上 4.自顶向下 5.关系图 在这期间 ...
- Linux中tty框架与uart框架之间的调用关系剖析【转】
转自:http://developer.51cto.com/art/201209/357501.htm 之前本人在"从串口驱动的移植看linux2.6内核中的驱动模型 platform de ...
- oracle处理节点之间的父子关系
通常当与树的结构之间的关系处理,这是一个很复杂的事情,我们可以通过程序代码去逐层遍历父或子节点,这样做的缺点是很明显,效率不高,操作复杂性是比较大的.而当我们使用Oracle当数据库,我们可以有一个简 ...
- java 深入理解内部类以及之间的调用关系
什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和 ...
- [UE4]角色、动画蓝图、动画蒙太奇、动画之间的调用关系
一.在“角色”中设置要使用的“动画蓝图” 二.在“动画蓝图”中使用“动画”和“混合动画” 三.在“混合动画”中,也可以使用“动画” 四.在角色中使用“动画蒙太奇”
- Vue-Cli项目如何查看依赖调用关系?
Vue是个优秀的前端框架,不管是前端还是后端开发人员都能很快使用Vue来开发应用.但是随着项目开发的深入,组件之间的依赖就变得越来越多,耦合越来越严重.这时候我们迫切地需要分析下组件和依赖之间的调用关 ...
- xpath 轴,节点之间的关系
http://www.w3school.com.cn/xpath/xpath_axes.asp http://www.freeformatter.com/xpath-tester.html 测试 轴可 ...
- JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)
利用节点间的层次关系获取节点: 上一节讲了3中获取的方式: * ※※一.绝对获取,获取元素的3种方式:-Element * 1.getElementById(): 通过标签中的id属性值获来取该标签对 ...
随机推荐
- Xfire实现webservice时,对象传递规则及解析简析
Xfire实现webservice,传递对象解析的话,要分两种情况处理:1.基本类型对象:2.复杂对象 其实,在客户端直接传递数组,如String[] int[]等这些无法通过配置具体类型来通知xfi ...
- jquery autoComplete 插件
github: https://github.com/Pixabay/jQuery-autoComplete/blob/master/demo.html 官网demo https://goodies. ...
- php-fpm 启动参数及重要配置详解(转)
约定几个目录 /usr/local/php/sbin/php-fpm /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php.ini 一,php- ...
- IP和java.net.InetAddress类的使用
一.IP 1.地址格式 互联网上每一台计算机都有一个唯一标示自己的标记,这个标记就是IP地址.IP 地址使用32 位长度二进制数据标示,一般在实际中看到的大部分IP地址都是以十进制的数据形式标示的,如 ...
- 批处理学习笔记7 - 管道连接符"|"
|就是把左边作为值传递给右边.有一些命令运用它比较方便 @echo off ping baidu.com | find "TTL" pause 这段命令就是把左边ping的结果传递 ...
- [k8s]elk架构设计-k8s集群里搭建
elasticsearch和mysql的对比 https://blog.csdn.net/qq_21383435/article/details/79323383 Mapping ~ Schema m ...
- python 分别用python2和python3伪装浏览器爬取网页内容
python网页抓取功能非常强大,使用urllib或者urllib2可以很轻松的抓取网页内容.但是很多时候我们要注意,可能很多网站都设置了防采集功能,不是那么轻松就能抓取到想要的内容. 今天我来分享下 ...
- MSVC與CRT的恩怨情仇
很久沒有寫程式設計入門知識的相關文章了,這篇文章要來談談程式庫 (Library) 連結,以及關於 MSVC 與 CRT 之間的種種恩怨情仇. 如果你使用的作業系統是 Linux.Mac 或其他非 W ...
- linux命令(33):less
一.less指令 less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性. 在 more 的时候,我 ...
- 字符设备驱动笔记——中断方式按键驱动之linux中断处理结构(五)
一.单片机下的中断处理 )分辨是哪一个中断 )调用处理函数 )清中断 二.linux下的中断处理 1)/arch/arm/kernel/irq.c asmlinkage void __exceptio ...