首页
学习
活动
专区
工具
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被声明了两次,我们从创建阶段中就知道到达变量之前在活动对象上已经创建了函数,并且如果活动对象上已经存在属性名称,我们就会绕过了声明。

    78120

    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的地址是一样的,但是其实它们是两个不同的变量,占用不同的存储空间。 那为什么地址看到的是一样的呢?

    43210

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

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

    1.2K10

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

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

    46510

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

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

    57430

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

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

    73310

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

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

    19610

    深入浅出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了 ?

    39420

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

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

    63130

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

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

    13910

    揭秘变量提升

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

    65630

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

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

    1.2K21

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

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

    2.8K20

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

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

    94930

    描述进程和进程状态

    在操作系统这门学科中 PCB是一个统称; 每一个具体的操作系统都有他们各自的PCB。...所以,我们需要用到操作系统内核提供的系统调用接口--------getpid 2.3一般来说,在操作系统内部,普通进程都有父进程 我们发现,每次我重新启动程序,虽然我的进程每次都是不一样的。...但是,我的父进程每次都是一样的。 我们查看了一下这个进程,发现23616是一个叫bash 的进程。 我们得出结论:操作系统内部所有在命令行启动的进程都是这个bash的子进程 。...就是将要改变的数据,在申请一块空间,用于存储修改后的值 3.6关于fork()函数的返回值的三问 3.6.1 为什么给父进程返回pid,而给子进程返回0....3.6.3 id作为一个变量为什么会同时有两个值 首先,我们要先明白一个点,就是一个进程的崩溃并不会影响到另一个进程。 进程任意之间都是相互独立的,并不会相互影响。

    9110

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

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

    43620

    掌握闭包,夯实基本功

    函数中,我们创建了两个内部的私有变量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()立即调用时,闭包内部引用的变量已经被释放

    24720
    领券