天天看點

Unity中的MonoBehaviour

從第一次在unity建立C#腳本開始就會發現每個腳本都繼承了一個叫MonoBehviour的類,那麼MonoBehaviour是做什麼的呢?

首先明确一點,Unity引擎将所有的代碼的執行都放在了一個主線程中,Update,FixedUpdate等都是按照Unity排程機制依次自行,沒有任何一個地方是并行執行的,都是依次執行的。

Unity中的MonoBehaviour
一層層進入MonoBehaviour父類,不妨看出MonoBehaviour間接繼承了Component,是以繼承自MonoBehaviour腳本的作用其中之一就是充當元件的角色,是以當我們需要将一個自定義腳本以元件的形式添加到對應的GameObject時(Unity中Inspector面闆中的每一項都稱為元件,包括建立的腳本),該腳本是必須要繼承MonoBehaviour,否則無法添加為元件。

那麼如果繼承了MonoBehaviour,那麼這個類的生命周期是怎樣的呢?

首先可以将生命周期分為兩種狀态

  • 編輯器下的狀态:隻有Reset函數一個
  • 運作狀态(真正的生命周期):除Reset函數外,其餘函數都在運作狀态執行(加特殊字段,也可以在編輯器運作)

Reset函數:

Unity中的MonoBehaviour

隻能在編輯器模式下執行,與腳本是否激活無關,點選Reset或者添加該腳本到遊戲物體上時執行(這個方法我幾乎沒有用過不是很常用)

Awake,OnEnable,Start函數:

Unity中的MonoBehaviour

Awake:僅執行一次,當遊戲物體被建立的時候執行,無論該腳本是否處于激活狀态,隻要遊戲物體處于激活狀态即可執行。

在Inspector面闆中的元件上有一個複選框,這是在腳本中有生命周期函數時才會顯示的,但是測試後發現隻有Awake和Reset并不會出現複選框,因為這兩個函數與腳本是否激活無關。

OnEnable:可執行多次,當元件設定enable = true或遊戲物體設定active = true時調用(包括腳本一開始處于激活狀态時運作遊戲的第一次)。

Start:僅執行一次,當遊戲物體處于激活狀态并且腳本也處于激活狀态才可以執行。

上述是生命周期的開始,先将生命周期的運作跳過,先來說說生命周期的結束。

OnApplicationQuit,OnDisable,OnDestroy函數:

Unity中的MonoBehaviour

OnApplicationQuit:當你的應用程式退出時,會先調用OnApplicationQuit。

OnDisable:除在OnApplicationQuit調用時會調用,還會在設定enable = false 或設定active = false時調用(如果腳本一開始處于未激活狀态則不會調用)。

OnDestory:除在OnApplicationQuit調用時會調用,還有在Destroy遊戲物體時調用。

看完了生命周期的開始與結束,下面是比較重要的部分——生命周期的運作過程

Unity中的MonoBehaviour

FixedUpdate,Update,LateUpdate函數:

可以将生命周期的運作以Update函數作為分割線,FixedUpdate,實體系統,輸入系統的相關函數都是在Update之前先執行,攜程是在Update之前LateUpdate函數之後執行。

FixedUpdate與Update:

FixedUpdate:每幀調用而且每幀的時間間隔是固定的,不受幀率(FPS)影響。每一幀的時間是在Edit->Project Settings->Time面闆中的Fixed Timestep設定,預設為0.02s,則0.02s為一幀也就是每幀之間的間隔是0.02s。

對于更新頻率比較穩定的實體系統來說就合适放在FixedUpdate中處理

Update:每幀調用但是每幀的時間間隔不固定,受到幀率影響,而幀率(FPS)與電腦性能有關。

例如FPS是30,則每秒執行30幀,如果FPS是10,則每秒執行10幀。是不穩定的。

在Update和FixedUpdate中輸出Time.time:因為FixedUpdate每幀之間是固定的時間間隔0.02秒(Fixed Timestep設定的值),是以不難發現FixedUpdate中的Time.time數值每幀都加了固定0.02,而Update中是不穩定的。
Unity中的MonoBehaviour

不能在Update中直接移動的原因:

例如:

Unity中的MonoBehaviour

1.人物移動會出現抖動:因為Update中每幀的間隔是不一樣的,是以移動不是平滑的則會抖動。

2.性能不同的裝置幀率不同:假如A和B兩台電腦,A電腦的幀率為50則人物一秒鐘移動50米,B電腦的幀率為30則人物一秒鐘移動30米,這肯定是不行的。

解決辦法就是乘上Time.deltaTime。

->Time類的相關詳解:Time類詳解

LateUpdate比較好了解:

LateUpdate:與Update一樣每幀之間的時間是不固定的,受到幀率影響,而幀率(FPS)與電腦性能有關。

LateUpdate是三個Update中最後一個執行的,舉個例子,比如一家三口要出去玩,每個人的起床都在Update中執行,則出發應該在LateUpdate中執行,這樣就保證了在都都起床之後才出發。

我們在Update,FixedUpdate,LateUpdate中都輸出Time.realtimeSinceStartup,明顯發現每一幀都是FixedUpdate->Update->LateUpdate的執行順序。

Unity中的MonoBehaviour

是以相機的跟随一般在LateUpdate中實作,這樣可以確定在人物移動結束後再進行相機的跟随。

普通類與繼承MonoBehaviour類的差別:

繼續閱讀