IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity学习之生命周期函数 -> 正文阅读

[游戏开发]Unity学习之生命周期函数

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:如果对象可见,则为每个相机调用一次此函数。


参考文档:

  1. Unity 官方开发手册

  2. 博客园

  3. Unity全部生命周期函数总结

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-27 13:08:32  更:2021-10-27 13:08:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 0:38:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码