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教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!

相关推荐
my_daling2 小时前
DSMC通信协议理解,以及如何在FPGA上实现DSMC从设备(1)
学习·fpga开发
嵌入式×边缘AI:打怪升级日志2 小时前
Makefile 完全学习笔记:从入门到通用模板解析
笔记·学习
ACGkaka_2 小时前
ES 学习(九)从文本到词元:分词器如何“拆解“你的数据
大数据·学习·elasticsearch
南無忘码至尊2 小时前
Unity学习90天-第1天-认识Unity并书写我们的第一个脚本
学习·unity·游戏引擎
2301_792674863 小时前
java学习day27(算法)
java·学习·算法
zhangrelay3 小时前
蓝桥云课一分钟-星界战纪-Stellar Combat-make
笔记·学习
淬炼之火3 小时前
笔记:对MoE混合专家模型的学习和思考
人工智能·笔记·学习·语言模型·自然语言处理
talen_hx2963 小时前
《kafka核心源码解读》学习笔记 Day 02
笔记·学习·kafka
talen_hx2963 小时前
《零基础入门Spark》学习笔记 Day 15
大数据·笔记·学习·spark