千家信息网

Unity编程标准导引-3.3 Transform

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,每个游戏对象(GameObject),其存在于游戏世界,都有一个位置、朝向、大小等基本定位信息;其存于Hierarchy面板,也存在与其他GameObject的相对关系,如父子关系、兄弟关系。Unit
千家信息网最后更新 2026年10月31日Unity编程标准导引-3.3 Transform

每个游戏对象(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


节点 坐标 坐标系 局部 属性 变换 位置 全局 层次 欧拉 代表 结构 尺寸 信息 兄弟 实际 对象 组件 频繁 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网龙头 互联网科技logo 广西互联网科技公司 火传媒上海互联网科技 互联网科技博主是什么意思 昭通云南众福互联网科技有限公司 金融科技与互联网金融相同和不同 福建科技产业互联网发展 畅思互联网科技 佛山市拉法互联网科技有限公司 互联网时代的科技公司 沐思想互联网科技有限公司 互联网金融科技公司的优势 厦门江牛科技互联网 广东鹅鹅鹅互联网科技有限公司 科技互联网行业投资研究 互联网科技收购价值 互联网科技大会大佬 瑞安市蟠桃会互联网科技有限公司 互联网科技创业有什么好项目 西安互联网科技 奇酷互联网科技公司 互联网公司会议桌创意科技软装饰 天速互联网络科技有限公司 须眉科技是互联网公司吗 北京华百购互联网科技有限公司 互联网安防科技感 云鲸互联网络科技有限公司 上海万顺科技互联网有限公司招聘 互联网科技创新创业项目
0