第二次加载相同场景时出现Unity MissingReferenceException

use*_*377 5 c# unity-game-engine

我正在尝试使用 Unity 和 C# 创建打砖块 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)
Run Code Online (Sandbox Code Playgroud)

我注意到由于未分配变量而导致的大量 MissingReferenceExceptions。但这对我来说感觉有点不同,因为它在“第一场比赛”期间一切正常。什么会导致这个问题?在为第二个游戏启动游戏后,我检查了检查员,所有变量都分配给了对象。

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

Pon*_*ios 5

就我而言,问题是两个静态事件。一个被分配在一个方法被引发(由另一个类创建)时调用它,一个在这个类中创建以通知其他类发生某事。

所以我只是在OnDestroy()方法中添加了以下两个:

OtherClass.onNewX_event -= X_eventHandler;

对于第一个(其中 OtherClass 是引发 onNewX_event 并且当前类正在处理它的另一个类)

onThisClassEvent = null;

对于在此类中创建和引发的事件。


Joe*_*jah 3

我猜你用过Application.loadLevel(xx)。这是我了解到的情况:

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

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

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

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

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