Unity3D腳印2——從腳本開始
按照我之前的慣性思維,這時候應該拋出一個問題,是不是可以不通過界面,直接new一個腳本出來,呵呵(自嘲,這種想法比new一個Scene更不實際,雖然可以實現~,通過寫文件在代碼里面寫一個腳本,然后動態加載進來)
比起new一個腳本,我覺得還是了解一下怎樣寫一個腳本吧
MonoBehaviour是所有腳本的基類,所有要掛載到GameObject之上的腳本,都需要繼承這個類,js腳本自動繼承這個類,C#需要顯式地繼承MonoBehaviour,MonoBehaviour提供了一系列函數給我們重寫,這里記錄一下最常用的一些函數
三個Update:
Update 在每一幀更新,和游戲邏輯相關的代碼,對游戲對象進行旋轉,平移的代碼在這里實現
LateUpdate 在每一幀的Update調用完之后被調用
FixedUpdate 按照固定的時間間隔調用,不受幀率變化的影響,物理引擎相關的代碼在這里實現,例如對對象施加力
Awake 在腳本實例被載入的時候調用
Start 在第一次Update之前調用
Reset 在對象被重置的時候調用
OnGUI 在渲染和處理GUI事件時被調用
OnDestroy 在對象被銷毀的時候調用
其他一些OnXXX函數在此不作介紹了,后面自然會用到的
這個網頁簡單介紹了MonoBehaviour這個類的所有函數,可重寫方法,成員變量
http://game.ceeger.com/Script/MonoBehaviour/MonoBehaviour.html
MonoBehaviour還有其他一些有意思的東西:
useGUILayout,當你不使用GUI.Window和GUILayout的時候,果斷設置為false,這個玩意兒默認是開啟的,設置為false最好在Awake回調里面進行設置
Invoke系列方法:
Invoke系列方法相當于計時器,在指定的時間點上調用指定的函數
void Invoke(string methodName, float time); //在time秒后調用methodName
void Invoke(string methodName, float time, float repeatRate); //在time秒后開始以repeatRate秒為間隔重復調用方法
void IsInvoking(string methodName); //判斷某個方法是否在等待調用
void CancelInvoke(); //取消所有的計時器調用
void CancelInvoke(string methodName) //取消某個計時器調用
(如果我想Invoke一個帶參數的方法,咋整呢?)
Coroutine系列方法:
協同方法相當于多線程吧,可以讓程序同時做多件事情,通過StartCoroutine傳入一個函數,將異步執行這個函數,StartCoroutine有三種用法,對應幾種不同類型的參數。需要注意的一個東西是yield,這是一個特殊的返回類型,它確保函數從yield語句的下一行繼續執行。
yield是一種特殊的return,就像c++里面的sleep,短暫的sleep可以交出線程的時間片,讓其他線程先執行,而yield會返回到父類繼續執行,yield后面可以返回一個null,也可以返回一個特殊的函數,當函數成立的時候,才執行接下來的語句(函數包括WaitForSeconds,WaitForFixedUpdate,Coroutine,StartCoroutine這四個繼承于YieldInstruction的指令)
yield return null; //讓出時間片,讓父進程先執行
yield return new WaitForSeconds(1); //在程序執行到1秒時才執行接下來的代碼
yield return new WaitForFixedUpdate(); //在FixedUpdate調用之后才執行接下來的代碼
yield return new WaitForEndOfFrame(); //在這一幀結束之后才執行接下來的代碼
yield return new StartCoroutine("xxx"); //在xxx協同執行完之后才執行接下來的代碼
StartCoroutine的三種調用方法:
StartCoroutine("Coroutine0", 1);
StartCoroutine("Coroutine1");
StartCoroutine(Coroutine2());
//帶一個object參數,返回值無視
int Coroutine0(int i)
{
print(i);
return i;
}
//不帶參數
void Coroutine1()
{
print("Coroutine test");
}
//調用yield返回IEnumerator類型的函數,可帶任意參數
IEnumerator Coroutine2()
{
yield return new WaitForSeconds(2);
print("WaitForSeconds" + Time.time);
}
另外,有StopCoroutine和StopAllCoroutines兩個函數用于停止協同函數