筆記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);

在這裏插入圖片描述

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