2013年11月23日土曜日

【Unity】なんちゃらManagerクラスを作ろう(シングルトン)

どこからでも呼び出したいもの

Unityでゲーム作ってるとどこからでも呼び出したいクラスが欲しくなります。
命名するとなんちゃらマネージャーみたいになるやつ。
AudioManagerとか、SettingManagerとか、ParticleManagerとか
どこからでも呼び出せると便利で、でも2つ以上あったら変なもの。

じゃーどうすんの?って調べてると大体シングルトンっていう考え方に行き着くと思う。
シングルトンとは→Wikipedia
ようするにインスタンスを1個しか作らなければいいだけ。
よし使おー。

シングルトンを使ってみよう

ってことで普通にやろうとすると
AudioManagerクラスを作成→シングルトンになるよう変数、関数追加
SettingManagerクラスを作成→シングルトンになるよう変数、関数追加
ParticleManagerクラスを作成→シングルトンになるよう変数、関数追加
・・・

ってなる。
同じようなの作るたびにコピペでめんどくさい。
いや、めんどくさいというより何度も書くのが気持ち悪い。

そんなときこそ、

じぇねりくす

こんなことしなくていいようにC#には便利な機能があって、
ジェネリクスってものを使うと1回書くだけで再利用できるようになります。
ジェネリクスとは→ジェネリックス

よし作ろう!と思ったけど
MonoBehaviourが絡んでくるのでどう書いていいか良くわからない。

絶対先輩方が書いてるでしょってことでめっちゃ調べた。
あるわあるわいっぱいあるわ

[Unity3D]もっと楽なシングルトンの実装 : テラシュールウェア
Unity開発に関する50のTips 〜ベストプラクティス〜(翻訳): No hack, no work
[Unity]Generic Based Singleton for MonoBehaviours完全版(?) : ケットシーウェア

この中でも一番自分のイメージに近かった
50のTipsにあるものを使うことにしました。

SingletonMonoBehaviour

using UnityEngine;

public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
 private static T instance;
 public static T Instance {
  get {
   if (instance == null) {
    instance = (T)FindObjectOfType(typeof(T));
 
    if (instance == null) {
     Debug.LogError (typeof(T) + "is nothing");
    }
   }
 
   return instance;
  }
 }

}

使い方

using UnityEngine;

public class AudioManager : SingletonMonoBehaviour<AudioManager> {
    
    public void Awake()
    {
        if(this != Instance)
        {
            Destroy(this);
            return;
        }

        DontDestroyOnLoad(this.gameObject);
    }    
    
}
こんな感じ。
SingletonMonoBehaviourを継承するだけでシングルトンパターンが実装できます。
テラシュールウェアさんも書いてましたがDestroyについては
利用側(XXXManager)で実装することにしました。
そしてDontDestroyOnLoadはクラスに応じてって感じですね。
AudioManagerならタイトルとかのSceneで生成して使い回すだろうし書きました。


うんうんいい感じ。
MonoBehaviourよくわかってないから合ってるのかわからんけど使えそう。

次はAudioManager完成させよう。

Unity系記事まとめ

スポンサーリンク

Related Posts Plugin for WordPress, Blogger...