目录
前言
本篇笔记用于记录唐老狮视频课程的学习心得
Transform是Untiy中必不可少的东西,十分的重要,可以发现,除了空物体外,几乎所有的游戏对象都有Transform存在。
Transform的主要用途
游戏对象(GameObject)的位移、旋转、缩放、父子关系、坐标转换等相关操作都由它处理。它是Unity提供的极其重要的类。
Vector3基础
Vector3主要是用来表示三维坐标系中的一个点,或者一个向量。Vector3和Vector2的核心数学逻辑和API设计是高度一致的,只要学会一个之后,再补充少量的知识就可以轻松的学会另一个。需要注意的是两者存在维度、应用场景和某些方法上的区别。
Vector3里面用x、y、z来表示位置信息。
申明Vector3
Vector3其实是Untiy给我们提供的一个结构体,我们可以像平常申明一个结构体一样去申明它。
public class Study : MonoBehaviour
{
void Start(){
Vector3 v = new Vector3();//
v.x=1;v.y=1;v.z=1;
Vector3 v1 = new Vector3(1,1);
Vector3 v2 = new Vector3(1,1,1);
Vector3 v3;
}
}
我们可以自由的根据需求来选择申明Vector3的方法,参数如果不填写的话,都是会默认为0的。并且我们是可以直接获取到里面的xyz坐标的信息并且赋值的。
Vector3的计算
Vector3里面已经写好了运算符重载,我们是可以直接使用+-*/来进行运算的。
public class Study : MonoBehaviour
{
void Start(){
Vector3 v1 = new Vector3(1,1,1);
Vector3 v2 = new Vector3(2,2,2);
print(v1 + v2);
print(v1 - v2);
print(v1 * 10);
print(v1 / 10);
}
}
我们是可以直接使用四则运算来处理Vector3的。效果如下所示
常用的Vector3坐标(向量)
其实我们直接申明一个Vector3的话,需要编写的代码量还是相对比较多的,所以它还给我们提供了一些静态属性。相当于是给我们提供了一些常用的向量或者坐标。
静态属性 | 坐标 |
Vector3.zero | (0,0,0) |
Vector3.right | (1,0,0) |
Vector3.left | (-1,0,0) |
Vector3.forward | (0,0,1) |
Vector3.back | (0,0,-1) |
Vector3.up | (0,1,0) |
Vector3.down | (0,-1,0) |
有个特别的规则,一般的,会把z轴正方向视为角色面朝的方向。
计算两个点之间的距离
虽然我们可以利用数学知识自己编写一个计算距离的方法出来,但是不用这么麻烦,因为它里面已经为我们提供好了。那就是Vector3.Distance。
public class Study : MonoBehaviour
{
void Start(){
Vector3 v1 = new Vector3(1,1,1);
Vector3 v2 = new Vector3(2,2,2);
print(Vector3.Distance(v1,v2));
}
}
如图,准确的计算出了两点的距离。
至此,简单的Vector3基础暂时结束了,接下来是关于Transform的笔记。
位置
相对世界坐标系
我们可以通过transform.position来获取位置信息,注意这个xyz数值可能Inspector面板上不一样,因为Inspector面板上显示的是相对于父对象的位置信息,而transform.position则是相对于世界坐标系的位置。
当然如果没有父对象,Inspector面板上显示的就是相对世界坐标系的位置信息了,有两种情况下Inspector面板上显示位置信息和相对世界坐标系位置信息是一样的。一种是没有父对象,另一种是父对象位置是(0,0,0)。
public class Study : MonoBehaviour
{
void Start(){
print(this.transform.position);
}
}
如图我们打印出了位置信息。
相对父对象坐标系
如果我们要获取的就是相对于父对象的位置信息,或者说是要获取和Inspector面板上一模一样的位置信息的话,就要使用transform.localPosition来获取了。
public class Study : MonoBehaviour
{
void Start(){
print(this.transform.localPosition);
}
}
笔记中就不展示实际效果了。
对位置进行赋值
想要修改一个位置是不能单独对它的xyz进行赋值的,要直接对整体进行赋值修改。
直接修改位置
我们要向position传入一个Vector3类型的值。
this.transform.position = new Vector3(1,1,1);
修改位置中的一个值
当然,也可以只修改一个值,但是会相对麻烦一点。为了避免显示不下,我分行了。
this.transform.position = new Vector3(19,
this.transform.position.y,this.transform.position.z);
先获取Vector在修改
可能上面那个比较复杂,我们也可以用另一个看起来比较简单的。因为Vector3是可以修改xyz的,所以我们可以先获取Vector3。
Vector3 v = this.transform.position;
v.x = 111;
this.transform.position = v;
对象当前的各朝向
对象的朝向对我们来说很重要,对于视角移动等内容有着重要意义。我们可以通过transform来获得。
public class Study : MonoBehaviour
{
void Start(){
print(this.transform.forward); //角色的面朝方向
print(this.transform.up); //角色的头顶方向
print(this.transform.right); //角色的右侧方向
}
}
这里只举例了三个方向,其实还有其他方向,其他方向同理。
位移
坐标系下的路程确实是时间乘速率的标量,但是为了得出位