おれ、Unity2Dでゲーム作るんだ。

Unity2Dをメインに、覚書などを記事にしていきます。

Singleton(シングルトン)ってなによ?

f:id:xev:20150124023327p:plain

Singleton(シングルトン)ってなによ?ってことをまとめてみました。

特にc#やUnityの機能では無く、プログラミングの手法というか設計のレシピです。 で、このシングルトンとはどのような設計かというと、

クラスのインスタンスが1個しかつくれない

別の言い方をすると、インスタンスが1つということが決まっている。 というプログラムの組み方です。

何が便利かって、newされまくって、同じ情報が至る所に重複するようなリソースの無駄遣いを防げますし、 いろんな所から参照されても、情報は1つだと言うことは保障されるので、グローバルな管理データなんかを突っ込んでおくのに便利です。

もちろん自分で1個しか作らないとルール決めて運用して、それがキッチリ守られるのであれば、使う必要は無いんですが。 世の中には、うっかり聞いてないオレのやり方じゃない、などルールから外れてしまうことが多々あります。

なので、もう設計段階で作っておこうということですね。

実装概要

  1. シングルトンにしたいクラスにstaticなクラス変数を用意
    • これでグローバルでインスタンスが参照可能
  2. コンストラクタをprivateに指定
    • シングルトンクラス自身以外からコンストラクタの呼出し(newが使えなくなる)ができないようになる
  3. 外部よりインスタンスを取得するメソッドを用意

こうすれば、勝手にインスタンスを作れないので、インスタンスが1つであることが保障される訳です。

Unity C#で書いてみる

using UnityEngine;

public class Singleton  {

    private static Singleton instance = null;   //(1)

    private Singleton(){   //(2)
        Debug.Log("Constructor");
    }

    public static Singleton Instance {  //(3)
        get {

            if( instance == null ) instance = new Singleton();

            return instance;
        }
    }
}

利用する際には、

Singleton singleton = Singleton.Instance;

といった感じで引っ張ってもらったら、(3)のgetterのところで、nullだったらインスタンス作成。 既に存在する場合は、そのままインスタンスを返します。

まぁ、今回はシングルトンとはなんぞやってところの話なので、

実践的にUnityにシングルトンを実装しようとするなら、MonoBehaviourの話や、実行タイミングなども絡んできますので、いろいろ他に参考にするのが吉だとおもいます。

tsubakit1.hateblo.jp

Unity - コルーチンってなに?

f:id:xev:20150124023327p:plain

コルーチンとは?

通常は、関数が始まるとreturnされるまでを1セットとして処理される訳ですが、 コルーチンは、処理の途中で一旦中断して、次のフレームでその続きから再開できたりする事ができます。

たとえば、「フェードアウトさせたい!」と思って以下のコードを書いたとします。

void Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
    }
}

しかし、実際はこれだと突然消えるわけです。forの中でずっと透明度を変化させてますから、 forを抜けたときには見えなくなってます。

コルーチン使って処理中断

じゃあ、その時に役に立つのがコルーチン。戻り値に IEnumerator を指定して使います。

で、 yield return を内包させます。このyield returnのところで処理をUnityに返すわけです。 すると、透明度がちょっと変化した状態で描画され、そして、また次のフレームからforの処理が再開されるわけです。

IEnumerator Fade()
{
    for (float f = 1f; f >= 0; f -= 0.1f)
    {
        Color c = image.color;
        alpha = f;
        c.a = alpha;
        image.color = c;
        yield return new WaitForSeconds(.1f);
    }
}

あと、コルーチンを呼ぶときは↓の様に呼ぶ。

StartCoroutine("Fade");

これで徐々に変化していって消えていく処理ができます。

コルーチン便利。

http通信での利用例

前の投稿では、コルーチンをwwwの通信待機に使っています。

public IEnumerator Start(){
    // ダウンロード処理
    var www = WWW.LoadFromCacheOrDownload(url, 1);
    while (!www.isDone)
    {
        yield return null;
    }
}

参考

こんな感じで、通信が完了するまで待って待ってる間は、表示をいろいろしておく感じでつかえますかね。