2016-04-15 4 views
0

プレイヤーが失敗したときにリロードしたいシーンがあります。私はSceneManager.LoadScene("MainScene");でこれを行うが、その後、私はこのエラーがあります:私は問題が私の事象によって引き起こされることがわかったいくつかの掘削後シーンリセット(リロード)でイベントサブスクリプションをリセットする方法

MissingReferenceException: The object of type 'AudioSource' has been destroyed but you are still trying to access it.

を。以前のシーンからの加入者がまだアクティブで、すでに破壊されているオブジェクトを探しているようです。したがって、質問は次のとおりです:

  1. 新しいシーンを読み込む前に、どういうわけかすべてのユーザを削除することはできますか、それとも1つずつ削除する必要がありますか?
  2. (私はそれを尋ねないと知っていますが...)簡単なイベントマネージャのチュートリアルや例を教えてください。イベントハンドラをラップしてサブスクリプションを管理できる静的クラスについて考えていますか?

答えて

0

.ITは、すべてのサブスクライバをクリアすることが可能であるが、あなたがこれは難しいことではありません。中に加入し、各スクリプトに退会することをお勧めします。 退会は、イベントに登録したすべてのクラスのOnDisable()の機能であり、現在の問題は発生しません。

CLEAR個人のEVENT

void OnDisable(){ 
ClassName.eventName -= functionName; 
} 

CLEAR ALL EVENTS:イベントがある

場合Unity UI Eventあなたはすべてのサブスクライバを削除するためにRemoveAllListeners()を使用することができます。あなたがC#のeventdelegatesを使用していて、あなたの名前デリゲートがあなたのイベントの名前はonButtonPressedている間、あなたは

if (onButtonPressed != null) 
    { 
     System.Delegate[] deletegates = onButtonPressed.GetInvocationList(); 
     for (int i = 0; i < deletegates.Length; i++) 
     { 
      //Remove all event 
      onButtonPressed -= deletegates[i] as buttonPressed; 
     } 
    } 

2を実行して、加入者を削除することができbuttonPressedであると仮定すると、

。何をしているのか分かりませんが、Event Managerは必要ありません。 OnDisable機能で購読/購読を解除するだけです。それでも必要な場合は、イベントマネージャーhereを入手できます。

+0

私の質問を書いた後、私はOnDisable()の方法を試してみましたが、うまくいきました。ありがとう –

+1

OnDisable()関数でそれを行うことは正しい方法です。毎回働くことが保証されています。必要に応じて、clear all eventメソッドを使用するか、独自のEvent Managerを作成することができます。 Unityがイベントを処理する方法をご覧ください。https://unity3d.com/learn/tutorials/modules/intermediate/scripting/events – Programmer

関連する問題