Unity中极其重要的Transform(笔记)

目录

前言

Transform的主要用途

Vector3基础

申明Vector3

Vector3的计算

常用的Vector3坐标(向量)

计算两个点之间的距离

位置

相对世界坐标系

相对父对象坐标系

对位置进行赋值

直接修改位置

修改位置中的一个值

先获取Vector在修改

对象当前的各朝向

位移

自己计算位移

利用API计算位移

角度

相对世界坐标系的角度

相对父对象坐标系的角度

修改角度

旋转

自己计算

API计算

自转

围绕轴旋转(也是自转)

相对于某一个点旋转

缩放

相对世界坐标系缩放大小

相对父对象坐标系缩放大小

看向

父子关系

获取和设置父对象

获取父对象

断绝父子关系

设置父对象

通过API来设置

抛妻弃子

获取子对象

按名字查找儿子

遍历儿子

儿子的操作

判断自己的父亲是谁

得到自己作为儿子的编号

把自己设置为第一个儿子

把自己设置为最后一个儿子

把自己设置为指定个儿子

坐标转换

世界坐标转本地坐标

世界坐标系的点转换为本地坐标系的点

世界坐标系的方向转换为本地坐标系的方向

本地坐标转世界坐标

本地转世界的点

本地转世界的方向

总结


前言

        本篇笔记用于记录唐老狮视频课程的学习心得

        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);    //角色的右侧方向
    }
}

        这里只举例了三个方向,其实还有其他方向,其他方向同理。

位移

        坐标系下的路程确实是时间乘速率的标量,但是为了得出位