常用腳本事件:
Update:每幀調用一次
Start:在第一次Update執行前調用
Awake:腳本實例在創建時調用
FixedUpdate:每個固定物理時間間隔調用一次
LateUpdate:每幀調用一次,在Update之后
MonoBehaviour類:
MonoBehaviour類是uniyt中非常重要的類,定義了基本的腳本行為,所有腳本類均需要從它直接或間接繼承。MonoBehaviour還定義了對各種特定事件的響應函數,這些函數名均以On作為開頭,下面是一些常用的事件響應函數。
OnMouseEnter:鼠標移入GUI控件或碰撞體時調用
OnMouseOver:鼠標停留~~~
OnMouseExit:鼠標移除~~~
OnMouseDown:鼠標按下~~~~
OnMouseUp:鼠標釋放~~~
OnTriggerEnter:當其他碰撞體進入觸發器時調用
OnTriggerExit:~~~~~~~~離開~~~~~~~~
OnTriggerStay:~~~~~~~停留~~~~~~~~~
OnCollisionEnter:當碰撞體或者剛體與其他碰撞體或者剛體接觸時調用
OnCollisionExit:~~~~~~~~~~~~~~~~~~~~~~~~離開時~~~
OnCollisionStay:~~~~~~~~~~~~~~~~~~~~~~~~保持接觸時~~~
OnControllerColliderHit:當控制器移動時與碰撞體發生碰撞時調用
OnBecameVisible:對於任意一個相機可見時調用
OnBecameInvisible:對於任意一個相機不可見時調用
OnEnable:對象啟用或者激活時調用
OnDisable:對象禁用或者取消激活時調用
OnDestory:腳本銷毀時調用
OnGUI:渲染GUI和處理GUI消息時調用
腳本和組件交互:
一個對象由若干個組件組成,通常需要利用腳本來訪問對象的各種組件並設置組件的參數。對於系統內置的常用組建,Unity提供了非常便利的訪問方式,只需要在腳本里訪問組件對應的成員變量即可,這些成員變量定義在MonoBehaviour中並被腳本繼承了下來。
常用組件以及對應的變量如下。
組件名稱 | 變量名 | 組件作用 |
Tranform | tranform | 設置對象的位置,旋轉,縮放 |
Rigidbody | rigidbody | 設置物理引擎的剛體屬性 |
Renderer | renderer | 渲染物體模型 |
Light | light | 設置燈光屬性 |
Camera | camera | 設置相機屬性 |
Collider | collider | 設置碰撞體屬性 |
Animation | animation | 設置動畫屬性 |
Audio | audio | 設置聲音屬性 |
注意:如果對象上不存在某組件,則返回null。
訪問不屬於商標中列出的組件,或者是訪問對象上的腳本(腳本屬於自定義組件),通過如下方式訪問來得到組件的引用:
GetComponent :得到組件
GetComponents:得到組件列表
GetComponentlnChildren:得到對象或對象子物體上的組件
GetComponentsInChildren:得到對象或對象子物體上的組件列表
注意:這幾個函數都比較耗時,因此一般不要在Update函數中使用,應該在外部定一個接受組件引用的對象,在Start函數中使用GetComponent函數來獲取組件引用。
示例:在一個cube里有一個move.cs腳本,在move.cs腳本中獲cube的Tranform組件
Tranform c_tranform; Move move;
void Start(){ //第一種方式 c_tranform = tranform; //第二種方式 c_tranform = GetComponent<Transform>();
move = GetComponent<Move>(); } void Update{ }
訪問場景中的對象:
在unity3d開發中,腳本不但需要訪問腳本所在對象的組件,還經常需要訪問其他的對象:
1.通過名稱來查找:使用函數GameObject.Find,如果場景中存在指定名稱的對象,則返回該對象的引用,否則返回null,如果存在多個同名的對象,則返回第一個對象的引用。
GameObject cube = GameObject.Find("MyCube");
2.通過標簽來查找:GameObject.FindWithTag,如果場景中存在指定標簽的對象,則返回該對象的引用,否則返回null,如果多個對象使用同一個標簽,則返回第一個對象的引用。
注意:與GetComponent一樣,GameObject.Find和GameObject.FindWithTag也是比較耗時的參數,因此不建議在update函數中調用它們,而是在初始化中查找一次后保存在變量中。
協同程序(Coroutine):
Coroutine也成為協同程序或協程,可以和主程並行運行,和多線程類似,但是在任一制定時刻只會有一個協同程序在運行,別的協同程序則會掛起。可以用來實現讓一段程序等待一段時間后繼續運行的效果。
協同程序(Coroutine)的相關函數如下:
- StartCoroutine:啟動一個協同程序
- StopCoroutine:停止一個協同程序
- StopAllCoroutine:終止所有協同程序
- WaitForSeconds:等待若干秒。
- WaitForFixedUpdate:等待知道下一次FiexdUpdate調用。
javascript示例:
function Start() { print("starting "+Time.time); yield WaitAndPrint();//啟用一個協同程序 print("done "+Time.time) } function WaitAndPrint() { yield WitForSeconds(5);//等待5s print("waitandprint "+Time.time) }
C#示例:
IEnumerator Start () { Debug.Log("等待5s "+Time.time); yield return StartCoroutine(WaitMethod()); } IEnumerator WaitMethod() { yield return new WaitForSeconds(5f); Debug.Log("已經等待5s "+Time.time); }
這里注意,C#中的協同函數的返回類型必須為IEnumerator,yield要用yield return來替代,並且啟動協程用StartCoroutine()函數。