主要內容
置頂:掛載到遊戲對象上的腳本必須繼承自Mono,其他的腳本不需要
Start learning C# from a C++ perspective
從C++的角度開始學C#
· 在C#中,變量與函數的定義、if語句、for循環、do-while和while循環等方面的語法都與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函數
· Awake和Start函數在腳本被加載時自動被調用,相當於腳本定義的類(父類)的構造函數。
· Awake函數會首先被調用,且腳本不被激活時依然能被調用。Start函數在Awake函數之後,第一次調用Update函數之前被調用,但是腳本不被激活時不會被調用。
· 因此Awake函數適合在腳本被激活前做一些腳本間的引用或初始化工作,而用Start函數去做腳本被激活後才能開始的工作。
· Awake和Start函數在生命週期內只能被調用一次。
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函數
· Translate和Rotate函數是用來修改遊戲對象的位置和使遊戲對象旋轉。使用這兩個函數的前提是遊戲對象不屬於物理對象,即不含rigidbody或rigidbody爲勾選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屬性的函數。
forward和up是Vector3結構體的成員(屬性)。除了forward和up還有back,down,left,right等成員,分別表示向前,順時針,向後,逆時針,左,右。
Time.deltaTime表示單位是m/s而不是m/幀,m/幀的效果會比m/s快很多。
· 注意Translate和Rotate函數都是在局部座標系裏工作,而且只能用於非物理對象,若要發生物理交互,就得使用物理函數來進行變換。
拓展:Vector3的靜態屬性
LookAt Function
LookAt函數
· LookAt函數可以使對象甲(如攝像機)一直看向世界座標系裏的某個對象。
· 示例
public class New : MonoBehaviour {
public Transform target;
void Update () {
transform.LookAt(target);
}
}
Destroy Function
Destroy函數
· Destroy函數可以在遊戲運行時移除遊戲對象,或者遊戲對象上的組件。也可以通過第二個參數(浮點數),在移除前加上一段延遲。
· 需要注意的是,移除組件sprite renderer或mesh 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_(:з」∠)_”