5

Unity と C# を使用して Arkanoid 3D ゲームを作成しようとしています。ゲームを開始できるシンプルなメニュー (シーン 0)、実際のゲームが行われるメイン シーン (シーン 1)、プレーヤーが最初に持っていた 3 つのボールをすべて失った後に表示されるスコアボード (シーン 2) を作成しました。任意のキーを押した後、メニューに戻り、ゲームを再開できます。そして、ここから問題が始まります。

最初のボールを失った後の 2 番目のゲームで、私のゲームは狂ってしまいます。以下のような「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)

変数を割り当てていないために発生する MissingReferenceException が大量にあることに気付きました。しかし、これは「最初のプレイ」ですべてが完璧に機能するので、私にとってはちょっと違う気がします。この問題の原因は何ですか? 2 番目のゲームのゲームを起動した後、インスペクタをチェックインすると、すべての変数がオブジェクトに割り当てられました。

ゲーム コードがかなり大きくなり、10 個を超えるスクリプトに分割されているため、ゲーム コードを挿入する必要があるかどうかはわかりません。

4

3 に答える 3

3

を使用したと思いますApplication.loadLevel(xx)。これは私がそれについて知ったことです:

すべてのオブジェクトの新しいインスタンスを論理的に作成すると値が初期状態にリセットされるため、静的変数を使用していない限り、シーンをリロードするとすべての変数がリセットされます。

一方、静的変数はインスタンスではなくクラスの一部であるため、破棄されません。これらは手動でリセットする必要があります。

DontDestroyOnLoad()は少し異なります。新しいシーンをロードするときにオブジェクトを破棄しないように Unity に指示します。したがって、これらのオブジェクトは破棄も再作成もされていないため、リセットされません。

それらをリセットする唯一の方法は、手動で変数を初期状態に戻すことです。それをどのように行うかはあなたの選択です。すべての初期値を保存するか、新しくインスタンス化されたクラスから値をコピーできます。

さらに、静的変数を使用する場合は、それらをすべてシングルトンに入れるか、非静的変数に変更する方が便利かもしれません。

于 2013-02-20T14:42:08.113 に答える
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);

この助けを願って...... :-)

于 2014-12-20T15:33:29.640 に答える