方法幾つかありますが、まず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 04:45
2018/08/02 06:32
退会済みユーザー
2018/08/02 10:50
退会済みユーザー
2018/08/02 14:25
2018/08/03 01:30
退会済みユーザー
2018/08/03 05:57