Unity编程标准导引-3.3 Transform
本文为博主原创文章,欢迎转载。请保留博主链接http://blog.csdn.net/andrewfan
每个游戏对象(GameObject),其存在于游戏世界,都有一个位置、朝向、大小等基本定位信息;其存于Hierarchy面板,也存在与其他GameObject的相对关系,如父子关系、兄弟关系。Unity中使用Transform来描述和操作这些属性。
Transform的字面理解就是“变换”的意思,所有的GameObject,当其被创建完成之后,均自动创建了这样一个变换组件,你不需要手动创建这个组件,而且无法删除此组件。
接下来,我们将变换组件的主要属性和功能一一进行解释。
3.3.1、层次相关的属性和方法
- childCount:代表当前GameObject节点下方有几个子节点
- hierarchyCount:代表在当前GameObject所处的相互关联的树状结构中,存在的层次数目。
相互关联的树状结构指的是:以Hierarchy面板中的一个顶层GameObject作为根节点出发的一棵树。任何一个GameObject都会存在于一棵树中。
可以预想的是,这个树状结构中的任意一个节点的hierarchyCount属性都是相同的。 - hierarchyCapacity:代表当前所在的树的层次容量。就是这棵树最大可以容纳的节点数目,从整个树中的任意一个节点访问此属性,所获取的层次容量都是相同的。
这个参数是自动增长的,即当GameObject发生层次变动时,如果当前树的容量不足,会自动扩容。
可以推测出:树中所有节点所查询的结果实际来自最顶层节点的属性,而当层次所发生变动时,Unity内部只需要修改顶层节点的这个属性即可。
需要注意的是,当频繁变化hierarchyCapacity时,是需要带来额外的内存消耗和性能消耗的,这与List类的内存扩容是一个道理。因此,应该为频繁增长的树的根节点在一开始就设置一个比较大的容量。 - parent:代表当前节点的父节点,返回一个Transform对象。当此parent为null时,就代表自己已经是顶层节点,也即树状结构中的根节点了。
- root:获得当前树状结构中的根节点。
- DetachChildren():分离子节点,意思就是将当前节点下方的所有直接子节点都分离出去,让他们成为根节点。有n个子节点,将产生n棵新的树。
- Find(string name):根据路径查找子节点,虽然这里的参数在文档上显示为name,但是它实际代表一个路径。它可以是"magazine/ammo"这种格式,即可以向着叶节点深度方向查询多个层次,找到目标Transform并返回。如果找不到返回空。
- GetChild(int index):根据索引index,返回当前节点的直接子节点。
- GetSiblingIndex():获得当前节点处于其父节点下的编号索引,即处于兄弟列表中的Index。
- SetAsFirstSibling():设置当前节点为兄弟节点列表中的第一个节点。
- SetAsLastSibling():设置当前节点为兄弟节点列表中的最后一个节点。
- SetSiblingIndex(int index):将当前节点设置到其兄弟列表中的index位置。
- SetParent(Transform parent, bool worldPositionStays):设置当前节点的父节点,如果worldPositionStays设置为true,则保持其世界坐标下的位置、旋转和缩放。这会相应地修改其局部坐标、旋转和缩放信息。(后续章节会涉及到世界和局部坐标的概念)
3.3.2、变换相关的属性和方法
这里所说的变换,就是指所处的位置、旋转(朝向)、缩放(大小)等信息。
Unity下的单位是米,比如你新建一个Cube,那么它默认的尺寸是1x1x1的尺寸,那么我们想要设置这个Cube到需要的尺寸,只要修改它的Trasform下的Scale三维向量参数即可,它代表了在1x1x1这个基础上所进行的缩放。
那些从外部导入的三维模型对象,它本身就带有一个局部的坐标系,和这个三维对象相对此局部坐标系的尺寸和位置。若要修改它的尺寸,则是基于此对象在其导入的局部坐标系中的尺寸和位置为基础,进行相应的缩放。
由于一棵树代表了很多个层次的存在,每个节点均有自己的缩放、旋转、位置等信息。而且子节点的变换状态会跟随父节点变换状态的变化而改变,因此Unity中存在局部坐标和全局坐标的概念。局部坐标是指其相对直接父节点的变换信息,而全局坐标是指当前节点叠加了所有父节点的累积变换之后的状态结果。
接下来详细了解变换相关的属性和方法。
- Vector3 localPosition:局部坐标系下的位置
- Vector3 position:全局坐标系下的位置
- Quaternion localRotation:局部坐标系下的旋转
- Quaternion rotation:全局坐标系下的旋转
- Vector3 localScale:局部坐标系下的缩放
- Vector3 lossyScale:全局坐标系下的缩放
- Vector3 localEulerAngles:局部坐标系下的欧拉角
- Vector3 eulerAngles 全局坐标系下的欧拉角
- Vector3 forward:全局坐标系下的前方矢量
- Vector3 up:全局坐标系下的上方矢量
- Vector3 right:全局坐标系下的右方矢量
通过以上属性看出,都每个变换属性都有局部和全局之分。位置和缩放比较容易理解。不过缩放有两种表现形式,一种是欧拉角,一种是四元数,实际上四元数也就是使用欧拉角在进行计算。对于这部分数学不熟悉的同学不必紧张,我们不需要详细了解四元数的原理,只要学会使用即可。后续的章节中我们会慢慢熟悉四元数的一些用法,而对于欧拉角,我们只要简单知道其概念即可:欧拉角是用相对Z、X、Y轴旋转一定的度数来表示旋转的一种方法,请记住它是按照先Z、再X、再Y这个顺序进行旋转的。
Unity文档上讲到,如果你对于欧拉角不是很熟悉,就不要使用它,四元数可以满足你的要求了。而实际上我们对于简单一些旋转计算,使用欧拉角是更方便的,速度也更快,比如,我们只需要某个物体相对其父节点围绕X、Y、Z中的单一轴进行旋转,此时文档相对简单,我们可以使用欧拉角进行处理,稍微复杂一点的情况,后面的四元数章节在做解释。
另外需要注意几点:
1、Vector、Quaternion 都是结构体,通过localRotation、position等以上函数获取的结果都是存在一个结构体中的,此时的返回结果是存在单独开辟的新内存中的,因此对其直接修改不能影响其原有数值,我们必须以localRotation=Vector这种形式对其赋值,让其进行函数内进行实际赋值操作。
2、Transform也是一个组件,尽管每个GameObject类中都有transform这个成员,但其内部实现依然是getComponent的函数调用,而这种函数调用是比较耗时的,考虑到频繁需要对Transform进行操作,因此,我们应该在脚本的初始化过程中获取一个Transform引用并保留下来,以便后续调用而避免频繁使用到getComponent。这也是上一节代码中我们这样做的目的。
本文为博主原创文章,欢迎转载。请保留博主链接http://blog.csdn.net/andrewfan
Unity编程标准导引-3.3 Transform的更多相关文章
- Unity编程标准导引-3.4 Unity中的对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...
- Unity编程标准导引-3.1 Component 组件脚本及其基本生命周期
本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan 3.1组件 Component 组件是Unity中最核心的一个概念,它是一切编程的基础.没有组件 ...
- Unity编程标准导引-Unity中的基本概念-2.1界面概览
Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...
- Unity编程标准导引-1.2官方资源介绍
1.2.官方资源介绍 Unity官方提供了丰富的学习和参考资源,有以下类别: Unity手册以及API文档 Unity的官方教程 AssetStore 1.2.1 Unity手册以及API文档 前述文 ...
- Unity编程标准导引-1.1下载和安装Unity
本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan 1.1.下载和安装Unity 1.1.1 选取版本 首先找到Unity官方网站https://s ...
- Unity编程标准导引-2.2Unity中的基本概念
2.2Unity中的基本概念 上述介绍提到了几个概念:游戏对象.场景.资源.相机,这个小节我们来深入了解,同时进行一些实践性操作.不过首先,我们需要大概了解一下Unity的工程文件夹. 2.2.1工程 ...
- Unity编程标准导引-3.2 MonoBehavior 组件父类重构
本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 3.2MonoBehavior 组件父类重构 为了让我们的组件类用起来更方便,我们将上一节的 ...
- 【Unity编程】Unity中关于四元数的API详解
本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计 ...
- 【Unity编程】四元数(Quaternion)与欧拉角
版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉旋转.四元数.矩阵旋转之间的差异 除了欧拉旋转以外,还有两种表示旋转的方式:矩 ...
随机推荐
- ZOJ 2059 The Twin Towers
双塔DP. dp[i][j]表示前i个物品,分成两堆(可以不全用),价值之差为j的时候,较小一堆的价值为dp[i][j]. #include<cstdio> #include<cst ...
- windows Vista-Server 2016系列激活脚本.cmd
@ECHO OFFTITLE Windows 全版本系统激活ECHO 检测 操作系统版本...SET RQR=REG QUERY "HKLM\SOFTWARE\Microsoft\Windo ...
- hack:选择符前缀法,样式属性前缀法
选择符前缀法 <style> *html .test{width:100px;} /*only for IE6*/ *+html .test{width:100px;}/*for IE6 ...
- 【蓝牙数据采集模块】-01-Sensor Controller 功能介绍
一. CC2650芯片内部的结构框图如图,内部包含: 一个Cortex-M3主控制器,用来做整个芯片的功能与任务实现 一个Cortex-M0射频控制器,用来驱动RF相关电路 一个Sensor Cont ...
- 利用cocoapods创建基于git的私有库
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- 避免Node.js中回调地狱
为了解决这个阻塞问题,JavaScript严重依赖于回调,这是在长时间运行的进程(IO,定时器等)完成后运行的函数,因此允许代码执行经过长时间运行的任务. downloadFile('example. ...
- inheritprototype原型继承封装及综合继承最简实例
1.inheritprototype.js ;(function(){ var s = { inheritObject:function(o){//对象继承封装 ...
- 兼容ie6及以上的阴影滤镜的写法
.subnav{ width: 220px; _width:160px; min-height: 168px; border: 1px solid #d0d8da; background: #fff; ...
- return_url和notify_url的区别
页面跳转同步通知页面特性(return_url特性) (1) 买家在支付成功后会看到一个支付宝提示交易成功的页面,该页面会停留几秒,然后会自动跳转回商户指定的同步通知页面(参数return_url ...
- 国内值得关注的官方API集合
项目地址:https://github.com/marktony/Awesome_API 本页仅收集国内部分官方API,如需查看其他版本,请点击这里. 目录 笔记 出行 词典 电商 地图 电影 后端云 ...