Unity 生命周期函数
Unity 3D 中的生命周期函数
生命周函数:需要继承 MonoBehaviour 类才能使用。生命周期函数全部都是由系统定义好的,系统会自动调用,且调用顺序与在代码中的书写顺序无关
常用的生命周期函数
Awake(): 唤醒事件,游戏一开始运行就执行,只执行一次。
OnEnable(): 启用事件,只执行一次,当脚本组件被启用的时候执行一次。
Start(): 开始事件,执行一次。
FiexdUpdate(): 固定更新事件,执行N次,每物理帧(0.02s)执行一次。所有物理相关的更新都在这个事件中处理。
Update(): 更新事件,执行N次,每帧执行一次。
LateUpdate(): 稍后更新事件,执行N次,在Update()事件执行完毕后在再执行。
OnGUI(): GUI渲染事件,执行N次,执行的次数是Update()事件的两倍。
OnDisable(): 禁用事件,执行一次。在OnDestory()事件前执行。或者当该脚本组件被"禁用"后,也会出发该事件。
OnDestory(): 销毁事件,执行一次。当脚本所挂载的游戏物体被销毁时执行。
一、Editor
Reset
void Reset()
{
}
调用Reset是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用,Reset最常用于在检视面板中给定一个最常用的默认值。
public GameObject target;
void Reset(){
target = GameObject.FindWithTag("Player");
}
OnValidate
OnValidate: 每当设置脚本的属性时都会调用OnValidate,包括反序列化对象时,这可能发生在不同的时间,例如在编辑器中打开场景时和域重新加载后。
二、Initialization
void Awake()
void Awake(){
}
当一个脚本实例被载入时Awake被调用。Awake用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次Awake在所有对象被初始化之后调用,所以可以安全的与其他对象或用GameObject.FindWithTag这类的函数搜索它们。每个游戏物体上的 Awake 以随机的顺序被调用。Awake 像构造函数一样只被调用一次。 Awake 总是在 Start 之前被调用。
void OnEnable()
void OnEnable(){
}
当对象变为可用或激活状态时此函数被调用,OnEnable 不能用于协同程序。
using UnityEngine;
using System.Collections;
public class OnEnabledTest : MonoBehaviour{
void OnEnable(){
print("This script was enable");
}
}
void Start()
void Start(){
}
Start 仅在Update 函数第一次被调用前调用,在 behaviour 的生命周期中只被调用一次,它和 Awake的不同是 Start只在脚本实例被启用时调用。可以按需调整延迟初始化代码。 Awake 总是在Start 之前执行,允许你协调初始化顺序,在游戏运行过程中实例化对象时,不能强制执行此调用,初始化目标变量,目标是私有的并且不能在检视面板中编辑。
using UnityEngine;
using System.Collections;
public class StartTest : MonoBehaviour
{
private GameObject target;
void Start(){
target = GameObject.FindWithTag("Player");
}
}
三、Physics
void FixedUpdate()
void FixedUpdate()
{
}
固定更新 void FixedUpdate() 处理基于物理游戏行为一般用该方法,处理 Rigidbody时, 需要用到 fixedUpdate 代替 Update 。当 MonoBehaviour 启用时,其FixedUpdate 在每一帧被调用。在FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime,因为FixedUpdate 的调用基于可靠的计时器(独立于帧率)。
例如:给刚体加一个作用力时,必须应用作用力在 FixedUpdate 里的固定帧,而不是Update中的帧。(两者帧长不同)每帧应用一个向上的力到刚体上
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour
{
void FixedUpdate()
{
rigidbody.AddForce(Vector3.up);
}
}
void OnTriggerXXX(Collider other)
void OnTriggerXXX(Collider other)
{
}
进入触发器 void OnTriggerEnter(Collider other) 当 Collider(碰撞体) 进入 trigger(触发器)时调用 OnTriggerEnter。
逗留触发器 void OnTriggerStay(Collider other) 当碰撞体接触触发器时,OnTriggerStay 将在每一帧被调用。
退出触发器 void OntriggerExit(Collider other) 当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。
void OnCollisionXXX (Collision collisionInfo)
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参数以避免不必要的运算.
yieldWaitForFixUpdate
四、Input events
void OnMouseXXX()
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(“当鼠标经过”);
}
}
五、Game Logic
void Update()
void Update()
{
}
当MonoBehaviour启用时,其Update在每一帧被调用,UPdate是实现各种游戏行为最常用的函数。
using UnityEngine;
using System.Collections;
public class UpdateTest : MonoBehaviour
{
void Update()
{
transform.Translate(0,0,Time.deltaTime * 2f);
}
}
void LateUpdate()
void LateUpdate()
{
}
当Behaviour启用时,其LateUpdate在每一帧被调用,LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。
例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。
yield null
yield WaitForSeconds
yield WWW
yield StartCoroutine
六、Scene rendering
OnWillRenderObject
OnWillRenderObject:如果对象可见,则为每个相机调用一次此函数。
OnPreCull
OnPreCull:在相机剔除场景之前调用此函数。相机可见的对象取决于剔除。OnPreCull 函数调用发生在剔除之前。
OnBecameVisible
OnBecameVisible/OnBecameInvisible:在对象对于相机可见/不可见时调用此函数。
OnPreRender
OnPreRender:在相机开始渲染场景之前调用此函数。
OnRenderObject
OnRenderObject:在完成所有常规场景渲染后调用此函数。此时,可使用GL类或Graphics.DrawMeshNow绘制自定义几何图形。
OnPostRender
OnPostRender:在相机完成场景渲染后调用此函数。
OnRenderImage
OnRenderImage:在完成场景渲染后调用此函数,以便对屏幕图像进行后期处理。
七、Gizemo rendering
void OnDrawGizmos()
void OnDrawGizmos(){
}
OnDrawGizmos只在编辑模式下被调用
OnDrawGizmos 用于在场景视图中绘制小图示(Gizmos),以实现可视化目的。
八、GUI rendering
void OnGUI()
void OnGUI(){
if( GUI.BUtton(new Rect(10,10,150,100),"I am a Button")){
print("You clicked the button!")
}
}
OnGUI在每一帧更新时调用多次,以响应GUI事件。程序首先将处理Layout和RePaint事件,然后再处理每个输入事件的Layout和keyboard/鼠标事件。
九、End of frame
yieldWaitForEndOfFrame()
十、Pausing
void OnApplicationPause()
void OnApplicationPause(){
}
OnApplicationPause()在程序检测到暂停时,会在帧的结尾被调用
十一、Disable/enable
void OnDisaable()
void OnDisable()
{
}
当对象变为不可用或非激活状态时此函数被调用。当物体被销毁时它将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。
十二、Decommissioning
void OnDestroy()
当MonBehaviour将被销毁时,这个函数被调用。OnDestory只会在 预先已经被激活的游戏物体上被调用。
OnApplicationQuit
当程序退出后调用
参考文档: