シングルトンとは
シーンに1つしかないスクリプトには,FindとかGetComponentとかしなくても,簡単にアクセスできる!
手順
- SingletonMonoBehaviourというスクリプトをコピペ
- 対象となるスクリプトをシングルトンにする.
- 呼ぶ
1. SingletonMonoBehaviour
- SingletonMonoBehaviourという名前でスクリプトを作成
- 中のコードをCommand + AとDeleteで消去
- 以下のコードをコピペ
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 ();
}
}
演習
- 新しく,TestManagerという名前のスクリプトを作成しシングルトンにしよう
- TestManagerの中にpublicな関数を作成しよう.
- 別のスクリプトからTestManagerの関数を呼んでみよう.