主要內容
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的設置中
(想象一下搖桿)
- Gravity屬性表示數值在按鍵釋放後返回0的速度,數值越大,速度越快
- Sensitivity屬性與Gravity相反,它表示數值返回值到達-1或1的速度,同樣是數值越大,速度越快
- Dead屬性表示盲區,盲區值越大,搖桿就需要移到更遠使GetAxis返回非0值
- 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.identity和transform.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#一致,這裏不重新寫了。