2017-09-27 18 views
0

私はUnityの初心者です。Unityで一般的なシングルトンクラスを作成する方法は?

私は勉強中に質問がありました。

以下のドキュメントを参照してください。

using UnityEngine; 

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour 
{ 
    private static T _instance; 

    private static object _lock = new object(); 

    public static T Instance 
    { 
     get 
     { 
      if (applicationIsQuitting) { 
       Debug.LogWarning("[Singleton] Instance '"+ typeof(T) + 
        "' already destroyed on application quit." + 
        " Won't create again - returning null."); 
       return null; 
      } 

      lock(_lock) 
      { 
       if (_instance == null) 
       { 
        _instance = (T) FindObjectOfType(typeof(T)); 

        if (FindObjectsOfType(typeof(T)).Length > 1) 
        { 
         Debug.LogError("[Singleton] Something went really wrong " + 
          " - there should never be more than 1 singleton!" + 
          " Reopening the scene might fix it."); 
         return _instance; 
        } 

        if (_instance == null) 
        { 
         GameObject singleton = new GameObject(); 
         _instance = singleton.AddComponent<T>(); 
         singleton.name = "(singleton) "+ typeof(T).ToString(); 

         DontDestroyOnLoad(singleton); 

         Debug.Log("[Singleton] An instance of " + typeof(T) + 
          " is needed in the scene, so '" + singleton + 
          "' was created with DontDestroyOnLoad."); 
        } else { 
         Debug.Log("[Singleton] Using instance already created: " + 
          _instance.gameObject.name); 
        } 
       } 

       return _instance; 
      } 
     } 
    } 

    private static bool applicationIsQuitting = false; 

    public void OnDestroy() { 
     applicationIsQuitting = true; 
    } 
} 

インスタンスがnullの場合、なぜGameObjectをAddComponentに追加するのですか?

なぜFindObject関数を使用するのですか?

なぜUnityでUnityを使用しますか?

私はシングルトン全体の流れを知らない...

..コードレビューに私に初心者として

を与えてください、私はあまり知りません。あなたの助けが必要です。

私にあなたの考えを教えてください。

答えて

4

インスタンスがnullの場合、なぜGameObjectをAddComponentに追加するのですか?

作成するスクリプトのインスタンスがnullの場合if (_instance == null):そのスクリプトの

.Create新しいゲームオブジェクト

GameObject singleton = new GameObject(); 

.Create新しいインスタンスとアタッチそれは上記で作成されたGameObjectに渡されます。 Unityでは、コンポーネントをGameObjectにアタッチする必要があります。 AddComponent関数は、コンポーネントをGameObjectにアタッチするために使用されます。そのFindObject機能を使用する理由

_instance = singleton.AddComponent<T>(); 

作成するスクリプトのインスタンスがNULL if (_instance == null)の場合、そのスクリプトインスタンスがすでにシーンに存在するかどうかを確認します。 FindObjectOfType関数は、このタイプのスクリプトのみを検索するために使用されます。 SceneLoaderというスクリプトがあり、SingletonクラスにSceneLoaderを渡すと、SceneLoaderのインスタンスがすでにシーンに含まれているかどうかを確認し、そのインスタンスを返します。存在しない場合はnullを返します。

UnityでUnityを使用する理由は?あなただけのシーンでスクリプトの種類のインスタンスを持ちたいときは、それを使用

。また、DontDestroyOnLoadでは、次のシーンがロードされてもこのインスタンスが存在することを意味します。それは他のスクリプトのように破壊されません。

あなたはcodereviewサイト上のコードの改善を求めることができるコードレビューに私に

をお願いします。 Unityを初めてお使いの場合は、Unityプロジェクトのチュートリアルを自分のサイトで見つけることができ、簡単に始めることができます。here

+1

私と1対1でチャットできますか? –

+1

私はめったにチャットをしませんが、チャットは作成しません。私は数分間滞在することができます。 – Programmer

+1

チャットルームのタイトルは? –

関連する問題