【Unity】认识常用的生命周期函数(Awake、Start、Update...)

这篇具有很好参考价值的文章主要介绍了【Unity】认识常用的生命周期函数(Awake、Start、Update...)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、了解帧的概念

游戏的本质就是一个死循环
每一次循环都会处理游戏逻辑 并 更新一次游戏画面
之所以能看到画面在动 是因为
切换画面速度达到一定速度时
人眼就会认为画面是动态且流畅的
一帧就是执行了一次循环
Unity底层已经封装好了这个死循环
我们只需要利用Unity的生命周期函数的规则来执行游戏逻辑即可

FPS(Frames Per Second)
即每秒钟帧数
一般我们说60帧30帧
意思是1秒更新60次、30次画面
1s = 1000ms
60帧:1帧为 1000ms/60 ≈ 16.66ms
30帧:1帧为 1000ms/30 ≈ 33.33ms

游戏卡顿的原因:
跑1帧游戏逻辑的计算量过大,或者硬件性能过低,无法在一帧的时间内处理完所有游戏逻辑

二、生命周期函数的概念

所有继承MonoBehavior的脚本 最终都会挂载到GameObject游戏对象上
生命周期函数就是该脚本对象依附的GameObject对象从出生到消亡整个生命周期中
会通过反射自动调用的一些特殊函数

Unity帮助我们记录了一个GameObject对象依附了哪些脚本
会自动地得到这些对象,通过反射去执行一些固定名字的函数(就是生命周期函数)

三、生命周期函数

注意:
生命周期函数的访问修饰符一般为private和protected
因为不需要在外部手动调用生命周期函数,都是Unity自动帮我们调用
unity start函数,Unity_学习笔记整理,unity,游戏引擎,c#

3-1.Awake

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    //当一个对象(自己这个类对象 而不是依附的GameObject)被创建时,会调用该生命周期函数
    //作用:Awake是类似构造函数的存在,我们可以在一个类对象刚被创建时,进行一些初始化操作
    //Awake只会被执行一次
    private void Awake()
    {
        //补充知识点:在Unity中打印信息的两种方式
        //1.如果没有继承MonoBehaviour,可以使用debug.Log();
        Debug.Log("我是打印的信息");
        Debug.LogWarning("警告!");
        Debug.LogError("出错了!");

        //2.如果继承了MonoBehaviour 有一个现成的方法可以实现打印
        print("我是打印的信息");
    }
}

3-2.OnEnable

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    //依附的GameObject对象每次被激活时 会被调用
    //作用:想要当一个对象被激活时 进行一些逻辑处理,就可以写在本函数中
    private void OnEnable()
    {
        print("我依附的GameObject被激活了");
    }
}

unity start函数,Unity_学习笔记整理,unity,游戏引擎,c#

3-2.Start

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    //从自己被创建出来后,第一次帧更新之前被调用
    //作用:还是用于初始化信息的,但是它相对Awake来说,要执行的晚一些
    //      因为它是在对象进行帧更新之前才会被执行
    //一个对象只会调用一次
    private void Start()
    {
        print("我在第1帧更新前被执行");
    }
}

3-4.FixedUpdate

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    //固定间隔时间执行,间隔的时间可以设置
    //作用:用于进行物理相关的更新(如碰撞检测)
    //      它是每一帧都会执行的,但是这里的帧和游戏帧有点不同
    private void FixedUpdate()
    {
        print("我会固定间隔时间循环执行");
    }
}

unity start函数,Unity_学习笔记整理,unity,游戏引擎,c#
unity start函数,Unity_学习笔记整理,unity,游戏引擎,c#

3-5.Update

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    //逻辑帧更新
    //每秒更新多少次是可以设置的,如果不设置 默认会以最快的速度更新
    //作用:用于处理游戏核心逻辑更新
    private void Update()
    {
        print("我一帧被执行一次");
    }
}

3-6.LateUpdate

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    //每帧执行 于Update之后执行
    //作用:一般用来处理摄像机位置更新相关内容
    //      在Update和LateUpdate之间,Unity进行了一些处理,处理动画相关的更新
    private void LateUpdate()
    {
        print("我每针都会被执行,但晚于Update");
    }
}

3-7.OnDisable

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    //依附的GameObject对象每次失活时被调用(对象被销毁时也会被调用)
    //作用:想要当一个对象失活时 进行一些逻辑处理,就可以写在本函数中
    private void OnDisable()
    {
        print("我依附的GameObject失活了");
    }
}

unity start函数,Unity_学习笔记整理,unity,游戏引擎,c#

3-8.OnDestroy

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson1 : MonoBehaviour
{
    //对象被销毁时被调用(依附的GameObject对象被删除时)
    private void OnDestroy()
    {
        print("我被销毁了");
    }
}

四、生命周期函数支持继承和多态

unity start函数,Unity_学习笔记整理,unity,游戏引擎,c#
Lesson1的脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson1 : MonoBehaviour
{
    //把Awake写成一个虚函数
    protected virtual void Awake()
    {
        print("父类的Awake");
    }
}

Lesson1Son的脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson1Son : Lesson1
{
    //可以重写父类Lesson1的虚函数
    protected override void Awake()
    {
        base.Awake();
        print("子类的Awake");
    }
}

unity start函数,Unity_学习笔记整理,unity,游戏引擎,c#

运行:可以看到,父类的Awake和子类的Awake都被执行了,所以生命周期函数支持继承和多态
unity start函数,Unity_学习笔记整理,unity,游戏引擎,c#

五、补充:关于继承Mono的类的构造函数

要知道,虽然不建议在继承MonoBehavior的类中写构造函数
但是不意味着不能写,当在继承MonoBehavior的类中写无参构造函数时
会发现在编辑模式下或者运行后,只要该脚本挂载在场景中,那么该无参构造函数是会被自动执行
因为Unity的工作原理中提到的反射机制,实际上Unity通过反射帮助我们实例化了该脚本对象
既然要实例化那么肯定是需要new的,只不过Unity中不需要我们自己new继承了MonoBehavior的类,只要挂载后Unity就帮助我们做了这件事

那么为什么不建议继承MonoBehavior的类写构造函数呢?
1.Unity的规则就是,继承MonoBehavior的脚本不能new只能挂载
2.生命周期函数的Awake是类似构造函数的存在,当对象出生就会自动调用
3.写构造函数反而在结构上会破坏Unity设计上的规范
总结:
如果继承MonoBehavior的脚本想要进行初始化相关,可以在Awake或者Start中进行,搞清这两个生命周期函数的执行时机,根据需求选择在哪里进行初始化。
切记!!继承MonoBehavior的脚本不要new,不要new,不要new!!

六、补充:不同对象的声明周期函数是在同一个线程中执行的吗?

Unity中所有对象上挂载的生命周期函数都是在一个主线程中按先后执行的
Unity会主动把场景上的对象,对象上挂载的脚本都统统记录下来,
在主线程的死循环中,按顺序按时机的通过反射,执行记录的对象身上挂载的脚本的对应生命周期函数文章来源地址https://www.toymoban.com/news/detail-784948.html

到了这里,关于【Unity】认识常用的生命周期函数(Awake、Start、Update...)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity中常见的脚本生命周期函数及顺序

    以下是Unity中常见的脚本生命周期函数的顺序: Awake():当对象被创建时调用,用于初始化对象的引用和状态。 OnEnable():在对象变为激活状态时调用,用于进行初始化操作。 Start():在 Awake 之后调用,用于在对象被启用前进行初始化操作。 FixedUpdate():固定的时间间隔(一般

    2024年02月06日
    浏览(43)
  • 微信小程序——生命周期,生命周期的分类,页面生命周期,生命周期函数的分类,应用的生命周期函数,页面的生命周期函数,wxs脚本概述

    生命周期( Life Cycle )是指一个对象从创建-运行-销毁的整个阶段,强调的是一个时间段。 例如: .张三出生,表示这个人生命周期的开始 .张三离世,表示这个人生命周期的结束 .中间张三的一生,就是张三的生命周期 我们可以把每个小程序运行的过程,也概括为生命周

    2024年02月01日
    浏览(63)
  • Ionic4 生命周期钩子函数和angular生命周期钩子函数介绍

    Ionic 4(以及之后的 Ionic 版本)使用了 Angular 生命周期钩子,因为 Ionic 是基于 Angular 构建的。因此,Ionic 4 中的生命周期与 Angular 组件生命周期非常相似。以下是一些常见的 Ionic 4 生命周期钩子: ionViewDidLoad : 在页面加载完成后触发。通常用于执行一次性的初始化任务。不推

    2024年02月07日
    浏览(54)
  • 什么是Vue中的生命周期钩子函数?有哪些主要的生命周期钩子函数?如何监听DOM事件?

    Vue中的生命周期钩子函数是指在Vue实例创建、数据绑定、组件挂载等生命周期阶段中,可以执行一些特定操作的函数。这些函数在Vue实例的不同生命周期阶段被调用,可以帮助开发者更好地控制Vue实例的行为。 Vue的生命周期钩子函数包括: beforeCreate :在Vue实例创建之前调用

    2024年02月12日
    浏览(57)
  • Vue生命周期函数(详解)

    目录  生命周期图 生命周期函数 beforeCreate和created的区别 beforeCreate创建前应用场景  created创建后应用场景 beforeMount和mounted的区别  beforeMount挂载前应用场景  mounted挂载后应用场景  beforeUpdate和updated的区别  beforeUpdate更新前应用场景  updated更新后应用场景  beforeDestroy和des

    2024年02月13日
    浏览(49)
  • [Angular 基础] - 生命周期函数

    之前的笔记: [Angular 基础] - Angular 渲染过程 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面,即不涉及到跨组件交流的内容 以下涉及到组件内的沟通,从这开始数据就“活”了 [Angular 基础] - 自定义事件 自定义属性 [Angular 基础]

    2024年02月20日
    浏览(42)
  • react17:生命周期函数

    挂载时 更新时 setState触发更新、父组件重新渲染时触发更新 forceUpdate触发更新 卸载时 react(v17.0.2)的生命周期图谱如下。  相较于16版本,17版本生命周期函数有如下变化: componentWillMount() componentWillUpdate() componentWillReceiveProps() +getDerivedStateFromProps(props,state) +getSnapshotBeforeUp

    2024年02月11日
    浏览(49)
  • 生命周期函数和wxs脚本

    应用的生命周期函数:指小程序从启动 - 运行 - 销毁期间依次调用的那些函数。 小程序的应用生命周期函数需要在 app.js 中进行声明。 上面这张图就是从前台进入了后台。后台进入前台反之同理。 页面的生命周期函数:指小程序中,每个页面从加载 - 渲染 - 销毁期间依次调

    2024年02月16日
    浏览(40)
  • 【react】react生命周期钩子函数:

    一、生命周期概念: 生命周期:简单来说就是一个事物从出生到消亡的过程就是生命周期,在React中的生命周期,就是组件从创建、挂载到页面再到卸载组件的过程。 意义:生命周期有助于理解组件运行方式、完成复杂组件功能、分析组件中间问题产生的原因等。 生命周期钩子函数

    2024年02月14日
    浏览(46)
  • vue3-生命周期钩子函数

    声明周期函数onMounted ,onUnmounted,onUpdated onMounted:页面渲染之前执行,执行完,页面就出来了 onUnmounted:组件注销之前执行,执行完组件就不在页面显示了。如果隐藏组件就行执行。 onUpdated:当组件内的内容发生变化时,就会执行这个更新钩子函数,比如删除数组中的某个元素

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包