Unity——Transform和位移

游戏对象(GameObject)的位移、旋转、缩放、父子关系,坐标转换等相关操作都由它处理。

它是Unity中一个极其重要的类。

基础

Vector3主要是用来表示三维坐标系中的 一个点或者一个向量

声明:

Vector3 v = new Vector3();

v.x = 10;
v.y = 20;
v.z = 30;
// 如果只传给xy2个值,那么另一个没有传的值将默认z为0
Vector3 v2 = new Vector3(10,20);
Vector3 v3 = new Vector3(10,10,10);

Vector3运算

Vector3 v3 = new Vector3(1,1,1);
Vector3 v4 = new Vector3(1,1,1);

print(v3+v4); // 结果:(2,2,2)

对应的就是:(x+x,y+y,z+z)

常用

下面这些都是以后常用的方向向量

Vector3.zero // 0,0,0
Vector3.down // 下 -> (0,-1,0)
Vector3.up // 上 ->(0,1,0)
Vector3.right // 右 ->(1,0,0)
Vector3.left// 左 ->(-1,0,0)
Vector3.forward// 前 -> (0,0,1)
Vector3.back // 后 -> (0,0,-1)

常用的方法

计算两个点之间的距离

Vector3.Distance(Vector3 a, Vector3 b); // 从a点到b点的距离

位置

相对世界坐标系

this.gameObject.transform这个意思是依附的游戏物体当前的位置,可以简写成this.transform

this.transform.position // 相对于世界坐标系 原点 的位置
// 如果当前依附的对象有一个父物体的话,打印和面板中显示的Transform面板中的信息不一样,
// 面板中显示的是相对于父物体的位置。打印的则是世界坐标系的位置

在这里插入图片描述

输出的内容是世界坐标系的点而不是相对于父物体的坐标

相对于父物体的坐标

// 这两个坐标对于我们来说很重要,如果你想以面板的位置为准,就需要使用localPosition
this.transform.localPosition

在这里插入图片描述

这次就一样了。

位移

以前做题时,都是在一维只有左右,路程 = 速度 * 时间就表示在这个方向上移动了多少m

在这里插入图片描述

📓当在多维的时候,就有了方向的概念,例如在2维中,我们先计算它朝着x轴的方向 * 速度 *时间移动了多少,之后再计算他朝着y轴的方向 * 速度 * 时间移动了多少,最后将当前所在的位置与计算出来的位置进行相加,此时就如下图指向的地方就是移动过后所在的位置。如果说错了请纠正我·

为什么要相加?因为,transform.position是一个向量它需要一个向量的值,恰巧Vector3.right这个方向也是一个向量,我们将方向这个向量乘以5,这个5此时就是它的标量,最后得到的就是Vector3.right=(5,0,0)再将它乘以时间得到的就是移动位置,了解数学中向量概念的同学都知道,两个向量相加就是 向量A+向量B=(xA+xB , yA+yB, zA+zB),得到的就是物体当前所处的位置

在这里插入图片描述

公式:路程 = 方向 * 速度 * 时间

有了上面的概念,我们在Unity中进行验证一下:

void Update()
{
	transform.position = transform.position + Vector3.right * 5 * Time.deltaTime;
}

在这里插入图片描述

API

Unity中提供了一个专门用于移动的方法transform.Traslate()他有五个重载,用的比较多的就只有两个

参数一:表示位移多少,路程 = 方向 * 速度 * 时间

参数二:表示 相对坐标系

相对于世界坐标系Z轴移动

transform.Translate(Vector3.right * 5 * Time.deltaTime, Space.World);

相对于世界坐标系,物体自己的面朝向(自己的Z轴) 移动。Space.World表示相对于世界坐标系移动

transform.Translate(transform.right * 5 * Time.deltaTime, Space.World);

相对于自己的坐标系 下的 自己的面朝向移动(一定不会让物体这样移动)

transform.Translate(transform.right * 5 * Time.deltaTime, Space.Self);

相对于自己的坐标系 下的 z轴正方向

transform.Translate(Vector3.right * 5 * Time.deltaTime, Space.Self);

注意:一般都是使用API来让物体移动

总结

Vector3的使用,如何声明 提供的常用静态属性 和一个计算距离的方法

位置,相对于世界坐标系和相对于父对象的位置 这两个位置的区别

位移,自己如何计算来进行位移

API是哪个方法来进行位移,使用时要注意。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity中,RectTransformTransform都可以用来表示游戏对象的位置、旋转和缩放。RectTransform主要用于UI元素在画布上的定位和排版,而Transform则用于3D场景中游戏对象的定位和排版。它们的位置转换可以通过以下方式实现: 1. 从RectTransformTransform的转换 要将RectTransform的位置转换为Transform的位置,需要使用RectTransform的anchoredPosition属性和anchorMin、anchorMax属性,以及Canvas的scaleFactor属性。具体步骤如下: - 获取RectTransform的anchoredPosition属性,并将其转换为Canvas坐标系下的位置。 - 获取RectTransform的anchorMin和anchorMax属性,计算出UI元素的宽度和高度。 - 获取Canvas的scaleFactor属性,计算出Canvas坐标系和世界坐标系之间的缩放比例。 - 将Canvas坐标系下的位置转换为世界坐标系下的位置,即可得到Transform的位置。 2. 从Transform到RectTransform的转换 要将Transform的位置转换为RectTransform的位置,需要使用Canvas的RenderMode属性和RectTransform的anchoredPosition属性。具体步骤如下: - 获取Canvas的RenderMode属性,判断Canvas的渲染模式是Screen Space还是World Space。 - 如果Canvas的渲染模式是Screen Space,直接将Transform的位置转换为屏幕坐标系下的位置。 - 如果Canvas的渲染模式是World Space,需要将Transform的位置转换为Canvas坐标系下的位置,然后再转换为RectTransform的anchoredPosition属性。具体步骤同从RectTransformTransform的转换。 需要注意的是,RectTransformTransform的坐标系不同,转换时需要注意坐标系的转换。此外,RectTransformTransform的旋转和缩放也需要进行转换。可以使用Transform的localRotation和localScale属性,或使用RectTransform的rotation和sizeDelta属性来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yunyou1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值