Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity開発】シングルトン(Singleton)パターンまとめ【ひよこエッセンス】

Unity5.1.1f1 Personal(2015年6月)
f:id:hiyotama:20150624205139p:plain


ひよこエッセンスの時間です〜

今回はシングルトンについて解説していきます〜

シングルトン(Singleton)パターンまとめ


シングルトンは、インスタンスが重複しないようにスクリプトで管理します〜
また、シングルトンはどこからでもアクセスできる形で使います〜
Unityで使う場合はGameManagerやAudioManager等、〜Managerという形で使われることが多いです〜


今回はAudioManagerを作成して、Sceneを遷移しても演奏が継続されるシングルトンパターンを作成していきます〜


①シーンとシーン切替ボタンの作成
まずはTitleシーンを作成します〜以下エッセンスをご参照下さい〜

hiyotama.hatenablog.com


続いて、Sceneを切替えるボタンを作成します〜こちらもエッセンスをご参照下さい〜

hiyotama.hatenablog.com


ButtonのTextは「Call Main」にし、

f:id:hiyotama:20150625125936p:plain

ButtonにCallMainスクリプトを取り付けます〜

using UnityEngine;
using System.Collections;

public class CallMain : MonoBehaviour {

	public void MainSceneCall () {
		Application.LoadLevel("Main");
	}
}

CallMain.cs


ButtonコンポーネントのOn Clickに、作成したCallMainスクリプトのMainSceneCallメソッドを指定します〜


f:id:hiyotama:20150625125725p:plain


次にBuild SettingsにてTitleシーンをAdd Currentします〜


f:id:hiyotama:20150625125839p:plain
TitleシーンをAdd Current


続いてMainSceneを作成します〜先ほどと同様シーンを作成し、Buttonを作成し、ButtonのText部分を「Call Title」にして下さい〜

f:id:hiyotama:20150625130037p:plain

次にCallTitleスクリプトを取り付けます〜

using UnityEngine;
using System.Collections;

public class CallTitle : MonoBehaviour {

	public void TitleSceneCall () {
		Application.LoadLevel("Title");
	}
}

CallTitle.cs


ButtonコンポーネントのOn Clickにて、CallTitleスクリプトのTitleSceneCallメソッドを指定します〜


f:id:hiyotama:20150625130231p:plain


最後にBuild SettingsにてMainシーンをAdd Currentします〜

f:id:hiyotama:20150625130324p:plain
MainシーンをAdd Current


以上でボタンによるシーンの切替機能の実装が完了しました〜


②シングルトンパターンのAudioManager作成
それではAudioManagerを作成していきます〜HierarchyビューからCreate > Create Emptyを選択し、名前をAudioManagerにします〜

f:id:hiyotama:20150625130611p:plain


続いてInspectorビューのAdd Componentから、Audio > Audio Sourceを選択します〜
Audio SourceのPlay On Awakeのチェックだけ外しておいて下さい〜


f:id:hiyotama:20150625130746p:plain
Play On Awakeはチェックを外す


続いてAudioManagerスクリプトを作成し取り付けます〜以下ソースです〜

using UnityEngine;
using System.Collections;

public class AudioManager : MonoBehaviour {
	//static: 新しくインスタンス化しても変数の中身を保持する
	public static AudioManager instance;
	public AudioClip audioClip;
	AudioSource audioSource;
	
	void Awake ()
	{
		//AudioManagerインスタンスが存在したら
		if (instance != null) {
			//今回インスタンス化したAudioManagerを破棄
			Destroy(this.gameObject);
		//AudioManagerインスタンスがなかったら
		} else if (instance == null){
			//このAudioManagerをインスタンスとする
			instance = this;
		}
		//シーンを跨いでもAudioManagerインスタンスを破棄しない
		DontDestroyOnLoad (this.gameObject);
	}
	//指定したBGMを再生する
	void Start () {
		audioSource = GetComponent<AudioSource>();
		audioSource.clip = audioClip;
		audioSource.Play();
	}
}

AudioManager.cs


public変数であるaudioClipに適当なBGMをAsset Store等でダウンロードして指定します〜


f:id:hiyotama:20150625131352p:plain
Asset Storeのオーディオ欄を選択


f:id:hiyotama:20150625131508p:plain
値段順にすると無料のものもたくさんある


ダウンロード・インポートが完了したら、BGMをドラッグ&ドロップしてaudioClip変数に指定します〜


f:id:hiyotama:20150625131639p:plain
ドラッグ&ドロップ!


Awakeの中でシングルトンパターンを実装しています〜staticなAudioManagerの変数instanceが既に存在していたら今回生成されたAudioManagerは破棄し、存在していなかったら保持することで、インスタンスが常に1つであることを保証します〜


またDontDestroyOnLoadによって、TitleシーンからMainシーンなど、シーンを跨いでもインスタンスは破棄されないため、Audioの再生が途切れることもありません〜

変数の値を保持したい時もstaticなメンバ変数を作成すれば、シーンを切り替えても値を保持することができます〜


以上、ひよこエッセンスでした〜

ありがとうございました〜