父子化(摘自官文原文说明)


父子化 (Parenting) 是使用 Unity 时需要理解的最重要的概念之一。当某个游戏对象 (GameObject) 是另一个游戏对象 (GameObject) 的父级 (Parent) 时,子级 (Child) 游戏对象 (GameObject) 会像其父级 (Parent) 一样移动、旋转和缩放。正如您的手臂与躯干相连,转动躯干时,手臂因为与其相连也会移动。任何对象都可以有多个子级,但却只能有一个父级。


您可以通过将层级视图 (Hierarchy View) 的任何游戏对象 (GameObject) 拖到另一个游戏对象上来创建一个父级 (Parent)。此操作会在两个游戏对象 (GameObject) 之间创建一种父子关系。


U3D局部坐标和全局坐标详解(或世界坐标)_第1张图片
父子层级视图 (hierarchy) 示例。名称左侧有折叠箭头的游戏对象 (GameObjects) 是父级。


上述示例中,我们认为躯干是手臂的父级而手臂是手的父级。您在 Unity 中制作的场景将包含这些变换层级 (Transform hierarchy)的集合。最上层的父级对象被称为根对象 (Root object)。当您移动、缩放或旋转某个父级对象时,其变换 (Transform) 中的所有变化都会被应用于其子级对象。


值得指出的是任何子级游戏对象 (Child GameObject) 的检视器 (Inspector) 中的变换 (Transform) 值都会相对于父级 (Parent) 的变换 (Transform) 值而显示。这些值又被称局部坐标 (Local Coordinate)您可以通过脚本处理访问全局坐标 (Global Coordinate) 和局部坐标 (local coordinate)。


例如:





U3D局部坐标和全局坐标详解(或世界坐标)_第2张图片


此时Cube1坐标视为全局部坐标或世界坐标


gameObject.transform.position=new Vector(2,2,0);就可以实现


也可以使用


Vector3 thePosition = transform.TransformPoint(newVector3(2,2,0));


gameObject.transform.position = thePosition;



Transform.TransformPoint 变换位置变换位置从自身坐标到世界坐标(原文:Transforms position from local space to world space.


现在给Cube1加个子对象Cube2并使Cube2移动到如图位置


U3D局部坐标和全局坐标详解(或世界坐标)_第3张图片


使用gameObject.transform.position=new Vector(2,2,0);将无法如愿;


问题解析:根据红色字内容说明,此时Cube2中的检视器 (Inspector) 的坐标显示的是相对父级Cube1的坐标,所以只能先把自身坐标使用transform.TransformPoint方法转为世界坐标


Vector3 thePosition = transform.TransformPoint(newVector3(2,2.5,0));


gameObject.transform.position = thePosition;



坐标系的转换:
TransformDirection 将一个方向从局部坐标系转换到世界坐标系
InverseTransformDirection 将一个方向从世界坐标系转换到局部坐标系
TransformPoint 将一个点从局部坐标系转换到世界坐标系
InverseTransformPoint 将一个点从世界坐标系转换到局部坐标系


到这里本博文就编写结束了,同时欢迎加入本人新建的U3D交流群 312315390,一起学习进步!