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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容