(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

2行で出来る!BGMのイントロ付きループ再生!!【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2017.3.1f1


はじめに

現状、UnityではBGMをイントロ付きループ再生させる事が標準機能では出来ません。


一応Wavファイルにループポイントを設定する事で実現出来るそうですが、

そもそもWavファイルは非圧縮で容量が大きくなるため、BGMには不向きです。


なので今回はプログラム(2行)でイントロ付きループ再生をする方法を紹介したいと思います!

なお、イントロとループの音源が別れている場合のやり方ですので、あしからず。


余談ですが、一つの音源でイントロ付きループ再生が出来るアセットもあるようです。(未確認)



また、かの有名なCRIWAREをUnityで使う事も出来るようです。(未確認)





------------追記

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は以下のアセットです。



ちなみに、イントロ中に一時停止して再開したい場合は、

以下のようにループ部分の遅延再生を設定し直します。

/// <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();
  }
}