Unity自帶函數說明

2021-02-15 Unity開發者俱樂部

在unity的腳本中,有大量的腳本執行按照預先確定的順序執行的事件函數,由於篇幅有限,無法一一列舉,這裡只列舉一些常用的自帶函數的順序,並論述他們之間的區別。
在Unity腳本中常用到的函數就是下面這些,他們的順序也是按照箭頭的方向執行的。
Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy
秉著實踐是檢驗真理的唯一標準,咱們可以寫腳本掛在一個物體運行,從列印結果中便可以看到執行順序

接下來針對每個方法進行詳細的說明

1.Awake

     用於在遊戲開始之前初始化變量或遊戲狀態。在腳本整個生命周期內它僅被調用一次.Awake在所有對象被初始化之後調用,所以你可以安全的與其他對象對話或用諸如GameObject.FindWithTag()這樣的函數搜索它們。每個遊戲物體上的Awake以隨機的順序被調用。因此,你應該用Awake來設置腳本間的引用,並用Start來傳遞信息Awake總是在Start之前被調用。它不能用來執行協同程序。

2.Start

    僅在Update函數第一次被調用前調用。Start在behaviour的生命周期中只被調用一次。它和Awake的不同是Start只在腳本實例被啟用時調用。你可以按需調整延遲初始化代碼。Awake總是在Start之前執行。這允許你協調初始化順序。在所有腳本實例中,Start函數總是在Awake函數之後調用。

3.FixedUpdate

   固定幀更新,在Unity導航菜單欄中,點擊「Edit」-->「Project Setting」-->「Time」菜單項後,右側的Inspector視圖將彈出時間管理器,其中「Fixed Timestep」選項用於設置FixedUpdate()的更新頻率,更新頻率默認為0.02s。

4.Update

    正常幀更新,用於更新邏輯。每一幀都執行,處理Rigidbody時,需要用FixedUpdate代替Update。例如:給剛體加一個作用力時,你必須應用作用力在FixedUpdate裡的固定幀,而不是Update中的幀。(兩者幀長不同)FixedUpdate,每固定幀繪製時執行一次,和update不同的是FixedUpdate是渲染幀執行,如果你的渲染效率低下的時候FixedUpdate調用次數就會跟著下降。FixedUpdate比較適用於物理引擎的計算,因為是跟每幀渲染有關。Update就比較適合做控制。

     Update()與FixedUpdate()的區別

     從字面上理解,它們都是在更新時會被調用,並且會循環的調用。但是Update會在每次渲 染新的一幀時,被調用。而FixedUpdate會在每個固定的時間間隔被調用,那麼要是Update 和FixedUpdate的時間間隔一樣,是不是就一樣呢?答案是不一定,因為Update受當前渲染的物體,更確切的說是三角形的數量影響,有時快有時 慢,幀率會變化,update被調用的時間間隔就發生變化。但是FixedUpdate則不受幀率的變化,它是以固定的時間間隔來被調用,那麼這個時間間 隔怎麼設置呢?Edit->Project Setting->time下面的Fixed timestep。

5.LateUpdate

     在所有Update函數調用後被調用,和fixedupdate一樣都是每一幀都被調用執行,這可用於調整腳本執行順序。例如:當物體在Update裡移動時,跟隨物體的相機可以在LateUpdate裡實現。LateUpdate,在每幀Update執行完畢調用,他是在所有update結束後才調用,比較適合用於命令腳本的執行。官網上例子是攝像機的跟隨,都是在所有update操作完才跟進攝像機,不然就有可能出現攝像機已經推進了,但是視角裡還未有角色的空幀出現。

    Update和LateUpdate的區別

    在聖典裡LateUpdate被解釋成一句話,LateUpdate是在所有Update函數調用後被調用。這可用於調整腳本執行順序。例如:當物體在Update裡移動時,跟隨物體的相機可以在LateUpdate裡實現。

        LateUpdate是晚於所有Update執行的。例如:遊戲中有2個腳本,腳本1含有Update和LateUpdate,腳本2含有Update,那麼當遊戲執行時,每一幀都是把2個腳本中的Update執行完後才執行LateUpdate 。雖然是在同一幀中執行的,但是Update會先執行,LateUpdate會晚執行。

        現在假設有2個不同的腳本同時在Update中控制一個物體,那麼當其中一個腳本改變物體方位、旋轉或者其他參數時,另一個腳步也在改變這些東西,那麼這個物體的方位、旋轉就會出現一定的反覆。如果還有個物體在Update中跟隨這個物體移動、旋轉的話,那跟隨的物體就會出現抖動。 如果是在LateUpdate中跟隨的話就會只跟隨所有Update執行完後的最後位置、旋轉,這樣就防止了抖動。

6.OnGUI

   在渲染和處理GUI事件時調用。比如:你畫一個button或label時常常用到它。這意味著OnGUI也是每幀執行一次。

7.Reset

   在用戶點擊檢視面板的Reset按鈕或者首次添加該組件時被調用。此函數只在編輯模式下被調用。Reset最常用於在檢視面板中給定一個默認值。

8.OnDisable

   當物體被銷毀時 OnDisable將被調用,並且可用於任意清理代碼。腳本被卸載時,OnDisable將被調用,OnEnable在腳本被載入後調用。注意: OnDisable不能用於協同程序。

9.OnDestroy

當MonoBehaviour將被銷毀時,這個函數被調用。OnDestroy只會在預先已經被激活的遊戲物體上被調用。注意:OnDestroy也不能用於協同程序。

有興趣的同學可以加入unity學習交流qq群:586033621,這裡有一大票的小夥伴一起和你探討。





相關焦點

  • Unity 重Built-in到URP函數對應整理
    6.1.頂點變換函數6.2.通用輔助函數6.3.前向渲染輔助函數6.4.屏幕空間輔助函數7.內置shader 變體7.1.燈光8.雜項8.1.陰影8.2.霧8.3.深度8.4.其他9.後處理/VFX (視覺特效)總體結構
  • Unity腳本生命周期
    作為一個unity從業人員,相信許多人有時候都會記不住unity的生命周期,記不住沒關係,有了這張圖,一切都是浮雲。
  • Unity PBR Standard Shader 實現詳解 (三)
    函數裡面有兩個分支,第一個分支是延遲渲染路徑。由於日常使用還是前向渲染多,所以我們先跳過。不過這裡UnityGlobalIllumination()有一個函數重載的方法,就是不同的變量數量和類型導向不同的函數分支。可以了解一下。
  • Unity3D 實用技巧 - Unity Shader 匯總式學習·初探篇
    而對於模型自帶的數據(如頂點,紋理坐標,法線等),Unity Shader也提供了直接訪問的方法,不需要開發者自行編碼來傳給著色器。通常採用動態編譯的方式(Cg也支持靜態編譯方式),即在宿主程序運行時,利用Cg運行庫(Cg Runtimer Library)動態編譯Cg代碼。
  • Unity Standard Shader 技術分析
    Metallic和unity_ColorSpaceDielectricSpec.a被用來構造reflectivity,之後reflectivity和Albedo共同構造diffColor.而Metallic,Albedo,unity_ColorSpaceDielectricSpec被共同用來構造
  • Unity編碼篇 Rigidbody類
    Rigidbogy組件可以使遊戲對象在物理系統的控制下運動 , 發射一顆子彈 ,如果子彈沒有命中任何物體 ,最後 子彈會因為重力落下 , 此時就可以利用 Rigidbody 組件實現 , 但是使用該組件一般在 FixedUpdate 函數中執行 , 因為物理仿真一般都在固定頻率下進行計算的 .
  • 博主營地 | Unity3D 實用技巧 - 基礎數學庫函數學習
    這個函數可以用來平滑任何一種值,位置,顏色,標量。最常見的是平滑一個跟隨攝像機。currentVelocity :當前速度,這個值在你訪問這個函數的時候會被隨時修改。smoothTime :要到達目標位置的近似時間,實際到達目標時要快一些。maxSpeed :可選參數,允許你限制的最大速度。deltaTime :上次調用該函數到現在的時間。預設為Time.deltaTime。
  • Unity中的GUI編程
    .這個函數用於將按鈕渲染到屏幕上,當鬆開按鈕時函數返回true.這裡值得一說的是GUI.Button函數只會在滑鼠在按鈕上按下並且在按鈕上鬆開時才返回true,如果用戶按下按鈕移動滑鼠在按鈕外面釋放滑鼠,則函數不會返回TRUE,同樣的如果用戶按下了滑鼠之後將光標移動到按鈕上然後釋放滑鼠該函數也不會返回TRUE.要使該函數返回true,滑鼠必須在按鈕上按下並釋放.
  • 新手如何從零開始學習unity
    自從 unity5發布免費過後,有很多獨立遊戲開發者轉向unity遊戲開發,unity的優勢就是多終端跨平臺打包,入門也快,很多人感覺自己的英文不好,就覺得學不會,其實這是一個誤區,unity的界面雖然是英文的,但是它的窗口就只有那麼幾個,用的次數多了,也就自然的熟練了,那麼新手該如何從零開始學習unity呢?
  • Unity面試題部分高頻題目整理匯集
    8.請簡述關鍵字Sealed用在類聲明和函數聲明時的作用  答:類聲明時可防止其他類繼承此類,在方法中聲明則可防止派生類重寫此方法。  Unity3d沒有多線程的概念,不過unity也給我們提供了StartCoroutine(協同程序)和LoadLevelAsync(異步加載關卡)後臺加載場景的方法。 StartCoroutine為什麼叫協同程序呢,所謂協同,就是當你在StartCoroutine的函數體裡處理一段代碼時,利用yield語句等待執行結果,這期間不影響主程序的繼續執行,可以協同工作。
  • Unity遊戲開發之C#快速入門
    我是為了unity遊戲開發課程學的,不是很深入,某些細節可能也沒有涉及到。 就先複習了以前學C++、java的筆記,然後對照著簡單學了C#,會重點學unity中用到的包。1.C#程序結構C# 中的關鍵組織結構概念包括程序、命名空間、類型、成員和程序集。一個C#版HelloWorld直觀感受一下。
  • 程序丨Unity Profiler 真機調試以及函數耗時案例分享
    本文將分享最近應用Profiler工具解決的一個關於函數耗時的案例 。
  • 旅行的青蛙Unity遊戲逆向修改--iOS篇
    所以要單獨分析iOS的話難度會大很多,如果從Android的C#腳本入手的話,因為iOS和Android腳本都是一樣的話,可以從Android分析的函數名來對應iOS的c函數然後進行hook修改。提取ipa首先從越獄設備上面提取旅行青蛙的ipa包,使用frida-ios-dump一鍵提取即可。由於是日文名字,先通過.
  • Unity遊戲開發40個小陰招
    內置函數Awake,Start,Update,FixedUpdate,LateUpdate 函數,令開發者直接往遊戲循環裡加內容,非常方便快捷。4.Editor/Resources 目錄可以存在多個,且可以存放在任意目錄下寫自己的插件或者代碼庫時可以自帶輔助的資源。9. Hierachy 層級在 Hierachy 層級對話框,可以隨時輸入搜索關鍵字,然後一起選中篩選出來的GameObject,這個時候可以同時修改它們的相同屬性。
  • NCL自帶常用統計學函數集錦
    NCL作為一門氣象專業語言,自帶了很多氣象屆常用的算法和命令
  • 博主營地 | Unity3D 實用技巧 - 理論知識庫(一)
    請簡述關鍵字Sealed用在類聲明和函數聲明時的作用。類聲明時可防止其他類繼承此類,在方法中聲明則可防止派生類重寫此方法。請簡述private,public,protected,internal的區別。
  • 將數值轉化為美元貨幣數值,用doallar函數一招搞定,還自帶美顏
    今天為大家講解如何將貨幣數值轉化為美元貨幣下的文本數值-dollar函數。特別說明,該函數僅僅對美元符號有作用,對人民幣無感!同時dollar函數自帶四捨五入的美顏功效,能力是棒棒的!還是先來看看dolla他老人家吧!
  • C++中函數異常規格的說明
    學習了異常處理,我們在調用一個函數的時候,就應該知道這個函數會不會拋出異常,如果會,拋那些:如果是第三方庫的函數,只有函數聲明,沒有函數實現,則也不知道會不會拋出異常; 查看函數文檔也是不錯的方法,但是如果手頭文檔和真實的庫的版本不匹配,有可能查到的東西就是不準確的;   3、異常規格說明:
  • JavaScript alert()函數用法說明
    JavaScript alert()函數用法說明 你對JavaScript alert()函數的用法是否熟悉,這裡和大家分享一下,alert消息對話框通常用於一些對用戶的提示信息,例如在表單中輸入了錯誤的數據時。
  • Unity技術面試題100問
    三種方法答:1.將Assets和Library一起遷移2.導出包package3.用unity自帶的assets Server功能九:OnEnable、Awake、Start運行時的發生順序?哪些可能在同一個對象周期中反覆的發生?