Unity-生命周期

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

常用生命周期函数

1> 什么是生命周期
在 Unity 中,脚本可以理解为附加在游戏对象上的,用于定义游戏对象行为的指令代码。一个脚本必须绑定在游戏对象上才能被调用,才能开始它的生命周期。比如一颗子弹,从按下鼠标左键被生成时,附属于此游戏对象的脚本开始了它的生命周期,直到触发某个逻辑而被销毁时,才结束它的生命周期。期间可能依次调用了 Awake,Start,OnDestroy 等周期函数,也可能一直循环执行了 Update,FixedUpdate 等函数,而着一条或多条的执行线就是贯穿此脚本的生命周期。

2> Reset() + 示例
这个函数会在用户首次添加该组件时或单击 Reset 按钮时被调用,且只在编辑器生效。可应用于大批量生成修改编辑器节点,这么说大家可能不明白,举个例子。

假如我们有一个地图,需要添加大量的树(这里用圆柱代替),这些树需要组成特定图案,且以一定规则命名,这个时候笔刷就无法胜任工作了,或许程序运行时可通过代码动态修改,但是一旦程序运行结束,这些树又要被销毁了,且还很消耗程序运行资源。这个时候,通过 Reset 函数,可直接在编辑器阶段完成此需求。

在编辑器创建一个空节点"Reset",将脚本"Reset_Test.cs"赋予此空节点,代码和运行结果如下
在这里插入图片描述
需要注意的是,所有初始化操作都应在 Reset 中完成,因为它仅调用 Reset 函数,不会调用 Start 等函数,因为这是在编辑器中操作,程序还没运行 :

public int row = 3;
public int col = 9;
private void Reset()
{
   
    GameObject t = null;
    GameObject tree = GameObject.Find("Cylinder");
    for (int i = 0; i < row; i++)
    {
   
        for (int j = 0; j < col; j++)
        {
   
            Vector3 position = new Vector3(i * 2, 0, j * 2);
            t = Instantiate(tree, position, Quaternion.identity);
            t.transform.SetParent(transform, false);
            t.gameObject.name = "tree:" + i + "," + j;
        }
    }
}

3> 常用周期函数简单介绍 :
Unity脚本从唤醒到销毁有着一套比较完整的生命周期,系统自带的几个重要的方法如下 :
Awake -> Start -> FixedUpdate -> Update -> LateUpdate -> OnGUI -> Resourt -> OnDisable -> OnDestroy
请添加图片描述
Awake() : 此函数在脚本实例被载入时调用,仅被调用一次

OnEnable() : 当脚本被启用时调用一次,当游戏对象被禁用时,仅监听响应此函数

Start() : 在 Awake 之后和 Update 之前被调用,仅被调用一次

FixedUpdate() : 物理更新函数,循环执行,每物理帧 0.02 秒执行一次(不受 FPS 帧率影响,时间可更改),所有和物理相关的更新都应在此函数处理

Update() : 更新函数,每帧执行一次,受 FPS 帧率影响

LateUpdate() : 稍后更新函数,在所有 Update 执行完后调用,帧间隔时间和 Update 一样

OnGUI() : 在渲染和处理 GUI 事件时被调用,每帧都执行

OnDisable() : 当脚本被禁用时调用一次,当脚本反复被禁用或启用,则反复调用 OnDisable 和 OnEable

OnDestroy() : 当脚本被销毁时被调用,只会在被激活的物体上调用。当脚本所挂载的游戏物体被销毁时执行

Editor 编辑器

1> void Reset()
调用Reset是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用,Reset最常用于在检视面板中给定一个最常用的默认值

public GameObject target;

void Reset()
{
   
    target = GameObject.FindWithTag("Player");
}

2> OnValidate
每当设置脚本的属性时都会调用OnValidate,包括反序列化对象时,这可能发生在不同的时间,例如在编辑器中打开场景时和域重新加载后

Initialization 初始化

1> void Awake()
当一个脚本实例被载入时Awake被调用。Awake用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次Awake在所有对象被初始化之后调用,所以可以安全的与其他对象或用GameObject.FindWithTag这类的函数搜索它们。每个游戏物体上的 Awake 以随机的顺序被调用。Awake 像构造函数一样只被调用一次。 Awake 总是在 Start 之前被调用。

2> void OnEnable()
当对象变为可用或激活状态时此函数被调用,OnEnable 不能用于协同程序。

using UnityEngine;
using System.Collections;

public class OnEnabledTest : MonoBehaviour
{
   
    void OnEnable()
    {
   
        print("This script was enable");
    }
}

3> 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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/262320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多相机系统通用视觉 SLAM 框架的设计与评估

Design and Evaluation of a Generic Visual SLAM Framework for Multi-Camera Systems PDF https://arxiv.org/abs/2210.07315 Code https://github.com/neufieldrobotics/MultiCamSLAM Data https://tinyurl.com/mwfkrj8k 程序设置 主要目标是开发一个与摄像头系统配置无关…

Linux笔记---文件和目录操作

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 ls (List): pwd (Print Working Directory): cp (Copy): mv (Move): rm (Remove): 结语 我的其他博客 前言 学习Linux命令…

vscode打开多个标签页配置

前言 如果其中一个标签的文件没有修改&#xff0c;再打开一个文件时之前的打开的标签页就会被替换掉。 在工作中使用很不方便。 解决办法 文件-首选项--设置 下图取消勾选 取消之后如下 再去打开标签就会一致显示了

Ajax Search Pro Live WordPress网站内容实时搜索插件

点击阅读Ajax Search Pro Live WordPress网站内容实时搜索插件原文 Ajax Search Pro Live WordPress网站内容实时搜索插件是 WordPress 最好的实时搜索引擎插件。高度可定制&#xff0c;具有许多功能和选项&#xff0c;可提供最佳结果&#xff01;用更美观、更高效的搜索引擎替…

55.0/CSS 的应用(详细版)

目录 55.1.1 设计边框样式 55.1.2 调整边框的粗细 55.1.3 边框颜色 55.1.4 复合设置边框 55.2 模块的边距 55.3 模块的内边距 55.4 层的应用 55.4.1 层的建立 55.4.2 浮动——float 55.4.3 清除浮动 55.4.4 层的定位 55.4.5 设置层的溢出——overflow 55.4.6 设置鼠…

数字人解决方案——ER-NeRF实时对话数字人模型推理部署带UI交互界面

简介 这个是一个使用ER-NeRF来实现实时对话数字人、口播数字人的整体架构&#xff0c;其中包括了大语言回答模型、语音合成、成生视频流、背景替换等功能&#xff0c;项目对显存的要求很高&#xff0c;想要达到实时推理的效果&#xff0c;建议显存在24G以上。 实时对话数字人 …

selenium 报错

selenium 报错 开始学自动化测试&#xff0c;&#xff0c;环境配了一天TAT 安装好selenium之后 运行python脚本 # codingutf-8 from selenium import webdriver import timedriver webdriver.Chrome() driver.get("https://www.baidu.com") time.sleep(3) driver.…

大模型之二十一-小语言模型塞道开启

当前提到大语言模型&#xff0c;大家想到的都是动辄百亿规模以上参数量的模型&#xff0c;13B、70B都是稀疏平常入门级的&#xff0c;但是目前从模型层面来看&#xff0c;模型参数量的规模两极分化已经来临&#xff0c;早期各大公司为了效果怼上去&#xff0c;采取了简单粗暴的…

Hive执行计划

Hive提供了explain命令来展示一个查询的执行计划&#xff0c;这个执行计划对于我们了解底层原理&#xff0c;Hive 调优&#xff0c;排查数据倾斜等很有帮助。 使用语法如下&#xff1a; explain query;在 hive cli 中输入以下命令(hive 2.3.7)&#xff1a; explain select s…

Flink系列之:背压下的检查点

Flink系列之&#xff1a;背压下的检查点 一、Checkpointing under backpressure二、缓冲区 Debloating三、非对齐 Checkpoints四、对齐 Checkpoint 的超时五、限制六、故障排除 一、Checkpointing under backpressure 通常情况下&#xff0c;对齐 Checkpoint 的时长主要受 Che…

使用Pycharm一键将.ui文件生成.py文件配置教程、一键打开QTDesigner教程

2df3621a-7ffd-4f18-9735-b86464b83a5b 前言 我痛恨所有将白嫖归为理所应当的猪&#x1f416;。 教程 打开pycharm之后&#xff0c;依次点击File->Settings->Tools->External Tools&#xff0c;进入如下界面&#xff1a; 1、配置快捷打开Qt Designer 点击号&…

基于深度学习的森林火焰烟雾检测系统(含UI界面,yolov8、Python代码,数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主干c…

gem5 RubyPort: mem_request_port作用与连接 simple-MI_example.py

简介 回答这个问题&#xff1a;RubyPort的口下&#xff0c;一共定义了六个口&#xff0c;分别是mem_request_port&#xff0c;mem_response_port&#xff0c;pio_request_port&#xff0c;pio_response_port&#xff0c;in_ports, interrupt_out_ports&#xff0c;他们分别有什…

YOLOv8改进 | 主干篇 | 利用MobileNetV2替换Backbone(轻量化网络结构)

一、本文介绍 本文给大家带来的改进机制是MobileNetV2&#xff0c;其是专为移动和嵌入式视觉应用设计的轻量化网络结构。其在MobilNetV1的基础上采用反转残差结构和线性瓶颈层。这种结构通过轻量级的深度卷积和线性卷积过滤特征&#xff0c;同时去除狭窄层中的非线性&#xff…

Circulation:室性早搏会增加不良心血管事件|UK Biobank周报(12.14)

欢迎报名2023年郑老师团队课程&#xff01; 郑老师科研统计培训&#xff0c;包括临床数据、公共数据分析课程等&#xff0c;欢迎报名 英国生物银行&#xff08;UK Biobank&#xff0c;UKB&#xff09;是英国迄今以来规模最大的有关致病或预防疾病的基因和环境因子的信息资源库。…

【案例】图片预览

效果图 如何让图片放大&#xff0c;大多数的UI组件都带有这种功能&#xff0c;今天给大家介绍的这个插件除了放大之外&#xff0c;还可以旋转、移动、翻转、旋转、二次放大&#xff08;全屏&#xff09; 实现 npm i v-viewer -Smain.js 中引入 import viewerjs/dist/viewer.c…

java并发编程六 共享模型之内存

文章目录 Java 内存模型可见性解决方法 有序性解决方法 Java 内存模型 JMM 即 Java Memory Model&#xff0c;它定义了主存、工作内存抽象概念&#xff0c;底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。 JMM 体现在以下几个方面 原子性 - 保证指令不会受到线程上…

前端ICON库

前端ICON库 1.mingcute mingcute 2.lordicon lordicon 3.字节iconpark&#xff08;推荐&#xff09; 字节iconpark 4.iconbuddy iconbuddy.app/ 5.商标寻找youicons 免费下载数百万个徽标以获得设计灵感 | YouIcons.com 还有一堆工具

黑盒测试中的完整性测试:确保系统的功能完整性

在软件开发过程中&#xff0c;为了保证系统的质量和可靠性&#xff0c;测试是一个不可或缺的环节。而黑盒测试作为常用的测试方法之一&#xff0c;以用户的角度出发&#xff0c;测试系统在不知道内部工作原理的情况下&#xff0c;对输入数据的处理和输出结果的正确性进行验证。…

如何直接使用别人的Python项目的虚拟环境

Cannot set up a python SDK at Python 3.10 (flaskTest) (2) (H:\WorkPlace\PyWorkPlace\flaskTest\flaskTest\venv\Scripts\python.exe). The SDK seems invalid 如何复制别人的虚拟环境 修改步骤 1. 修改pyvenv.cfg文件里的home和version 2. Scripts\activate以及Scripts\a…
最新文章