質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

20133閲覧

UnityでシーンによってBGMを消したりつけたりしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

2クリップ

投稿2018/08/01 13:21

Unityでブロック崩しを作っています。SceneはTitle,Menu,Mainの3つを作っていて、TitleとMenuでは同じBGMを流し(これは出来ました。)、MenuからMainに遷移したときに違うBGMに差し替え、MainからMenuに遷移したらMenuで流れていたBGMに戻すということをしたいのですが、

using

1using System.Collections.Generic; 2using UnityEngine; 3using UnityEngine.SceneManagement; 4 5public class SoundManager : MonoBehaviour { 6 7 public bool DontDestroyEnabled = true; 8 9 private void Start() 10 { 11 if (DontDestroyEnabled) 12 { 13 DontDestroyOnLoad(this);//遷移しても流し続ける 14 } 15 16 } 17 void Update() 18 { 19 20 21 22 } 23} 24 25コード

上記のコードを使う場合BGMはどう消せばよいのでしょうか、また消したBGMを最初から流すにはどうしたらよいか、MainからMenuへ遷移してMenuからTitleへ遷移したとき上記のコードを使うにはどうしたらよいかも教えていただきたいです。使っている音源はループ再生するものです。上記のコードを使う場合で特定のSceneだけ音を消すのは調べてもわからなかったので質問させていただきました。

shepherd09👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

方法幾つかありますが、まずUnityの仕様確認から。

  • 音はAudioSourceというコンポーネントによって鳴る
  • AudioSourceコンポーネントのAudioClipでどの音を鳴らすか決定する
  • GameObjectはシーンが切り替わると破棄される
  • DontDestroyOnLoadを付けたGameObjectはシーンが切り替わっても破棄されない

シーン切り替え時に音が止まるのはAudioSourceが付いたGameObjectが破棄されるからであって、こいつで音を制御するのはあんまりスマートではありません。
(出来なくはないけど負荷が上がるし面倒臭い)

なので**「AudioSourceが付いたGameObjectは破棄しない」「切り替え処理は全てスクリプトでAudioSourceコンポーネントを利用してやる」**という方針を立てます。
とりあえず実装方法2つ挙げるのでお好みでどうぞ。(※MenuからTitleには戻らない想定です)

###方法A.全てのBGM分のAudioSourceを作るパターン
0. 全てのBGM分のGameObjectを用意して、それぞれAudioSourceを付けます。(親子関係作っておくと分かりやすい)
0. 最初に使用するBGM以外のAudioSourceの「Play On Awake」はオフにしておきます。
0. 以下のスクリプトを適当なオブジェクト(管理オブジェクトと呼称)に付けます。
0. 管理オブジェクトのインスペクターにて各BGMのGameObjectをドラッグ&ドロップします。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; //必要です!! 5 6public class SoundManager : MonoBehaviour { 7 8 //ヒエラルキーからD&Dしておく 9 public AudioSource BGM_title; 10 public AudioSource BGM_main; 11 12 //1つ前のシーン名 13 private string beforeScene = "Title"; 14 15 // Use this for initialization 16 void Start () { 17 //自分と各BGMオブジェクトをシーン切り替え時も破棄しないようにする 18 DontDestroyOnLoad(gameObject); 19 DontDestroyOnLoad (BGM_title.gameObject); 20 DontDestroyOnLoad (BGM_main.gameObject); 21 22 //シーンが切り替わった時に呼ばれるメソッドを登録 23 SceneManager.activeSceneChanged += OnActiveSceneChanged; 24 } 25 26 //シーンが切り替わった時に呼ばれるメソッド 27 void OnActiveSceneChanged ( Scene prevScene, Scene nextScene ) { 28 //シーンがどう変わったかで判定 29 30 //メニューからメインへ 31 if (beforeScene == "Menu" && nextScene.name == "Main") { 32 BGM_title.Stop (); 33 BGM_main.Play (); 34 } 35 36 //メインからメニューへ 37 if (beforeScene == "Main" && nextScene.name == "Menu") { 38 BGM_main.Stop (); 39 BGM_title.Play (); 40 } 41 42 //遷移後のシーン名を「1つ前のシーン名」として保持 43 beforeScene = nextScene.name; 44 } 45} 46

参考:【Unity】シーンが遷移したことを検知する - おもちゃラボ

###方法B.AudioSource1つを使い回すパターン
0. GameObjectにAudioSourceを付けます。
0. AudioSourceのAudioClipは空に、「Play On Awake」はオフにしておきます。
0. 以下のスクリプトをそのGameObjectに付けます。
0. そのGameObjectのインスペクターにて、使用するAudioClipをドラッグ&ドロップします。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; //必要です!! 5 6public class SoundManager : MonoBehaviour { 7 8 //ヒエラルキーからD&Dしておく 9 public AudioClip BGM_title; 10 public AudioClip BGM_main; 11 12 //使用するAudioSource 13 private AudioSource source; 14 15 //1つ前のシーン名 16 private string beforeScene = "Title"; 17 18 // Use this for initialization 19 void Start () { 20 //自分をシーン切り替え時も破棄しないようにする 21 DontDestroyOnLoad(gameObject); 22 23 //使用するAudioSource取得 24 source = GetComponent<AudioSource> (); 25 26 //最初のBGM再生 27 source.clip = BGM_title; 28 source.Play(); 29 30 //シーンが切り替わった時に呼ばれるメソッドを登録 31 SceneManager.activeSceneChanged += OnActiveSceneChanged; 32 } 33 34 //シーンが切り替わった時に呼ばれるメソッド 35 void OnActiveSceneChanged ( Scene prevScene, Scene nextScene ) { 36 //シーンがどう変わったかで判定 37 38 //メニューからメインへ 39 if (beforeScene == "Menu" && nextScene.name == "Main") { 40 source.Stop (); 41 source.clip = BGM_main; //流すクリップを切り替える 42 source.Play (); 43 } 44 45 //メインからメニューへ 46 if (beforeScene == "Main" && nextScene.name == "Menu") { 47 source.Stop (); 48 source.clip = BGM_title; //流すクリップを切り替える 49 source.Play (); 50 } 51 52 //遷移後のシーン名を「1つ前のシーン名」として保持 53 beforeScene = nextScene.name; 54 } 55}

※ファイルサイズ等により音途切れるかも?(あと毎回ロードの為にちょっと間が開くかも)
日々の流れ:<Unityメモ>状況によってBGMを切り替える - livedoor Blog(ブログ)

投稿2018/08/02 03:02

編集2018/08/03 01:29
sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/02 04:45

丁寧にありがとうございます!TitleとMenuは2dでMainは3dで作っているためまだ試せてませんが出来そうなので頑張ります!
退会済みユーザー

退会済みユーザー

2018/08/02 10:50

すみません、先ほどUIができたのでAを試したところできませんでした。AudioSourceは必ず空のGameObjectを作って親子関係で入れないといけないのでしょうか、AudioSource単体でヒエラルキーに入れてます。
退会済みユーザー

退会済みユーザー

2018/08/02 14:25

Bも試しましたがこちらはそもそも音が出ません。
sakura_hana

2018/08/03 01:30

prevSceneは通常常にnullになるんでした。 過去に自分で回答しておいてSceneManager.activeSceneChangedの仕様忘れてました。 https://teratail.com/questions/106743 プログラム修正したのでこちらを使ってみてください。 >AudioSourceは必ず空のGameObjectを作って親子関係で入れないといけないのでしょうか 親子関係にしてもしなくても構いません。お好みでどうぞ。 >方法B 最初の音流すコード入れ忘れてました。こちらもプログラム修正しました。
退会済みユーザー

退会済みユーザー

2018/08/03 05:57

成功しました!本当にありがとうございます!!ちなみになんですが、prevSceneは使ってないと思うので消しても大丈夫でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問