Unity基礎知識 - Beginner Scripting(一)

主要內容

從C++的角度開始學C#

Awake和Start函數

Update和FixedUpdate函數

LateUpdate函數

向量計算

組件的激活與不激活

激活遊戲對象

Translate和Rotate函數

LookAt函數

Destroy函數


置頂:掛載到遊戲對象上的腳本必須繼承自Mono,其他的腳本不需要


 

Start learning C# from a C++ perspective

從C++的角度開始學C#

· 在C#中,變量與函數的定義、if語句、for循環、do-whilewhile循環等方面的語法都與C++相同或者相似,下面只是提一下比較陌生的foreach循環。

 

· foreach循環用來遍歷數組中的每個元素,但不能對元素進行修改,想要修改元素還得用到for循環。

· 示例

void Start () {

        string[] strings = new string[3];         /*new了一個包含3個字符串的數組,並把地址給指向字符串數組的指針strings*/



        strings[0] = "119";                       /*賦值*/

        strings[1] = "117";

        strings[2] = "0330";



        foreach (string item in strings)          /*在foreach函數的括號中定義一個與遍歷元素類型(string)相同的臨時變量,接上關鍵詞in和需要遍歷的數組名*/

            Debug.Log(item);

}

 

Awake and Start Functions

Awake和Start函數

· AwakeStart函數在腳本被加載時自動被調用,相當於腳本定義的類(父類)的構造函數。

 

· Awake函數會首先被調用,且腳本不被激活時依然能被調用。Start函數在Awake函數之後,第一次調用Update函數之前被調用,但是腳本不被激活時不會被調用。

 

· 因此Awake函數適合在腳本被激活前做一些腳本間的引用初始化工作,而用Start函數去做腳本被激活後才能開始的工作。

 

· AwakeStart函數在生命週期內只能被調用一次。


 

Update and FixedUpdate Functions

Update和FixedUpdate函數

· Update(應該)是Unity最常用的函數,它在每幀,每個使用它的腳本上都會被調用一次,幾乎所用需要被週期性修改的東西都發生在這,例如非物理對象(無rigidbody移動,簡單的計時器(Timer),輸入檢測等。

 

· 但是Update函數並不按照規律的時間被調用,如果處理某幀的時間比後面的長,時間間隔就不同了。FixedUpdate的作用跟Update類似,但是FixedUpdate被調用的時間間隔是固定的

 

· FixedUpdate被調用之後,任何必要的物理計算開始進行。因此,任何影響物理對象(含有rigidbody)的操作,都應該在FixedUpdate裏執行。

在用FixedUpdate處理物理效果時,一個好習慣是用力來觸發運動


 

LateUpdate Function

LateUpdate函數

· LateUpdate函數在所用Update函數調用之後執行,跟隨遊戲對象的相機必須要放在這個函數裏,因爲遊戲對象可能在Update函數裏發生位置的變化。


 

Vector Maths

向量計算

· 向量長度:Vector2.magnitude

· 向量點乘:Vector2.Dot(VectorA,VectorB)

· 向量叉乘:Vector2.Cross(VectorA,VectorB)


 

Enabling and Disabling Components

組件的激活與不激活

· 激活和不激活腳本也能通過這種方式實現。

· 示例:

public class New : MonoBehaviour {


private Light light;


void Start () {

        light = GetComponent<Light>();          /*獲取腳本所在對象上的組件的泛型函數*/

    }


void Update () {

        if(Input.GetKeyDown(KeyCode.Space))

        {

            light.enabled = !light.enabled;     /*設置成開關*/

        }

    }

}

 

Activating GameObjects

激活遊戲對象

· 在腳本中控制遊戲對象是否被激活,要使用語句:

gameObject.SetActive(false);

 

· 在層次視圖中,父節點不被激活時,即使子節點處於激活狀態也不會在場景中顯示出來。想要在控制檯觀察子節點的激活狀態可以使用語句:

public class New : MonoBehaviour {


public GameObject myObject;                     /*獲取腳本所在對象*/


void Start () {

        Debug.Log(myObject.activeSelf);         /*獲取對象激活狀態*/

        Debug.Log(myObject.activeInHierarchy);  /*獲取對象在層次視圖(場景)中的激活狀態*/

    }

}


 

Translate and Rotate Functions

Translate和Rotate函數

· TranslateRotate函數是用來修改遊戲對象的位置和使遊戲對象旋轉。使用這兩個函數的前提遊戲對象不屬於物理對象,即不含rigidbodyrigidbody爲勾選Is Kinematic

 

public class New : MonoBehaviour {

public float moveSpeed = 10f;

public float turnSpeed = 50f;


void Update () {

        if (Input.GetKeyDown(KeyCode.UpArrow))

            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);

        if (Input.GetKeyDown(KeyCode.DownArrow))

            transform.Translate(Vector3.forward * -moveSpeed * Time.deltaTime);

        if (Input.GetKeyDown(KeyCode.LeftArrow))

            transform.Rotate(Vector3.up * -turnSpeed * Time.deltaTime);

        if (Input.GetKeyDown(KeyCode.RightArrow))

            transform.Rotate(Vector3.up * turnSpeed * Time.deltaTime);

    }

}

· Translate()Rotate()transform屬性的函數。

forwardupVector3結構體的成員(屬性)。除了forwardup還有backdownleftright等成員,分別表示向前,順時針,向後,逆時針,左,右。

Time.deltaTime表示單位是m/s而不是m/幀,m/幀的效果會比m/s快很多。

 

· 注意TranslateRotate函數都是在局部座標系裏工作,而且只能用於非物理對象,若要發生物理交互,就得使用物理函數來進行變換。

 

拓展:Vector3的靜態屬性


 

LookAt Function

LookAt函數

· LookAt函數可以使對象甲(如攝像機)一直看向世界座標系裏的某個對象。

 

· 示例

public class New : MonoBehaviour {

public Transform target;


void Update () {

        transform.LookAt(target);

    }

}

 

Destroy Function

Destroy函數

· Destroy函數可以在遊戲運行時移除遊戲對象,或者遊戲對象上的組件。也可以通過第二個參數(浮點數),在移除前加上一段延遲。

· 需要注意的是,移除組件sprite renderermesh renderer與移除遊戲對象的效果相同。

//移除其他遊戲對象:

public class New : MonoBehaviour {

public GameObject other;

void Update () {

        if(Input.GetKeyDown(KeyCode.Space))

        {

            Destroy(other);

        }

    }

}



//移除腳本所在對象:

void Update () {

        if(Input.GetKeyDown(KeyCode.Space))

        {

            Destroy(gameObject);

        }

}



//移除對象上的組件:

void Update () {

        if(Input.GetKeyDown(KeyCode.Space))

        {

            Destroy(GetComponent<MeshRenderer>());

        }

}

 

路過的圈毛君:“這篇介紹的是一些基礎的腳本知識,以後會慢慢把進階的肝出來啦~挖坑太多,感覺有點填不過來了hhh_(:з」∠)_”

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