2014年10月1日水曜日

Unityシングルトン。スクリプトやシーン間でのデータ共有

シングルトンで必要な機能。
一つの実体でいつでもどこからでもデータを保持受け渡しできること。
Unityのシングルトンにはいろいろと制約があるのでC#はJAVAに慣れている人でもリファレンスを見る必要があるかも。

以下のC#スクリプトを作成する。
Tukau1 シングルトンデータを使うクラス。どこに実装してもいい。
DataKanri 空のゲームオブジェクトに実装する。(ドラッグドロップ)
Kyouyuu 共有データ置き場。とりあえず変数mojiを共有。


データを実際に使用する場合
using UnityEngine;
using System.Collections;

public class Tukau1: MonoBehaviour {

void Start () {
DataKanri dk = DataKanri.Instance;
Debug.LogWarning (dk.moji");
                dk.moji="Tukau1"; 
       Debug.LogWarning (dk.moji");
}
}

データをゲームオブジェクトに関連付けて保持する
using UnityEngine;
using System.Collections;

public class DataKanri: Kyouyuu<DataKanri> {

void Awake(){
DontDestroyOnLoad (this);//シーン移動でゲームオブジェクトを破棄しない
}

// Use this for initialization

void Start () {

}

// Update is called once per frame
void Update () {

}

}

実際にデータを置く場所。
using UnityEngine;
using System.Collections;

public class Kyouyuu<T> : MonoBehaviour where T : Kyouyuu<T>
{
public string moji ="Kyouyuu";//必要なだけ変数を作ってOK。内部クラスを作っても良い

protected static T instance;
public static T Instance {
get {
if (instance == null) {
instance = (T)FindObjectOfType (typeof(T));

if (instance == null) {
Debug.LogWarning (typeof(T) + "インスタンス無いよ");
}
}

return instance;
}
}

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

Destroy(this);
return false;
}

protected void Awake()
{
CheckInstance();
}

}


適当なソースから使いやすそうなものをチョイスしました。
他にもシングルトンの書き方があるそうです。

0 件のコメント:

コメントを投稿