精华内容
下载资源
问答
  • MonoBehaviour生命周期

    2017-09-16 23:41:00
    MonoBehaviour生命周期 上图中重要的信息点很多,需要特别注意的是所有脚本的Awake方法都执行完才会执行Start,但是如果在Awake 中开启了一个协程这个协程中每一帧执行一些操作然后等待,那么Start方法执行是...

    MonoBehaviour生命周期

     

    上图中重要的信息点很多,需要特别注意的是所有脚本的Awake方法都执行完才会执行Start,但是如果在Awake 中开启了一个协程这个协程中每一帧执行一些操作然后等待,那么Start方法执行是不会等待这个协程结束的,也就是说Start方法中的代码会比协程的代码结束早晚是不一定的。另外可以看到Unity中所有的方法都是在一个大循环里,所以协程只是换一个地方循环中的位置执行,并不是另一个线程。

    在Unity脚本中,有一些按照预定顺序执行的事件函数,脚本即是按照此顺序执行的。这个执行顺序描述如下:

    First Scene Load 第一个场景加载

    These functions get called when a scene starts (once for each object in the scene).

    这些函数在场景开始时就被调用了(对场景中的每个对象执行一次)。

    • Awake: This function is always called before any Start functions and also just after a prefab is instantiated.
      Awake:这个函数是在Start函数之前以及预制物体实例化后被调用。
    • OnEnable: (only called if the Object is active): This function is called just after the object is enabled.
      OnEnable:(仅在对象激活状态下可用):这个函数在对象可用之后被调用。

    Before the first frame update 第一帧更新之前

    • Start: Start is called before the first frame update only if the script instance is enabled.
      Start:如果脚本实例化被启用,则Start函数在第一帧更新之前被调用。

    In between frames 执行期间

    • OnApplicationPause: This is called at the end of the frame where the pause is detected, effectively between the normal frame updates. One extra frame will be issued after OnApplicationPause is called to allow the game to show graphics that indicate the paused state.
      OnApplicationPause:若暂停被检测到,当前帧执行后就调用此函数,在正常的运行期间调用是有效的。在OnApplicationPause被调用后,额外的用一帧来显示图像表明暂停状态。

    Update Order 更新顺序

    When you’re keeping track of game logic and interactions, animations, camera positions, etc., there are a few different events you can use. The common pattern is to perform most tasks inside the Update() function, but there are also other functions you can use.

    这里有一些不同的事件函数供你来追踪游戏逻辑,动画和相机的位置等。在Update()函数中执行大多数任务是比较常见的,然而也有其他函数可以使用。

    • FixedUpdate: FixedUpdate() is often called more frequently than Update(). It can be called multiple times per frame, if the frame rate is low and it may not be called between frames at all if the frame rate is high. All physics calculations and updates occur immediately after FixedUpdate(). When applying movement calculations inside FixedUpdate(), you do not need to multiply your values by Time.deltaTime. This is because FixedUpdate() is called on a reliable timer, independent of the frame rate.
      FixedUpdate: FixedUpdate()比Update()函数调用的更频繁。当帧率比较低时,它每帧被调用多次,如果帧率比较高,它有可能就不会被调用。所有的物理计算和更新都立即发生在FixedUpdate()之后。当在FixedUpdate()中计算物体移动时,你不需要乘以Time.deltaTime。因为FixedUpdate()是基于可靠的定时器的,不受帧率的影响。
    • Update: Update() is called once per frame. It is the main workhorse function for frame updates.
      Update() 每帧调用一次。这是帧更新的主要函数。
    • LateUpdate: LateUpdate() is called once per frame, after Update() has finished. Any calculations that are performed in Update() will have completed when LateUpdate() begins. A common use for LateUpdate() would be a following third-person camera. If you make your character move and turn inside Update(), you can perform all camera movement and rotation calculations in LateUpdate(). This will ensure that the character has moved completely before the camera tracks its position.
      LateUpdate: 在Update()执行后,LateUpdate() 也是每帧都被调用。在Update()中执行的任何计算都会在LateUpdate()开始之前完成。LateUpdate()的一个常见应用就是第三人称控制器的相机跟随。如果你把角色的移动和旋转放在Update()中,那么你就可以把所有相机的移动旋转放在LateUpdate()。这是为了在相机追踪角色位置之前,确保角色已经完成移动。

    Rendering 渲染

    • OnPreCull: Called before the camera culls the scene. Culling determines which objects are visible to the camera. OnPreCull is called just before culling takes place.
      OnPreCull:在相机剔除场景前被调用。剔除取决于物体在相机中是否可见。OnPreCull仅在剔除执行之前被调用。
    • OnBecameVisible/OnBecameInvisible: Called when an object becomes visible/invisible to any camera.
      OnBecameVisible/OnBecameInvisible:当物体在任何相机中可见/不可见时被调用。
    • OnWillRenderObject: Called once for each camera if the object is visible.
      OnWillRenderObject:如果物体可见,它将为每个摄像机调用一次。
    • OnPreRender: Called before the camera starts rendering the scene.
      OnPreRender: 在相机渲染场景之前被调用。
    • OnRenderObject: Called after all regular scene rendering is done. You can use GL class or Graphics.DrawMeshNow to draw custom geometry at this point.
      OnRenderObject:在所有固定场景渲染之后被调用。此时你可以使用GL类或者Graphics.DrawMeshNow来画自定义的几何体。
    • OnPostRender: Called after a camera finishes rendering the scene.
      OnPostRender: 在相机完成场景的渲染后被调用。
    • OnRenderImage(Pro only): Called after scene rendering is complete to allow postprocessing of the screen image.
      OnRenderImage(仅专业版):在场景渲染完成后被调用,用来对屏幕的图像进行后处理。
    • OnGUI: Called multiple times per frame in response to GUI events. The Layout and Repaint events are processed first, followed by a Layout and keyboard/mouse event for each input event.
      OnGUI: 每帧被调用多次用来回应GUI事件。布局和重绘事件先被执行,接下来是为每一次的输入事件执行布局和键盘/鼠标事件。
    • OnDrawGizmos Used for drawing Gizmos in the scene view for visualisation purposes.
      OnDrawGizmos:为了可视化的目的在场景视图中绘制小图标。

    Coroutine 协同程序(协程)

    Normal coroutine updates are run after the Update function returns. A coroutine is function that can suspend its execution (yield) until the given given YieldInstruction finishes. Different uses of Coroutines:

    正常情况下协程是在Update函数返回时执行。协程的功能是,延缓其执行(yield) ,直到给定的YieldInstruction完成。协程的不同用途:

    • yield; The coroutine will continue after all Update functions have been called on the next frame.
      yield:协程在所有的Update函数于下一帧调用后继续执行。
    • yield WaitForSeconds(2); Continue after a specified time delay, after all Update functions have been called for the frame
      yield WaitForSeconds(2):在一个指定的时间延迟后继续执行,在所有的Update函数被调用之后。
    • yield WaitForFixedUpdate(); Continue after all FixedUpdate has been called on all scripts
      yield WaitForFixedUpdate():在所有脚本上所有的FixedUpdate被调用之后继续执行。
    • yield WWW Continue after a WWW download has completed.
      yield WWW:在WWW加载完成之后继续执行。
    • yield StartCoroutine(MyFunc); Chains the coroutine, and will wait for the MyFunc coroutine to complete first.
      yield StartCoroutine(MyFunc):用于链接协程,此将等待MyFunc协程完成先。

    When the Object is Destroyed 当对象被销毁时

    • OnDestroy: This function is called after all frame updates for the last frame of the object’s existence (the object might be destroyed in response to Object.Destroy or at the closure of a scene).
      OnDestroy: 这个函数在所有帧更新之后被调用,在对象存在的最后一帧(对象将销毁来响应Object.Destroy或关闭一个场景)。

    When Quitting 当退出时

    These functions get called on all the active objects in your scene, :

    这些函数对于场景中的所有激活状态的物体都会被调用。

    • OnApplicationQuit: This function is called on all game objects before the application is quit. In the editor it is called when the user stops playmode. In the web player it is called when the web view is closed.
      OnApplicationQuit:在应用退出之前所有的游戏对象都会调用这个函数。在编辑器中当用户停止播放时它将被调用。在webplayer中,当网页关闭时被调用。
    • OnDisable: This function is called when the behaviour becomes disabled or inactive.
      OnDisable: 当行为不可用或非激活时,这个函数被调用。

    So in conclusion, this is the execution order for any given script:

    因此结论是,对于任意给定的脚本的执行顺序为:

    1. All Awake calls 所有Awake调用
    2. All Start Calls 所有Start调用
    3. while (stepping towards variable delta time)
      1. All FixedUpdate functions 所有FixedUpdate函数
      2. Physics simulation 物理模拟
      3. OnEnter/Exit/Stay trigger functions OnEnter/Exit/Stay触发函数
      4. OnEnter/Exit/Stay collision functions OnEnter/Exit/Stay碰撞函数
    4. Rigidbody interpolation applies transform.position and rotation
      刚体插值应用于transform.position 和 rotation
    5. OnMouseDown/OnMouseUp etc. events OnMouseDown/OnMouseUp等事件
    6. All Update functions 所有Update函数
    7. Animations are advanced, blended and applied to transform 高级动画、混合并应用到变换
    8. All LateUpdate functions 所有LateUpdate函数
    9. Rendering 渲染

    Hints 提示

    • If you start a coroutine in LateUpdate it will also be called after LateUpdate just before rendering.
      如果你在LateUpdate中开启一个协程,它将在LateUpdate之后渲染之前也会被调用。
    • Coroutines are executed after all Update functions.
      协程在所有的Update函数完成后执行。

     

    转载于:https://www.cnblogs.com/kanekiken/p/7533501.html

    展开全文
  • Monobehaviour生命周期

    2017-05-07 16:03:20
     上述是生命周期的开始,我们先不讲生命周期运行,直接将生命周期的结束,如下图: OnApplicationQuit:当你的应用程序退出时,会先调用OnApplicationQuit(你可以在此时来save你的数据) OnDisable:除在...

    转载:http://blog.csdn.net/qiupu4667/article/details/70215988?locationNum=10&fps=1


    其实在刚接触Unity3D,会有一个疑问,关于Unity3D游戏运行的初始入口在哪?不像Cocos2dx还有个AppDelegate文件可以去理解。而且在刚开始就接触Unity3D时,看到所有脚本中编写的类

    几乎都继承了MonoBehaviour这个父类,那么MonoBehaviour这个类是干什么的

      首先我们看一关于MonoBehavior这个类的继承关系:

      

      从上图可以看出,MonoBehaviour是间接继承自Component,说明继承自MonoBehaviour的脚本充当的角色是组件的角色,当我们需要将一个自定义脚本已组件的形式添加到对应的GameObject时,该脚

    是必须要继承MonoBehaviour。所以综上MonoBehaviour的作用就是开发者可以自定义自己的组件类。

      当我们拥有拥有自己的组件类时,我们会对类的生命周期,和一些重要的接口感兴趣,以便在使用过程中,不那么疑惑。

      我们可以先看一下 Unity3D官网上的一张图 可以先熟悉一下整体的流程(在网页的中间):

      首先我们可以将这张图分成两种状态:

    • 编辑器下的状态:可以点击设置,Reset函数,将脚本恢复默认状态
    • 运行状态(真正的生命周期):,除Reset函数外,其余函数都在运行状态执行(加特殊字段,该脚本也可已在编辑器运行)

      我们主要关心的是在运行状态,因为此时脚本的生命周期真正开始,先看如下图:

      

      当我们点击Unity3D的Play按钮时,脚本会从编辑器模式进入运行模式,会先走Initialization步骤,从名字可以看出,该步骤做的是初始化操作,且确定了三个函数的调用时序

      那三个函数有啥区别:

    • Awake: 
      •  调用条件: gameObj is Active(场景开始时 当前obj的Active 是 true) 或者 在 Instantiate 一个 Prefab之后
      •  注意事项:
        • 总是在所有脚本调用Start之前调用如下图:

        • Awake函数只调用一次
    • OnEnable:
      • 调用条件: 当执行完Active时
      • 注意事项 : 将enable = false, 会在执行完OnEnable后,直接执行OnDisable,在OnDisable设置enable = true就会跳到OnEnable(切记不要出现死循环:)
    • Start:          
      • 调用条件 : OnEnable执行完
      • 注意事项:Start只会执行一次,无论下次第几次调用到OnEnable,均不会在执行(适合初始化)

      上述是生命周期的开始,我们先不讲生命周期运行,直接将生命周期的结束,如下图:

    • OnApplicationQuit:当你的应用程序退出时,会先调用OnApplicationQuit(你可以在此时来save你的数据)
    • OnDisable:除在OnApplicationQuit调用时会调用,还会再设置enable = false 或 active = false 调用
    • OnDestory:除在OnApplicationQuit调用时会调用,还有在手动的Destory gameObject时  

      讲完了生命周期的开始和结束,现在聊聊比较重要的部分:

      

      

      上述有很多Update 和 很多yield , 关于yield知识点可以看这里 , 我们可以从上述看到三个Update调用的顺序,FixedUpdate --> Update --> LateUpdate:

      

      我们可以看到,Unity是调用完所有脚本的FixedUpdate,在调用所有脚本的Update,在调用所有脚本的LateUpdate。

      关于协程中的yield其实很好理解 ,如下图:

      

      比如 yield null ,表示当函数运行到此处时,会挂起(中断),等下一帧,所有的脚本Update运行完后,会继续执行此函数。

      (上图的意思是回去检测所有因yield null 挂起的协程 并恢复)

    展开全文
  • monobehaviour生命周期完整版 posted on 2018-02-28 09:40 jiahuafu 阅读(...) 评论(...) 编辑 收藏

    monobehaviour生命周期完整版

    posted on 2018-02-28 09:40 jiahuafu 阅读(...) 评论(...) 编辑 收藏

    展开全文
  • 所有创建用于添加到游戏对象上的脚本必须继承自 MonoBehaviour,它有着完整的生命周期。 Awake(): 脚本唤醒函数,无论脚本是否被激活,当游戏对象创建时,对象绑定的脚本在该帧(frame)内执行Awake()。 Start():...

    所有创建用于添加到游戏对象上的脚本必须继承自 MonoBehaviour,它有着完整的生命周期。

    1. Awake(): 
      脚本唤醒函数,无论脚本是否被激活,当游戏对象创建时,对象绑定的脚本在该帧(frame)内执行Awake()。
    2. Start():
      脚本不处于激活状态,不会执行。
    3. Updata(): 
      激活状态下的脚本,每一帧都执行。更新逻辑。
    4. LateUpdata():
      延迟更新函数,Updata() 后执行,调整代码执行顺序。
    5. FixedUpdata():
      用于固定更新。固定间隔时间执行某些代码。常用于移动物体等操作,移动速度均匀,默认0.02S,可调整。
    6. OnGUI():
      绘制界面函数。使用uGUI界面系统创建页面。
    7. OnDestory():
      在当前脚本销毁时调用,可以在函数内填写删除时需处理的逻辑。
    8. OnEnable():
      激活函数,当脚本被激活时调用。
    9. OnDisable():
      当脚本被禁用时调用。

    其他注意:

    每个继承自 MonoBehaviour 的脚本,都有着 enabled 的 bool 值开关,决定脚本生命周期函数是否被调用,为 true 时生命周期各阶段对应函数将会被调用,否则不调用。变为 true 时 调用 OnEnable(),变为 false 时调用 OnDisable()。

    不管有无生命周期,enabled 是否为 false,均不影响其他脚本对该脚本变量和非生命周期函数的调用。

    展开全文
  • 先大体的给一个官方的Flowchart然后...原图地址:https://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg 就常用的函数来说顺序是这样的: Awake > OnEnable > Start > FixedUpdate >...
  • 最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=false,如果这样做了,则会直接跳转到OnDisable方法执行一次,然后其它的任何方法,都将...
  • 在热更工程中使用Unity的MonoBehaviour相关调用,虽然是可以实现的,但是官方不推荐这样去使用,如果非要使用,还是基于Unity内部自身脚本MonoBehaviour配合委托或者回调去实现。 即便能做到使用,要完全支持...
  • 所有创建的用于添加到游戏对象上的脚本都必须继承自MonoBehaviour。二.调式1.我们可以在脚本里输出调试信息, 并在控制台中显示。2.接口(1).Debug.Log:向控制台输出普通信息(白色)。(2).Debug.LogWarning:向控制台...
  • 游戏做完了,抽时间总结一下吧。以免睡一觉下次又忘了...关于MonoBehaviour生命周期函数,执行次数、时机、顺序……刚开始时踩了不知多少坑。 收集了很多图,用做参考吧。 图一 图二 图三 图四 ...
  • Unity3d脚本从唤醒到销毁有一套比较完整的生命周期 Awake – Start – Update – FixedUpdate – LateUpdate – OnGUi – Reset – OnDisable – OnDestroy 1. Awake方法 在加载场景时运行,只执行一次(加载一次...
  • 一个游戏组件的脚本有一个生命周期——一开始实例化,直到结束实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状态;对于活动,对用户有时候可见,有时候不可见 本文主要讨论常见脚本的的生命...
  • 预热游戏对象: tempObject = Instantiate(cubePrefab)asGameObject; tempObject.SetActive(false); 游戏对象tempObject调用三个方法: Awake()、OnEnable()、OnDisable() 暂停游戏,启用游戏对象: ...On...
  • 在Unity中给出的MonoBehaviour的描述如下: MonoBehaviour Namespace: UnityEngine Inherits from: Behaviour Description 描述 MonoBehaviour is the base class every script derives from. ...
  • http://www.richardfine.co.uk/2012/10/unity3d-monobehaviour-lifecycle/ MonoBehaviour生命周期
  • Unity文档:https://docs.unity3d.com/Manual/ExecutionOrder.html原图地址:https://docs.unity3d.com/uploads/Main/monobehaviour_flowchart.svg
  • Editor: Reset;Initialization: Awake OnEnable StartPhysic: FixedUpdate OnTriggerXXX OnCollisionXXXInput events: OnMouseXXXGame logic: OnUpdate LateUpdateScene rendering: ...
  • 官方的事件函数的执行顺序中有详解(Link:Execution ...(图片来源:http://whatiseeinit.blogspot.com/2012/10/unity3d-monobehaviour-lifecycle.html) 通过实际操作来测试上述的流程: 1、新建一个场景:Lifec...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,036
精华内容 814
关键字:

monobehaviour生命周期