当前位置: 首页 > news >正文

【unity组件_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. 属性详解

属性数据类型描述默认值
PositionVector3X/Y/Z坐标位置(0,0,0)
RotationQuaternion (常用欧拉角 Vector3 表示)Rotation 属性底层使用 Quaternion 存储,但通常通过 eulerAngles (Vector3) 属性以欧拉角(度)的形式进行设置和读取(0,0,0)
ScaleVector3沿X/Y/Z轴的缩放比例(1,1,1)

Scale 特殊说明:值"1"表示原始大小(导入时的尺寸)

二、编辑 Transform 的三种方式

1. 场景视图(Scene View)操作

场景工具
移动工具 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. 父子关系本质

父物体
子物体A
子物体B
孙子物体
  • 继承规则:- 继承规则:(子物体在Hierarchy窗口中缩进显示)
变换类型继承公式数学表示说明
位置继承子物体世界位置 = 父物体世界位置 + 父物体旋转后的局部位置ChildWorldPos = ParentWorldPos + ParentRotation * ChildLocalPos• 父物体的旋转会影响子物体的局部位置方向
• 局部位置是相对于父物体轴心点的偏移
旋转继承子物体世界旋转 = 父物体世界旋转 × 子物体局部旋转ChildWorldRot = ParentWorldRot * ChildLocalRot• 使用四元数乘法(顺序:父×子)
• 局部旋转是相对于父物体坐标系的旋转
缩放继承子物体世界缩放 = 父物体世界缩放 × 子物体局部缩放ChildWorldScale = ParentWorldScale ⊗ ChildLocalScale• ⊗ 表示分量乘法(xx, yy, z*z)
• 父物体缩放影响所有子物体的视觉尺寸
  • 创建方法:在Hierarchy窗口中将GameObject拖到另一个上
  • 层级限制
    • 一个GameObject只能有一个父物体
    • 可以有多个子物体
    • 无父物体的称为根物体(Root GameObject)

2. 坐标系转换

属性描述示例
localPosition相对于父物体的位置(0,1,0)
position世界坐标系位置(5,3,2)
lossyScale世界空间中的最终缩放(累积所有父级缩放,只读,可能无法精确分解)(2,2,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. 缩放影响因素

物体最终缩放
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. 问题与限制

问题类型具体表现影响组件
组件支持圆形组件保持圆形Sphere Collider
Capsule Collider
Light
Audio Source
视觉变形子物体旋转后扭曲所有渲染组件
碰撞错位碰撞体与网格不匹配Box Collider
缩放更新分离时突然变形所有子物体

3. 解决方案

  1. 避免使用:尽量保持等比缩放
  2. 碰撞体补偿
    // 计算实际碰撞体尺寸
    Vector3 actualSize = Vector3.Scale(collider.size, transform.lossyScale);
    
  3. 层级隔离:对需要非均匀缩放的对象单独分组

六、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作为位置参考点
  • 层级分组
    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);
}

八、常见问题解决方案

  1. 子物体位置异常

    • 检查父物体缩放值
    • 确认使用localPosition而非position
  2. 旋转抖动问题

    • 使用Quaternion代替EulerAngles
    • 避免万向节死锁
  3. 物理模拟异常

    • 检查物体缩放比例
    • 确保碰撞体未变形
http://www.dtcms.com/a/310944.html

相关文章:

  • 设计模式篇:在前端,我们如何“重构”观察者、策略和装饰器模式
  • 蓝桥杯----串口
  • 内存、硬盘与缓存的技术原理及特性解析
  • 《软件测试与质量控制》实验报告二 单元测试
  • Ubuntu系统VScode实现opencv(c++)视频及摄像头使用
  • 空间平面旋转与xoy平行
  • 【BTC】挖矿
  • MyBatisPlus之CRUD接口(IService与BaseMapper)
  • 【软考中级网络工程师】知识点之堆叠
  • 公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描
  • CS课程项目设计7:基于Canvas交互友好的五子棋游戏
  • 小智服务器Java安装编译(xinnan-tech)版
  • 【05】OpenCV C#——OpenCvSharp 图像基本操作---转灰度图、边缘提取、兴趣区域ROI,图像叠加
  • 28Rsync免密传输与定时备份
  • 【Spring Boot 快速入门】五、文件上传
  • 图漾相机-ROS1_SDK_ubuntu 4.X.X版本编译
  • Shell【脚本 02】离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
  • [硬件电路-122]:模拟电路 - 信号处理电路 - 模拟电路与数字电路、各自的面临的难题对比?
  • [硬件电路-124]:模拟电路 - 信号处理电路 - 测量系统的前端电路详解
  • 编程与数学 03-002 计算机网络 20_计算机网络课程实验与实践
  • filezilla出现connected refused的时候排查问题
  • Flink2.0学习笔记:Stream API 窗口
  • 鸿蒙智选携手IAM进驻长隆熊猫村,为国宝打造智慧健康呼吸新空间
  • 智能合约漏洞导致的损失,法律责任应如何分配
  • Hyperliquid:揭秘高性能区块链共识引擎HyperBFT
  • 入门MicroPython+ESP32:《点亮LED灯》
  • 1.7vue声明周期
  • Token系列 - 再谈稳定币
  • 保证金率(Margin Ratio)
  • 【最新区块链论文录用资讯】CCF A--WWW 2025 23篇