Appearance
Transform 组件
常用API
| 属性方法 | 详解 |
|---|---|
| position | 位置 |
| rotation | 旋转 |
| scale | 缩放 |
如何获取全局位置、旋转、缩放
csharp
// 获取全局位置
Vector3 globalPos = transform.position;
// 获取全局旋转
Quaternion globalRot = transform.rotation;
// 获取欧拉角
Vector3 eulerAngles = transform.eulerAngles;
// 获取全局缩放
Vector3 globalScale = transform.scale;如何获取本地位置、旋转、缩放
csharp
// 获取本地位置
Vector3 localPos = transform.localPosition;
// 获取本地旋转
Quaternion localRot = transform.localRotation;
// 获取本地欧拉角
Vector3 localEulerAngles = transform.localEulerAngles;
// 获取本地缩放
Vector3 localScale = transform.localScale;全局和本地有什么区别?
- 全局坐标:从世界坐标系开始,经历所有父级的变换,最终到达当前物体的坐标。
- 本地坐标:从当前物体的坐标系开始,不经历父级的变换,直接到达当前物体的坐标。
如何正确进行旋转?
csharp
// 正确的旋转方式
transform.rotation = Quaternion.Euler(0, 0, 0);正方向与其他方向
全局正方向:
Vector3.forward((0, 0, 1))本地正方向:
transform.forward(取决于物体自身旋转)全局向上方向:
Vector3.up((0, 1, 0))本地向上方向:
transform.up(取决于物体自身旋转)全局向右方向:
Vector3.right((1, 0, 0))本地向右方向:
transform.right(取决于物体自身旋转)
获取同级物体、父级物体、子级物体
- 获取同级物体:
transform.GetSiblingIndex()(返回物体在父级中的索引) - 获取父级物体:
transform.parent(返回物体的父级 Transform 组件) - 获取子级物体:
transform.GetChild(index)(返回指定索引的子级 Transform 组件) - 获取子级物体数量:
transform.childCount(返回子级物体的数量)
为什么transform.position的量不能直接修改?
- 值类型副本机制:在Unity中,
transform.position是一个属性,它返回的是Vector3结构体(值类型)的副本。当你访问transform.position时,Unity会创建并返回一个新的Vector3实例。 - 修改副本无效:如果你直接修改返回值的分量(如
transform.position.x = 10),你只是修改了一个临时副本,而不是transform组件内部的实际数据,因此修改不会生效。
正确的修改方式
方法1:创建副本修改后完整赋值
csharp
// 正确的修改位置的方式
Vector3 newPos = transform.position;
newPos.x = 10f; // 修改副本的分量
transform.position = newPos; // 将修改后的副本完整赋值回去方法2:同时修改位置和旋转时使用 SetPositionAndRotation
csharp
// 同时修改位置和旋转的方式(性能更优)
transform.SetPositionAndRotation(newPos, newRot);