unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期
腳本生命周期流程圖
加載第一個場景
場景開始時將調(diào)用以下函數(shù)(為場景中的每個對象調(diào)用一次)。
- Awake:始終在任何 Start 函數(shù)之前并在實例化預(yù)制件之后調(diào)用此函數(shù)。(如果游戲?qū)ο笤趩悠陂g處于非活動狀態(tài),則在激活之后才會調(diào)用Awake。)
- OnEnable:(僅在對象處于激活狀態(tài)時調(diào)用)在啟用對象后立即調(diào)用此函數(shù)。在創(chuàng)建 MonoBehaviour實例時(例如加載關(guān)卡或?qū)嵗哂心_本組件的游戲?qū)ο髸r)會執(zhí)行此調(diào)用。
- OnLevelWasLoaded:執(zhí)行此函數(shù)可告知游戲已加載新關(guān)卡。 請注意,對于添加到場景中的對象,在為任何對象調(diào)用 Start 和 Update 等函數(shù)之前,會為所有腳本調(diào)用 Awake 和 OnEnable 函數(shù)。當(dāng)然,在游戲運(yùn)行過程中實例化對象時,不能強(qiáng)制執(zhí)行此調(diào)用。
Editor
- Reset:調(diào)用 Reset 可以在腳本首次附加到對象時以及使用 Reset 命令時初始化腳本的屬性。
在第一次幀更新之前
- Start:僅當(dāng)啟用腳本實例后,才會在第一次幀更新之前調(diào)用 Start。
對于添加到場景中的對象,在為任何腳本調(diào)用 Update 等函數(shù)之前,將在所有腳本上調(diào)用 Start 函數(shù)。當(dāng)然,在游戲運(yùn)行過程中實例化對象時,不能強(qiáng)制執(zhí)行此調(diào)用。
幀之間
- OnApplicationPause:在幀的結(jié)尾處調(diào)用此函數(shù)(在正常幀更新之間有效檢測到暫停)。在調(diào)用 OnApplicationPause 之后,將發(fā)出一個額外幀,從而允許游戲顯示圖形來指示暫停狀態(tài)。
更新順序
跟蹤游戲邏輯和交互、動畫、攝像機(jī)位置等的時候,可以使用一些不同事件。常見方案是在 Update 函數(shù)中執(zhí)行大多數(shù)任務(wù),但是也可以使用其他函數(shù)。
- FixedUpdate:調(diào)用 FixedUpdate 的頻度常常超過Update。如果幀率很低,可以每幀調(diào)用該函數(shù)多次;如果幀率很高,可能在幀之間完全不調(diào)用該函數(shù)。在 FixedUpdate 之后將立即進(jìn)行所有物理計算和更新。在 FixedUpdate 內(nèi)應(yīng)用運(yùn)動計算時,無需將值乘以 Time.deltaTime。這是因為 FixedUpdate 的調(diào)用基于可靠的計時器(獨立于幀率)。
- Update:每幀調(diào)用一次 Update。這是用于幀更新的主要函數(shù)。
- LateUpdate:每幀調(diào)用一次 LateUpdate__(在 Update__ 完成后)。LateUpdate 開始時,在Update 中執(zhí)行的所有計算便已完成。LateUpdate 的常見用途是跟隨第三人稱攝像機(jī)。如果在 Update內(nèi)讓角色移動和轉(zhuǎn)向,可以在 LateUpdate 中執(zhí)行所有攝像機(jī)移動和旋轉(zhuǎn)計算。這樣可以確保角色在攝像機(jī)跟蹤其位置之前已完全移動。
動畫更新循環(huán)
Unity 評估動畫系統(tǒng)時,將調(diào)用以下函數(shù)和 Profiler 標(biāo)記。
- OnStateMachineEnter:在狀態(tài)機(jī)更新 (State Machine Update) 步驟中,當(dāng)控制器的狀態(tài)機(jī)進(jìn)行流經(jīng) Entry 狀態(tài)的轉(zhuǎn)換時,將在第一個更新幀上調(diào)用此回調(diào)。在轉(zhuǎn)換到 StateMachine 子狀態(tài)時不會調(diào)用此回調(diào)。
僅當(dāng)動畫圖中存在控制器組件(例如,AnimatorController、AnimatorOverrideController 或 AnimatorControllerPlayable)時才會發(fā)生此回調(diào)。
注意:將此回調(diào)添加到 StateMachineBehaviour 組件會禁用多線程的狀態(tài)機(jī)評估。 - OnStateMachineExit:在狀態(tài)機(jī)更新 (State Machine Update) 步驟中,當(dāng)控制器的狀態(tài)機(jī)進(jìn)行流經(jīng) Exit 狀態(tài)的轉(zhuǎn)換時,將在最后一個更新幀上調(diào)用此回調(diào)。在轉(zhuǎn)換到 StateMachine 子狀態(tài)時不會調(diào)用此回調(diào)。
僅當(dāng)動畫圖中存在控制器組件(例如,AnimatorController、AnimatorOverrideController 或 AnimatorControllerPlayable)時才會發(fā)生此回調(diào)。
注意:將此回調(diào)添加到 StateMachineBehaviour 組件會禁用多線程的狀態(tài)機(jī)評估。 - 觸發(fā)動畫事件 (Fire Animation Events):調(diào)用在上次更新時間和當(dāng)前更新時間之間采樣的所有剪輯中的所有動畫事件。
- StateMachineBehaviour(OnStateEnter/OnStateUpdate/OnStateExit):一個層最多可以有 3個活動狀態(tài):當(dāng)前狀態(tài)、中斷狀態(tài)和下一個狀態(tài)。使用一個定義 OnStateEnter、OnStateUpdate 或 OnStateExit 回調(diào)的 StateMachineBehaviour 組件為每個活動狀態(tài)調(diào)用此函數(shù)。
依次針對當(dāng)前狀態(tài)、中斷狀態(tài)和下一個狀態(tài)調(diào)用此函數(shù)。
僅當(dāng)動畫圖中存在控制器組件(例如,AnimatorController、AnimatorOverrideController 或 AnimatorControllerPlayable)時才會執(zhí)行此步驟。 - OnAnimatorMove:在每個更新幀中為每個 Animator 組件調(diào)用一次此函數(shù)來修改根運(yùn)動 (Root Motion)。
- StateMachineBehaviour(OnStateMove):使用定義此回調(diào)的 StateMachineBehaviour在每個活動狀態(tài)中調(diào)用此函數(shù)。
- OnAnimatorIK:設(shè)置動畫 IK。為每個啟用 IK pass 的 Animator Controller 層進(jìn)行一次此調(diào)用。
僅當(dāng)使用人形骨架時才會執(zhí)行此事件。 - StateMachineBehaviour(OnStateIK):使用在啟用 IK pass 的層上定義此回調(diào)的StateMachineBehaviour 組件在每個活動狀態(tài)中調(diào)用此函數(shù)。
- WriteProperties:從主線程將所有其他動畫屬性寫入場景。
有用的性能分析標(biāo)記
腳本生命周期流程圖中顯示的某些動畫函數(shù)不是可以調(diào)用的事件函數(shù);它們是 Unity 處理動畫時調(diào)用的內(nèi)部函數(shù)。
這些函數(shù)具有 Profiler 標(biāo)記,因此您可以使用 Profiler 查看 Unity 在幀中調(diào)用這些函數(shù)的時間。知道 Unity 調(diào)用這些函數(shù)的時間有助于準(zhǔn)確了解所調(diào)用的事件函數(shù)的具體執(zhí)行時間。
例如,假設(shè)在 FireAnimationEvents 回調(diào)中調(diào)用 Animator.Play。如果知道只有在執(zhí)行狀態(tài)機(jī)更新 (State Machine Update) 和流程圖 (Process Graph) 函數(shù)后才會觸發(fā) FireAnimationEvents 回調(diào),就可以預(yù)期動畫剪輯會在下一幀播放,而不是馬上播放。
- 狀態(tài)機(jī)更新 (StateMachineUpdate):在執(zhí)行序列的此步驟中評估所有狀態(tài)機(jī)。僅當(dāng)動畫圖中存在控制器組件(例如,AnimatorController、AnimatorOverrideController 或 AnimatorControllerPlayable)時才會發(fā)生此回調(diào)。
注意:狀態(tài)機(jī)評估通常是多線程的,但添加某些回調(diào)(例如,OnStateMachineEnter 和 OnStateMachineExit)會禁用多線程。請參數(shù)上文的動畫更新循環(huán)以了解詳細(xì)信息。 - ProcessGraph:評估所有動畫圖。此過程包括對需要評估的所有動畫剪輯進(jìn)行采樣以及計算根運(yùn)動 (Root Motion)。
- ProcessAnimation:混合動畫圖的結(jié)果。
- WriteTransforms:將所有動畫變換從工作線程寫入場景。
如果一個人形骨架的多個層啟用了 IK pass,則該人形骨架可以有多個 WriteTransforms 通道(請參閱腳本生命周期流程圖)。
Rendering
- OnPreCull:在攝像機(jī)剔除場景之前調(diào)用。剔除操作將確定攝像機(jī)可以看到哪些對象。正好在進(jìn)行剔除之前調(diào)用 OnPreCull。
- OnBecameVisible/OnBecameInvisible:對象變?yōu)閷θ魏螖z像機(jī)可見/不可見時調(diào)用。
- OnWillRenderObject:如果對象可見,則為每個攝像機(jī)調(diào)用一次。
- OnPreRender:在攝像機(jī)開始渲染場景之前調(diào)用。
- OnRenderObject:所有常規(guī)場景渲染完成之后調(diào)用。此時,可以使用 GL 類或 Graphics.DrawMeshNow 來繪制自定義幾何形狀。
- OnPostRender:在攝像機(jī)完成場景渲染后調(diào)用。
- OnRenderImage:在場景渲染完成后調(diào)用以允許對圖像進(jìn)行后處理,請參閱后期處理效果。
- OnGUI:每幀調(diào)用多次以響應(yīng) GUI 事件。首先處理布局和重新繪制事件,然后為每個輸入事件處理布局和鍵盤/鼠標(biāo)事件。
- OnDrawGizmos 用于在場景視圖中繪制輔助圖標(biāo)以實現(xiàn)可視化。
協(xié)程
Update 函數(shù)返回后將運(yùn)行正常協(xié)程更新。協(xié)程是一個可暫停執(zhí)行 (yield) 直到給定的 YieldInstruction 達(dá)到完成狀態(tài)的函數(shù)。 協(xié)程的不同用法:
- yield 在下一幀上調(diào)用所有 Update 函數(shù)后,協(xié)程將繼續(xù)。
- yield WaitForSeconds 在為幀調(diào)用所有 Update 函數(shù)后,在指定的時間延遲后繼續(xù)協(xié)程
- yield WaitForFixedUpdate 在所有腳本上調(diào)用所有 FixedUpdate 后繼續(xù)協(xié)程
- yield WWW 在 WWW 下載完成后繼續(xù)。
- yield StartCoroutine 將協(xié)程鏈接起來,并會等待 MyFunc 協(xié)程先完成。
銷毀對象時
- OnDestroy:對象存在的最后一幀完成所有幀更新之后,調(diào)用此函數(shù)(可能應(yīng) Object.Destroy 要求或在場景關(guān)閉時銷毀該對象)。
退出時
在場景中的所有活動對象上調(diào)用以下函數(shù):
- OnApplicationQuit:在退出應(yīng)用程序之前在所有游戲?qū)ο笊险{(diào)用此函數(shù)。在編輯器中,用戶停止播放模式時,調(diào)用函數(shù)。
- OnDisable:行為被禁用或處于非活動狀態(tài)時,調(diào)用此函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sql server 怎么把视图中的数据
- 下一篇: python处理pdf实例_python