2013-02-20 354 views
3

我想創建使用Unity與C#的Arkanoid 3D遊戲。我創建了一個簡單的菜單(場景0),我可以開始我的遊戲,我的主場景是實際比賽發生的場景(場景1)和記分牌(場景2),這是在玩家在開始時失去所有3個球后顯示的。按任意鍵後,我回到菜單並可以重新開始遊戲。這是問題開始的地方。Unity MissingReferenceException當第二次加載相同的場景

在第一場比賽失利後,我的比賽變得瘋狂。我得到的「MissingReferenceException」 S負載,如一個下面(但有些連接到其他對象(如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) 

我注意到,通過不分配變量casued MissingReferenceExceptions的負載,但這種感覺的有點不同勢。因爲它在「第一次遊戲」中完全正常工作,什麼會導致這個問題?我在第二局比賽發動後,在檢查員中做出了迴應,並且所有變量都被分配給了對象。代碼,因爲它已經變得相當大,並被分成> 10個腳本。

+0

您是否在重新開始新遊戲後重設值? – 2013-02-20 13:59:18

+1

你有沒有單身人士或設置任何對象爲[DontDestroyOnLoad](http://docs.unity3d.com/Documentation/ScriptReference/Object.DontDestroyOnLoad.html)(看來你的GameEventManager是)? – onevcat 2013-02-20 14:15:02

+0

你如何加載不同的場景? – Joetjah 2013-02-20 14:37:29

回答

2

我猜你使用Application.loadLevel(xx)。這是我發現的:

重新加載場景應重置所有變量,除非您使用靜態變量,因爲邏輯上創建每個對象的新實例會將其值重置爲其初始狀態。

另一方面,靜態變量不會被銷燬,因爲它們是類的一部分,而不是實例。您必須手動重置這些。

DontDestroyOnLoad()有點不同。它告訴Unity在加載新場景時不要銷燬對象。所以這些對象不會被重置,因爲它們沒有被破壞和重新創建。

重置它們的唯一方法就是手動通過並將變量恢復爲初始狀態。這是你的選擇。您可以保存所有初始值,也可以從新實例化的類中複製值。

作爲一個補充,我想說,如果你使用靜態變量,將它們全部放入Singleton或將它們改爲非靜態變量可能會更有用。

+0

格式化代碼是的,我使用Application.loadLevel(XX)。 我只有1個靜態對象,我用它將遊戲的分數傳遞給記分板。沒有其他的對象是靜態的,也不是我使用DontDestroyOnLoad()(但是我早些時候嘗試過使用靜態對象結果包含一個不應該對遊戲具有任何影響的int結果我已經檢查過我的代碼了DontDestroyOnLoad ()但都已經不在了)。 – user2091377 2013-02-20 15:06:35

1

包括下列功能在您的GameEventManager類

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

}

,並調用這個函數(GameEventManager.Nullify();)加載其他場景之前在菜單(scene0);

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

希望這有助於:-) ......

0

在我的情況下,問題是兩個靜態事件。一個被賦值的方法在每當它被提出時調用一個方法(由另一個類創建),另一個在這個類中創建,通知其他類發生某些事情。

所以我只是在OnDestroy()方法添加了以下兩個:

OtherClass.onNewX_event -= X_eventHandler;

的拳頭一個(其中OtherClass是這是提高onNewX_event和當前類的其他類是handlening吧)

onThisClassEvent = null;

用於在本課程中創建和提出的事件。

相關問題