1. 程式人生 > >一起看看MonoBehavior內部事件執行順序

一起看看MonoBehavior內部事件執行順序

寫在最前面

或許對於大部分Unity3D程式設計師來說,第一次接觸指令碼編寫的時候都是從MonoBehavior開始的。MonoBehavior是Uniy3d指令碼編寫核心的類之一, 它預先定義好了很多事件,並且這些事件按照預先定義好順序執行。瞭解MonoBehavior提供的這些事件的執行順序,是我們進一步提高腳步程式設計和了解Unity3D內部邏輯的必要一步。我們先從MonoBehavior提供的事件說起。

MonoBehavior都提供了什麼事件

MonoBehavior提供的事件從編輯器到遊戲結束都有涉及。下面列舉一些常用的,更詳列表可以參照 這個頁面

與編輯相關

名稱 註釋
Reset Reset to default values.

Update相關

名稱 註釋
FixedUpdate This function is called every fixed framerate frame, if the MonoBehaviour is enabled.
Update Update is called every frame, if the MonoBehaviour is enabled.
LateUpdate LateUpdate is called every frame, if the Behaviour is enabled.

生命週期相關

名稱 註釋
Awake Awake is called when the script instance is being loaded.
OnEnable This function is called when the object becomes enabled and active.
OnDisable This function is called when the behaviour becomes disabled () or inactive.
OnDestroy This function is called when the MonoBehaviour will be destroyed.
OnApplicationFocus Sent to all game objects when the player gets or loses focus.
OnApplicationPause Sent to all game objects when the player pauses.
OnApplicationQuit Sent to all game objects before the application is quit.
Start Start is called on the frame when a script is enabled just before any of the Update methods is called the first time.

物理系統相關

名稱 註釋
OnCollisionEnter OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.
OnCollisionStay OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider.
OnCollisionExit OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider.
OnCollisionEnter2D Sent when an incoming collider makes contact with this object’s collider (2D physics only).
OnCollisionStay2D Sent each frame where a collider on another object is touching this object’s collider (2D physics only).
OnCollisionExit2D Sent when a collider on another object stops touching this object’s collider (2D physics only).
OnTriggerEnter OnTriggerEnter is called when the Collider other enters the trigger.
OnTriggerStay OnTriggerStay is called once per frame for every Collider other that is touching the trigger.
OnTriggerExit OnTriggerExit is called when the Collider other has stopped touching the trigger.
OnTriggerEnter2D Sent when another object enters a trigger collider attached to this object (2D physics only).
OnTriggerStay2D Sent each frame where another object is within a trigger collider attached to this object (2D physics only).
OnTriggerExit2D Sent when another object leaves a trigger collider attached to this object (2D physics only).

輸入系統相關

名稱 註釋
OnMouseDown OnMouseDown is called when the user has pressed the mouse button while over the GUIElement or Collider.
OnMouseOver OnMouseOver is called every frame while the mouse is over the GUIElement or Collider.
OnMouseUp OnMouseUp is called when the user has released the mouse button.
OnMouseDrag OnMouseDrag is called when the user has clicked on a GUIElement or Collider and is still holding down the mouse.
OnMouseEnter OnMouseEnter is called when the mouse entered the GUIElement or Collider.
OnMouseExit OnMouseExit is called when the mouse is not any longer over the GUIElement or Collider.
OnMouseUpAsButton OnMouseUpAsButton is only called when the mouse is released over the same GUIElement or Collider as it was pressed.

渲染相關

名稱 註釋
OnPreCull OnPreCull is called before a camera culls the scene.
OnBecameVisible OnBecameVisible is called when the renderer became visible by any camera.
OnBecameInvisible OnBecameInvisible is called when the renderer is no longer visible by any camera.
OnWillRenderObject OnWillRenderObject is called once for each camera if the object is visible.
OnPreRender OnPreRender is called before a camera starts rendering the scene.
OnRenderObject OnRenderObject is called after camera has rendered the scene.
OnPostRender OnPostRender is called after a camera finished rendering the scene.
OnRenderImage OnRenderImage is called after all rendering is complete to render image.
OnGUI OnGUI is called for rendering and handling GUI events.
OnDrawGizmos Implement OnDrawGizmos if you want to draw gizmos that are also pickable and always drawn.

用圖來表示MonoBehavior事件執行順序

monobehavior

總結:

  • 首次載入場景時執行Awake()
  • Start()只在第一幀才執行, Start()Awake()之後執行
  • Update的執行順序是: FixedUpdate() -> Update() -> LateUpdate()
  • 以每一幀的Update()事件作分界線:
    • Update()之前物理系統輸入系統相關事件先執行,如OnTriggerXXXOnMouseXXX事件。此處XXX是佔位符,如OnTriggerXXX可以代表OnTriggerEnter或者OnTriggerExit
    • Update()之後場景渲染協程,如OnRenderImage()yield WWW語句
  • 協程中,除了WaitForFixedUpdate是在FixedUpdate之後,Update之前執行,其他的都是在Update之後,場景渲染前執行
  • GUI事件OnGUI在場景渲染完之後執行
  • 當物件被銷燬時執行OnDestory()事件
  • 當遊戲退出時執行OnApplicationQuit()
  • OnEnable()OnDisable()
    • OnEnable()只有在Object是Active的狀態下才能用,一般是Object被初始化或者Object從disable到active過程中被呼叫
    • OnDisable()只有到Object從active到disable狀態才被呼叫

相關推薦

一起看看MonoBehavior內部事件執行順序

寫在最前面 或許對於大部分Unity3D程式設計師來說,第一次接觸指令碼編寫的時候都是從MonoBehavior開始的。MonoBehavior是Uniy3d指令碼編寫核心的類之一, 它預先定義好了很多事件,並且這些事件按照預先定義好順序執行。瞭解MonoBehavior提供的這些事件的執行順序,是我們進

jquery的AJAX中各個事件執行順序

.ajax star ajaxstop jquery ajax let start 執行 .com jquery的AJAX中各個事件執行順序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.aja

JS事件執行順序理解以及 e.stopPropagation()

先捕獲(document-往下)->後執行(執行)->冒泡(具體到不具體); addEventListener 第三個引數 預設false   (false 是冒泡階段執行)   true 是捕獲階段執行   如果是多個元素巢狀的情況

WinForm 生命周期, WinForm 事件執行順序

ext ech 執行 tin focus hand got 生命周期 text 1.窗體啟動: Control.HandleCreatedControl.BindingContextChangedForm.LoadControl.VisibleChangedForm.Act

JAVA類初始化及例項初始化時內部執行順序

       記得剛畢業時,應聘JAVA開發崗位,做招聘單位的筆試時,經常有JAVA類內部的執行順序的考察,就是讓你寫出某個程式的列印結果的順序,現在整理一下。        如果一個類,有構造器,普通塊,靜態塊,那該類初始化時,它的執行順序如何呢?如果它有父類,並且它的父

遞迴函式內部執行順序

#include <stdio.h> void fun(int n) { printf("1th - Level: %d Address: %d\n", n, &

Global事件執行順序

Global.asax 檔案,有時候叫做 ASP.NET 應用程式檔案,提供了一種在一箇中心位置響應應用程式級或模組級事件的方法。你可以使用這個檔案實現應用程式安全性以及其它一些任務。下面讓我們詳細看一下如何在應用程式開發工作中使用這個檔案。概述Global.asax 位

JS事件機制:事件繫結、事件監聽、事件委託(代理)和事件執行順序總結

JS 對於使用者的操作做出響應,就必須對DOM元素繫結事件處理函式 事件繫結  1、在DMO中直接繫結事件 <input type="button" value="click me"

HttpApplication事件執行順序

HttpApplication 類的例項(是不是想起Global檔案了?)是在 ASP.NET 基礎結構中建立的,而不是由使用者直接建立的。HttpApplication 類的一個例項在其生存期內被用於處理多個請求,但它一次只能處理一個請求。這樣,成員變數才可用於儲存針對每

WinFrom DataGridView 常用事件執行順序

When moving from cell to cell (in the same row) you get: 1) Cell Leave (old cell) 2) Cell Validating/ed (old cell) 3) Cell Enter (new cell

VB.NET中8個主要的事件執行順序

VB.NET幾個主要的事件執行順序: >>>顯示窗體過程中 new HandleCreated Load Activated '這個事件以後可以被觸發多次,每當使用者啟用窗體是都會觸發此事件 >>>關閉窗體過程中 Closi

aspx 的頁面事件執行順序

aspx頁面生命週期事件 Page_PreInit 使用IsPostBack屬性確定是否是第一次處理該頁;建立動態控制元件;動態設定Theme屬性;讀取或設定配置檔案屬性值等Page_Init 讀取或初始化控制元件屬性Page_Preload 事件在所有回發資料處理之後但在

滑鼠點選 INPUT 元素後預設觸發的事件執行順序

所有瀏覽器中,當用戶通過滑鼠操作觸發 click 事件時,事件觸發順序: 1、MouseDown 事件 2、Focus 事件 3、MouseUp 事件 4、Click 事件 可點選測試網頁 測試程式碼如下: <script> w

網龍暑期訓練營第一週:MonoBehavior函式執行順序、碰撞與滑鼠事件

本文通過實驗梳理第一週訓練營視訊中所提到的知識點,便於大家複習鞏固,也便於自己日後查閱。視訊內容主要分為三個部分: MonoBehavior的執行順序 碰撞事件 滑鼠事件 配合視訊使用效果更佳。 1.MonoBehavior的執行順序

Unity3D事件函數的執行順序

攝像機 觸發 var med lac 視圖 專業 chains war In Unity scripting, there are a number of event functions that get executed in a predetermined order

JS中事件執行順序和AJAX的異步

容易 jquery 博客 出現問題 同步 內容 img 留言 加載 之前了解過異步和同步,知道同步是順序執行,異步是同時執行,但是沒有遇到過這種情況,不是很理解,這兩天做項目突然遇到了,對這有了一個初步的認識。廢話不多說,直接上要求。 1.項目要求:外部調用x

觀察者模式中多執行執行訂閱事件順序執行的問題

       對事件釋出訂閱模式中啟動執行緒執行操作,但又要保證執行緒順序執行的一些思考和實踐,在開發過程中,經常會遇到需要使用事件來觸發方法執行的情況,比如CS中按鈕的點選事件,滑鼠移動事件,鍵盤監聽事件等等,有時候需要執行比較耗時的任務,但並不希望阻塞主執

Unity5指令碼事件函式及其執行順序

指令碼函式 編輯器相關函式 初始化函式 物理相關函式 輸入相關函式 遊戲邏輯相關函式

form表單中onclick事件和onsubmit事件執行順序

說來很慚愧,今天因為form表單的一個小問題困擾了一下午。雖然最終得以解決,但花費的時間實在是令人汗顏,現在總結一下遇到的問題。 先說一下背景,之前幫一個朋友的專案寫了一個原生js的表單驗證,今天

關於Unity物理事件執行順序的最新理解

物體A: public class A:{    B b;    void FixedUpdate(){        if(input.GetKeyDow(Keycode.I)) {     &nb