Unity基礎知識 - Beginner Scripting(二)

主要內容

GetButton 和 GetKey

得到座標系

OnMouseDown函數

GetComponent函數

Delta Time變量

數據類型

Instantiate函數

數組

Invoke函數

枚舉

Switch語句


GetButton and GetKey

GetButton 和 GetKey

· 在Unity中,GetButton和GetKey是獲取鍵盤按鍵或手柄按鍵的方式。GetKey對於鍵盤操作來說是沒問題的,但建議用GetButton來代替它,更加詳細地配置遊戲的控制。

 

· 在Edit/ProjectSettings/Input中調整按鍵以及按鍵內容。

 

· GetButtonDown、GetButton或GetButtonUp分別代表三種狀態,按下按住鬆開,並傳遞一個布爾值

 

· 示例,給按鍵命名爲Jump後,給它配置一個positive button爲space。

 Debug.Log(Input.GetButtonDown("Jump"));


 

GetAxis

得到座標系

· GetAxis和GetButton、GetKey的工作方式類似,但是它返回的是一個浮點數,數值在-1到1之間。

Debug.Log(Input.GetAxis("Horizontal"));

 

· 如果用GetAxisRaw(),則返回值只有-1,0或1,這適用於需要準確控制而不是平滑值的2D遊戲,所以也不需要Gravity和Sensitivity。

 

· 在Input的設置中

(想象一下搖桿)

  1. Gravity屬性表示數值在按鍵釋放後返回0的速度,數值越大,速度越快
  2. Sensitivity屬性與Gravity相反,它表示數值返回值到達-1或1的速度,同樣是數值越大,速度越快
  3. Dead屬性表示盲區,盲區值越大,搖桿就需要移到更遠使GetAxis返回非0值
  4. Snap允許在positive鍵和negative鍵同時按下的時候返回0

 

OnMouseDown Function

OnMouseDown函數

· OnMouseDown及相關函數可以檢測在碰撞體或GUI(圖形用戶界面)元素上的點擊。


· 示例:

//通過鼠標點擊擊飛一扇門,擊飛腳本掛在門上

void OnMouseDown() {

        rigidbody.AddForce(-transform.forward * 500);

        rigidbody.useGravity = true;

    }

 

GetComponent Function

GetComponent函數

· 示例:

//AnotherScript爲同一對象上的另一個腳本,YetAnotherScript爲另一個對象上的腳本

public GameObject otherGameObject;                   /*引用另一個對象*/

private AnotherScript another;                       /*引用其他腳本,這種引用方式實際上新建一個定義在腳本中的類的實例*/

private YetAnotherScript yetanother;

private void Awake()                                 /*在Awake中完成初始化*/

{
        another = GetComponent<AnotherScript>();     /*尖括號內爲組件類型*/

        yetanother = otherGameObject.GetComponent<YetAnotherScript>();

}

· 注意GetComponent()比較耗費處理能力,應該儘可能少地調用。在Awake或Start函數中使用,或者只在第一次需要時調用一次是最好的選擇。


 

Delta Time

Delta Time變量

· Delta的術語意思爲兩個值的差別。Time類中的deltaTime屬性本質是兩次Update或者FixedUpdate的間隔,它可以平滑過程中數值的運算。


 

Data Types

數據類型

· 基本數據類型分別是值類型(value types引用類型(reference types

 

· 值類型裏又有int、float、double、bool、char、Structs等,兩個常用的Structs分別是Vector3(三維向量)Quaternion(四元數)

 

· 引用類型要簡單一些,基本上任何屬於某個類的對象的變量,都是引用類型。

 

· 常用的引用類型(也就是類)分別是Transform和GameObject,其餘還有Rigidbody、MeshRenderer等。

 

· 區別:值類型保存了某個特定的值,而引用類型保存了某個值所在的內存地址


 

Classes

· 在Unity中,每個腳本包含了一個類的定義,類繼承自MonoBehaviour

· 各遊戲對象上不同的功能最好分別寫在不同的腳本上,這樣更易於管理。

· 在腳本中創建的類都屬於子類,浮點數數值後要加f。

· 編寫腳本需要的語法跟C#相同,內容包括類的定義,構造函數的定義,類的實例化等。

 

· 示例(認真觀察一下,能看出多少知識)

public class Stuff

    {

        public int bullets;

        public int rockets;

        public float fule;



        public Stuff()

        {

            bullets = 1;

            rockets = 1;

        }



        public Stuff(int bul,int roc)

        {

            bullets = bul;

            rockets = roc;

        }



        public Stuff(int bul,float ful)

        {

            bullets = bul;

            fule = ful;

        }

    }



public Stuff myStuff1 = new Stuff();

public Stuff myStuff2 = new Stuff(2, 2);

public Stuff myStuff3 = new Stuff(2, 2.5f);        /*浮點數數值後要加f*/

 

Instantiate Function

Instantiate函數

· Instantiate函數用來創建遊戲對象的克隆體,通常這是指克隆一個預製體(Prefab)。預製體是預先設置好,存放在資源庫中的遊戲對象。

//發射導彈!!!


public Rigidbody rocketPrefab;         /*導彈預製體的引用*/

public Transform barrelEnd;            /*給導彈一個發射位置的引用*/



void Update () {

        if(Input.GetButtonDown("Fire"))     /*在Input裏設置好“Fire”對應的positive button*/

        {

            Rigidbody rocketInstance;       /*爲了讓導彈作爲一個物理對象出現而創建的變量*/

            rocketInstance = Instantiate(rocketPrefab, barrelEnd.position, barrelEnd.rotation) as Rigidbody;

                                            /*Instantiate函數內有三個參數,分別是(預製體,位置屬性,旋轉屬性)*/

                                            /*as Rigidbody的作用是物理對象化*/

            rocketInstance.AddForce(barrelEnd.forward * 500f);  /*給導彈發射位置給一個力*/

        }

}

 

· 通常生成一個預製體後還要有移除它的方式,譬如導彈發射出去後就應該消失併產生相應的特效和聲音。

//導彈的“自爆”腳本
 
void Start() {

        Destroy(gameObject, 1.5f);     /*調用Destroy函數,注意第二個參數是浮點型*/

}

 

Arrays

數組

· 數組定義方式(以整型數組爲例):

第一種:

int[] Array = new int[3];  //跟C#有點不一樣

void Start()

    {

        Array[0] = 0;

        Array[1] = 1;

        Array[2] = 2;

}

第二種:

int[] Array = { 0, 1, 2 };

 

· 在遊戲製作中數組的用途:

    public GameObject[] players;


    void Start()

    {

        players = GameObject.FindGameObjectsWithTag("Player");

        /*找到所有帶“Player”標籤的遊戲對象,並把它們放在一個數組中統一進行管理*/


        for(int i = 0;i < players.Length;i++)

        {

            Debug.Log("Player Number " + i + " is named " + players[i].name);

        }

    }


 

Invoke Function

Invoke函數

· Invoke函數用於安排一個延遲一定時間調用的函數,有助於構造一個有時效性的調用系統。

· 示例:

public class New : MonoBehaviour {

    public GameObject target;


    void Start()

    {

        Invoke("Spawn", 2);                  /*只調用一次,延遲2s,第一個參數爲函數名*/

        InvokeRepeating("Spawn", 2, 1);      /*重複調用,延遲2s調用後,每次調用間隔1s*/

    }


    void Spawn()

    {

        float x = Random.Range(-2.0f, 2.0f); /*生成隨機數*/

        float z = Random.Range(-2.0f, 2.0f);

        Instantiate(target, new Vector3(x, 2, z), Quaternion.identity);  /*生成預製體*/

    }

}

注意:

1)Invoke()能作用的函數只有void類型,不需要參數的函數。

2)Quaternion意思是四元數,又稱爲超複數,形式爲a+bi+cj+dk(a,b,c,d爲實數),i表示x軸到y軸的轉動,j表示z軸到x軸的轉動,k表示y軸到z軸的轉動,所以四元數可以表示三維空間的旋轉。

3)Quaternion.identitytransform.rotation的區別:

Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋轉前的初始角度,是一個確切的值,而transform.rotation是指本物體的角度,值是不確定的,比如可以這麼設置transform.rotation = Quaternion.identity;

4)CancelInvoke("Spawn"); 可以用來停止Invoke函數。


 

Enumerations

枚舉

· 跟C#的內容一樣,這裏不重新寫了。


 

Switch Statements

Switch語句

· switch語句常跟枚舉類型搭配使用,預估也可用於遊戲中的特定觸發事件隨機觸發事件

· 內容也與C#一致,這裏不重新寫了。

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