この記事でのバージョン
Unity 2017.3.1f1
はじめに
現状、UnityではBGMをイントロ付きループ再生させる事が標準機能では出来ません。
一応Wavファイルにループポイントを設定する事で実現出来るそうですが、
そもそもWavファイルは非圧縮で容量が大きくなるため、BGMには不向きです。
なので今回はプログラム(2行)でイントロ付きループ再生をする方法を紹介したいと思います!
なお、イントロとループの音源が別れている場合のやり方ですので、あしからず。
余談ですが、一つの音源でイントロ付きループ再生が出来るアセットもあるようです。(未確認)
Introloop - Asset Store |
また、かの有名なCRIWAREをUnityで使う事も出来るようです。(未確認)
CRI ADX2 Unity Plugin/AssetStore - Asset Store |
------------追記
CRIWAREには個人や学生等向けに無料ライセンス(CRI ADX2 LE)もあるようです!
------------追記おわり
イントロ付きループBGMの再生
さっそくですがプログラムです。タイトル通り(掲載しているコード部分は)2行です!
/*_introAudioSourceも_loopAudioSourceもAudioSource、AudioClipは設定済み*/ //イントロ部分の再生開始 _introAudioSource.PlayScheduled(AudioSettings.dspTime); //イントロ終了後にループ部分の再生を開始 _loopAudioSource.PlayScheduled (AudioSettings.dspTime + ((float)_introAudioSource.clip.samples / (float)_introAudioSource.clip.frequency));
AudioSource-PlayScheduled - Unity スクリプトリファレンス
Unity - Scripting API: AudioSettings.dspTime
実際にやってみるといかのような感じで、切れ目なくイントロ付きループ再生が行えます。
ただし、全プラットフォームで確認したわけではないので、
一部プラットフォームでは上手くいかない可能性があります。
なお動画で使ってるBGMは以下のアセットです。
Japanese Samurai Music Pack Vol. 1 | Audio Music | Unity Asset Store |
ちなみに、イントロ中に一時停止して再開したい場合は、
以下のようにループ部分の遅延再生を設定し直します。
/// <summary> /// BGMを一時停止 /// </summary> public void Pause() { //イントロ中に一時停止したかどうか _isPausingIntro = _introAudioSource.isPlaying; _loopAudioSource.Pause(); _introAudioSource.Pause(); } /// <summary> /// BGMを一時停止を解除 /// </summary> public void UnPause() { _introAudioSource.UnPause(); if (_isPausingIntro) { //イントロ中に一時停止した場合はループ部分の遅延再生を設定し直す _loopAudioSource.Stop(); _loopAudioSource.PlayScheduled(AudioSettings.dspTime - _introAudioSource.time + ((float)_introAudioSource.clip.samples / (float)_introAudioSource.clip.frequency)); } else { _loopAudioSource.UnPause(); } }