一.Unity 中常見的生命周期方法
1Awake(),2OnEnable(), 3Start(), 4FixedUpdate(), 5Update(), 6LateUpdate(), 7OnGUI(), 8OnDisable(), 9OnDestroy().
二.通常的執(zhí)行順序
特殊一點的方法Reset()
Reset
方法是在編輯器中調(diào)用的,并且僅在以下情況下執(zhí)行:
-
腳本組件被添加到 GameObject 上: 當(dāng)你將一個腳本組件添加到一個 GameObject 上時,如果該腳本包含
Reset
方法,該方法會在組件添加后立即被調(diào)用。 -
編輯器中修改了腳本的公共字段或?qū)傩裕?/strong> 如果在 Inspector 中修改了腳本的公共字段或?qū)傩裕?code>Reset 方法會在你停止編輯器播放或重新加載場景時調(diào)用。
-
重置組件: 在 Inspector 中,右鍵點擊腳本組件的標(biāo)題欄,選擇 "Reset" 選項,可以手動觸發(fā)
Reset
方法。
這樣設(shè)計的目的是確保在編輯器中對腳本屬性的修改能夠及時地反映到場景中,同時提供了一個機(jī)會來確保編輯器中的屬性值與腳本的初始狀態(tài)保持一致。Reset
方法對于在編輯器中進(jìn)行調(diào)試、初始化和同步屬性狀態(tài)等方面非常有用。在運行時(在構(gòu)建后的實際游戲中),Reset
方法不會被調(diào)用。
1.Awake():
????????首先調(diào)用 Awake 方法。在這個階段,對象被實例化,但還沒有被激活。他先于OnEnable和Start方法調(diào)用。
2.OnEnable():
????????如果對象被啟用(enabled),接著調(diào)用 OnEnable。這是對象變?yōu)榧せ顮顟B(tài)時的第一個方法。
3.Start():
????????方法調(diào)用時機(jī):在對象第一次更新時調(diào)用。用于初始化,但是在 Awake 后調(diào)用。
4.FixedUpdate() 和 Update():
????????在 Start 方法執(zhí)行完畢后,按照固定的時間間隔調(diào)用 FixedUpdate 方法,然后在每一幀調(diào)用 Update 方法。
5.LateUpdate():
????????在 Update 方法執(zhí)行完畢后,調(diào)用 LateUpdate 方法。通常用于相機(jī)跟隨等操作,確保在所有 Update 方法執(zhí)行完畢后執(zhí)行。
6.OnGUI():
????????在 LateUpdate 方法執(zhí)行完畢后,調(diào)用 OnGUI 方法。用于渲染 GUI 元素。
7.OnDisable():
????????如果對象被禁用,調(diào)用 OnDisable 方法。在對象被禁用時執(zhí)行一些清理工作。
8.OnDestroy():
????????如果對象被銷毀,最后調(diào)用 OnDestroy 方法。在對象銷毀時執(zhí)行最終的清理工作。
三.一些使用建議
1.在使用awake和start時:
1.在生命周期中都只調(diào)用一次
2.awake在start之前調(diào)用,并且在所有游戲?qū)ο蟮腶wake方法都調(diào)用完才能調(diào)用某一個游戲?qū)ο蟮膕tart方法,所以如果start方法中有需要提前獲取才能運行的需求,一定要寫在awake中,以免報錯。
3.避免在 Awake
或 Start
中執(zhí)行過于耗時的操作,以免影響游戲啟動性能。這兩個方法應(yīng)該用于輕量級的初始化工作。
4.腳本的構(gòu)造函數(shù)一般先于Awake
?和Start,但在unity中一般不直接使用構(gòu)造函數(shù)。
2.Update
、FixedUpdate
和 LateUpdate的區(qū)別
-
Update:
- 調(diào)用頻率: 在每一幀都會調(diào)用。
- 用途: 用于處理與游戲邏輯和用戶輸入相關(guān)的代碼。
- 建議用法: 處理輸入、游戲邏輯、玩家控制等。
-
FixedUpdate:
- 調(diào)用頻率: 固定的時間間隔內(nèi)調(diào)用,通常默認(rèn)為每秒 50 次。
- 用途: 用于處理物理計算和更新,確保在不同平臺上物理模擬的結(jié)果一致。
- 建議用法: 處理剛體運動、物理碰撞等。
-
LateUpdate:
-
調(diào)用頻率: 在所有
Update
和FixedUpdate
方法執(zhí)行完畢后調(diào)用。 - 用途: 用于處理相機(jī)跟隨邏輯,確保在所有對象的位置和旋轉(zhuǎn)更新后再執(zhí)行。
- 建議用法: 處理相機(jī)跟隨、后處理效果等。
-
調(diào)用頻率: 在所有
建議使用:
- 盡量將用戶輸入和游戲邏輯放在
Update
中,因為它在每一幀都被調(diào)用,適合處理實時性較高的操作。 - 將物理相關(guān)的計算放在
FixedUpdate
中,確保在固定時間間隔內(nèi)進(jìn)行物理更新,使得物理模擬更加準(zhǔn)確。 - 使用
LateUpdate
處理相機(jī)跟隨邏輯,確保在所有對象的位置和旋轉(zhuǎn)更新后再執(zhí)行,避免相機(jī)跟隨的抖動或不穩(wěn)定情況。
3.onEnable和ondisable的區(qū)別
-
OnEnable
:- 調(diào)用時機(jī): 在對象變?yōu)榧せ顮顟B(tài)(enabled)時調(diào)用,無論是在場景開始運行時還是在腳本實例化時。
- 用途: 通常用于初始化工作、資源加載、訂閱事件或啟動協(xié)程等操作,確保在對象激活時執(zhí)行。
-
注意事項: 不要在
OnEnable
中執(zhí)行耗時的操作,因為它可能會影響游戲的啟動性能。
-
OnDisable
:- 調(diào)用時機(jī): 在對象變?yōu)榉羌せ顮顟B(tài)(disabled)時調(diào)用,例如對象被禁用或銷毀。
- 用途: 通常用于清理工作、取消訂閱事件、停止協(xié)程等,確保在對象禁用或銷毀時執(zhí)行。
-
注意事項: 不要在
OnDisable
中執(zhí)行需要對象處于激活狀態(tài)的操作。
建議使用:
- 在
OnEnable
中進(jìn)行資源加載、初始化、訂閱事件等操作,確保在對象激活時執(zhí)行。 - 在
OnDisable
中進(jìn)行清理工作、取消訂閱事件、停止協(xié)程等,確保在對象禁用或銷毀時執(zhí)行。 - 避免在
OnEnable
和OnDisable
中執(zhí)行過多耗時的操作,以免影響游戲性能。
綜合使用 OnEnable
和 OnDisable
方法,可以在對象的生命周期中實現(xiàn)一些必要的初始化和清理邏輯,確保對象在激活和禁用時能夠執(zhí)行特定的操作。
四.面試可能會問的問題
1.生命周期方法的執(zhí)行順序是什么?
Awake
, OnEnable
, Start
, FixedUpdate
, Update
, LateUpdate
, OnGUI
, OnDisable
, OnDestroy
.
2.為什么有時候使用 Awake
而不是 Start
?
Awake
在對象被實例化時調(diào)用,通常用于初始化,而 Start
在 Awake
后執(zhí)行,適合進(jìn)行一次性的初始化工作。如果需要確保在所有腳本的 Awake
階段執(zhí)行,可以使用 Awake
。
3.LateUpdate
適用于什么樣的情況?
LateUpdate
適合處理相機(jī)跟隨邏輯,確保在所有對象的位置和旋轉(zhuǎn)更新后再執(zhí)行,避免相機(jī)抖動或不穩(wěn)定情況。
4.如何處理對象被禁用和銷毀時的清理工作?
OnDisable
用于在對象被禁用時執(zhí)行清理操作,OnDestroy
用于在對象被銷毀時執(zhí)行最終的清理工作。
5.為什么不在 Update
中進(jìn)行物理計算?
FixedUpdate
適合處理物理計算,因為它以固定的時間間隔調(diào)用,確保在不同平臺上物理模擬的結(jié)果一致。
6.如何在編輯器中執(zhí)行初始化操作?
在 Reset
方法中執(zhí)行初始化操作,以確保在編輯器中對腳本屬性的修改能夠及時地反映到場景中。
7.協(xié)程能在哪些生命周期方法中使用?
協(xié)程通常在 Start
或之后的生命周期方法中使用,不建議在 Awake
中使用。
8.生命周期方法執(zhí)行的頻率和如何優(yōu)化性能?
生命周期方法的執(zhí)行頻率取決于引擎調(diào)用的頻率。避免在這些方法中執(zhí)行過多的計算,可以提高性能。
9.如何處理單例模式在 Unity 生命周期中的問題?
使用 Awake
方法來確保單例模式在對象實例化時初始化,并使用 OnDestroy
方法來處理對象銷毀時的清理工作。
例子文章來源:http://www.zghlxwxcb.cn/news/detail-757314.html
public class GameManager : MonoBehaviour
{
// 單例模式實例
private static GameManager instance;
// 獲取單例實例的方法
public static GameManager Instance
{
get
{
if (instance == null)
{
// 如果實例不存在,則嘗試在場景中找到已有的實例
instance = FindObjectOfType<GameManager>();
// 如果場景中不存在實例,則創(chuàng)建一個新的實例
if (instance == null)
{
GameObject obj = new GameObject("GameManager");
instance = obj.AddComponent<GameManager>();
}
}
return instance;
}
}
// 在 Awake 中確保單例的正確性
private void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject); // 防止在場景切換時被銷毀
}
else
{
Destroy(gameObject); // 如果有重復(fù)的實例,銷毀新創(chuàng)建的實例
}
}
// 游戲初始化邏輯
private void Start()
{
// 這里可以添加游戲初始化的邏輯
}
// 游戲結(jié)束時的清理工作
private void OnDestroy()
{
// 這里可以添加游戲結(jié)束時的清理工作
}
}
10.MonoBehaviour 的生命周期方法和非 MonoBehaviour 類的區(qū)別是什么?
MonoBehaviour 類的生命周期方法由引擎調(diào)用,用于管理對象的生命周期,而非 MonoBehaviour 類則沒有這些特殊的生命周期方法。在非 MonoBehaviour 類中,需要手動管理對象的初始化和清理。文章來源地址http://www.zghlxwxcb.cn/news/detail-757314.html
到了這里,關(guān)于unity生命周期簡單敘述的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!