Unity 图解脚本函数生命周期(综合各种解释) | 您所在的位置:网站首页 › unity生命周期函数 › Unity 图解脚本函数生命周期(综合各种解释) |
http://docs.unity3d.com/Manual/ExecutionOrder.html 生命周期Unity手册上的解析 注:图后附有常用函数的简单解释和详细解释
一、简单解释 (1) Reset() 组件重设为默认值时(只用于编辑状态) (2)Awake() 脚本组件载入时 (调用一次) (3)OnEnable() 是在游戏对象可以调用时调用 (4) Start()第一个Update发生之前 (调用一次) (5)FixedUpdate() 固定时间调用,常用于物理相关的计算,比如对Rigidbody的操作 (6)Update()大部分游戏行为代码被执行的地方,除了物理代码 (7)LateUpdate() 每帧Update调用之后 (8)OnGUI() 绘制GUI时调用 (9)OnDisable() 当对象设置为不可用时 (10)OnDestroy()组件销毁时调用
二、详细解释部分 1)void Reset() Reset是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。 public GameObject target; void Reset() { target = GameObject.FindWithTag("Player"); } 2)void Awake () 当一个脚本实例被载入时Awake被调用。 Awake用于在游戏开始之前初始化变量或游戏状态。 在脚本整个生命周期内它仅被调用一次Awake在所有对象被初始化之后调用,所以可以安全的与其他对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。 每个游戏物体上的Awke以随机的顺序被调用。 Awake总是在Start之前被调用。 Awake像构造函数一样只被调用一次。 3)void OnEnable() 当对象变为可用或激活状态时此函数被调用。 OnEnable不能用于协同程序。 using UnityEngine; using System.Collections; public class OnEnabledTest : MonoBehaviour { void OnEnable() { Debug.Log("script was enabled"); } } 4)void Start() Start仅在Update函数第一次被调用前调用。 Start在behaviour的生命周期中只被调用一次。 它和Awake的不同是Start只在脚本实例被启用时调用。 可以按需调整延迟初始化代码。 Awake总是在Start之前执行。 允许你协调初始化顺序。 初始化目标变量, 目标是私有的并且不能在检视面板中编辑 using UnityEngine; using System.Collections; public class StartTest : MonoBehaviour { private GameObject target; void Start() { target = GameObject.FindWithTag("Player"); } } 5)void FixedUpdate() 固定更新void FixedUpdate ()处理基于物理游戏行为一般用该方法,处理Rigidbody时,需要用FixedUpdate代替Update。当MonoBehaviour启用时,其 FixedUpdate 在每一帧被调用。 例如:给刚体加一个作用力时,必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)每帧应用一个向上的力到刚体上 using UnityEngine; using System.Collections; public class Example : MonoBehaviour { void FixedUpdate() { rigidbody.AddForce(Vector3.up); } } 6)void OnTriggerXXX(Collider other) 进入触发器void OnTriggerEnter (Collider other) 当Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter。 逗留触发器void OnTriggerStay (Collider other) 当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用。 退出触发器void OnTriggerExit (Collider other)当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。 7)void OnCollisionXXX (Collision collisionInfo) 进入碰撞 void OnCollisionEnter (Collision collisionInfo),当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionEnter将会在开始碰撞时调用。 逗留碰撞 void OnCollisionStay (Collision collisionInfo),当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。 退出碰撞 void OnCollisionExit (Collision collisionInfo),当此collider/rigidbody停止触发另一个rigidbody/collider时,OnCollisionExit将被调用。 Collision包含接触点,碰撞速度等细节。如果在函数中不使用碰撞信息,省略collisionInfo参数以避免不必要的运算. 8)void OnMouseXXX() void OnMouseUp ():当用户释放鼠标按钮时调用OnMouseUp。OnMouseUp只调用在按下的同一物体上。此函数在iPhone上无效。 void OnMouseDown ():当鼠标在Collider(碰撞体)上点击时调OnMouseDown。 void OnMouseEnter ():当鼠标进入到Collider(碰撞体)中时调用OnMouseEnter。 void OnMouseExit ():当鼠标移出Collider(碰撞体)上时调用OnMouseExit。 void OnMouseOver ()当鼠标悬浮在Collider(碰撞体)上时调用 OnMouseOver 。 using UnityEngine; using System.Collections; public class OnMouseXXX : MonoBehaviour { void OnMouseEnter() { Debug.Log("当鼠标进入"); } void OnMouseDown() { Debug.Log("当鼠标按下"); } void OnMouseDrag() { Debug.Log("当鼠标拖动"); } void OnMouseExit() { Debug.Log("当鼠标推出"); } void OnMouseOver() { Debug.Log("当鼠标经过"); } } 9)void Update () 当MonoBehaviour启用时,其Update在每一帧被调用。Update是实现各种游戏行为最常用的函数。 using UnityEngine; using System.Collections; public class UpdateTest : MonoBehaviour { void Update() { transform.Translate(0, 0, Time.deltaTime * 1); } } 10)void LateUpdate () 当Behaviour启用时,其LateUpdate在每一帧被调用。 LateUpdate是在所有Update函数调用后被调用。 这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。 11)void OnGUI() void OnGUI() { if (GUI.Button(new Rect(10, 10, 150, 100), "I am a button")) print("You clicked the button!"); } 12)void OnDisable () 当对象变为不可用或非激活状态时此函数被调用。当物体被销毁时它将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。 13)void OnDestroy () 当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用
========================================
在unity的脚本,有大量的脚本执行按照预先确定的顺序执行的事件函数。此执行顺序说明如下: Editor Reset: Reset调用来初始化脚本的属性,当它第一次附加到该对象,并且使用Reset命令时。 第一次Scene Load scene启动 (一次为每个场景中的对象) 时,会调用这些函数。 Awake:此函数始终是开始任何职能之前调用,并且也是在一个预置实例化之后。(如果一个游戏对象处于非活动状态,Awake不会被调用当被激活时 或者一个附加到游戏对象的任何脚本中这个函数会被调用。 OnEnable:(如果对象处于活动状态时被调用):在对象被启用后,将调用此函数。发生这种情况是在创建一个MonoBehaviour实例时,例如当加载一个level或游戏对象带有脚本组件被实例化。 请注意对于对象添加到场景,所有脚本的清醒和 OnEnable函数将被调用之前启动、更新、 等统称为其中任何。当然,这不能强制执行时在游戏过程中实例化对象。 在第一帧更新之前 Start: Start第一帧更新仅当enabled了脚本实例之前,将调用 start。 为对象添加到场景,开始将对所有脚本更新之前,调用函数等统称为其中任何。当然,这不能强制执行时在游戏过程中实例化对象。 帧之间 OnApplicationPause:这称为框架末尾暂停检测到,有效地之间正常的帧更新。OnApplicationPause调用,允许的比赛来证明表明暂停的状态的图形后,将发出一个额外的帧。 Update Order 当游戏逻辑和交互,动画,相机位置,等您要跟踪的时有几个不同的事件,您可以使用。常见的模式是执行大多数任务里面的更新功能,但也有其他可以使用的函数。 FixedUpdate:FixedUpdate通常被称为比更新更频繁。它可以被多次调用每帧,如果帧率偏低,它可能不根本被称为帧之间如果帧率较高。FixedUpdate后立即发生的所有物理计算和更新。当应用在FixedUpdate内的运动计算,你不需要将你的Time.deltaTime的值相乘。这是因为在一个可靠的定时器,独立的帧速率上调用FixedUpdate。 Update:Update每帧调用一次。它是主要的主力框架更新的功能。 LateUpdate:LateUpdate是每帧,一次调用更新完毕后。LateUpdate开始时,将会完成在更新中执行的任何计算。常用的LateUpdate将以下的第三人称视角。如果你使你的性格,并且动转内更新,则可以在LateUpdate中执行所有摄像机的平移和旋转变换计算。这将确保该字符已经完全之前相机跟踪它的位置。 呈现 OnPreCull:在相机中挑选出现场之前调用。扑杀确定哪些对象是可见的相机。只是在扑杀发生之前,将调用消隐。 OnBecameVisible/OnBecameInvisible:当对象变为可见/不可见的任何相机时调用。 OnWillRenderObject:每个摄像头调用一次,如果对象是可见。 OnPreRender:在相机开始渲染场景之前调用。 OnRenderObject:所有普通的场景渲染完成后,调用你可以使用 GL类或 Graphics.DrawMeshNow,在这一点上绘制自定义几何。 OnPostRender:在相机完成渲染场景之后调用。 OnRenderImage (仅限专业版):在场景渲染完成允许屏幕图像的后处理后调用。 OnGUI:每帧响应 GUI事件调用多次。布局和重绘事件处理第一,紧接着的布局和键盘/鼠标的事件,为每个输入事件。 OnDrawGizmos用于可视化用于场景视图中绘制小玩意。 协同程序 更新函数返回后运行正常的协程的更新。协同是一个函数,可以暂停其执行 (收益率),直到完成给定的YieldInstruction。不同用途的协同程序: yield后所有的更新功能已呼吁下一帧,将继续协同。 yieldWaitForSeconds在指定的时间延迟之后,继续后所有的更新功能一直呼吁的框架 yieldWaitForFixedUpdate在所有的 FixedUpdate被称为对所有脚本后继续 yield WWW在WWW下载已完成后继续。 yieldStartCoroutine链协同,并将等待 MyFunc协同完成第一次。 当对象被销毁 OnDestroy:所有帧更新的对象的存在 (对象可能毁于响应 Object.Destroy或一幕结束时) 的最后一帧后,将调用此函数。 退出时 在你的场景中的所有活动对象上得到调用这些函数: OnApplicationQuit:在应用程序退出之前,在所有的游戏物体上调用此函数。在编辑器中时用户停止攻击性影响调用。在网络播放器时关闭了 web视图调用。 OnDisable:调用此函数时的行为变得残疾人士或非活动状态。 脚本生命周期流程图 下面的关系图概述订购和重复事件函数在脚本的一生。
|
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |