UnityAPI学习之 事件函数(生命周期函数)的整体调用流程及细节

news2024/12/24 20:24:35

 事件函数(生命周期函数)的整体调用流程

Reset()

这个函数会在用户首次添加该组件时或单击 Reset 按钮时被调用,且只在编辑器生效,可用于保存默认值

示例:

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

public class NO2_EventFunction : MonoBehaviour
{
    private void Reset()
    {
        Debug.Log("调用了Reset方法");
        Debug.Log("攻击重置为默认值");
    }
}

如图可发现在程序运行之前就已经调用了Reset();

Awake()

此函数在脚本实例被载入时调用,仅被调用一次

调用时机:1. 任何有Awake()函数的脚本在场景加载的时候调用

                  2. 挂在拥有Awake()函数的脚本的物体从睡眠到显现的瞬间调用

                  

                  3. 在使用instantiate函数创建拥有Awake()函数的脚本的物体时调用

调用生存周期:脚本实际生存的期间

注:当有多个组件拥有Awake()函数时,每个组件调用Awake()函数的顺序不一定,但可以通过人为的编写确定调用顺序

示例:

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

public class NO2_EventFunction : MonoBehaviour
{
    private void Reset()
    {
        Debug.Log("调用了Reset方法");
        Debug.Log("攻击重置为默认值");
    }
    private void Awake()
    {
        Debug.Log("Awake");
    }
}

OnEnable()

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

调用时机:1. 任何有OnEnable()函数的脚本在场景加载的时候调用

                  2. 挂在拥有OnEnable()函数的脚本的物体从睡眠到显现的瞬间调用

注:与Awake()不同的是,OnEnable()可被调用多次

        Awake()与OnEnable()可以相互配合进行某些值的初始化(如怪物初始位置)

private void Awake()
    {
        monsterInitPos = monsterTrans.localPosition;
        lunaInitPos = lunaTrans.localPosition;
    }

    private void OnEnable()
    {
        monsterSr.DOFade(1,0.01f);
        lunaSr.DOFade(1,0.01f);
        lunaTrans.localPosition = lunaInitPos;
        monsterTrans.localPosition = monsterInitPos;
    }

示例:

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

public class NO2_EventFunction : MonoBehaviour
{
    private void Reset()
    {
        Debug.Log("调用了Reset方法");
        Debug.Log("攻击重置为默认值");
    }
    private void Awake()
    {
        Debug.Log("Awake");
    }
    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }
}

现在加载场景并多次对该物体进行激活与失活操作

Start()

 调用时机:只会在游戏物体或者脚本组件首次被激活时被调用一次

调用顺序:Awake()、OnEnable()之后,Update()之前

注:Awake()和Start()进行UI的实例化中,可以用Awake()加载资源组,Start()实例化资源组

关于变量赋值顺序的探究

如下列代码所示,创建int类型变量a1赋值100,因为其修饰符为public,所以我们可以在外部脚本或者Unity中对其进行重新赋值,因此探究其赋值顺序对以后的游戏开发很有必要

变量赋值顺序(左边最先赋值,右边最后赋值):

变量声明并直接赋值>检视面板赋值>Awake>OnEnable>外部赋值>Start

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

public class NO2_EventFunction : MonoBehaviour
{
    public int a1 = 100;
    private void Reset()
    {
        Debug.Log("调用了Reset方法");
        Debug.Log("攻击重置为默认值");
    }
    private void Awake()
    {
        Debug.Log("Awake");
    }
    private void OnEnable()
    {
        Debug.Log("OnEnable");
    }
}

现在进行类内部的变量赋值覆盖的实验

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

public class NO2_EventFunction : MonoBehaviour
{
    public int a1 = 100;
    private void Reset()
    {
        /*Debug.Log("调用了Reset方法");
        Debug.Log("攻击重置为默认值");*/
    }
    private void Awake()
    {
        /*Debug.Log("Awake");*/
        a1 = 90;
        Debug.Log(a1);
    }
    private void OnEnable()
    {
        /*Debug.Log("OnEnable");*/
        a1 = 80;
        Debug.Log(a1);
    }
    private void Start()
    {
        a1 = 70;
        Debug.Log(a1);
    }
}

由运行结果可知,类内部变量赋值的顺序按照代码的执行顺序进行

现在进行外部调用改变变量值的实验

创建外部脚本NO2_External对变量进行改变

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//用于外部赋值的探索
public class NO2_External : MonoBehaviour
{
    public NO2_EventFunction ev;
    // Start is called before the first frame update
    void Start()
    {
        ev.a1 = 60;
        Debug.Log(ev.a1);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

而当重启Unity再次进行场景激活时会出现以下情况

此时的赋值顺序为

变量声明并直接赋值>检视面板赋值>Awake>OnEnable>Start>外部赋值

对于变量赋值的不同情况的详解

有些情况在脚本激活时,会出现外部脚本赋值的变量在最后的情况,那是因为外部脚本和内部脚本放在同一个目录下,再场景激活时,两个脚本是一起被激活的,这时候外部脚本中的Start和内部脚本Start的赋值情况不可控

现在重新创建外部脚本NO2_External02,并重新创建对象ev02改变内部脚本的a1的值

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

public class NO2_EventFunction : MonoBehaviour
{
    public int a1 = 100;
    private void Reset()
    {
        /*Debug.Log("调用了Reset方法");
        Debug.Log("攻击重置为默认值");*/
    }
    private void Awake()
    {
        /*Debug.Log("Awake");*/
        a1 = 90;
        Debug.Log(a1);
    }
    private void OnEnable()
    {
        /*Debug.Log("OnEnable");*/
        a1 = 80;
        Debug.Log(a1);
    }
    private void Start()
    {
        a1 = 70;
        Debug.Log(a1);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NO2_External02 : MonoBehaviour
{
    // Start is called before the first frame update
    public NO2_EventFunction ev02;
    void Start()
    {
        ev02.a1 = 10;
        Debug.Log(ev02.a1);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

结果如下 

在Unity重启后还会发生以上情况

在实际的脚本编写过程中,为了规避发生以上上情况对我们的游戏数据造成混乱,我们一般对一个对象赋值,或者说想要从外部对一个对象的属性或者成员变量的值进行更改的前提是,这个对象已经有了(意味着start方法已经调用),所以外部赋值会后于start方法进行调用

以本博主的理解就是改变脚本的激活顺序

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker中布置Jenkins实现Android项目的自动化构建

因项目需要,要在服务器上使用Jenkins完成Android项目的自动化构建,但服务器上登录的账户没有管理员权限,无法用sudo命令,因此需要把相应环境布置在docker中。 环境搭建 docker容器相关命令 创建容器 docker create -it contai…

Android Handler机制使用及全面解析

前言 我是真的不想写这篇总结,说实话,关于Handler,全面且优秀的文章多的很。 但是这东西吧,还是想以自己的方式再去细看一下它的原理,实现源码,它的各种机制,在App中使用到的地方。 这样或许…

【深度揭秘GPT-4o】:全面解析新一代AI技术的突破与优势

目录 ​编辑 1.版本对比:从GPT-3到GPT-4,再到GPT-4o的飞跃 1.1 模型规模的扩展 1.2 训练数据的更新 1.3 算法优化与效率提升 1.4 案例分析 2.技术能力:GPT-4o的核心优势 2.1 卓越的自然语言理解 2.1.1 上下文理解能力 2.1.2 语义分…

地质灾害位移应急监测站

地质灾害位移应急监测站是一种专门用于地质灾害预警和应急响应的设施,它能够实时监测和分析山体、建筑物、管道等的位移变化情况。以下是关于地质灾害位移应急监测站的详细介绍: 主要组成部分 传感器:安装于需要监测的位置,用于…

chap4 simple neural network

全连接神经网络 问题描述 利用numpy和pytorch搭建全连接神经网络。使用numpy实现此练习需要自己手动求导,而pytorch具有自动求导机制。 我们首先先手动算一下反向传播的过程,使用的模型和初始化权重、偏差和训练用的输入和输出值如下: 我…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

MFC 模态对话框的实现原理

参考自MFC 模态对话框的实现原理 - 西昆仑 - OSCHINA - 中文开源技术交流社区 1. 模态对话框 在涉及 GUI 程序开发的过程中,常常有模态对话框以及非模态对话框的概念 模态对话框:在模态对话框活动期间,父窗口是无法进行消息响应&#xff0…

The book

Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD is the book that forms the basis for this course. We recommend reading the book as you complete the course. There’s a few ways to read the book – you can buy it as a paper bo…

到无穷大和更远,用分形更好

文章目录 一、说明二、分形到底是什么?三、更多更深刻的四、引进无穷小会产生什么样的怪事?五、希尔伯特曲线六、还有什么有趣的要补充的吗? 一、说明 ​​​​​​​数学领域有太多有趣的领域,领域我特别感兴趣。这是一个奇妙的…

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】

在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候,通常会对表的每一行,都会进行检查以确保列为空/不为空,这是符合常理的。 但是如果本身这个列上有非空(NOT NULL)约束,再次检查就会浪费资源。甚至有时候…

经验分享:如何搭建一个有效的知识库管理系统

打开知乎,发现很多朋友在问如何搭建一个有效的知识库管理系统,所以今天LookLook同学就来跟大家分享一下我是怎么搭建一个既实用又高效的知识库管理系统的。 一、明确需求,定位清晰 首先,你得想清楚你要搭建的知识库管理系统是用来…

时钟、复位与上电初始化

目录 1. 时钟2. 复位2.1. 异步复位 同步释放2.2. Xilinx FPGA复位设计基于PLL锁定(locked)复位设计 3. 上电初始化 1. 时钟 2. 复位 FPGA中复位设计总结 深入理解复位—同步复位,异步复位,异步复位同步释放(含多时钟域&#xff0…

element table表格行列合并span-method,根据数据动态行列合并

表格行列合并需要用到 table的方法 span-method 根据数据来进行动态的行列合并&#xff0c;实例如下&#xff1a; <el-table:data"tableData":span-method"objectSpanMethod" style"width: 100%"><el-table-columnprop"key"l…

【python】OpenCV—Color Detection

学习来自 如何使用 OpenCV Python 检测颜色 import cv2 import numpy as npdef red_hsv(img, saveFalse):lower_hsv1 np.array([0, 175, 20])higher_hsv1 np.array([10, 255, 255])lower_hsv2 np.array([170, 175, 20])higer_hsv2 np.array([10, 255, 255])mask1 cv2.inR…

基于STM32的轻量级Web服务器设计

文章目录 一、前言1.1 开发背景1.2 实现的功能1.3 硬件模块组成1.4 ENC28J60网卡介绍1.5 UIP协议栈【1】目标与特点【2】核心组件【3】应用与优势 1.6 添加UIP协议栈实现创建WEB服务器步骤1.7 ENC28J60添加UIP协议栈实现创建WEB客户端1.8 ENC28J60移植UIP协议并编写服务器测试示…

[代码复现]Self-Attentive Sequential Recommendation(ing)

参考代码&#xff1a;SASRec.pytorch 可参考资料&#xff1a;SASRec代码解析 前言&#xff1a;文中有疑问的地方用?表示了。可以通过ctrlF搜索’?。 环境 conda create -n SASRec python3.9 pip install torch torchvision因为我是mac运行的&#xff0c;所以device是mps 下面…

npm install pubsub-js报错的解决汇总

我在练习谷粒商城P83时&#xff0c;选择分类时触发向后端请求选择分类catId绑定的品牌数据&#xff0c;发现前端控制台报错&#xff1a; "PubSub is not definded",找不到pubsub。 因为缺少pubsub包&#xff0c;所以开始安装此包。 于是在网上一顿搜索猛如虎&…

C# :IQueryable IEnumerable

1. IEnumerable namespace System.Collections: public interface IEnumerable {public IEnumerator GetEnumerator (); }public interface IEnumerator {pubilc object Current { get; }public bool MoveNext ();public void Reset (); }IEnumerable 只有一个方法 GetEnumera…

django使用fetch上传文件

在上一篇文章中&#xff0c;我包装了fetch方法&#xff0c;使其携带cookie。但是之前fetch传递的是json数据&#xff0c;现在有了一个上传文件的需求&#xff0c;因此需要进行修改&#xff1a; const sendRequest (url, method, data) > {const csrftoken Cookies.get(cs…

C++ | Leetcode C++题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> getRow(int rowIndex) {vector<int> row(rowIndex 1);row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row;} };