【マリオカート8】スカイガーデン 切り替わりBGM
http://www.nicovideo.jp/watch/sm24324337
こーいうのやるとき用のメモ。
マリカーでは雲の中に入った時に曲がスッと切り替わってました。カッチョイイ
再生デモ
BGM切り替え。マリカのスカイガーデンBGMでやってみた
— 白金バーガー (@flankids) 2017年11月29日
AudioSource2つ再生させてるのってぶっちゃけ負荷的に良くない気がしてるけどとりあえず pic.twitter.com/CvSTOUsBxc
こんな感じで、MixRateという変数で管理。実際にはゲーム内の状況を監視して切り替える別なマネージャーから操作するようにすべきかと。
実装
using UnityEngine;
public class SwitchAudio : MonoBehaviour {
[SerializeField]
private AudioSource[] _audios;
/// <summary>
/// BGMの混ぜ具合。0ならSound1、1ならSound2になる
/// </summary>
[Range(0, 1)]
public float _mixRate = 0;
public void Play() {
_audios[0].Play();
_audios[1].Play();
}
private void Update () {
_audios[0].volume = 1f - _mixRate;
_audios[1].volume = _mixRate;
}
}
▼コンポーネント設定はこんな感じ
Sound1、Sound2にそれぞれAudioSouceコンポーネントを設定し、再生したいサウンドファイルを入れてます。
AudioSouceコンポーネントの取得方法や、AudioClipの設定方法は適宜カスタムという感じで(直接入れるのはダサいので)
※注意点1
AudioSouceコンポーネントはInspector上でどちらも「Play On Awake」を false にしてます。
Playメソッドを使って再生開始。Play On Awakeに任せると、読み込みで再生タイミングがズレそう。
課題点
1.負荷
2つのAudioSourceが常時再生されてるのは負荷的にアレだと思うので、せめてMixRateが 0 or 1 のときはもう一方のAudioSourceの再生を止めるべきかと
0 < MixRate < 1 のときは、再生中のAudioSourceの再生時間(time)を止めていたほうに反映して、すぐに同期を取るようにすれば大丈夫そう
2.3つ以上のAudio管理
AudioClipの参照を持たせておけば、AudioSouce2つのままで実現できそう。ただし、同時再生は2曲までで、切り替え対象を3つ以上、という仕様に限る。
実装する場合、1 or 0 のときに再生されてない方のAudioSourceに遷移対象のClipを設定する感じになるかと
こぼれ話
ストリートファイターVのBGM切り替え表現もやってみたい
ステージごとに6種類の曲が用意されていて、
・1ラウンド目
・1ラウンド目 - どちらかの体力が一定以下
・1ラウンド目終了(ME)
・2、3ラウンド目
・2、3ラウンド目 - どちらかの体力が一定以下
・決着(ME)
という感じで構成されてます。
それぞれ、記載してる状況になると自動的に曲が切り替わるんですが、クロスフェードではなく、曲の拍(テンポ)を見て良きタイミングで切り替わっていて、対戦開始~終わりまで一つの長い曲に錯覚するような仕組みになってます。
この動画の1試合目の滝ステージの曲が好き
https://youtu.be/v4MhhIMZKEo?t=25s
バラして並べてある動画上がってました
https://www.youtube.com/watch?v=u0-Szhv5B40
こういうのってCRIWAREとかにサクッと実装できる機能があったりするのかな・・・?
お手製でやるとしたらBPMをサウンドクリエイターから聞いて、条件を満たしていて、かつBPMから計算した"切り替えしてよい拍"でパッと切り替えるようにする感じになるかな