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

时间:2013-02-20 13:54:17

标签: c# unity3d

我正在尝试使用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个脚本。

3 个答案:

答案 0 :(得分:3)

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

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

另一方面,

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

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

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

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

答案 1 :(得分:3)

就我而言,问题是两个静态事件。一个被指定在每次引发时调用一个方法(由另一个类创建),另一个在该类中创建,以通知其他类的某些事物的发生。

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

OtherClass.onNewX_event -= X_eventHandler;

为第一个(其中OtherClass是另一个提升onNewX_event并且当前类正在处理它的类)

onThisClassEvent = null;

在此课程中创建和提升的事件。

答案 2 :(得分:2)

在GameEventManager类中包含以下函数

public static void Nullify(){
    GameStart = null;
    GameOver = null;
    LevelWon = null; 
    GamePause = null; 
    GameResume = null; 
    BallLost = null;

}

并在加载其他场景之前在Menu(scene0)中调用此函数(GameEventManager.Nullify(););

GameEventManager.Nullify();
Application.LoadLevel("Scene1);

希望这有帮助......: - )