ユニティシングルトン

出典:https://www.cnblogs.com/llstart-new0201/p/9730181.html

 

(A)単利の最も簡単な

コードをコピー
パブリッククラスWebRequestUtility:MonoBehaviour 
{ 
    公共静的WebRequestUtilityインスタンス。

    プライベートボイドアウェイク()
    { 
        インスタンスこの=。
    } 
}
コードをコピー

これは、最も簡単で最も効果的な、最も実用的でシンプルな関心モードの問題はないです。そこに何らかの問題があり、その別のスクリプト目を覚まし、最初awkeよりも目を覚ましRuoguo他のスクリプトの実行中に参照されている場合は、NULL参照が報告されます。この問題は、スクリプトの実行順序のクラスを設定することによって解決されます。方法は、第1および目覚めを実行するために使用していない、それは目を覚ましとの最初の実行を決定していない限り、一般的な初期化開始と起動しようとします。

(II)コンストラクタメソッド

コードをコピー
パブリッククラスWebRequestUtility:MonoBehaviour 
{ 
    公共静的WebRequestUtilityインスタンス。

    WebRequestUtility()
    { 
        インスタンス=この; 
    } 

}
コードをコピー

あなたが目を覚ましになる前に、インスタンスを初期化するコンストラクタは、(公式説明を直接見つけましたが、実行し、初期化するためのスクリプトを与えている誰かが問題を発見して、お互いを憎むことを提案した場合、それは最初、あまりにも、目を覚ましよりも実際に実行されます)、最初に実行しました。しかし、遭遇したバグ(一度タイトな出会いが)、それはちょうど2017unityバージョンで複数の実行を、実行中のコンストラクタを開始し、原因が見つかりません。

(C)単一モードの実施形態DontDestroyOnLoad

時には、一つのケースは、シーンに消えロードすることができない、必要とされている、したがって、これは、それ自体ですでに、単一のケースを持っている問題ですが、中に(破壊されない必要がありますが、2つの負荷のシナリオがある場合のケースになりますケースのシナリオは)目を覚まし、再び実行をロード

コードをコピー
パブリッククラスWebRequestUtility:MonoBehaviour 
{ 
    パブリックブールbDontDestroyOnLoad =偽; 

    パブリック静的WebRequestUtilityインスタンス。

    プライベート無効InitializeInstance()
    { 
        場合(インスタンス=ヌル&インスタンス==この!)
            リターン。

        IF(bDontDestroyOnLoad)
        { 
            (インスタンス== NULL)の場合
            { 
                インスタンスがこれを=。
                DontDestroyOnLoad(ゲームオブジェクト)。
            } 
            { 
                (ゲームオブジェクト)を破壊します。
            } 
        } 
        他の 
        {
            インスタンス=この;
        } 
    } 

    プライベートボイドアウェイク()
    { 
        InitializeInstance()。
    } 
}
コードをコピー

ユニティのソースコードからコード参照NetworkManagerのアセンブリ。ロジックは、単一の実施形態は、(空でない)初期化されていることを確認することに加えて、に言及する場合、単一の実施形態を可能にする、単純であるが、その単一の実施形態==これを確実にするために。それ以外の場合は、再割り当てされた一つのケースがあり、それが再び許可されていないSingletonパターンを使用するので、他の場所で初期化されます。

(IV)メソッド静的プロパティまたは静的メソッド

コードをコピー
パブリッククラスWebRequestUtility:MonoBehaviour 
{ 
    プライベート静的WebRequestUtilityインスタンス。
    
    パブリック静的WebRequestUtilityインスタンス
    { 
        取得
        { 
            IF(例えば== NULL)
            { 
                インスタンス=新しいWebRequestUtility(); 
            } 

            戻りインスタンス。
        } 
    } 
}
コードをコピー

また、これは良い方法ではなく、()(ⅱ)その他の問題は、単一の実施形態を取得する際に初期化する必要がある場合に、シンプルで一般的に使用され、シングルモードのほとんどの場合に()(ⅱ)十分なされています。

(IV)シングルモードカオス例(実際には相互憎悪を始めます)

これは、直接憎しみのこの部分を開始したいと思いますが、誰がこの敵意がなくなった書いた、または良いを学び、私は落ち着いて学習してみましょう。ユニティ・シングルトンうちのある程度の継続的な問題。

1)一の実施形態では、変異体「の場合」

コードの観点から、彼が実際に直接存在する複数のインスタンスから(???)を「シングルトン」を返すことがあり、単一の実施形態であるが、複数のケースに数行のコードの後に​​、次いで数行のコードの後に​​することです憎しみのリンクは、考えるか忘れます。あなたはこの記事を見てhttps://blog.csdn.net/qq_15267341/article/details/54232854、マルチプロファイル、マルチ明確を取ることができます。

2)ロック(ロック)を使用し

何の問題もなく、ロックを使用しますが、統一は推奨されません。純再びシングルトンでは、このようなデッドロック、またはロジックなどの問題ではなく、並べ替え問題アウトなど、定期的な紛争における単一スレッドのより一貫して使用するので、ロックする必要があります。この問題は存在しないのでしかし、団結は、コルーチンが運営する「非同期」を達成するために、シングルスレッド操作です。非メインスレッドが可能コンポーネントの動作ではありませんので、もちろん問題オープンスレッドが、唯一の純粋なデータプレーン操作のためのオープンスレッドまたは非同期操作は、(人気の話が動作ユニティ・カスタムのものである)があります。だから、とき非同期の団結やオープンスレッド、基本的な回避(ゲームレベルのために言えば、AR VR)他のスレッドで時にメインスレッド、単一のケースを呼び出します。ごく少数で、また解決にリアルタイム検出に更新することができます(コールバックが時に通常発生する)治療に関連する必要があります。あなたは、単一の場合は、関連のコンポーネントが動作団結を含まないある場合はもちろん、そうではありません継承モノ、あなたがに対処するため、純粋なC#構文を使用することができます。

おすすめ

転載: www.cnblogs.com/LiTZen/p/11851116.html