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

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

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

いつもひよこのたまごをご利用下さいましてありがとうございます!
おかげ様でチュートリアル数も10ゲーム目となりました!
チュートリアル一覧は
こちら からどうぞ!


スポンサーリンク

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なメンバ変数を作成すれば、シーンを切り替えても値を保持することができます〜


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

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