現場レベルのゲーム制作が、すべてここで学べます。
この講座はUnity 初心者向けノンフィールドRPGの作り方講座の第3回です。
前回はTextMeshProやButtonオブジェクトを配置してタイトルシーンを作成しました。
前回の記事:

第3回ではタイトルシーンから別のシーンに移行するためのスクリプトや音楽を再生する機能を実装します。
シングルトンを使ってシーン遷移処理をゲームマネージャーに実装する
Unityではシーン遷移する場合、まず遷移前のシーンにあるゲームオブジェクトを全て破壊します。その後、遷移後のシーンに配置されたゲームオブジェクトの初期化処理が始まります。
ですが、この仕組みだとあるシーンから別のシーンへデータを保持したまま遷移することができません。ゲーム中でデータを引継ぎながら処理したいときは結構多いです。
そんなときの対応方法はいくつかありますが、よく使われるのがシングルトンというオブジェクトの設計手法です。
シングルトンは「インスタンスが1つしか存在しないことを保証するデザインパターン」です。
ゲーム制作では”どのシーンからでも共通して使えるデータ管理オブジェクト”を作る際に重宝されます。
プレイヤーの所持金、ステージ進行度、設定情報など、シーンが変わっても残しておきたいデータを扱いたい場合にシングルトンは非常に有効です。
今回はGameManagerオブジェクトに”シーンが変わっても残しておきたいデータを管理する”機能を担ってもらいます。
そのためGameManagerクラスをシングルトン設計にします。これでどのシーンからでもアクセスできるようにします。
実際のシーンの遷移処理もGameManagerクラスで行います。
それでは、実際にGameManagerクラスを書き換えていきましょう。
GameManager.cs
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
using UnityEngine; using UnityEngine.SceneManagement; public enum SceneCode { Title, Dungeon, Battle, End, Start } public class GameManager : MonoBehaviour { public static GameManager Instance;// 静的な変数 // Startメソッドより先に呼び出される private void Awake() { if (Instance == null) { Instance = this;// 実体化されたらいつでもアクセス可能 DontDestroyOnLoad(gameObject);// シーンをまたいでもオブジェクトは消えない } else { Destroy(gameObject);// すでに存在していたら削除 } } // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { } // Update is called once per frame void Update() { } public static void LoadScene(SceneCode sceneCode) { SceneManager.LoadScene(sceneCode.ToString()); } } |
↑黄色く色付けしたところが新しく追加した命令になります。
まず、シーンをロードするLoadSceneメソッドを使えるようにusing文でUnityEngine.SceneManagementを追加しました。
次に、シーンファイルの名前をenum型で定義しておきます。LoadSceneメソッドは遷移したいシーンを文字列で指定して使いますが、この際に書き間違いによるエラーを防ぐためです。
定義する文字列は必ずシーンファイル名と同じにしておきます。
例えばSceneManager.LoadScene(“Tilte”) のようにスペルミスがあると、実行時エラーが発生してしまいます。enumを使えばコンパイル時にエラーを検出できるため安全性が高まります。
シーンの名前がenum型の中で集中管理されていることで、シーン遷移の設計が把握しやすくなり、複雑なゲームになった場合でも保守しやすくなります。
LoadSceneメソッドでは受け取ったSceneCode型の引数を文字列に変換してLoadSceneメソッドに渡します。またこのメソッドは静的メソッドとして定義します。これは後の講座で実装しますがGameManagerが実体化される前に呼び出す予定だからです。
また、シングルトン設計を行っている箇所が
public static GameManager Instance;
private void Awake() { ~~~ }
の部分です。staticを付けたオブジェクトは静的オブジェクトとなり、このクラス以外どこからでも参照可能になります。
Awakeはゲームシーンが始まったら真っ先に実行する処理を意味しています。
Awakeの中の命令の書き方はイディオムのようなもので、一度も作られてなければ生成し、このクラスから作られるインスタンスが消えないようにする。既に存在している場合は自身を削除してインスタンスが2つ以上存在しないことを保証します。
この機能を与えるイディオムをシングルトンパターンと呼びます。
ここまでスクリプトを変更できたら一度Unityで再生ボタンを押してみましょう。

Hierarchy画面でGameManagerオブジェクトが他とは異なり、DontDestroyOnLoadというところに存在していることがわかります。
DontDestroyOnLoadはこのシーンが終わっても破壊されないで残るオブジェクトを意味しています。
オーディオ再生機能をSoundManagerに実装する
オーディオの再生はSoundManagerが処理します。SoundManagerもGameManagerと同様どこからでもアクセスできるシングルトン設計にします。
SoundManager.cs
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
using UnityEngine; public class SoundManager : MonoBehaviour { public static SoundManager Instance; private AudioSource audioSource; public AudioClip TitleBGM;// タイトルBGM public AudioClip TouchSE;// タッチ効果音 private void Awake() { if (Instance == null) { Instance = this; audioSource = GetComponent<AudioSource>();// コンポーネントの取得 DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { } // Update is called once per frame void Update() { } private void PlayBgm(AudioClip audioClip) { if (audioSource.clip == audioClip) return;// すでに再生されているBGMなら処理しない audioSource.clip = audioClip; audioSource.Play(); } public void PlayTitleBGM() { PlayBgm(TitleBGM); } public void PlayTouchSE() { audioSource.PlayOneShot(TouchSE); } } |
まずはゲームで音声を使えるようにするためにpublic AudioClip ~~を宣言します。
BGMを再生する際は同じ曲(AudioClip)を引き続き再生した場合でも曲の最初から再生されないようにif文で処理しています。単にaudioSource.Play()を呼び出すよりゲームとして仕上がりが良くなります。
効果音の再生では、元々用意されているPlayOneShotメソッドを呼び出しています。
AudioClipをSoundManagerコンポーネントにアタッチする
Unityではドラッグ&ドロップでオブジェクトやスクリプトをコンポーネントに紐づけることをアタッチといいます。
ここではHierarchyウィンドウにあるSoundMangerオブジェクトを選択してInspectorビューを表示し、BGMやSEをアタッチしていきます。

↑Inspectorビューを表示した状態。
まとめ
ここまででタイトルシーンで画面をタッチ(クリック)するとタイトルシーンからダンジョンシーンに遷移するようになりました。

次回からダンジョンシーンを制作していきます。
次の記事:

現場レベルのゲーム制作が、すべてここで学べます。






コメント