加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Unity MissingReferenceException第二次加载相同的场景时

发布时间:2020-12-16 01:53:09 所属栏目:百科 来源:网络整理
导读:我正在尝试使用Unity与C#创建Arkanoid 3D游戏.我已经创建了简单的菜单(场景0),在那里我可以开始我的游戏,实际游戏发生的主场景(场景1)和记分牌(场景2),这是在玩家开始时失去所有3个球之后显示的.按任意键后,我返回菜单,可以再次开始游戏.这就是问题的起点.
我正在尝试使用Unity与C#创建Arkanoid 3D游戏.我已经创建了简单的菜单(场景0),在那里我可以开始我的游戏,实际游戏发生的主场景(场景1)和记分牌(场景2),这是在玩家开始时失去所有3个球之后显示的.按任意键后,我返回菜单,可以再次开始游戏.这就是问题的起点.

在第一场失球后的第二场比赛中,我的比赛变得疯狂.我得到的负载“MissingReferenceException”如下所示(但有些链接到其他对象(如GUIText等):

MissingReferenceException: The object of type 'Player' has been destroyed but
you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
Player.BallLost () (at Assets/Player/Player.cs:164)
GameEventManager.TriggerBallLost () (at Assets/Menagers/GameEventManager.cs:30)
Ball.Update () (at Assets/Ball/Ball.cs:47)

我注意到由于没有赋值变量而导致的MissingReferenceExceptions加载.但这对我来说有点不同,因为它在“第一场比赛”中完美运作.什么可能导致这个问题?在为第二场比赛启动游戏后,我在检查员中咀嚼,所有变量都分配给对象.

我不确定是否shoudl插入游戏代码,因为它已经变得相当大并且分成了> 10个脚本.

解决方法

我猜你用过Application.loadLevel(xx).这是我发现的:

重新加载场景应重置所有变量,除非您使用静态变量,因为逻辑创建每个对象的新实例会将其值重置为其初始状态.

另一方面,静态变量不会被破坏,因为它们是类的一部分,而不是实例.您必须手动重置这些.

DontDestroyOnLoad()有点不同.它告诉Unity在加载新场景时不要销毁对象.因此,这些对象不会被重置,因为它们没有被销毁和重新创建.

重置它们的唯一方法就是手动完成并将变量恢复到某个初始状态.您可以选择如何做到这一点.您可以保存所有初始值,也可以从新实例化的类中复制值.

作为补充,我想说如果使用静态变量,将它们全部放在Singleton中或将它们更改为非静态变量可能更有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读