【Unity開発】シングルトン(Singleton)パターンまとめ【ひよこエッセンス】
Unity5.1.1f1 Personal(2015年6月)
ひよこエッセンスの時間です〜
今回はシングルトンについて解説していきます〜
シングルトン(Singleton)パターンまとめ
シングルトンは、インスタンスが重複しないようにスクリプトで管理します〜
また、シングルトンはどこからでもアクセスできる形で使います〜
Unityで使う場合はGameManagerやAudioManager等、〜Managerという形で使われることが多いです〜
今回はAudioManagerを作成して、Sceneを遷移しても演奏が継続されるシングルトンパターンを作成していきます〜
①シーンとシーン切替ボタンの作成
まずはTitleシーンを作成します〜以下エッセンスをご参照下さい〜
続いて、Sceneを切替えるボタンを作成します〜こちらもエッセンスをご参照下さい〜
ButtonのTextは「Call Main」にし、
ButtonにCallMainスクリプトを取り付けます〜
using UnityEngine; using System.Collections; public class CallMain : MonoBehaviour { public void MainSceneCall () { Application.LoadLevel("Main"); } }
CallMain.cs
ButtonコンポーネントのOn Clickに、作成したCallMainスクリプトのMainSceneCallメソッドを指定します〜
次にBuild SettingsにてTitleシーンをAdd Currentします〜
TitleシーンをAdd Current
続いてMainSceneを作成します〜先ほどと同様シーンを作成し、Buttonを作成し、ButtonのText部分を「Call Title」にして下さい〜
次にCallTitleスクリプトを取り付けます〜
using UnityEngine; using System.Collections; public class CallTitle : MonoBehaviour { public void TitleSceneCall () { Application.LoadLevel("Title"); } }
CallTitle.cs
ButtonコンポーネントのOn Clickにて、CallTitleスクリプトのTitleSceneCallメソッドを指定します〜
最後にBuild SettingsにてMainシーンをAdd Currentします〜
MainシーンをAdd Current
以上でボタンによるシーンの切替機能の実装が完了しました〜
②シングルトンパターンのAudioManager作成
それではAudioManagerを作成していきます〜HierarchyビューからCreate > Create Emptyを選択し、名前をAudioManagerにします〜
続いてInspectorビューのAdd Componentから、Audio > Audio Sourceを選択します〜
Audio SourceのPlay On Awakeのチェックだけ外しておいて下さい〜
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等でダウンロードして指定します〜
Asset Storeのオーディオ欄を選択
値段順にすると無料のものもたくさんある
ダウンロード・インポートが完了したら、BGMをドラッグ&ドロップしてaudioClip変数に指定します〜
ドラッグ&ドロップ!
Awakeの中でシングルトンパターンを実装しています〜staticなAudioManagerの変数instanceが既に存在していたら今回生成されたAudioManagerは破棄し、存在していなかったら保持することで、インスタンスが常に1つであることを保証します〜
またDontDestroyOnLoadによって、TitleシーンからMainシーンなど、シーンを跨いでもインスタンスは破棄されないため、Audioの再生が途切れることもありません〜
変数の値を保持したい時もstaticなメンバ変数を作成すれば、シーンを切り替えても値を保持することができます〜
以上、ひよこエッセンスでした〜
ありがとうございました〜