【Unity】シーンをまたいでBGMを鳴らし続ける
machokoさんゲームは、タイトルからエンディングまで、一貫して同じBGMが流れ続けています。
ゲームシーンは①タイトル②チュートリアル③ゲーム④エンディングの4つありますが、同じBGMを途切れさせずに流し続ける方法をご紹介します。
DontDestroyOnLoad指定する
BGMを途絶えさせたくない場合、BGMのAudioSourceを持つGameObjectをシーン切り替え時に削除しなければ良いわけです。
GameObjectを削除しないようにするには、DontDestroyOnLoadメソッドを使用します。
こんな感じに実装してやります。
ところが、これだけだとGameObjectが削除されないために、同じシーンを再度ロードした際にGameObjectがもう1個生成されてしまいます。
static変数を活用する
この現象を避けるために、static変数を利用します。
static変数とは、プログラム内で唯一の実態を持つ変数です。たとえば、staticなフィールドを持つクラスを複数作成したとします。クラスが複数できてもstaticなフィールド自体は実態が1つしか存在しないため、 クラス全員で同じ唯一の値を参照できることになります。
static変数を使って、GameObjectがすでに生成されていた場合に自らを破棄するプログラムを書いてみます。
こうすることで、シーンをまたいでBGMを鳴らし続けることができます。
これはAudioSourceに限らず、シーンをまたいでGameObjectを使用したい場合に有効な手段となります。
結論
- 新しいシーンのロード時にGameObjectを破棄したくない場合、DontDestroyOnLoadを使う
- DontDestroyOnLoadを使う際は、シーン再ロードでGameObjectが増殖しないようにする必要がある
- static変数は、プログラム内で唯一の実態を持つ変数