▼そのUnityの作業、依頼しませんか?

【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サンプルゲーム】うちのポチが危ないところでフリスビーを要求する理由を教えてくれの本記事
【Unity3Dサンプルゲーム・チュートリアル】「フリスビーを犬に届けよ!」の概要【Unityチュートリアル・サンプルゲーム】Unityで3Dゲームを作りたいと考えている人、本やネットにあるUnityのチュートリアルをやってみたけど、いまいちゲームらしくないと思っている人、テキストでも動画でも学びたい人におすすめのチュートリアルです。...
ABOUT ME
さぎのみや
さぎのみや
超書手。現在はUnityメディア「ユニシャー」の運営とゲーム開発がメインです。Unity、ライティング関係のお仕事お待ちしております。 >>詳しいプロフィール >>Amazonほしいものリスト
【Unity3D】新しいサンプルゲーム(チュートリアル)を作りました!!!
Unity有料サンプルゲーム

「Unityで3Dゲームを本格的に作っていきたい!」という人におすすめのチュートリアルとなっています。

画像のようなゲームの作り方を販売しています。色々と応用できるサンプルゲームとなっています。ぜひ、作ってみてください。

詳細
>>【Unity3Dサンプルゲーム・チュートリアル】「フリスビーを犬に届けよ!」の概要

>>BOOTHでこのチュートリアルを見る

【RT・フォローであなたのスキルが上がる】

シェアフォローする

さぎのみやのモチベが上がる

コンテンツの質が上がる

あなたの能力も上がる

あなたの
Twitterでのシェア

であなたの能力が上がります。

>>さぎのみやのツイッター(@saginomiya8)

 

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


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