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兩個函數用於停止協同函數


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