Unity学习90天-第1天-认识Transform + 坐标系

上一章的运行结果展示

那么接下来就然我来了解了解什么是Unity的Transform和Unity的坐标系,并且在上一章的 基础上进行制作一个会旋转 + 上下移动的物体

一、什么是 Transform?

每个 GameObject(对象) 必定有且仅有一个 Transform 组件,它记录了物体在世界中的三个核心信息:

Transform:

Position 位置(在哪里)

Rotation 旋转(朝哪里)

Scale 缩放(多大)

Transform 是 Unity 中最基础的组件,不能被删除

二、Unity 的坐标系

Unity 使用左手坐标系,记住这三个轴的方向:

| 轴 | 方向 | 对应 Vector3 |
| X 轴 | 正右/负左 | Vector3.right = (1, 0, 0) Vector3.right = (-1, 0, 0) |
| Y 轴 | 正上/负下 | Vector3.up = (0, 1, 0) Vector3.up = (0, -1, 0) |

Z 轴 正前/负后 Vector3.forward = (0, 0, 1) Vector3.forward = (0, 0, -1)

三、两种坐标系:世界坐标 vs 本地坐标

这是 Unity 里最容易搞混的概念:

世界坐标系(World Space):

场景原点 (0,0,0) 为基准,固定不变。

cs 复制代码
transform.position        // 世界坐标位置
transform.eulerAngles     // 世界旋转角度
transform.lossyScale      // 世界缩放(只读)

本地坐标系(Local Space):

父物体为基准。没有父物体时和世界坐标一致。

cs 复制代码
transform.localPosition   // 相对父物体的位置
transform.localEulerAngles// 相对父物体的旋转
transform.localScale      // 相对父物体的缩放

如何区分这两个坐标系呢,接下来请看我们在场景的世界坐标原点创建一个立方体

这个物体现在的位置就是世界坐标的原点

接下来我在创建一个立方体和一个球体来观看他们跟原点这个物体的位置区别

在这里可以看到新建的立方体是X轴方向-2,而球体是X轴方向3,这个球体反而更贴近世界坐标的原点(0,0,0)这是因为我们的球体采用的是本地坐标,也就是他的父对象最右边的那个立方体 的坐标。

四、Translate 移动详解

cs 复制代码
transform.position                  // 获取/设置世界坐标
transform.localPosition             // 获取/设置本地坐标
transform.Translate(vec)            // 相对移动
cs 复制代码
transform.Translate(Vector3 translation, Space relativeTo);

第二个参数 Space 决定以哪个坐标系为基准移动

cs 复制代码
// 相对【自身】坐标系移动(默认)
// 物体转向后,forward 方向也跟着变
transform.Translate(Vector3.forward * speed * Time.deltaTime);
// 等同于:
transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.Self);

// 相对【世界】坐标系移动
// 无论物体朝哪,都朝世界 Z 轴正方向移动
transform.Translate(Vector3.forward * speed * Time.deltaTime, Space.World);

直观对比:

Space.Self → 像人走路,身体转了朝哪走哪
Space.World → 像推箱子,无论朝向都往固定方向走

五、Rotate 旋转详解

cs 复制代码
transform.rotation                  // 四元数旋转(世界)
transform.localRotation             // 四元数旋转(本地)
transform.eulerAngles               // 欧拉角(世界)
transform.localEulerAngles          // 欧拉角(本地)
transform.Rotate(vec)               // 相对旋转
transform.LookAt(target)            // 朝向某个目标
cs 复制代码
transform.Rotate(Vector3 axis, float angle);   // 指定轴 + 角度
transform.Rotate(Vector3 eulerAngles);         // 传入欧拉角

三种常用旋转写法:

cs 复制代码
// 写法一:绕 Y 轴每秒转 90 度
transform.Rotate(Vector3.up * 90f * Time.deltaTime);

// 写法二:分别指定轴和角度
transform.Rotate(Vector3.up, 90f * Time.deltaTime);

// 写法三:直接赋值旋转到某个角度
transform.eulerAngles = new Vector3(0, 45, 0);  // 直接旋转到 Y=45°

注意:旋转用 eulerAngles(欧拉角),Unity 内部实际用四元数 Quaternion 存储,避免万向锁问题。

六、Scale 缩放详解

cs 复制代码
transform.localScale                // 本地缩放
transform.lossyScale                // 世界缩放(只读)
cs 复制代码
// 直接设置缩放
transform.localScale = new Vector3(2, 2, 2);   // 放大2倍

// 动态变化缩放
transform.localScale += Vector3.one * Time.deltaTime; // 每秒均匀放大1

注意:transform.lossyScale 是世界缩放(只读),实际操作缩放用 localScale

七、脚本实现

那么我们创建并打开脚本,经过上一章和这张的知识我们来书写这份脚本

首先设置好我们物体的速度,旋转角度

cs 复制代码
public float moveSpeed = 3f;
public float rotateSpeed =90f;

在编写我的向某一个轴移动的方法(这里我默认使用Z轴)

cs 复制代码
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);

最后在编写我们的旋转逻辑

cs 复制代码
transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime);

最后在将我们的脚本保存,并挂载在我场景中创建的物体对象上那么我们就实现了让物体在运行后朝某个方向移动的功能啦。

八、总结

GameObject

Transform

position / localPosition ← 在哪里

rotation / eulerAngles ← 朝哪里

localScale ← 多大

坐标系

世界坐标系 以场景原点为基准(固定)

本地坐标系 以父物体为基准(随父变化) Translate 移动

Space.Self(默认) 沿自身朝向移动

Space.World 沿世界轴移动

接下来我将连续更新90天的Untiy教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!

相关推荐
袁小皮皮不皮10 小时前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
装不满的克莱因瓶11 小时前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
清辞85312 小时前
产品经理需求推进流程
大数据·深度学习·学习·产品经理
YM52e12 小时前
鸿蒙PC ArkTS 声明合并问题深度解析与最佳实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
海兰13 小时前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
ken223213 小时前
在 Libreoffice Calc中输入自定义表情字符时,需要保存之后,才能正常显示
学习
zwenqiyu14 小时前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法
编程圈子14 小时前
电机驱动开发学习2. 直流无刷电机工作原理
驱动开发·学习
MartinYeung514 小时前
[论文学习]大型语言模型(LLM)安全与隐私-基于善、恶、丑的深度分析
学习·安全·语言模型
什仙14 小时前
Mathcad Prime 的教程资料
学习·工具