進(jìn)階測(cè)試參考unity腳本MonoBehaviour默認(rèn)方法執(zhí)行順序測(cè)試
將腳本掛到空物體上執(zhí)行
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Unity腳本執(zhí)行順序 測(cè)試
/// </summary>
public class TestCallSequence : MonoBehaviour
{
void Awake()
{
Debug.Log("Awake^^^^^^^^^^^^^");
}
void OnEnable()
{
Debug.Log("OnEnable^^^^^^^^^^^^^");
}
// Use this for initialization
void Start()
{
Debug.Log("Start^^^^^^^^^^^^^");
}
void FixedUpdate()
{
Debug.Log("FixedUpdate^^^^^^^^^^^^^");
}
// Update is called once per frame
void Update()
{
Debug.Log("Update^^^^^^^^^^^^^");
}
void LateUpdate()
{
Debug.Log("LateUpdate^^^^^^^^^^^^^");
}
void OnGUI()
{
Debug.Log("OnGUI^^^^^^^^^^^^^");
}
void Reset()
{
Debug.Log("Reset^^^^^^^^^^^^^");
}
void OnDisable()
{
Debug.Log("OnDisable^^^^^^^^^^^^^");
}
void OnDestroy()
{
Debug.Log("OnDestroy^^^^^^^^^^^^^");
}
}
執(zhí)行結(jié)果
先運(yùn)行腳本然后將將腳本組件改為非激活狀態(tài)(active=false),然后停止運(yùn)行。
上面的執(zhí)行結(jié)果說(shuō)明方法的調(diào)用順序一部分是不固定的(FixedUpdate)。
Unity腳本從喚醒到銷毀都有著一套比較完善的生命周期,添加任何腳本都要遵守生命周期法則! 接下來(lái)介紹幾種系統(tǒng)自調(diào)用的重要方法。首先要我們先來(lái)說(shuō)明一下它們的執(zhí)行順序:
Awake --> Start --> Update --> FixedUpdate --> LateUpdate -->OnGUI -->Reset --> OnDisable -->OnDestroy
下面我們針對(duì)每一個(gè)方法進(jìn)行詳細(xì)的說(shuō)明:
1.Awake:用于在游戲開(kāi)始之前初始化變量或游戲狀態(tài)。在腳本整個(gè)生命周期內(nèi)它僅被調(diào)用一次.Awake在所有對(duì)象被初始化之后調(diào)用,所以你可以安全的與其他對(duì)象對(duì)話或用諸如GameObject.FindWithTag()這樣的函數(shù)搜索它們。每個(gè)游戲物體上的Awake以隨機(jī)的順序被調(diào)用。因此,你應(yīng)該用Awake來(lái)設(shè)置腳本間的引用,并用Start來(lái)傳遞信息Awake總是在Start之前被調(diào)用。它不能用來(lái)執(zhí)行協(xié)同程序。
2.Start:僅在Update函數(shù)第一次被調(diào)用前調(diào)用。Start在behaviour的生命周期中只被調(diào)用一次。它和Awake的不同是Start只在腳本實(shí)例被啟用時(shí)調(diào)用。你可以按需調(diào)整延遲初始化代碼。Awake總是在Start之前執(zhí)行。這允許你協(xié)調(diào)初始化順序。在所有腳本實(shí)例中,Start函數(shù)總是在Awake函數(shù)之后調(diào)用。
3.Update:正常幀更新,用于更新邏輯。每一幀都執(zhí)行,處理Rigidbody時(shí),需要用FixedUpdate代替Update。例如:給剛體加一個(gè)作用力時(shí),你必須應(yīng)用作用力在FixedUpdate里的固定幀,而不是Update中的幀。(兩者幀長(zhǎng)不同)FixedUpdate,每固定幀繪制時(shí)執(zhí)行一次,和update不同的是FixedUpdate是渲染幀執(zhí)行,如果你的渲染效率低下的時(shí)候FixedUpdate調(diào)用次數(shù)就會(huì)跟著下降。FixedUpdate比較適用于物理引擎的計(jì)算,因?yàn)槭歉繋秩居嘘P(guān)。Update就比較適合做控制。
4.FixedUpdate:固定幀更新,在Unity導(dǎo)航菜單欄中,點(diǎn)擊“Edit”-->“Project Setting”-->“Time”菜單項(xiàng)后,右側(cè)的Inspector視圖將彈出時(shí)間管理器,其中“Fixed Timestep”選項(xiàng)用于設(shè)置FixedUpdate()的更新頻率,更新頻率默認(rèn)為0.02s。
5.LateUpdate:在所有Update函數(shù)調(diào)用后被調(diào)用,和fixedupdate一樣都是每一幀都被調(diào)用執(zhí)行,這可用于調(diào)整腳本執(zhí)行順序。例如:當(dāng)物體在Update里移動(dòng)時(shí),跟隨物體的相機(jī)可以在LateUpdate里實(shí)現(xiàn)。LateUpdate,在每幀Update執(zhí)行完畢調(diào)用,他是在所有update結(jié)束后才調(diào)用,比較適合用于命令腳本的執(zhí)行。官網(wǎng)上例子是攝像機(jī)的跟隨,都是在所有update操作完才跟進(jìn)攝像機(jī),不然就有可能出現(xiàn)攝像機(jī)已經(jīng)推進(jìn)了,但是視角里還未有角色的空幀出現(xiàn)。
6.OnGUI:在渲染和處理GUI事件時(shí)調(diào)用。比如:你畫一個(gè)button或label時(shí)常常用到它。這意味著OnGUI也是每幀執(zhí)行一次。
7.Reset:在用戶點(diǎn)擊檢視面板的Reset按鈕或者首次添加該組件時(shí)被調(diào)用。此函數(shù)只在編輯模式下被調(diào)用。Reset最常用于在檢視面板中給定一個(gè)默認(rèn)值。
8.OnDisable:當(dāng)物體被銷毀時(shí) OnDisable將被調(diào)用,并且可用于任意清理代碼。腳本被卸載時(shí),OnDisable將被調(diào)用,OnEnable在腳本被載入后調(diào)用。注意: OnDisable不能用于協(xié)同程序。
9.OnDestroy:當(dāng)MonoBehaviour將被銷毀時(shí),這個(gè)函數(shù)被調(diào)用。OnDestroy只會(huì)在預(yù)先已經(jīng)被激活的游戲物體上被調(diào)用。注意:OnDestroy也不能用于協(xié)同程序。
備注: 協(xié)同程序,即在主程序運(yùn)行時(shí)同時(shí)開(kāi)啟另一段邏輯處理,來(lái)協(xié)同當(dāng)前程序的執(zhí)行。換句話說(shuō),開(kāi)啟協(xié)同程序就是開(kāi)啟一個(gè)線程。
協(xié)同程序,即在主程序運(yùn)行時(shí)同時(shí)開(kāi)啟另一段邏輯處理,來(lái)協(xié)同當(dāng)前程序的執(zhí)行。換句話說(shuō),開(kāi)啟協(xié)同程序就是開(kāi)啟一個(gè)線程。在中,使用MonoBehaviour.StartCoroutine方法即可開(kāi)啟一個(gè)協(xié)同程序,也就是說(shuō)該方法必須在MonoBehaviour或繼承于MonoBehaviour的類中調(diào)用。
unity的生命周期;unity中畫線;unity3d使用ondestroy;unity生命周期函數(shù);unity onenable start;unity awake onenable;unity 生命周期;在unity畫線;unity畫線;unity3d ondestroy;unity 函數(shù)生命周期;unity start onenable;unity onenable awake
引用文章:
http://www.manew.com/thread-14461-1-1.html
;
如果在其他腳本里面實(shí)例化物體,且物體上掛有該腳本:
腳本會(huì)在實(shí)例化時(shí)(Instantiate)Awake直接同步執(zhí)行,執(zhí)行完后才執(zhí)行Instantiate后面的代碼