【unity组件_Transform 】_gameobject transform 详解
Unity Transform 组件介绍
Transform 作为最重要,也是唯一一个GameObjcet物体必须具备的组件(2023.1之后在一些特定流工作流里可以创建没有Transform的对象,常规开发目前是必须的,RectTransform 是 Transform 的子类,用于 UI 系统,它除了继承位置、旋转、缩放外,还增加了锚点、轴心点、尺寸等概念。UI 元素必须使用 RectTransform),中文翻译为“变换”,它用来控制GameObjcet的位置、旋转、缩放,作为本专栏第一个介绍的。官方手册链接官方手册链接,点击跳转
一、Transform 组件概念
1. 基础定义
- 本质:存储 GameObject 的位置(Position)、旋转(Rotation)、缩放(Scale)和父子关系状态
- 必备性:所有 GameObject 必须包含 Transform 组件,无法移除或创建无 Transform 的 GameObject
- 坐标系:
- 世界空间:无父物体时使用
- 局部空间:相对于父物体的坐标系
2. 属性详解
Scale 特殊说明:值\"1\"表示原始大小(导入时的尺寸)
二、编辑 Transform 的三种方式
1. 场景视图(Scene View)操作
#mermaid-svg-35ruAUC7DbJpvBgh {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-35ruAUC7DbJpvBgh .error-icon{fill:#552222;}#mermaid-svg-35ruAUC7DbJpvBgh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-35ruAUC7DbJpvBgh .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-35ruAUC7DbJpvBgh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-35ruAUC7DbJpvBgh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-35ruAUC7DbJpvBgh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-35ruAUC7DbJpvBgh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-35ruAUC7DbJpvBgh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-35ruAUC7DbJpvBgh .marker.cross{stroke:#333333;}#mermaid-svg-35ruAUC7DbJpvBgh svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-35ruAUC7DbJpvBgh .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-35ruAUC7DbJpvBgh .cluster-label text{fill:#333;}#mermaid-svg-35ruAUC7DbJpvBgh .cluster-label span{color:#333;}#mermaid-svg-35ruAUC7DbJpvBgh .label text,#mermaid-svg-35ruAUC7DbJpvBgh span{fill:#333;color:#333;}#mermaid-svg-35ruAUC7DbJpvBgh .node rect,#mermaid-svg-35ruAUC7DbJpvBgh .node circle,#mermaid-svg-35ruAUC7DbJpvBgh .node ellipse,#mermaid-svg-35ruAUC7DbJpvBgh .node polygon,#mermaid-svg-35ruAUC7DbJpvBgh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-35ruAUC7DbJpvBgh .node .label{text-align:center;}#mermaid-svg-35ruAUC7DbJpvBgh .node.clickable{cursor:pointer;}#mermaid-svg-35ruAUC7DbJpvBgh .arrowheadPath{fill:#333333;}#mermaid-svg-35ruAUC7DbJpvBgh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-35ruAUC7DbJpvBgh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-35ruAUC7DbJpvBgh .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-35ruAUC7DbJpvBgh .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-35ruAUC7DbJpvBgh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-35ruAUC7DbJpvBgh .cluster text{fill:#333;}#mermaid-svg-35ruAUC7DbJpvBgh .cluster span{color:#333;}#mermaid-svg-35ruAUC7DbJpvBgh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-35ruAUC7DbJpvBgh :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 场景工具 移动工具 W 旋转工具 E 缩放工具 R 通用工具 T
- 轴向标识:
- X轴:红色
- Y轴:绿色
- Z轴:蓝色
- 操作技巧:
- 单轴操作:沿特定轴拖动
- 平面锁定:点击Gizmo中心的彩色方块(如蓝色方块锁定Z轴)
- 轴向选择:点击后变为黄色表示选中
2. 检视窗口(Inspector)操作
- 精确输入:直接在数值字段输入
- 快速调整:点击字段后上下拖动鼠标
- 组件位置:位于GameObject检视窗口顶部
3. 脚本控制
// 位置控制transform.position = new Vector3(1, 2, 3);transform.Translate(Vector3.forward * Time.deltaTime);// 旋转控制transform.eulerAngles = new Vector3(0, 45, 0);transform.Rotate(Vector3.up * 90 * Time.deltaTime);// 缩放控制transform.localScale = new Vector3(2, 2, 2);
三、父子关系与层级系统
1. 父子关系本质
#mermaid-svg-vGYs2O8gtFKCnjkB {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vGYs2O8gtFKCnjkB .error-icon{fill:#552222;}#mermaid-svg-vGYs2O8gtFKCnjkB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vGYs2O8gtFKCnjkB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-vGYs2O8gtFKCnjkB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vGYs2O8gtFKCnjkB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vGYs2O8gtFKCnjkB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vGYs2O8gtFKCnjkB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vGYs2O8gtFKCnjkB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vGYs2O8gtFKCnjkB .marker.cross{stroke:#333333;}#mermaid-svg-vGYs2O8gtFKCnjkB svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vGYs2O8gtFKCnjkB .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vGYs2O8gtFKCnjkB .cluster-label text{fill:#333;}#mermaid-svg-vGYs2O8gtFKCnjkB .cluster-label span{color:#333;}#mermaid-svg-vGYs2O8gtFKCnjkB .label text,#mermaid-svg-vGYs2O8gtFKCnjkB span{fill:#333;color:#333;}#mermaid-svg-vGYs2O8gtFKCnjkB .node rect,#mermaid-svg-vGYs2O8gtFKCnjkB .node circle,#mermaid-svg-vGYs2O8gtFKCnjkB .node ellipse,#mermaid-svg-vGYs2O8gtFKCnjkB .node polygon,#mermaid-svg-vGYs2O8gtFKCnjkB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vGYs2O8gtFKCnjkB .node .label{text-align:center;}#mermaid-svg-vGYs2O8gtFKCnjkB .node.clickable{cursor:pointer;}#mermaid-svg-vGYs2O8gtFKCnjkB .arrowheadPath{fill:#333333;}#mermaid-svg-vGYs2O8gtFKCnjkB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vGYs2O8gtFKCnjkB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vGYs2O8gtFKCnjkB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-vGYs2O8gtFKCnjkB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-vGYs2O8gtFKCnjkB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vGYs2O8gtFKCnjkB .cluster text{fill:#333;}#mermaid-svg-vGYs2O8gtFKCnjkB .cluster span{color:#333;}#mermaid-svg-vGYs2O8gtFKCnjkB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vGYs2O8gtFKCnjkB :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 父物体 子物体A 子物体B 孙子物体
- 继承规则:- 继承规则:(子物体在Hierarchy窗口中缩进显示)
ChildWorldPos = ParentWorldPos + ParentRotation * ChildLocalPos
• 局部位置是相对于父物体轴心点的偏移
ChildWorldRot = ParentWorldRot * ChildLocalRot
• 局部旋转是相对于父物体坐标系的旋转
ChildWorldScale = ParentWorldScale ⊗ ChildLocalScale
• 父物体缩放影响所有子物体的视觉尺寸
- 创建方法:在Hierarchy窗口中将GameObject拖到另一个上
- 层级限制:
- 一个GameObject只能有一个父物体
- 可以有多个子物体
- 无父物体的称为根物体(Root GameObject)
2. 坐标系转换
// 世界坐标转局部坐标Vector3 localPos = transform.InverseTransformPoint(worldPos);// 局部坐标转世界坐标Vector3 worldPos = transform.TransformPoint(localPos);
3. 父子关系实践
- 设置技巧:
// 创建父子关系child.transform.SetParent(parentTransform);// 解除父子关系child.transform.SetParent(null);// 保持世界位置不变child.transform.SetParent(parentTransform, true);
四、缩放(Scale)深度解析
1. 缩放影响因素
#mermaid-svg-USwLOxlJrdEcVE0Y {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-USwLOxlJrdEcVE0Y .error-icon{fill:#552222;}#mermaid-svg-USwLOxlJrdEcVE0Y .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-USwLOxlJrdEcVE0Y .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-USwLOxlJrdEcVE0Y .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-USwLOxlJrdEcVE0Y .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-USwLOxlJrdEcVE0Y .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-USwLOxlJrdEcVE0Y .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-USwLOxlJrdEcVE0Y .marker{fill:#333333;stroke:#333333;}#mermaid-svg-USwLOxlJrdEcVE0Y .marker.cross{stroke:#333333;}#mermaid-svg-USwLOxlJrdEcVE0Y svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-USwLOxlJrdEcVE0Y .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-USwLOxlJrdEcVE0Y .cluster-label text{fill:#333;}#mermaid-svg-USwLOxlJrdEcVE0Y .cluster-label span{color:#333;}#mermaid-svg-USwLOxlJrdEcVE0Y .label text,#mermaid-svg-USwLOxlJrdEcVE0Y span{fill:#333;color:#333;}#mermaid-svg-USwLOxlJrdEcVE0Y .node rect,#mermaid-svg-USwLOxlJrdEcVE0Y .node circle,#mermaid-svg-USwLOxlJrdEcVE0Y .node ellipse,#mermaid-svg-USwLOxlJrdEcVE0Y .node polygon,#mermaid-svg-USwLOxlJrdEcVE0Y .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-USwLOxlJrdEcVE0Y .node .label{text-align:center;}#mermaid-svg-USwLOxlJrdEcVE0Y .node.clickable{cursor:pointer;}#mermaid-svg-USwLOxlJrdEcVE0Y .arrowheadPath{fill:#333333;}#mermaid-svg-USwLOxlJrdEcVE0Y .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-USwLOxlJrdEcVE0Y .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-USwLOxlJrdEcVE0Y .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-USwLOxlJrdEcVE0Y .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-USwLOxlJrdEcVE0Y .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-USwLOxlJrdEcVE0Y .cluster text{fill:#333;}#mermaid-svg-USwLOxlJrdEcVE0Y .cluster span{color:#333;}#mermaid-svg-USwLOxlJrdEcVE0Y div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-USwLOxlJrdEcVE0Y :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 物体最终缩放 3D软件中的模型尺寸 导入设置的Mesh Scale Factor Transform的Scale值
2. 缩放与物理系统
- 物理假设:1 Unity单位 = 1米
- 缩放问题:
- 过大物体会\"慢动作\"下落(物理正确但视觉异常)
- 非均匀缩放导致碰撞体变形
3. 缩放最佳实践
- 建模阶段:
- 在3D软件中保持真实比例
- 避免在Unity中调整Transform的Scale值
- 导入设置:
- 在Import Settings中调整Mesh Scale Factor
- 保持最终比例为1:1:1
五、非均匀缩放
1. 基本概念
- 非均匀缩放:X/Y/Z缩放值不同(如(2,4,2))
- 均匀缩放:X/Y/Z缩放值相同(如(3,3,3))
2. 问题与限制
Capsule Collider
Light
Audio Source
3. 解决方案
- 避免使用:尽量保持等比缩放
- 碰撞体补偿:
// 计算实际碰撞体尺寸Vector3 actualSize = Vector3.Scale(collider.size, transform.lossyScale);
- 层级隔离:对需要非均匀缩放的对象单独分组
六、Transform API 参考手册
1. 核心属性
// 方向向量Vector3 forward = transform.forward; // 物体前方Vector3 up = transform.up; // 物体上方Vector3 right = transform.right; // 物体右侧// 层级关系Transform parent = transform.parent; // 父物体int childCount = transform.childCount; // 子物体数量Transform firstChild = transform.GetChild(0); // 获取子物体
2. 实用方法
// 朝向目标transform.LookAt(targetTransform);// 查找子物体Transform child = transform.Find(\"Arm/Hand\");// 索引管理int index = transform.GetSiblingIndex();transform.SetAsFirstSibling();
3. 高级操作
// 原子操作(避免多次计算)transform.SetPositionAndRotation(newPos, newRot);// 方向转换Vector3 worldDir = transform.TransformDirection(localDir);Vector3 localDir = transform.InverseTransformDirection(worldDir);
七、使用技巧
1. 性能优化
// 缓存Transform引用private Transform _transform;void Start(){ _transform = transform;}void Update(){ // 使用缓存引用 _transform.Rotate(Vector3.up, 30 * Time.deltaTime);}
2. 场景设计
- 空物体锚点:创建空GameObject作为位置参考点
- 层级分组: #mermaid-svg-kYr4ki45oX8vTnjT {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kYr4ki45oX8vTnjT .error-icon{fill:#552222;}#mermaid-svg-kYr4ki45oX8vTnjT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kYr4ki45oX8vTnjT .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-kYr4ki45oX8vTnjT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kYr4ki45oX8vTnjT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kYr4ki45oX8vTnjT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kYr4ki45oX8vTnjT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kYr4ki45oX8vTnjT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kYr4ki45oX8vTnjT .marker.cross{stroke:#333333;}#mermaid-svg-kYr4ki45oX8vTnjT svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kYr4ki45oX8vTnjT .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kYr4ki45oX8vTnjT .cluster-label text{fill:#333;}#mermaid-svg-kYr4ki45oX8vTnjT .cluster-label span{color:#333;}#mermaid-svg-kYr4ki45oX8vTnjT .label text,#mermaid-svg-kYr4ki45oX8vTnjT span{fill:#333;color:#333;}#mermaid-svg-kYr4ki45oX8vTnjT .node rect,#mermaid-svg-kYr4ki45oX8vTnjT .node circle,#mermaid-svg-kYr4ki45oX8vTnjT .node ellipse,#mermaid-svg-kYr4ki45oX8vTnjT .node polygon,#mermaid-svg-kYr4ki45oX8vTnjT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kYr4ki45oX8vTnjT .node .label{text-align:center;}#mermaid-svg-kYr4ki45oX8vTnjT .node.clickable{cursor:pointer;}#mermaid-svg-kYr4ki45oX8vTnjT .arrowheadPath{fill:#333333;}#mermaid-svg-kYr4ki45oX8vTnjT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kYr4ki45oX8vTnjT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kYr4ki45oX8vTnjT .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-kYr4ki45oX8vTnjT .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-kYr4ki45oX8vTnjT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kYr4ki45oX8vTnjT .cluster text{fill:#333;}#mermaid-svg-kYr4ki45oX8vTnjT .cluster span{color:#333;}#mermaid-svg-kYr4ki45oX8vTnjT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kYr4ki45oX8vTnjT :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} CharacterRoot Body WeaponSlot Sword Shield
3. 调试技巧
// 绘制坐标轴void OnDrawGizmos(){ Gizmos.color = Color.red; Gizmos.DrawLine(transform.position, transform.position + transform.right); Gizmos.color = Color.green; Gizmos.DrawLine(transform.position, transform.position + transform.up); Gizmos.color = Color.blue; Gizmos.DrawLine(transform.position, transform.position + transform.forward);}
八、常见问题解决方案
-
子物体位置异常
- 检查父物体缩放值
- 确认使用localPosition而非position
-
旋转抖动问题
- 使用Quaternion代替EulerAngles
- 避免万向节死锁
-
物理模拟异常
- 检查物体缩放比例
- 确保碰撞体未变形