1. 程式人生 > >Unity API(一)Unity中的指令碼事件及其函式

Unity API(一)Unity中的指令碼事件及其函式

常用的指令碼事件函式

        當在Unity中新增一個指令碼,預設會有兩個事件函式Start和Update,除此之外還有Awake、OnEnable、LateUpdate,OnDisable和OnDestroy等五個常用的,他們從時間線上表示了整個指令碼的生命週期。這五個事件的事件順序如下圖所示(引用自藍歐Unity引擎基礎視訊教程)。
這裡寫圖片描述

        1. Awake:當指令碼載入時呼叫,只調用一次。

Awake()在MonoBehavior建立後就立刻呼叫,在指令碼例項的整個生命週期中,Awake函式僅執行一次;如果遊戲物件(即gameObject)的初始狀態為關閉狀態,那麼執行程式,Awake函式不會執行;如果遊戲物件的初始狀態為開啟狀態,那麼Awake函式會執行;值得注意的一點是,Awake函式的執行與否與指令碼例項的狀態(啟用或禁用)並沒有關係,而是與指令碼例項所繫結的遊戲物件的開關狀態有關。如果重新載入場景,那麼場景內Awake函式的執行情況重新遵循上述兩點。 可以做一些初始化操作

一般開發中都是在Awake函式中獲取遊戲物件或者指令碼例項的資訊,然後在Start函式中進行一些獲取之後的初始化設定。

         2. OnEnable:當指令碼的被啟用時呼叫。

Start()將在MonoBehavior建立後在該幀Update()第一次執行前被呼叫;Start()函式只在指令碼例項被啟用時才會執行;Start函式總是在Awake函式之後執行。如果遊戲物件開啟了,物件上繫結的指令碼例項被禁用了,那麼Start函式不會執行。這是Start函式的特點,只有在指令碼例項被啟用時它才會執行,並且Start函式只會在指令碼例項首次被開啟時才會執行。如果是已經開啟過的指令碼例項被關閉後再次開啟,那麼Start函式不會再次執行。 公共的欄位放在Awake中 初始化

         4. Update:每個幀呼叫,每秒呼叫的次數與幀頻有關係。
         5. LateUpdate:Update呼叫之後呼叫,一般呼叫的次數與Update一樣。
        6. OnDisable:在指令碼被禁用後呼叫。

         以下需要注意:

Awake、OnEnable、Start,都是遊戲開始執行前就呼叫的方法。 每次啟用指令碼時會呼叫 ,但是start之會在第一次呼叫update之前呼叫!
GameObject的Activity為true,指令碼的enable為true時,其先後順序為:Awake、OnEnable、Start;
GameObject的Activity為true,指令碼的enable為false時,只執行Awake;
GameObject的Activity為false時,以上都不呼叫,OnDisable()被呼叫;
OnDisable() 指令碼不作用與遊戲物件是 Activity為false
OnDestory:物體被刪除時呼叫。 或者指令碼元件被移除時呼叫,物件銷燬時執行

Awake與Start

         Unity聖典中的解釋。

  • Awake(),

當一個指令碼例項被載入時Awake被呼叫。Awake用於在遊戲開始之前初始化變數或遊戲狀態。在指令碼整個生命週期內它僅被呼叫一次.Awake在所有物件被初始化之後呼叫,所以你可以安全的與其他物件對話或用諸如 GameObject.FindWithTag 這樣的函式搜尋它們。每個遊戲物體上的Awke以隨機的順序被呼叫。因此,你應該用Awake來設定指令碼間的引用,並用Start來傳遞資訊。Awake總是在Start之前被呼叫。它不能用來執行協同程式。

  • Start()

Start僅在Update函式第一次被呼叫前呼叫。Start在behaviour的生命週期中只被呼叫一次。它和Awake的不同是Start只在指令碼例項被啟用時呼叫。你可以按需調整延遲初始化程式碼。Awake總是在Start之前執行。這允許你協調初始化順序。

Update、LateUpdate和FixUpdate

  • Update:當MonoBehaviour啟用時,其Update在每一幀被呼叫; 用來處理畫面的邏輯
  • LateUpdate:當Behaviour啟用時,其LateUpdate在每一幀被呼叫
  • FixedUpdate:這個函式會在每個固定的物理時間片被呼叫一次.這是放置遊戲基本物理行為程式碼的地方。UPDATE之後呼叫。

指令碼事件大全

編輯器相關函式

  • Reset:當指令碼附加到GameObject上或者指令碼的右鍵選單項裡選擇了“Reset”命令的時候呼叫此函式。
  • OnValidate:指令碼被載入或則值被改變在inspector中時呼叫

初始化函式

  • Awake:此函式在指令碼附加到GameObject物件上且此物件是被啟用的的時候呼叫。並且是在所有Start函式呼叫之前呼叫。但是要特殊說明的是,就算掛的指令碼沒有被啟用此函式也會呼叫。
  • OnEnable:指令碼物件被啟用的時候。 Start:在所有的Update函式呼叫之前呼叫。

物理相關函式

-FixedUpdate:物理更函式函式,一幀中可能呼叫幾次
-OnTriggerEnter:進入觸發器(勾選了IsTrigger的Collider)時觸發
-OnTriggerEnter2D:進入2D觸發器(勾選了IsTrigger的Collider)時觸發
-OnTriggerExit:離開觸發器(勾選了IsTrigger的Collider)時觸發
-OnTriggerExit2D:離開2D觸發器(勾選了IsTrigger的Collider)時觸發
-OnTriggerStay2D:在2D觸發器裡(勾選了IsTrigger的Collider)時觸發
-OnCollisionEnter:進入碰撞器(Collider)時觸發
-OnCollisionEnter2D:進入2D碰撞器(Collider)時觸發
- OnCollisionExit:離開碰撞器(Collider)時觸發
- OnCollisionExit2D:離開2D碰撞器(Collider)時觸發
- OnCollisionStay:在碰撞器裡(Collider)時觸
- OnCollisionStay2D:在2D碰撞器(Collider)時觸發

輸入相關函式

OnMouseDown:滑鼠在GUIElement或Collider上按下時呼叫
OnMouseDrag:滑鼠在GUIElement或Collider上拖拽時呼叫
OnMouseEnter:滑鼠進入GUIElement或Collider時呼叫
OnMouseExit:滑鼠離開GUIElement或Collider時呼叫
OnMouseOver:滑鼠懸浮在GUIElement或Collider上時呼叫
OnMouseUp:滑鼠從GUIElement或Collider彈起時呼叫
OnMouseUpAsButton:滑鼠在同一個GUIElement或Collider上按下喝彈起時呼叫,也就是單擊一GUIElement或Collider時。

遊戲邏輯相關函式

Update:遊戲邏輯的更新函式
LateUpdate:所有Update函式呼叫後呼叫的更新函式

渲染相關函式

OnPreCull:在執行剔除之前執行的函式
OnBecameVisible:此物件從隱藏到顯示時呼叫
OnBecameInvisible:此物件從顯示到隱藏時呼叫
OnWillRenderObject:將要渲染此物件時呼叫
OnPreRender:渲染場景之前
OnRenderObject:所有常規的渲染結束後呼叫
OnPostRender:渲染完整個場景後呼叫
OnRenderImage:場景渲染完後呼叫
OnGUI:執行UI的渲染,一幀中可能呼叫幾次
OnDrawGizmos: 執行場景檢視中物件的標示圖示的繪製
OnDrawGizmosSelected:執行場景檢視中選中物件的標示圖示的繪製

應用程式相關函式

OnApplicationFocus:應用程式成為當前的應用時呼叫
OnApplicationPause:當應用程式切入後臺暫停時呼叫
OnApplicationQuit:應用程式退出時呼叫

其他函式

OnDisable:指令碼物件被禁用時呼叫
OnDestory:指令碼物件被銷燬的時候呼叫
OnLevelWasLoaded:一個新的場景載入時呼叫

協程

yield:延緩到下一幀執行
yield WaitForSeconds:這一幀執行完後,等待指定的延遲到
yield WaitForFixedUpdate:所有的固定更新完成後
yield WWW:www下載完成
yield StartCoroutine 等待一個自定的函式完成

這裡寫圖片描述

其他

        1.用在遊戲物件中的指令碼,繼承自MonoBehaviour,是執行時類,不能直接本地手段進行例項化。可以藉助GetComponent方法來獲取,然後例項化。
        2.在指令碼中Unity預設gameObject指代指令碼掛載所在的遊戲物件,transform指代指代指令碼掛載所在的遊戲物件的Transform元件。