腳本周期
1.初始化階段
場景開始時
1.Awake
場景創(chuàng)建時或prefab實例化時,若為inactive則在active時調(diào)用柒昏,僅執(zhí)行一次
一般為了初始化游戲變量和游戲狀態(tài)凳宙。僅執(zhí)行一次。
如果游戲?qū)ο笤趩悠陂g處于非活動狀態(tài)职祷,則在激活之后才會調(diào)用 Awake氏涩。
只要該物體存在于場景中且屬于活躍狀態(tài),就會執(zhí)行Awake有梆,與物體掛載的腳本組件是否激活無關(guān)是尖。
2.OnEnable
僅在游戲?qū)ο笫强杉せ顮顟B(tài)時調(diào)用,取消激活后再次激活也會響應泥耀。
在創(chuàng)建 MonoBehaviour 實例時(例如加載關(guān)卡或?qū)嵗哂心_本組件的游戲?qū)ο髸r)會執(zhí)行此調(diào)用饺汹。
場景加載完,GameObject實例化時痰催,對象enabled時
3.OnLevelWasLoaded
場景全部加載完成后
執(zhí)行此函數(shù)可告知游戲已加載新關(guān)卡兜辞。
4.Reset?
當Scripts第一次的綁定到物體上或者點擊Reset按鈕的時候觸發(fā)。
且只在Editor模式下觸發(fā)夸溶,游戲打包的時候不會觸發(fā)逸吵。
Editor級別,非playmode下腳本掛載時或主動調(diào)用
5.Start
僅在場景中所有Awake 和 OnEnable執(zhí)行后缝裁,所有場景中對象第一幀update之前扫皱,且僅執(zhí)行一次
2.物理計算階段
1.fixedupdate
每一幀會執(zhí)行的調(diào)用,所有的物理行為的每幀更新的邏輯都應在放在這里面捷绑,比如剛體的運算韩脑。
FixedUpdate的幀率是固定的,由FixedTimestepd的值決定胎食,路徑:Edit->ProjectSetting->Time->FixedTimestep扰才。但每一幀的時間間隔不固定,如果每幀都有大量的運算厕怜,為了避免運算超時影響主幀(Update)衩匣,邏輯運算受臨界值MaximumAllowedTimestep控制蕾总,超出時間就會退出運算。
而Update幀率不固定琅捏,會受到時間縮放的影響生百,會出現(xiàn)卡頓的情況。
調(diào)用FixedUpdate的頻度常常超過Update柄延。
每幀根據(jù)幀率高低可能多次調(diào)用也可能不調(diào)用蚀浆,執(zhí)行后立即開始物理計算和更新,做移動計算時無需使用Time.deltaTime
2.狀態(tài)機周期(動畫更新)
1.狀態(tài)機更新(State Machine Update)
2.OnStateMachineEnter
掛載在一個動畫圖形上的狀態(tài)機首次進入一個狀態(tài)時的第一幀調(diào)用
3.OnStateMachineExit
退出狀態(tài)的最后一幀調(diào)用
4.處理圖形
評估所有動畫圖形
5.觸發(fā)動畫事件?(Fire Animation Events)
在該時間內(nèi)當前幀和最后一幀之間搜吧,觸發(fā)所有動畫片段的動畫事件
6.狀態(tài)周期回調(diào)?StateMachineBehaviour(OnStateEnter/OnStateUpdate/OnStateExit)?
一個狀態(tài)層有最多三個活躍狀態(tài)市俊,current state, interrupted state, and next state(當前狀態(tài)、中斷狀態(tài)和下一個狀態(tài)滤奈。)摆昧,對應階段周期方法順序執(zhí)行
3.內(nèi)部物理更新
4.狀態(tài)機周期(動畫更新)
1.處理動畫
渲染動畫結(jié)果圖形
2.IK動畫周期(OnAnimatorIK)
設置動畫 IK。為每個啟用 IK pass 的 Animator Controller 層進行一次此調(diào)用蜒程。
由workthread寫入Transform
3.寫入屬性
由主線程寫入場景其他動畫屬性
5.碰撞事件(Collision绅你、Trigger)
6.協(xié)程(yield WaitForFixedUpdate)
在所有腳本的FixedUpdated執(zhí)行后再執(zhí)行
3.輸入事件
1.OnMouseXXX
4.游戲邏輯
1.update
每一幀進行調(diào)用,是實現(xiàn)游戲邏輯的主要方法昭躺。
2.協(xié)程
除WaitForFixedUpdate和WaitForEndOfFrame其他協(xié)程時機
3.狀態(tài)機周期(動畫更新)
同物理計算階段過程忌锯,單無內(nèi)部物理更新
4.lateupdate
開始時update的計算都已完成,一普遍用法是相機跟隨领炫,update中對人物移動的計算已全部完成偶垮,此時在lateupdate中更新相機位置
5.場景渲染
1.OnWillRenderObject
若物體可見則每個相機調(diào)用一次
2.OnPreCull
相機剔除動作前
在攝像機剔除場景之前調(diào)用。剔除操作將確定攝像機可以看到哪些對象帝洪。正好在進行剔除之前調(diào)用 OnPreCull针史。
3.OnBecameVisible/OnBecameInvisible
對任何相機可見/不可見時調(diào)用
4.OnPreRender
相機渲染前
5.OnRenderObject
所有常規(guī)場景渲染完成時,可在此繪制自定義幾何圖形
此時碟狞,可以使用?GL?類或?Graphics.DrawMeshNow?來繪制自定義幾何形狀啄枕。
6.OnPostRender
當一個相機渲染完場景后
7.OnRenderImage
場景渲染后,可對Image做后期處理(濾鏡)
6.Gizmo 渲染
1.OnDrawGizmos
僅在editor
用于在場景視圖中繪制輔助圖標以實現(xiàn)可視化族沃。
7.GUI渲染
1.OnGUI 每幀多次調(diào)用
每幀調(diào)用多次以響應 GUI 事件频祝。首先處理布局和重新繪制事件,然后為每個輸入事件處理布局和鍵盤/鼠標事件脆淹。
8.幀結(jié)束
1.yield WaitForEndOfFrame
協(xié)程是一個可暫停執(zhí)行 (yield) 直到給定的 YieldInstruction 達到完成狀態(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é)程先完成昆禽。
9.暫停
1.OnApplicationPause
一幀最后時調(diào)用蝗蛙,調(diào)用后會再觸發(fā)一幀以刷新圖像和切換暫停狀態(tài)
10.退出/銷毀
1.OnApplicationQuit
在退出應用程序之前在所有游戲?qū)ο笊险{(diào)用此函數(shù)。
在編輯器中醉鳖,用戶停止播放模式時捡硅,調(diào)用函數(shù)。
2.OnDisable
在對象被取消活躍狀態(tài)的時候響應盗棵,與OnEable相對應壮韭。
3.OnDestroy
當一個被激活的對象被銷毀的時候調(diào)用,未被激活的對象被銷毀則不會調(diào)用纹因。