Unity中对象的生命周期_unity对象生命周期
一、 Unity中的帧
游戏的本质是一个死循环,每一次循环中,都会处理游戏的逻辑并且更新一帧画面。 当帧生成速度足够快时,在人眼中就是动态的。
每一帧,就是完整的执行了一次循环,在Unity底层已经为我们封装好了这个循环,我们只需要恰当得利用Unity提供的生命周期函数,即可完成游戏逻辑。
二、 Unity中的生命周期函数的概念
所有继承自MonoBehavior
的脚本,都可以挂载在GameObject对象上,
生命周期函数则是脚本依附的GameObject对象冲出生到消亡的周期中,由Unity通过反射调用的一些特殊函数。
三、 生命周期函数
生命周期函数通常为protected或者private的,我们不需要主动调用这些函数,由Unity自动调用。
#mermaid-svg-LjmNbMilXGJe5CvE {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LjmNbMilXGJe5CvE .error-icon{fill:#552222;}#mermaid-svg-LjmNbMilXGJe5CvE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LjmNbMilXGJe5CvE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-LjmNbMilXGJe5CvE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LjmNbMilXGJe5CvE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LjmNbMilXGJe5CvE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LjmNbMilXGJe5CvE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LjmNbMilXGJe5CvE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LjmNbMilXGJe5CvE .marker.cross{stroke:#333333;}#mermaid-svg-LjmNbMilXGJe5CvE svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LjmNbMilXGJe5CvE .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LjmNbMilXGJe5CvE .cluster-label text{fill:#333;}#mermaid-svg-LjmNbMilXGJe5CvE .cluster-label span{color:#333;}#mermaid-svg-LjmNbMilXGJe5CvE .label text,#mermaid-svg-LjmNbMilXGJe5CvE span{fill:#333;color:#333;}#mermaid-svg-LjmNbMilXGJe5CvE .node rect,#mermaid-svg-LjmNbMilXGJe5CvE .node circle,#mermaid-svg-LjmNbMilXGJe5CvE .node ellipse,#mermaid-svg-LjmNbMilXGJe5CvE .node polygon,#mermaid-svg-LjmNbMilXGJe5CvE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LjmNbMilXGJe5CvE .node .label{text-align:center;}#mermaid-svg-LjmNbMilXGJe5CvE .node.clickable{cursor:pointer;}#mermaid-svg-LjmNbMilXGJe5CvE .arrowheadPath{fill:#333333;}#mermaid-svg-LjmNbMilXGJe5CvE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LjmNbMilXGJe5CvE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LjmNbMilXGJe5CvE .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-LjmNbMilXGJe5CvE .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-LjmNbMilXGJe5CvE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LjmNbMilXGJe5CvE .cluster text{fill:#333;}#mermaid-svg-LjmNbMilXGJe5CvE .cluster span{color:#333;}#mermaid-svg-LjmNbMilXGJe5CvE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LjmNbMilXGJe5CvE :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}一直在此处循环对象出生AwakeOnEnableStartFixedUpdateUpdateLateUpdateOnDisableOnDestroy对象被销毁
Awake
类似构造函数,在GameObject出生时调用,一个对象只会调用一次。OnEnable
会在GameObject启用时调用,每次将GameObject的Active属性从false设置为True时调用。Start
从GameObject创建出来后,第一次帧更新时调用,一个对象只会调用一次。FixedUpdate
物理帧更新,间隔固定时间执行。在物理帧中,Unity会判断碰撞,所以物体碰撞操作应当放在FixedUpdate中执行。Update
逻辑帧更新,每一帧都执行。按键检测应当放在Update中,如果在FixedUpdate中处理,则可能会有检测不到按键的情况。LateUpdate
每一帧都执行,但比Update晚执行。OnDisable
会在GameObject禁用时调用,每次将GameObject的Active属性从True设置为false时调用。OnDestroy
会在GameObject被销毁时调用。
四、 特别注意
如果场景中物体从开始时的Active状态为false时,此时不会调用Awake方法,当第一次设置为true时,才会进入生命周期。