前提・実現したいこと
android向けのゲームを作っている途中ですが、(縦STG)
タイトルのシーンでBGMを流した後、それがほかのシーンに遷移してもBGMが途切れることなく流れ続けてほしいのですが、
途切れてしまいます
ほかのサイトを参考にしたサウンド管理クラスをアレンジすればその辺も調整できる気がするのですが、
いかんせんソースが複雑すぎて初心者にはちょっとわからないです・・・
SE再生やBGM再生などの面で高機能(らしい?)ので、できればこの管理クラスを使ってみたいです
どこをどのように直せばBGMのon/offをシーンをまたいで管理できるようになるのでしょうか?><
また、既存の使用方法から変更する必要がある場合は、使い方まで合わせて教えていただけるとありがたいです><
該当のソースコード
C#
1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4 5/// サウンド管理 6public class Sound { 7 8 /// SEチャンネル数 9 const int SE_CHANNEL = 4; 10 11 /// サウンド種別 12 enum eType { 13 Bgm, // BGM 14 Se, // SE 15 } 16 17 // シングルトン 18 static Sound _singleton = null; 19 // インスタンス取得 20 public static Sound GetInstance() { 21 return _singleton ?? (_singleton = new Sound()); 22 } 23 24 // サウンド再生のためのゲームオブジェクト 25 GameObject _object = null; 26 // サウンドリソース 27 AudioSource _sourceBgm = null; // BGM 28 AudioSource _sourceSeDefault = null; // SE (デフォルト) 29 AudioSource[] _sourceSeArray; // SE (チャンネル) 30 // BGMにアクセスするためのテーブル 31 Dictionary<string, _Data> _poolBgm = new Dictionary<string, _Data>(); 32 // SEにアクセスするためのテーブル 33 Dictionary<string, _Data> _poolSe = new Dictionary<string, _Data>(); 34 35 /// 保持するデータ 36 class _Data { 37 /// アクセス用のキー 38 public string Key; 39 /// リソース名 40 public string ResName; 41 /// AudioClip 42 public AudioClip Clip; 43 44 /// コンストラクタ 45 public _Data(string key, string res) { 46 Key = key; 47 ResName = "Sounds/" + res; 48 // AudioClipの取得 49 Clip = Resources.Load(ResName) as AudioClip; 50 } 51 } 52 53 /// コンストラクタ 54 public Sound() { 55 // チャンネル確保 56 _sourceSeArray = new AudioSource[SE_CHANNEL]; 57 } 58 59 /// AudioSourceを取得する 60 AudioSource _GetAudioSource(eType type, int channel = -1) { 61 if (_object == null) { 62 // GameObjectがなければ作る 63 _object = new GameObject("Sound"); 64 // 破棄しないようにする 65 GameObject.DontDestroyOnLoad(_object); 66 // AudioSourceを作成 67 _sourceBgm = _object.AddComponent<AudioSource>(); 68 _sourceSeDefault = _object.AddComponent<AudioSource>(); 69 for (int i = 0; i < SE_CHANNEL; i++) { 70 _sourceSeArray[i] = _object.AddComponent<AudioSource>(); 71 } 72 } 73 74 if (type == eType.Bgm) { 75 // BGM 76 return _sourceBgm; 77 } 78 else { 79 // SE 80 if (0 <= channel && channel < SE_CHANNEL) { 81 // チャンネル指定 82 return _sourceSeArray[channel]; 83 } 84 else { 85 // デフォルト 86 return _sourceSeDefault; 87 } 88 } 89 } 90 91 // サウンドのロード 92 // ※Resources/Soundsフォルダに配置すること 93 public static void LoadBgm(string key, string resName) { 94 GetInstance()._LoadBgm(key, resName); 95 } 96 public static void LoadSe(string key, string resName) { 97 GetInstance()._LoadSe(key, resName); 98 } 99 void _LoadBgm(string key, string resName) { 100 if (_poolBgm.ContainsKey(key)) { 101 // すでに登録済みなのでいったん消す 102 _poolBgm.Remove(key); 103 } 104 _poolBgm.Add(key, new _Data(key, resName)); 105 } 106 void _LoadSe(string key, string resName) { 107 if (_poolSe.ContainsKey(key)) { 108 // すでに登録済みなのでいったん消す 109 _poolSe.Remove(key); 110 } 111 _poolSe.Add(key, new _Data(key, resName)); 112 } 113 114 /// BGMの再生 115 /// ※事前にLoadBgmでロードしておくこと 116 public static bool PlayBgm(string key) { 117 return GetInstance()._PlayBgm(key); 118 } 119 bool _PlayBgm(string key) { 120 if (_poolBgm.ContainsKey(key) == false) { 121 // 対応するキーがない 122 return false; 123 } 124 125 // いったん止める 126 _StopBgm(); 127 128 // リソースの取得 129 var _data = _poolBgm[key]; 130 131 // 再生 132 var source = _GetAudioSource(eType.Bgm); 133 source.loop = true; 134 source.clip = _data.Clip; 135 source.Play(); 136 137 return true; 138 } 139 /// BGMの停止 140 public static bool StopBgm() { 141 return GetInstance()._StopBgm(); 142 } 143 bool _StopBgm() { 144 _GetAudioSource(eType.Bgm).Stop(); 145 146 return true; 147 } 148 149 /// SEの再生 150 /// ※事前にLoadSeでロードしておくこと 151 public static bool PlaySe(string key, int channel = -1) { 152 return GetInstance()._PlaySe(key, channel); 153 } 154 bool _PlaySe(string key, int channel = -1) { 155 if (_poolSe.ContainsKey(key) == false) { 156 // 対応するキーがない 157 return false; 158 } 159 160 // リソースの取得 161 var _data = _poolSe[key]; 162 163 if (0 <= channel && channel < SE_CHANNEL) { 164 // チャンネル指定 165 var source = _GetAudioSource(eType.Se, channel); 166 source.clip = _data.Clip; 167 source.Play(); 168 } 169 else { 170 // デフォルトで再生 171 var source = _GetAudioSource(eType.Se); 172 source.PlayOneShot(_data.Clip); 173 } 174 175 return true; 176 } 177} 178
追記
GameSystem.csはタイトルのシーン全体にobjectとして持っていたので、(つまりゲーム全体にかかっていた?)
新しく下記TitleControllerをタイトルシーンにのみアタッチしてStart()でPlayBgmするようにしてみましたが、
それでもなぜかアタッチしてないはずの別シーンに遷移するとBGMが一回切れて再度流れてしまいました・・・
これは、コードを変更したら一回どこかをクリーンする必要があるとか、そういう話なのでしょうか?。。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class TitleController : MonoBehaviour { 6 7 // Use this for initialization 8 void Start () { 9 Sound.LoadBgm("bgm01", "test_bgm01"); 10 Sound.PlayBgm("bgm01"); 11 } 12 13 // Update is called once per frame 14 void Update () { 15 16 } 17}
試したこと
シングルトンにすればいい、や、DontDestoyメソッド?を使えばシーンをまたげると調べたのですが、
サウンド管理クラス中ですでにどちらも使っているにもかかわらず、
BGMを再生するとシーンをまたいだタイミングでBGMがいったんきれるので、お手上げです。。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/17 07:25
2018/09/17 08:47
2018/09/17 08:59
2018/09/17 10:35
2018/09/17 20:20
2018/09/18 11:28
2018/09/18 11:48
2018/09/18 11:57
2018/09/18 19:39
2018/09/19 05:05
2018/09/19 16:04
2018/09/19 22:13
2018/09/20 12:08
2018/09/20 12:16
2018/09/20 20:57
2018/09/24 09:11
2018/09/24 09:41