Last Updated 2025.04.03
初心者による週末Unity備忘録。
今回は、対戦シーンから対戦シーンへ移動する際は『同じBGM』を再生し続け、勝利したり、オプションで別のシーンへ移動した際にはBGMを切り替える方法を模索していました。
はじめに
まず、同じBGMを再生し続けたい場面を具体的に考えます。
対戦シーンから対戦シーンというのは、相手からセットポイントを奪ったあと、試合に決着がついていなければ次のラウンドへと移行したり、オプションメニューで状態をリセットした場合です。
大体の格ゲーでは対戦中はステージBGMが流れ続けるので、それをイメージしてみて下さい。
ストⅡみたいに、ステージBGM自体を1分前後にし、勝利ポーズ&スコアカウントで停止、次のラウンドはまた最初からというパターンもありますが、あれはBGMに序盤から印象に残る名調子があり、曲自体のインパクトやピンチになった時に曲が変化する演出があるから成立するものであって、大体の場合は、逐一途切れてしまうと没入感を損なってしまうと思います。
悪い具体例を挙げるとするなら、自分の場合は闘神伝2です。
DontDestroyOnLoad
BGMを変えたくない意図の話を終えたところで、具体的な方法を調べました。
大体のサイトで紹介されている方法は、BGMを鳴らすゲームオブジェクトを単体で用意し、そのオブジェクトにScene移動しても破棄されない──
DontDestroyOnLoad(gameObject);
をスクリプトとして張り付ける方法が紹介されています。
▼問題点
問題は、この方法『だけ』だとタイトルやキャラセレ画面、勝利シーンなどで、BGMを変更したい時に困ります。
また、オブジェクトが破棄されないため、対戦シーンから対戦シーンに移った際、破棄されずに残った音源オブジェクトとは別に、シーンに最初から設置されている音源も存在する状況になってしまうため、音源が重複して再生される ことになります。
ラウンドが進む度に音源が増殖していくので、それはもう酷いことに……
別のシーンに移動した際に発生する問題は、AudioSourceに設定されている曲をScene名で判定し、スクリプトから別の曲に差し替えたりも出来そうなんですが、Scene判定したり、AudioSourceの曲をスクリプトから変更する方法を、この時点では未修なので今回は掘り下げません。※後々必要になってくる予感はしたので試行錯誤はしました。数時間
今回の場合、流し続けたいのは対戦シーンだけなので、対戦シーン以外へScene移動する際には、推移直前に音源を『Destroy();』することにしました。
これでタイトルやキャラセレ画面に移った際は破棄されており、最初からSceneに設置されているAudioSource以外の曲が流れることはなくなります。
具体的な解決方法
音源の重複問題に関しては
『Static変数を使う』
という方法が各所に紹介されていたんですが──
Unity初心者にはまだ早すぎました(´・ω・`)
通ることには通って、無事にBGM重複問題は解消されたんですが、その後色々弄ってみて、自分が理解しきれていない関数を、見様見真似で組み込んでいる『危うさ』みたいなものとか、扱いきれてない実感があったので、似たような方法でぼんやりと
『void Awake段階でシーン検索して、重複してる音源オブジェクトの有無を判定できないだろうか』
と考え、色々調べてたら実践していた先人の方がいらっしゃいました。
この記事の一番下のトピックにあるコードの『MusicPlayer』部分を、自分が設置してる音源に置き換えて考えると、非常にシンプルかつ、自分が考えてたアプローチと合致した内容です。理解も……一応は出来てる筈。
おわりに
というわけで自力突破ではないのですが、シンプルで、初心者にも解る作例があったよ!というお話でした。
まだまだ勉強しないとですね……特にStatic関数。