【Unity】他のシーンに切り替えてもオブジェクトを保持(BGMを鳴らし続ける)方法

  • 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);が重要ポイントです。

このスクリプトによって、シーン切り替え時もオブジェクトが守られます。

実行してみる

DontDestroyOnLoadを使って実行

実行しています。Hierarchyになにか追加されているのがわかりますか。それはスクリプトで書いた「DontDestroyOnLoad」の効果です。

 

補足:もしうまくいかない場合は【Scene in Build】にシーンを追加する

もしうまくいかない場合は【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を鳴らし続ける)方法でした。

あわせて読みたい
【Unity3Dサンプルゲーム・チュートリアル】「フリスビーを犬に届けよ!」の概要 【はじめに】 Unityでのゲーム開発を手助けするメディア「Unishar-ユニシャー」のさぎのみやです。「フリスビーを犬に届けよ!」というゲームのチュートリアルを作成し...
シーンを切り替えてもオブジェクトを保持する

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次