Unity 生命周期函数

unity3d mono生命周期 unity中的生命周期函数_unity3d mono生命周期

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

当程序退出后调用

参考文档:

  1. Unity 官方开发手册