unity生命周期简单叙述

这篇具有很好参考价值的文章主要介绍了unity生命周期简单叙述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.Unity 中常见的生命周期方法

1Awake(),2OnEnable(), 3Start(), 4FixedUpdate(), 5Update(), 6LateUpdate(), 7OnGUI(), 8OnDisable(), 9OnDestroy().

二.通常的执行顺序

特殊一点的方法Reset()

Reset 方法是在编辑器中调用的,并且仅在以下情况下执行:

  1. 脚本组件被添加到 GameObject 上: 当你将一个脚本组件添加到一个 GameObject 上时,如果该脚本包含 Reset 方法,该方法会在组件添加后立即被调用。

  2. 编辑器中修改了脚本的公共字段或属性: 如果在 Inspector 中修改了脚本的公共字段或属性,Reset 方法会在你停止编辑器播放或重新加载场景时调用。

  3. 重置组件: 在 Inspector 中,右键点击脚本组件的标题栏,选择 "Reset" 选项,可以手动触发 Reset 方法。

这样设计的目的是确保在编辑器中对脚本属性的修改能够及时地反映到场景中,同时提供了一个机会来确保编辑器中的属性值与脚本的初始状态保持一致。Reset 方法对于在编辑器中进行调试、初始化和同步属性状态等方面非常有用。在运行时(在构建后的实际游戏中),Reset 方法不会被调用。

1.Awake():

        首先调用 Awake 方法。在这个阶段,对象被实例化,但还没有被激活。他先于OnEnable和Start方法调用。

2.OnEnable():

        如果对象被启用(enabled),接着调用 OnEnable。这是对象变为激活状态时的第一个方法。

3.Start():

        方法调用时机:在对象第一次更新时调用。用于初始化,但是在 Awake 后调用。

4.FixedUpdate() 和 Update():

        在 Start 方法执行完毕后,按照固定的时间间隔调用 FixedUpdate 方法,然后在每一帧调用 Update 方法。

5.LateUpdate():

        在 Update 方法执行完毕后,调用 LateUpdate 方法。通常用于相机跟随等操作,确保在所有 Update 方法执行完毕后执行。

6.OnGUI():

        在 LateUpdate 方法执行完毕后,调用 OnGUI 方法。用于渲染 GUI 元素。

7.OnDisable():

        如果对象被禁用,调用 OnDisable 方法。在对象被禁用时执行一些清理工作。

8.OnDestroy():

        如果对象被销毁,最后调用 OnDestroy 方法。在对象销毁时执行最终的清理工作。

三.一些使用建议

1.在使用awake和start时:

1.在生命周期中都只调用一次

2.awake在start之前调用,并且在所有游戏对象的awake方法都调用完才能调用某一个游戏对象的start方法,所以如果start方法中有需要提前获取才能运行的需求,一定要写在awake中,以免报错。

3.避免在 AwakeStart 中执行过于耗时的操作,以免影响游戏启动性能。这两个方法应该用于轻量级的初始化工作。

4.脚本的构造函数一般先于Awake 和Start,但在unity中一般不直接使用构造函数。

2.UpdateFixedUpdateLateUpdate的区别

  1. Update:
    • 调用频率: 在每一帧都会调用。
    • 用途: 用于处理与游戏逻辑和用户输入相关的代码。
    • 建议用法: 处理输入、游戏逻辑、玩家控制等。
  2. FixedUpdate:
    • 调用频率: 固定的时间间隔内调用,通常默认为每秒 50 次。
    • 用途: 用于处理物理计算和更新,确保在不同平台上物理模拟的结果一致。
    • 建议用法: 处理刚体运动、物理碰撞等。
  3. LateUpdate:
    • 调用频率: 在所有 UpdateFixedUpdate 方法执行完毕后调用。
    • 用途: 用于处理相机跟随逻辑,确保在所有对象的位置和旋转更新后再执行。
    • 建议用法: 处理相机跟随、后处理效果等。

建议使用:

  • 尽量将用户输入和游戏逻辑放在 Update 中,因为它在每一帧都被调用,适合处理实时性较高的操作。
  • 将物理相关的计算放在 FixedUpdate 中,确保在固定时间间隔内进行物理更新,使得物理模拟更加准确。
  • 使用 LateUpdate 处理相机跟随逻辑,确保在所有对象的位置和旋转更新后再执行,避免相机跟随的抖动或不稳定情况。

3.onEnable和ondisable的区别

  1. OnEnable
    • 调用时机: 在对象变为激活状态(enabled)时调用,无论是在场景开始运行时还是在脚本实例化时。
    • 用途: 通常用于初始化工作、资源加载、订阅事件或启动协程等操作,确保在对象激活时执行。
    • 注意事项: 不要在 OnEnable 中执行耗时的操作,因为它可能会影响游戏的启动性能。
  2. OnDisable
    • 调用时机: 在对象变为非激活状态(disabled)时调用,例如对象被禁用或销毁。
    • 用途: 通常用于清理工作、取消订阅事件、停止协程等,确保在对象禁用或销毁时执行。
    • 注意事项: 不要在 OnDisable 中执行需要对象处于激活状态的操作。

建议使用:

  • OnEnable 中进行资源加载、初始化、订阅事件等操作,确保在对象激活时执行。
  • OnDisable 中进行清理工作、取消订阅事件、停止协程等,确保在对象禁用或销毁时执行。
  • 避免在 OnEnableOnDisable 中执行过多耗时的操作,以免影响游戏性能。

综合使用 OnEnableOnDisable 方法,可以在对象的生命周期中实现一些必要的初始化和清理逻辑,确保对象在激活和禁用时能够执行特定的操作。

四.面试可能会问的问题

1.生命周期方法的执行顺序是什么?

Awake, OnEnable, Start, FixedUpdate, Update, LateUpdate, OnGUI, OnDisable, OnDestroy.

2.为什么有时候使用 Awake 而不是 Start

Awake 在对象被实例化时调用,通常用于初始化,而 StartAwake 后执行,适合进行一次性的初始化工作。如果需要确保在所有脚本的 Awake 阶段执行,可以使用 Awake

3.LateUpdate 适用于什么样的情况?

LateUpdate 适合处理相机跟随逻辑,确保在所有对象的位置和旋转更新后再执行,避免相机抖动或不稳定情况。

4.如何处理对象被禁用和销毁时的清理工作?

OnDisable 用于在对象被禁用时执行清理操作,OnDestroy 用于在对象被销毁时执行最终的清理工作。

5.为什么不在 Update 中进行物理计算?

FixedUpdate 适合处理物理计算,因为它以固定的时间间隔调用,确保在不同平台上物理模拟的结果一致。

6.如何在编辑器中执行初始化操作?

Reset 方法中执行初始化操作,以确保在编辑器中对脚本属性的修改能够及时地反映到场景中。

7.协程能在哪些生命周期方法中使用?

协程通常在 Start 或之后的生命周期方法中使用,不建议在 Awake 中使用。

8.生命周期方法执行的频率和如何优化性能?

生命周期方法的执行频率取决于引擎调用的频率。避免在这些方法中执行过多的计算,可以提高性能。

9.如何处理单例模式在 Unity 生命周期中的问题?

使用 Awake 方法来确保单例模式在对象实例化时初始化,并使用 OnDestroy 方法来处理对象销毁时的清理工作。

例子

public class GameManager : MonoBehaviour
{
    // 单例模式实例
    private static GameManager instance;

    // 获取单例实例的方法
    public static GameManager Instance
    {
        get
        {
            if (instance == null)
            {
                // 如果实例不存在,则尝试在场景中找到已有的实例
                instance = FindObjectOfType<GameManager>();

                // 如果场景中不存在实例,则创建一个新的实例
                if (instance == null)
                {
                    GameObject obj = new GameObject("GameManager");
                    instance = obj.AddComponent<GameManager>();
                }
            }

            return instance;
        }
    }

    // 在 Awake 中确保单例的正确性
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // 防止在场景切换时被销毁
        }
        else
        {
            Destroy(gameObject); // 如果有重复的实例,销毁新创建的实例
        }
    }

    // 游戏初始化逻辑
    private void Start()
    {
        // 这里可以添加游戏初始化的逻辑
    }

    // 游戏结束时的清理工作
    private void OnDestroy()
    {
        // 这里可以添加游戏结束时的清理工作
    }
}

10.MonoBehaviour 的生命周期方法和非 MonoBehaviour 类的区别是什么?

MonoBehaviour 类的生命周期方法由引擎调用,用于管理对象的生命周期,而非 MonoBehaviour 类则没有这些特殊的生命周期方法。在非 MonoBehaviour 类中,需要手动管理对象的初始化和清理。文章来源地址https://www.toymoban.com/news/detail-757314.html

到了这里,关于unity生命周期简单叙述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Vue3】学习笔记-生命周期

    Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名: beforeDestroy 改名为 beforeUnmount destroyed 改名为 unmounted Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下: beforeCreate === setup() created ======= setup() beforeMount === onBeforeMount mounted ======= onMo

    2024年02月11日
    浏览(44)
  • Vue学习笔记(三)常用指令、生命周期

    vue指令:html标签上带有 v- 前缀的特殊属性,不同的指令具有不同的含义,可以实现不同的功能。 常用指令: 指令 作用 v-for 列表渲染,遍历容器的元素或者对象的属性 v-bind 为html标签绑定属性值,如设置href,css样式等 v-if/v-else-if/v-else 条件性的渲染某元素,判定为true时渲染

    2024年02月20日
    浏览(40)
  • unity的C#学习——多线程编程(线程的生命周期、创建与管理)与线程相关类

    多线程编程是 C# 一个比较难且涵盖面比较广的知识点,本文整理仓促而且属于笔记向博客,有些地方必然还存在不严谨和错误,本人会在日后的使用过程中不断完善。如果发现问题或有改进意见可以在评论区提出,我会及时修改。 线程是程序的执行流程,也被称为 轻量级进

    2024年02月12日
    浏览(46)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(124)
  • Unity-Unity脚本生命周期

    Unity脚本生命周期是指在Unity游戏引擎中,脚本在运行过程中所经历的各个阶段。这些阶段包括:初始化、更新、固定更新、销毁等。下面我们来详细讲解一下Unity脚本生命周期的各个阶段。 1. Awake Awake是脚本的初始化阶段,当脚本被实例化时,Awake函数会被调用且只执行一次

    2024年02月14日
    浏览(38)
  • Unity-生命周期

    Unity 中,有一个特别重要的知识点,生命周期函数。这些东西全部都是系统定义好的,运行时自动调用,但需要继承 MonoBehaviour 类才能使用。这个类是从 Unity 中创建脚本就自动继承了。 正是因为继承了 MonoBehaviour 这个类,Unity 才能依次调用我们的脚本代码,执行游戏逻辑。

    2024年02月03日
    浏览(37)
  • Unity 脚本的生命周期

    Unity 脚本的生命周期有哪些?什么时机会触发/执行?什么时候用? 手册 Unity 手册地址 生命周期 初始化 方法说明: Awake:当物体载入时立即调用一次,在 Start 函数之前调用。 OnEnable:在脚本对象启用时调用。 Start:仅当启用脚本实例时,才会在第一帧调用。 Reset:编辑器下

    2024年04月09日
    浏览(70)
  • 【Unity】一文了解生命周期

    又新开一个坑,这个系列主要是记录Unity的干货,就不像之前那几个有点口水话了233 当然我会改正 时隔半个月 经历了开学 换教室等等一系列杂七杂八的事情也算步入正轨了~ 没杂七杂八的介绍什么,不水字数,直接开干!(暴论) 编写顺序会严格按照真实的生命周期顺序

    2023年04月22日
    浏览(34)
  • Unity之组件的生命周期

    PS:第二天,依旧在摸鱼学unity 我本身是由Web后端转到了游戏后端,最近因为工作原因在学ET框架。学到了 ECS 编程模式开发(E —— Entity,C —— Component , S —— System)实体、组件、逻辑开发。 我是这么理解的:组件是挂载到实体上的,组件中记录了实体所需要的数据,然

    2024年02月02日
    浏览(38)
  • Games104现代游戏引擎学习笔记10

    Physics Actors and Shapes Actor Static:静态actor,例如挡板等 Actor Dynamic:动态actor,例如可移动的箱子 Trigger:触发器 Actor-Kinematic:违背物理原则,由设计决定,不遵循真实物理原则 反物理物体容易导致很多数学运算出现问题 Triangle Meshes一般只允许静态物体使用 Height Fields通常用于地

    2024年02月11日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包