- Unityでシーンを切り替えたときにもBGMが流れている状態にしたい
そんなときはシーンを切り替えてもオブジェクトが破壊されないようにすれば良いのです。
この記事ではBGMを例に、シーンを切り替えてもオブジェクトが破壊されないようにする方法をお伝えします。
【Unity】他のシーンに切り替えてもオブジェクトを保持(BGMを鳴らし続ける)方法
こんな状態
- 「Scene1」→「Scene2」に切り替える
- Scene1で再生した音楽をそのままScene2でも流したい
- Scene1で音楽を再生するオブジェクトがScene2にいったときに、破壊されなきゃいい
すでに音楽を再生するオブジェクトができているものとします。音楽を再生するオブジェクトとは【AudioSource】コンポーネントがついているオブジェクトのことです。
音楽を再生しているオブジェクトにスクリプトをつける
【音楽を再生するオブジェクト】→【Add Component】→
【New Script】→【名前はMusicPlayer(なんでもいい)】
ますは音楽を再生する(AudioSourceがついている)オブジェクトにスクリプトをつけます。名前はなんでもいいですが、ここでは「MusicPlayer.cs」スクリプトとしておきます。
オブジェクトを保持するスクリプトを書く
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class MusicPlayer : MonoBehaviour {
private void Awake() {
DontDestroyOnLoad(gameObject);
}
// Use this for initialization
void Start () {
Invoke("LoadScene", 3f);
}
void LoadScene(){
SceneManager.LoadScene("Scene2");
}
}
using UnityEngine.SceneManagement; | Scene関係の処理をするときに必要なライブラリ |
DontDestroyOnLoad(gameObject); | アタッチされているオブジェクトがシーンを切り替えたときに破壊されないにする |
Invoke("LoadScene", 3f); | 3秒後に「LoadScene」メソッドを実行 |
SceneManager.LoadScene("Scene2"); | 「Scene2」を読み込み。自分のシーン名をいれてください。 |
DontDestroyOnLoad(gameObject);が重要ポイントです。
このスクリプトによって、シーン切り替え時もオブジェクトが守られます。
実行してみる
実行しています。Hierarchyになにか追加されているのがわかりますか。それはスクリプトで書いた「DontDestroyOnLoad」の効果です。
補足:もしうまくいかない場合は【Scene in Build】にシーンを追加する
【File】→【Build Settings】→【Sceneを追加】
Sceneを追加しています。
シーンがはじめから最後まで終わり、もう一度戻るときに保護したオブジェクトがもう1つできてしまう
今のままですと「Scene1」から「Scene2」までいくまではいいですが、「Scene2」から「Scene1」に戻るときに、MusicPlayerがもう一つできてしまいます。保護したオブジェクトがもう1つできてしまうというわけです。
その場合は次のようなスクリプトを書くことで対処できます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class MusicPlayer : MonoBehaviour {
private void Awake() {
int numMusicPlayers = FindObjectsOfType<MusicPlayer>().Length;
if (numMusicPlayers > 1)
{
Destroy(gameObject);
}
else
{
DontDestroyOnLoad(gameObject);
}
}
}
このようなスクリプトで保護されているオブジェクトが増えることがなくなります。
まとめ
- BGMを再生するオブジェクトがシーンを切り替えたときに破壊されなければ良い
- 【DontDestroyOnLoad】を使うことでオブジェクトを保持できる
以上、他のシーンに切り替えてもオブジェクトを保持(BGMを鳴らし続ける)方法でした。
コメント