Unity

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

More than 1 year has passed since last update.

シングルトンとは

シーンに1つしかないスクリプトには,FindとかGetComponentとかしなくても,簡単にアクセスできる!

手順

  1. SingletonMonoBehaviourというスクリプトをコピペ
  2. 対象となるスクリプトをシングルトンにする.
  3. 呼ぶ

1. SingletonMonoBehaviour

  1. SingletonMonoBehaviourという名前でスクリプトを作成
  2. 中のコードをCommand + AとDeleteで消去
  3. 以下のコードをコピペ
using UnityEngine;
using System;

public abstract class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour{

    private static T instance;
    public static T Instance
    {
        get{
            if (instance == null) {
                Type t = typeof(T);

                instance = (T)FindObjectOfType (t);
                if (instance == null) {
                    Debug.LogError (t + " をアタッチしているGameObjectはありません");
                }
            }

            return instance;
        }
    }

    virtual protected void Awake(){
        // 他のゲームオブジェクトにアタッチされているか調べる
        // アタッチされている場合は破棄する。
        CheckInstance();
    }

    protected bool CheckInstance(){
        if (instance == null) {
            instance = this as T;
            return true;
        } else if (Instance == this) {
            return true;
        }
        Destroy (this);
        return false;
    }
}

2. 対象となるスクリプトをシングルトンにする.

ここでは,GameManagerというスクリプトをシングルトンにする.

元のスクリプト

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {

    public void Test(){
        Debug.Log ("シングルトン!");
    }
}

編集後

using UnityEngine;
using System.Collections;

public class GameManager : SingletonMonoBehaviour<GameManager> {

    public void Test(){
        Debug.Log ("シングルトン!");
    }
}

MonoBehaviourの部分がSingletonBehaviourに変わっています.

関数の呼び方

using UnityEngine;
using System.Collections;

public class TestScript : MonoBehaviour {

    void Start () {
        // クラス名.Instance.関数
        GameManager.Instance.Test ();
    }
}

演習

  1. 新しく,TestManagerという名前のスクリプトを作成しシングルトンにしよう
  2. TestManagerの中にpublicな関数を作成しよう.
  3. 別のスクリプトからTestManagerの関数を呼んでみよう.