2026/6/9 20:19:44
网站建设
项目流程
做特卖的网站怎么赚钱,wordpress模板堂,wordpress主题个人云盘,开发定制软件开发当我们使用观察者模式、事件监听时#xff0c;关于生命周期函数执行顺序的很多问题会浮现出来。Awake()、OnEnable()、Start()物体激活、脚本启用时#xff0c;执行顺序是Awake、OnEnable、Start#xff1b;进入场景时失活的物体会执行Awake#xff0c;不执行后两个#x…当我们使用观察者模式、事件监听时关于生命周期函数执行顺序的很多问题会浮现出来。Awake()、OnEnable()、Start()物体激活、脚本启用时执行顺序是Awake、OnEnable、Start进入场景时失活的物体会执行Awake不执行后两个进入场景时未启用脚本会执行Awake不执行后两个当物体激活且脚本启用时执行OnEnableStart可以理解为第一次OnEnable后执行deepseek回答在Unity中未激活的物体不会执行Start方法24。具体执行规则如下初始未激活的物体若游戏物体初始状态为activefalse其所有脚本的Awake和Start都不会执行6只有当通过SetActive(true)激活物体时才会首次触发Awake和Start46脚本启用状态的影响Awake会在脚本实例加载时立即执行即使脚本的enabledfalse2Start必须同时满足两个条件才会执行游戏物体处于激活状态(activeInHierarchytrue)脚本组件启用(enabledtrue)26生命周期特性Start在整个物体生命周期中只会执行一次56若物体被反复激活/禁用只有OnEnable/OnDisable会重复触发56执行顺序总结首次激活物体时Awake → OnEnable → Start35后续禁用再激活时仅触发OnEnable一帧里Update、LateUpdate和协程的执行顺序Unity一帧内Update与协程的执行顺序遵循以下规则基础执行顺序每帧先执行所有脚本的Update()函数再处理协程中yield return之后的代码2若协程使用WaitForEndOfFrame则会在所有LateUpdate()调用结束后执行1协程启动时机影响在Awake/OnEnable中启动的协程会在首帧Update前被处理2在Start中启动的协程需等到下一帧Update才会执行2多协程优先级后启动的协程会优先执行LIFO原则2例如同时存在协程A和B若先启动A后启动B则当前帧会先执行B的后续代码2特殊延迟类型WaitForFixedUpdate在FixedUpdate之后、Update之前执行14WaitForSeconds受Time.timeScale影响实际执行时机可能跨帧1与LateUpdate的关系LateUpdate()始终在所有Update和常规协程执行完毕后调用34但若协程包含yield return null其后续代码会在LateUpdate前执行1物理帧同步FixedUpdate()独立于主线程帧率每物理时间步长强制调用默认0.02秒1当游戏卡顿时Unity会通过补帧机制保证FixedUpdate按固定频率执行1注完整生命周期顺序为Awake → OnEnable → Start → FixedUpdate → Update → 协程非WaitForEndOfFrame→ LateUpdate→协程WaitForEndOfFrame→ OnDisable → OnDestroy脚本执行顺序与OnDestroy设置脚本执行顺序不能控制OnDestroy的执行顺序据说销毁顺序主要受组件添加顺序影响。是执行完所有脚本的Awake后执行OnEnable吗NO不是所有Awake执行完才执行OnEnable// 假设有 ScriptA 和 ScriptB 两个脚本 // 都在同一个GameObject上 public class ScriptA : MonoBehaviour { void Awake() Debug.Log(A.Awake); void OnEnable() Debug.Log(A.OnEnable); } public class ScriptB : MonoBehaviour { void Awake() Debug.Log(B.Awake); void OnEnable() Debug.Log(B.OnEnable); }A.Awake ← ScriptA的AwakeA.OnEnable ← ScriptA的OnEnable ❗注意这里B.Awake ← ScriptB的AwakeB.OnEnable ← ScriptB的OnEnable1. 创建GameObject↓2. 添加第一个组件如ScriptA↓3. 调用 ScriptA.Awake()↓4. 调用 ScriptA.OnEnable() ← 立即调用↓5. 添加第二个组件如ScriptB↓6. 调用 ScriptB.Awake()↓7. 调用 ScriptB.OnEnable()对于不同GameObject场景加载↓GameObject1创建↓组件A.Awake() → 组件A.OnEnable() ← 成对执行↓组件B.Awake() → 组件B.OnEnable() ← 成对执行↓GameObject2创建↓组件C.Awake() → 组件C.OnEnable() ← 成对执行