笔记12 unity常用的API

笔记12 Unity常用的API

组件

在这里插入图片描述

生命周期里的方法

构造

在这里插入图片描述

   //构造
    private void Awake()
    {
        Debug.Log("Awake");
    }
      
    // Use this for initialization
	void Start () {
        Debug.Log("Start");
    } 

刷新

GPU控制的每帧调用一次的刷新

在这里插入图片描述

// Update is called once per frame每帧调用一次
    void Update () {
        Debug.Log("Update");
    }
    //Update调用之后,调用一次。
    private void LateUpdate()
    {
        //摄像机跟随
        Debug.Log("LaUpdate");
    } 

CPU控制的固定时间刷新

   /*固定时间刷新,一秒调用60次。1秒除以60,约每隔0.02f。
    比如可使得下落的物体,在各台电脑上下落的位移一样。*/
    private void FixedUpdate()
    {
        //物理事件。
    } 

激活

在这里插入图片描述

    //激活调用
    private void OnEnable()
    {
        Debug.Log("Enable");
    }
    //非激活调用
    private void OnDisable()
    {
        Debug.Log("Disable");
    } 

一个旧方法

为了把GUI很平滑的渲染出来

 //旧方法。每两帧调用一次。
    private void OnGUI()
    {
    } 

销毁

在这里插入图片描述

    //销毁的时候调用
    private void OnDestroy()
    {
        //释放或者关闭一些变量的

        Debug.Log("OnDestroy");   //Debug调试
    } 

Vector3结构体

在这里插入图片描述

创建,得到单位向量、模、模的平方,常用向量简写

void Start () {
        Vector3 v = new Vector3(1, 1, 1);  
        //可以new一个空的,在下面v.x,x.y,v.z赋值
        
        //得到v的单位向量
        Debug.Log(v.normalized);    //结果:(0.6,0.6,0.6)
        //得到v的模
        Debug.Log(v.magnitude);      //结果:1.73
        //得到v的模的平方。可用于比较向量大小
        Debug.Log(v.sqrMagnitude);
       
        //常用向量简写
        Debug.Log(Vector3.zero);  //等于new Vector3(0, 0, 0)
        Debug.Log(Vector3.forward);    //001   反方向Debug.Log(-Vector3.forward);   
        Debug.Log(Vector3.up);    //010
        Debug.Log(Vector3.right);  //100   Debug.Log输出
    } 

向量的点乘Vector3.Angle。公式:a.b = |a||b|cosθ

计算两个向量的夹角

        //两个向量的夹角   
        Debug.Log(Vector3.Angle(Vector3.up, Vector3.forward));  

计算两点的距离Vector3.Distance

 //计算两点的距离。
 //向量是可以乘以变量(数值)的,就是XYZ都乘以标量。计算000与0,0,10的距离。结果:10
        Debug.Log(Vector3.Distance(Vector3.zero, Vector3.forward * 10));    

插值Vector3.Lerp(做移动)

插值,一个百分比
比如0至10,插值为0.1f,那么插值的结果:0+(10-0)*0.1是1
比如10至20,插值为0.1f,那么插值的结果:10+(10-0)*0.1是11

位移(位移到第一次插值结果的位置)

  transform.position = Vector3.Lerp(transform.position, Vector3.forward * 10, 0.1f);
        //transform组件的位置position = 起始值(从他自身的位置),终点,插值(0.1)
/*结果:
位移到transform.position +(Vector3.forward * 10 —transform.position)*0.1的位置。
此处,由于其实位置是000,所以位移到了0,0,1*/

减速移动(位移到第二个参数的位置。没必要用)

  void Update ()
   {
        //因为让它动起来,所以写在Update里面。
         transform.position = Vector3.Lerp(transform.position, Vector3.forward * 10, 0.1f);
         //从transform.position移动到Vector3.forward * 10,减速。 
   }        

在这里插入图片描述

匀速运动(没必要用)

 transform.position = Vector3.Lerp(transform.position, transform.position+Vector3.forward * 10, 0.01f);  
 /*因为参数二里面包含了变化的参数一,所以二者的差永远是相同的, 
 那么每次插值结果便是相同的,所以形成匀速运动,且不会停止。
 因为是运动,需要多次执行代码,所以是写在Update里的。*/

调试方法

输出:Debug.Log和 print

print是MonoBehaviour的成员方法,所以只有当类继承于 MonoBehaviour时,才可以用。
而Debug.Log是使用的Debug的静态方法,所以没有上面那样的限制。
print其实是Debug的封装,一种简单写法。
位置:Start

 print(111);    //输出。随便什么类型。

画线Debug.DrawLine(特点:移动物体,终点固定,线的长度变化)

位置:Update

//画线。例:往天上10米的位置画线。(起始位置(自身位置),终点(0,10,0),标记(红色))
//不标记的话,可以不写标记那个参数。特点:移动物体,终点固定,线的长度变化
        Debug.DrawLine(transform.position, Vector3.up * 10, Color.red);    

画射线Debug.DrawRay(特点:移动物体,线的长度不变,终点不固定。)

位置:Update

//画射线(起始位置(自身位置),终点(自身位置基础上的0,10,0),标记(蓝色))。
//特点:移动物体,线的长度不变,终点不固定。
        Debug.DrawRay(transform.position, Vector3.up * 10, Color.blue);    

四元数(结构体)

旋转Euler

位置:Update

        //它有个类方法叫Euler欧拉,欧拉转成了四元数。
        //括号里可以填Vector3的结构体,代表一个角度。也可以直接写xyz。
        Quaternion q = Quaternion.Euler(0, 0, 90);   //让z轴旋转90度。   

空旋转identity(000的意思)

位置:Update

 //空旋转(000的意思)。
 //因为我们可萌不知道给多少度是空旋转,所以给了一个变量identity,代表这是一个空旋转。
        q = Quaternion.identity;    

朝向一个向量(不管怎么移动,依旧朝向那个向量)

//首先拿到Transform组件(要面向的圆柱),此处是Cylinider的Transform。
    public Transform Cylinider;    
 void Update () 
 {
        //朝向一个向量  (不管怎么移动,依旧朝向那个向量)
        //拿到面向Cylinider的一个向量。要面向的圆柱的位置-我的位置
        Vector3 dir = Cylinider.position - transform.position;
        //朝向dir向量
        q = Quaternion.LookRotation(dir);
        //赋值回去。rotation旋转
        transform.rotation = q;
}    

在这里插入图片描述

四元数也可以有插值

transform.retation在unity里是欧拉角,在代码里就是四元数。
eulerAngles欧拉角,transform.eulerAngles就是它真实的欧拉角度了。
transform.rotation用四元数表示角度,transform.eulerAngles用欧拉角表示角度,二者都代表了角度。
从当前的角度,到这样的角度(Y轴转90度),插值是0.1。
返回值(插值后的四元数)赋给自己。结果:一直转。

transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, transform.eulerAngles.y + 90, 0),0.1f);  

Mathf(结构体)与数学相关。它的常用api

绝对值Mathf.Abs(简单又常用)

        //绝对值
        int n = Mathf.Abs(-1);

插值Mathf.Lerp

      //插值。对一个轴进行插值,Vactor3是对三个轴进行插值
        Mathf.Lerp(0, 10, 0.1f);

限制数

法一Mathf.Clamp:三个参数

此处,如果n是0到5之间的数,那么就是本值。如果n大于5,则n会变成5。如果n小于0,则会变成0。
可用于限定年龄。

       //限制数。参数1:要限制的数(输入值)。参数2:最小值。参数3:最大值。
        n = Mathf.Clamp(n, 0, 5);

法二Mathf.Clamp01:一个参数

//限制数。返回值必须是float。就相当于上面n = Mathf.Clamp(n, 0, 1);所以一般用上面的方法
        float f = Mathf.Clamp01(n);

计算三角函数

Mathf.Sin();

Time(类)。它的常用属性

游戏从开始到现在所运行的总时间Time.time

位置:start
可用于提醒,保存进度

 //游戏从开始到现在所运行的总时间。time是静态的,因为直接用类名Time调用的。
        float t = Time.time;

从上一帧到这一帧所用的时间Time.deltaTime,及移动

 void Update () {
        //从上一帧到这一帧所用的时间。
        float t = Time.deltaTime;
        /*用於单位的转化。
        例如:移动。从当前位置往前移动10米。
        由于它默认的是米/帧,不是米/秒。为了每台设备运行一致,所以将单位统一成秒。
        所有的数值都*Time.deltaTime*/
        Vector3 move = transform.position + Vector3.forward * 10;
	}

固定时间调用一次FixedUpdate,可修改

//固定时间调用一次,默认0.02秒调用一次。可以修改,但一般不要修改
    private void FixedUpdate()
    {

    }

它是可以修改的,但一般不要修改。例如2d游戏,要求不高时,可用。

void Start () 
{
/*修改FixedUpdate调用时间。
FixedUpdate默认也是0.02秒。此时改成了1,则上面的方法是1秒调用一次。*/
        Time.fixedDeltaTime = 1f;
}

时间缩放Time.timeScale

 //timeScale是时间缩放,默认值是1。它影响的只是Update和LateUpdate。一般不会修改
        Time.timeScale = 1;

GameObject(类)

unity里的物体,在c#里,都叫GameObject类。
我们写的代码是在test这个组件里面写的,Transform也是一个脚本,只不过它是系统写好的,挂在那的。对于test这个脚本来说,我们如何拿到它所挂载的物体?直接调用GameObject即可。

拿到当前脚本所挂载的物体

//拿到当前脚本所挂载的物体。直接调用GameObject即可。go就是当前空的游戏物体。
        GameObject go = gameObject;

便捷的拿到Transform组件

每个物体都有Transform组件

 //便捷的拿到Transform组件
        Transform trans = go.transform;

它俩之间的关系:通过物体拿到组件,有了组件可以得到它所挂载的物体,有了物体,又可以得到它的组件……
可以写一溜,然后调用里面的方法。gameObject.transform.gameObject.transform.方法
很好用,所以给了上面的transform属性,直接go.transform即可。其他属性就不能这样拿了,比如test也是一个组件,但不能go.test。

获取物体的激活状态

        //获取物体的激活状态
        Debug.Log(go.activeSelf);   //true激活

更改物体的激活状态

        //更改物体的激活状态。用方法
        go.SetActive(false);     //改成false非激活状态

更改组件的激活状态

        //更改组件的激活状态。但是transform不行。用属性
        //enabled = false;

更改游戏物体的名称

       //更改游戏物体的名称
        Debug.Log(go.name);

输出标签

       //输出标签
        Debug.Log(go.tag);

在这里插入图片描述

打印层

        //打印层。layer是int类型,结果就是名称前面的数。
        Debug.Log(go.layer);

在这里插入图片描述

拿到组件(利用泛型)

        //拿到组件。利用泛型
        //比如拿到AudoSource组件
        AudioSource plear = go.GetComponent<AudioSource>();
        //比如拿到teste组件
        test test = go.GetComponent<test>();   

拿到Cube物体

方法一:写一个变量GameObject,并把它设置为public

在这里插入图片描述

//拿到Cube物体
 public GameObject cube ; 

方法二:通过大名去找Find

        //拿到Cube物体,通过大名去找,效率低,少用。
        GameObject cube = GameObject.Find("Cube");

方法三:通过tag值(标签)去找

拿到一个物体

//拿到一个物体。比如上面的Cube的标签是Player,通过标签,拿到Cube。
        cube = GameObject.FindWithTag("Player");

拿到同标签的一组物体

 /*它的返回值是一个数组。它会将所有标签为Player的物体拿到,并放到这个数组里。
 然后就可以对他们进行统一的操作了。*/
        GameObject[] cubes = GameObject.FindGameObjectsWithTag("Player");

transform

功能一:位置、旋转、缩放

拿到它的位置

当前物体的世界座标点

        //拿到当前物体的世界座标点
        Debug.Log(transform.position);

当前物体的本地座标点(相对于父物体的座标)

        //当前物体的本地座标点。相对于父物体的座标
        Debug.Log(transform.localPosition);

欧拉角

世界欧拉角

        //世界欧拉角。旋转父物体,子物体会以父物体为中心点一起旋转。
        Debug.Log(transform.eulerAngles);

本地欧拉角

        //本地欧拉角。相对于父物体的角度
        Debug.Log(transform.localEulerAngles);

本地缩放(缩放仅此一种)

//本地缩放。即缩放父物体,子物体一起缩放。所以相对于父物体来说是没缩放的。
        Debug.Log(transform.localScale);

四元数

世界四元数

        //世界四元数。unity里的rotation是指欧拉角,此处是指四元数。
        Debug.Log(transform.rotation);

本地四元数

        //本地四元数
        Debug.Log(transform.localRotation);

获取当前物体的前方(z轴)、上方、右方的单位向量

        //当前物体的前方向量(z轴)
        Debug.Log(transform.forward);
        //当前物体的上方向量
        Debug.Log(transform.up);
        //当前物体的右方向量
        Debug.Log(transform.right);

移动transform.Translate

位置:Update

        //移动。方向*速度*Time.deltaTime
        //方向常用单位向量,例如此处为transform.up
        //*Time.deltaTime是为了将速度的单位由帧转化成秒。此处表示向上,10米/秒。
        transform.Translate(transform.up * 10 * Time.deltaTime);

旋转

自转transform.Rotate

        //旋转。transform.up表示绕着Y轴。此处表示绕着Y轴旋转,20度/秒。
        transform.Rotate(transform.up * 20 * Time.deltaTime);

公转transform.RotateAround

       //绕着某个点或物体旋转。此时表示绕着世界座标的000点的Y轴旋转,30度/秒。
        transform.RotateAround(Vector3.zero, Vector3.up, 30 * Time.deltaTime);

看向某点transform.LookAt

       //看向某点。之前学的是朝向某个向量。
        transform.LookAt(Vector3.zero);

功能二:保存父子物体的功能

拿到父物体parent

parent代表我的父物体的transform组件。因为他们真正有联系的是transform组件。
为了方便,有几个属性,只要拿到组件,就可以拿到游戏物体的属性。主要就是name和tag值。

        //打印出了父物体的名称。
        //Debug.Log(transform.parent.name);   

设置父子物体transform.SetParent

可用于做物品栏。当把物品放在物品栏时,物品栏就变成了物品的父物体。

        //设置父子物体。运行的时候是父子关系,不运行的话,还是原样。
        transform.SetParent(GameObject.Find("Sphere").transform);

通过索引,得到子物体transform.GetChild

        //通过索引,得到子物体。索引0,表示第1个子物体。
        Debug.Log(transform.GetChild(1));

查看子物体个数transform.childCount

        //查看子物体个数
        Debug.Log(transform.childCount);

找到根部的父物体transform.root

       //找到根部的父物体
        Debug.Log(transform.root);

寻找子物体transform.Find

 //寻找子物体。和gameObject.Find很像,都是用名称查找。gameObject.Find返回GameObject
        //此处的返回值是Transform,找到子物体名字叫Cylinder的输出出来。
        //transform.Find效率高,因为它只在它的子物体里查找。能找到非激活的子物体。
        Transform trans = transform.Find("Cylinder");
        Debug.Log(trans.name);

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章