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

相关推荐
dadaobusi21 分钟前
pcie原子操作和nvme原子操作
学习
sunshine22 girl35 分钟前
Java学习五 面向对象高级5 内部类1
java·学习
每天题库3 小时前
架子工脚手架工题库:安全操作考点与模拟题练习指南
学习·安全·考试·题库·考证
yangmu32033 小时前
Codex 提示词优化教程:用四要素把模糊需求变成可执行任务
人工智能·学习
无敌贵点大王4 小时前
RTThread学习记录13——关于要使用一个外设,RTThread与cubemx到底要怎么配合?
c语言·stm32·学习·rtthread
WarPigs4 小时前
Unity在Create菜单添加创建自定义脚本模板选项
unity
喜欢打篮球的普通人6 小时前
MiniMind 学习笔记(十二):Pretrain 实操——从版本梳理到 8GB 显卡上的真实训练
人工智能·笔记·学习
m4Rk_6 小时前
【论文阅读】Agent 记忆机制(87):VizoMem——把文本历史转化为可检索的视觉记忆
论文阅读·人工智能·学习·开源·github
郝学胜-神的一滴7 小时前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建
坤坤子吖7 小时前
算法学习——高精度加减乘除
c++·笔记·学习·算法