首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么OnLevelWasLoaded ()被调用两次,为什么我的变量在每次调用中都有不同的值?

OnLevelWasLoaded() 方法在 Unity 中用于处理场景加载完成的事件。如果你发现这个方法被调用了两次,并且变量的值在每次调用中都有所不同,可能有以下几个原因:

  1. 多个场景加载
    • 如果你的游戏设计中包含了多个场景的切换,每次切换场景时 OnLevelWasLoaded() 都会被调用。
    • 确保你理解了场景切换的逻辑,并且知道每次调用 OnLevelWas->Loaded() 时加载的是哪个场景。
  2. 加载场景的方式
    • 使用 Application.LoadLevel()SceneManager.LoadScene() 方法加载场景时,如果参数设置不当,可能会导致场景被加载多次。
    • 例如,如果你在 OnLevelWasLoaded() 中再次调用了加载场景的方法,就会导致递归加载。
  3. 异步加载
    • 如果你使用了异步加载场景的方法(如 SceneManager.LoadSceneAsync()),在加载完成之前和之后都可能会调用 OnLevelWasLoaded()
    • 确保你正确处理了异步加载的回调,以避免重复调用。
  4. 变量初始化问题
    • 如果你的变量在 OnLevelWasLoaded() 中初始化,而这个方法被调用了多次,那么每次调用时变量的值都会重新设置。
    • 考虑将变量的初始化放在其他生命周期方法中,比如 Awake()Start(),以确保它们只被初始化一次。
  5. 脚本实例化
    • 如果你的脚本在场景中被多次实例化,那么每个实例的 OnLevelWasLoaded() 都会被调用。
    • 确保你理解了脚本实例化的逻辑,并且知道每次调用 OnLevelWasLoaded() 时是哪个实例在调用。

为了更好地调试这个问题,你可以在 OnLevelWasLoaded() 方法中添加日志输出,打印出当前的场景名称和变量的值。这样可以帮助你更清楚地了解每次调用的情况。

代码语言:javascript
复制
void OnLevelWasLoaded(int level)
{
    Debug.Log("OnLevelWasLoaded called for scene: " + SceneManager.GetActiveScene().name);
    Debug.Log("Variable value: " + yourVariable);
}

通过这些信息,你可以更好地理解为什么 OnLevelWasLoaded() 被调用了两次,以及为什么变量的值在每次调用中都有所不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么Java成员变量不能重写?成员变量Java能够重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域方法

这篇文章讨论了Java面向对象概念中一个基本概念--Field Hiding(成员变量隐藏) 成员变量Java能够重写么?...Paste_Image.png 按照我们已有的多态概念,第二个应该是输出sub才对,但却输出了super。这是为什么呢?...不会重写成员变量,而是隐藏成员变量 Java文档对隐藏域定义: Within a class, a field that has the same name as a field in the superclass...意思就是: 一个类,子类成员变量如果和父类成员变量同名,那么即使他们类型不一样,只要名字一样。父类成员变量都会被隐藏。子类,父类成员变量不能简单用引用来访问。...而是,必须从父类引用获得父类隐藏成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。

3.5K40

JavaScript执行上下文和堆栈

本文结束时,你应该对解释器了解得更清楚:为什么声明它们之前可以使用某些函数或变量?以及它们是如何确定? 什么是执行上下文?...但是,JavaScript解释器,对执行上下文每次调用都有两个阶段: 创建阶段 [调用函数时,但在执行任何代码之前]: 创建作用域链。 创建变量,函数和参数。 确定“this”。...Foo声明两次为什么foo显示为`function`而不是`undefined`或`string`?...即使foo声明两次,我们通过创建阶段知道函数变量之前就被创建在激活对象上了,而且如果激活对象上已经存在了属性名称,我们只是绕过了声明这一步骤。...bar实际上是一个具有函数赋值变量,我们知道变量创建阶段创建,但它们是使用undefined初始化

1.2K40
  • 【译】JS执行上下文和环境栈是什么?

    读过本文后,你将更加清楚地了解到解释器尝试做什么,为什么声明某些函数/变量之前,可以使用它们以及它们是如何确定。 执行上下文是什么?...但是,JavaScript解释器,执行上下文调用都有两个阶段: 创建阶段【调用函数时,但是执行里面的代码之前】: 创建作用域链 创建变量,函数和参数 确定this 激活/代码执行阶段: 分配...扫面上下文以获取变量声明: 对于找到每个变量声明,变量对象(或活动对象)创建一个属性,该属性是变量名称,并将初始化为undefined。...Foo声明了两次为什么foo显示为函数而不是undefined或string呢?...即使foo声明了两次,我们从创建阶段中就知道到达变量之前活动对象上已经创建了函数,并且如果活动对象上已经存在属性名称,我们就会绕过了声明。

    77920

    C语言: 定义一个函数int fun(int n),用来计算整数阶乘,主函数输入一个变量x,调用fun(x)输出x及以下阶乘

    最近太忙了,就不分析代码了,有问题留言,或者私QQ2835809579 希望对你有帮助,是计算机学长川川,点个赞加个关吧。...原题: 定义一个函数int fun(int n),用来计算整数阶乘,主函数输入一个变量x,调用fun(x)输出x及以下阶乘。 输入输出示例 输入:5 输出: 1!=1 2!=2 3!...main(int argc, char const *argv[]) //主函数 { int n; printf("Input n:"); //变量定义...=%d\n",n, fun(n)); //调用函数计算阶乘 return 0; } int fun(int n) //定义计算n!...函数 { int fact = 1; for (int i = 1; i <= n; ++i) //遍历1到n { fact = fact*i; }

    6.5K20

    【Linux系统编程】通过系统调用获取进程标识符 及 创建子进程(fork)

    没问题,就是19490 然后: 把它终止掉,再反复多启动终止几次 我们发现,它每次PID可能都是不同,是会变化,进程PID是由操作系统维护。...一个进程自己执行流里执行代码时候是可以修改代码里面的数据(比如某个变量) 像这样 那我们运行一下看看 我们看到修改之后呢,它们打印x确实是不一样了,但是我们看到两个...那这里如何做到同一个变量地址相同但是不同,我们目前还不能解释,后面再说。...那还有一个问题: 这里return执行了两次,所以返回了两个,但是: 我们接收返回只用了一个变量接收啊。 一个变量怎么同时接收两个?...虽然我们看到这两个x地址是一样,但是其实它们是两个不同变量,占用不同存储空间。 那为什么地址看到是一样呢?

    34810

    vue下拉选i-select无法选取“全部”,无法赋值为空串诡异bug

    同在一个对象body里,为什么为什么除了businessType无法赋值为空串外,其它属性都可以?“本自同对象,何故你与众不同?” ? 于是决定打个断点,一探究竟。...结果竟然神奇发现,点击刷新后,调用clear()方法,this.body.businessType确实赋值为了空串''。但是为什么还是往后台传“two”呢? ? 3.第三步,再次刷新。...会惊奇发现,所有的清空了。这就留下了一个引人深思问题:“businessType”为什么要刷两次才可以清空,其它只需要一次? 开始思考,研究这个问题。...但转换思维,从另一个角度来看,这些对象无法赋值为空串''属性,都有绑定了v-model,并且都在i-select下拉选中绑定。于是推测这跟 v-model和i-select混合使用有关系。...与此同时,每次都记录调用方法时传入

    1.1K10

    Javascript你必须理解执行上下文和调用

    这篇文章我们将深入了解 执行上下文,读完文章之后你应该可以清楚了解到 JavaScript 解释器到底做了什么,为什么可以一些函数和变量之前使用它,以及它们是如何确定。...自己调用自己三次,每次将 i 递增 1,每次函数 foo 调用时候,就会创建一个新执行上下文。一旦当前上下文执行完毕之后,它就会从栈中弹出并转移到下面的上下文中,直到全局上下。...但是 JavaScript 解释器每次调用执行上下文会有两个阶段: 创建阶段 创建作用域链 创建变量,函数,```arguments```列表。...foo 声明了两次为什么 foo 显示是 function 而不是 undefined 或者 string?...虽然 foo 声明了两次,但是我们创建阶段说到,函数是变量之前创建在变量对象,当变量对象名称已经存在时,变量声明什么也不做。

    56730

    Javascript你必须理解执行上下文和调用

    这篇文章我们将深入了解 执行上下文,读完文章之后你应该可以清楚了解到 JavaScript 解释器到底做了什么,为什么可以一些函数和变量之前使用它,以及它们是如何确定。...,每次将 i 递增 1,每次函数 foo 调用时候,就会创建一个新执行上下文。...但是 JavaScript 解释器每次调用执行上下文会有两个阶段: 创建阶段 创建作用域链 创建变量,函数,arguments列表。...foo 声明了两次为什么 foo 显示是 function而不是 undefined或者 string?...虽然 foo 声明了两次,但是我们创建阶段说到,函数是变量之前创建在变量对象,当变量对象名称已经存在时,变量声明什么也不做。

    46410

    JavaScript 执行上下文和调用栈是什么

    通过这篇文章,你应该能够清楚地了解到 JS 解释器究竟在干嘛,为什么可以一些函数和变量声明之前就能使用,以及它们是怎样决定。 什么是执行上下文(Execution Context)?...foo(++i); } }(0)); 这段代码调用自己自身3次, 每次将 i 增加 1。...扫描上下文中变量声明: 对于每个被发现变量声明,变量对象创建一个同名属性并初始化为 undefined。 如果变量 变量对象 已经存在, 什么都不做,继续扫描。...Foo 声明了两次, 为什么最后它显示为 function 而不是 undefined 或 string?...* 虽然 foo 声明了两次, 但是从 创建阶段 我们都知道函数变量之前创建在 活动对象 当中,并且如果属性名已经存在 活动对象 当中, 重复声明会被忽略。

    72710

    【Linux】进程与可执行程序关系&&fork创建子进程&&写实拷贝理解

    当前myprocess程序正在运行 而此时将其对应可执行程序删掉 这个进程所对应可执行程序已经语法高亮了,证明已经被删掉了   而此时可执行程序仍在运行,这也从侧面证明了当一个进程运行起来时候...我们也可以看到,其中父子进程fork返回是不一样,父进程fork返回是子进程pid,子进程返回是0。 那这里就会有疑问了,为什么fork给父进程返回子进程pid,给子进程返回0?...那fork函数为什么会返回两次呢?...那上面的id可是同一个变量啊,怎么会即大于零,又等于零呢?这和linux虚拟地址有关,也就是说,一个变量可以指向不同地址空间。 写实拷贝 任意进程之间是具有独立性,不会互相影响。...进程都有自己代码和数据,系统创建出来子进程PCB默认就会指向父进程代码和数据,想让父子进程分别执行不同程序,那就可以代码根据父子进程fork返回不同设置ifelse语句,让父子进程分别执行不同代码

    18010

    全网最通透“闭包”认知 · 跨越语言

    庖丁解牛 一个闭包就是一个“捕获”了其生成环境、所引用自由变量函数。 这个引用自由变量将和这个函数一同存在,即使已经离开了创造它环境也不例外。...都说了闭包是跨越语言设计, 至少知道 JavaScript C# Go都有闭包。 3....追本溯源 闭包是词法闭包简称,维基百科上是这样定义: “计算机编程,闭包是词法环境绑定自由变量头等函数”。...,注意,是引用自由变量,并不是使用当时自由变量。...Demo2:输出乱序0,1,2,3,4 这是因为 for循环内,每次循环j均拷贝自当时i,每个任务均引用了自由变量 j (每个任务执行环境均维护了一个变量j); 任务乱序执行时依旧能获取本任务绑定自由变量

    62530

    深入浅出JavaScript之闭包(Closure)

    这个例子调用outer()返回匿名函数function(),这个匿名函数可以访问outer()局部变量localVal,outer()调用结束后,再次调用func()时候,仍然能访问到outer...()局部变量localVal 闭包概念 闭包,不同于一般函数,它允许一个函数立即词法作用域外调用时,仍可访问非本地变量。...它一共运行了两次,第一次是999,第二次是1000。这证明了,函数f1局部变量n一直保存在内存,并没有f1调用自动清除。 为什么会这样呢?...原因就在于f1是f2父函数,而f2赋给了一个全局变量,这导致f2始终在内存,而f2存在依赖于f1,因此f1也始终在内存,不会在调用结束后,垃圾回收机制(garbage collection)...,每次循环时候,用立即执行匿名函数把它包装起来,这样子做的话,每次alert(i)就取自闭包环境i,这个i来自每次循环赋值i就能输出1,2,3了 ?

    39120

    一道华为C语言面试题,很多人都栽了!

    回到main函数,紧接着调用free函数释放刚刚分配内存。...因为C语言堆内存分配算法,不会每次释放内存都调用系统级函数(如VirtualFree)去真正释放内存页面,这是一个很重操作。...这是因为main函数返回后,程序流程又会进入到C语言运行时库地盘,堆内存破坏事情这个时候还是会被捅出来。 那为什么Debug模式下,程序又能够成功运行呢?...另外,这段代码Linux上默认编译后,也是能够运行: 所以总结来看,这段代码能不能正常工作,没有一个确定说法,与不同平台、不同编译模式都有关系,它运行结果是不确定。...但好玩来了,接下来还是打印p,不是打印q,居然把指针q内容给我打印出来了。 打印了两次p,两次输出内容居然不一样,这是为什么呢?

    13210

    揭秘变量提升

    甚至 ES6 之前:变量提升意思究竟是“提升至当前作用域顶部”还是“从嵌套代码块中提升到最近函数或脚本作用域中”?还是两者都有?...激活:什么时候可以访问变量? 这是一个动态特征:有些变量只要我们进入其作用域,就可以访问。 有的,我们必须等到执行到它们声明。 下表总结了不同声明方式如何处理上述两个方面。...“Duplicates”描述是否可以同一作用域内声明两次。 “Global prop.”表示一个 script 声明,当全局作用域中被执行时,是否会向全局对象添加属性。...进入变量作用域与执行声明之间这段时间被称为该变量 临时死区(TDZ): 临时死区变量认为是未初始化(就像它有一个特殊一样)。...因此,模块,很少需要担心函数顺序。 最后,注意提前激活是怎样自动执行以维持上述规则:当进入一个作用域时,在任何函数调用前,所有的函数声明都会被先执行。

    65030

    fork函数简介_fork()&&fork()

    该函数调用一次,但返回两次两次返回区别是子进程返回是0,而父进程返回则是新进程(子进程)进程id。...对于父子进程执行顺序问题:也是do_fork函数,它会有一个标志性变量,根据其不同取值,来决定先让谁执行,比如子进程先执行然后再把父进程插入到队列,具体位置也没研究清楚,简单来说就是在内核实现过程...fork调用一个奇妙之处就是它仅仅调用一次,却能够返回两次,它可能有三种不同返回:   1)父进程,fork返回新创建子进程进程ID;   2)子进程,fork返回0;   3)如果出现错误...引用一位网友的话来解释fpid为什么父子进程不同。...每个进程都有一个独特(互不相同)进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid变量,可以通过getppid()函数获得变量

    1.2K21

    可重入函数对于线程安全意义(附函数表)

    不可重入函数: 并发服务器,经常会出现多个任务调用同一个函数情况,比方说后端服务器使用多线程同时对数据库进行访问操作。...(其实也没什么不可预料,就是服务器崩了呗,然后就完了呗) 可重入函数: 所谓可重入是指一个可以多个任务调用过程,任务调用时不必担心数据是否会出错。...可重入函数可以在任意时刻中断,稍后再继续运行,不会丢失数据,可重入函数要么使用本地变量,要么使用全局变量时保护自己 数据。 为什么 为什么有的函数可重入,又有的函数不可重入?...为什么可重入 一个可重入函数可以多个执行流重复进入,内部使用数据都应该来自于自身栈空间,包括返回也不应该是全局或者静态,可以允许有该函数多个副本在运行,而正是因为其中操作数据都来自于自身栈空间...,而每次调用函数会开辟不同栈空间,因此二者互不影响。

    2.7K20

    程序员C语言快速上手——进阶篇(八)

    每次调用函数时,生成局部变量储存空间可能都是不同,意即局部变量函数调用结束后,就会释放,下次调用函数,生成局部变量又是一个新。...C语言中,全局变量整个程序生命期中都有,换句话说,也就是一旦声明了一个全局变量,则整个程序中都可以访问,而静态全局变量,则只声明它那个源文件可以访问。...静态全局变量虽然也是整个程序生命期中都有效,但它在其他文件不可见,无法访问。关于这一点细则,在下面的extern关键字使用做详细说明。...静态局部变量和普通局部变量区别就比较大了,主要有三个区别 存储位置不同。静态局部变量编译器放在全局存储区,虽是局部变量,但是程序整个生命期中都存在。而普通局部变量函数调用结束后就会被释放。...我们知道,普通局部变量函数每次调用时候都会生成一个新调用结束后又将它释放,如果一个函数频繁调用,这样性能岂不是很低?

    93230

    攒了一个月Android面试题及详细解答,年底准备起来,冲刺大厂单车变摩托!(上)

    为什么多线程同时访问(读写)同个变量,会有并发问题? Java 内存模型规定了所有的变量都存储主内存,每条线程有自己工作内存。...原子性:一个操作,CPU 不可以中途暂停然后再调度,即不被中断操作,要么执行完成,要么就不执行。 可见性:多个线程访问同一个变量时,一个线程修改了这个变量,其他线程能够立即看得到修改。...由于单例模式特殊性,可能程序不同地方多个线程同时调用,所以为了避免多线程并发问题,一般要采用volatile+Synchronized方式进行变量,方法保护。...如果在事务中出现错误,那么系统所有变化将自动地回滚,系统返回到原始状态。 隔离性 指的是并发环境,当不同事务同时操纵相同数据时,每个事务都有各自完整数据空间。...synchronized和volatile区别 volatile本质是告诉jvm当前变量寄存器是不确定,需要从主存读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量

    43220

    一文看懂:Vue3 和React Hook对比,到底哪里好?

    ,和reacthook用法非常相似,并且尤大也有说这个RFC是借鉴了reacthook想法,但是规避了一些react问题,然后这里解释一下为什么把vue这个RFC也称为是hook。...遵守这条规则,你就能确保 Hook 每一次渲染中都按照同样顺序调用。这让 React 能够多次 useState 和 useEffect 调用之间保持 hook 状态正确。...而Vue带来不同在于: 与 React Hooks 相同级别的逻辑组合功能,但有一些重要区别。与 React Hook 不同,setup 函数仅调用一次,这在性能上比较占优。...对调用顺序没什么要求,每次渲染不会反复调用 Hook 函数,产生 GC 压力较小。...假如第一次渲染执行两次 useState,而第二次渲染时第一个 useState if 条件判断给取消掉了,那么第二个 count2 useState 就会拿到链表第一条,完全混乱了。

    6.1K21

    掌握闭包,夯实基本功

    函数,我们创建了两个内部私有变量name、age,并且我们A函数创建一个内部函数B,此时B函数,我们会发现在B内部可以访问它周围状态(变量),也就意味着B函数内部可以访问外部函数作用域。...不知道你有没有发现,A内部定义变量在外部并不能访问,也就是说相对A外部,A内部所有的变量都是私有的,A定义变量,相对于B,又可以访问。...闭包特性 1.创建私有变量 2.延长变量生命周期 我们知道闭包会造成内存泄露,本质上就是创建变量一直引用内存,当一个普通函数调用结束时,函数内部创建变量就会被销毁。...具体一张图可以可以理解下 当我们用var b1 = A()时,实际上,用蓝色方框已经标注起来了,b1内部我们可以看到,每执行b1,实际就是执行红色区域函数,也就是A内部定义函数B,但是每次调用...,所以一直就1,2,3,但是这里使用是A()(),我们发现每次都是1,说明当我第二次调用时内部age已经重新定义了一遍,而并没有引用上一次,这就说明,A()立即调用时,闭包内部引用变量已经释放

    24420
    领券