IntroLoopで簡単にイントロ付きループBGMを作る

# 前提

この記事は、Unity アセット冬のアドベントカレンダー 2019 のために書かれた記事です。

[Unityアセット冬のアドベントカレンダー 2019 Winter！ – Unity公式 Asset Portal](http://assetstore.info/asset-advent-calendar-2019-winter/)
[<img width=800 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/10d4497e-d550-6027-e478-739bafd308f6.png">](http://assetstore.info/asset-advent-calendar-2019-winter/)
この記事では、**簡単にイントロ付きループBGMが作れるアセットIntroLoop**をご紹介したいと思います。

https://assetstore.unity.com/packages/tools/audio/introloop-51095?aid=1011l8zf9

↓Youtubeの解説動画
[![Youtubeの解説動画](http://img.youtube.com/vi/M44wGGPB11k/0.jpg)](http://www.youtube.com/watch?v=M44wGGPB11k)

# IntroLoopとは？

UnityのデフォルトのAudio Sourceでは、BGMのループはBGMの最初と最後をループすることしかできません。
![IntroLoop1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/36e01cb1-921b-53e4-00b7-6057a287f718.png)
しかしBGMによっては、まずイントロ部分を流しその後のループ部分をループしたいという、イントロ付きループをしたい場合があります。

IntroLoopでは、下図のようにIntro BoundaryとLooping Boundaryを設定することで自由にループ部分を指定することできます。
![IntroLoop2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/a6585dbb-a054-63a6-7632-42ec7d597517.png)

このアセットを使う利点を細かく挙げると、

- イントロ付きループをするために、オーディオファイルをカットしたりする必要はない
- イントロ付きループをするためのプログラムを書く必要はない。（再生処理などのコントロールはプログラムで実行します）
- ループ地点の数値指定なので、ループの設定がとても楽
- オーディオファイルのメモリリリースを適切に行なってくれるのでモバイルでも安心
- ポーズ、リジューム、フェードイン、フェードアウト、クロスフェードなど多様なコントロールができる
- オーディオごとにボリューム、ピッチの設定、ループ形式（イントロループ、ループ、ループなし）の設定が可能
- AudioMixerGroupとの連携も普通にできる
- フルソースコード、Package Manager対応、コーディングも良い

などがあります。

# 使い方

使い方はとても簡単です。大体４つの工程に分かれます。

1. オーディオファイルを用意する
2. オーディオファイルのループポイントを調べる
3. IntroloopAudioアセットファイルを作成する
4. IntroloopPlayerシングルトンを使ってIntroloopAudioを再生する

## 1. オーディオファイルを用意する

イントロ付きループを行うオーディオファイルを用意します（wav/ogg/mp3など）。
用意したオーディオファイルをUnityにインポートして、AudioClipアセットファイルとしておきます。

## 2. オーディオファイルのループポイントを調べる

イントロ付きループの２つのループポイント（Intro BoundaryとLooping Boundary）の位置をミリ秒単位で調べます。
![IntroLoop2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/a6585dbb-a054-63a6-7632-42ec7d597517.png)

ループポイントのを調べるためには、Audacityなどのオーディオ編集ソフトを利用します。（私はAdobeのAuditionを使っています。こちらも便利です。）今回はIntroLoopの紹介で、オーディオ編集ソフトを用いたループポイントの調べ方は記事の範囲を逸脱しますので省略します。

[Audacity ® | Free, open source, cross-platform audio software for multi-track recording and editing.](https://www.audacityteam.org/)

なお、オーディオ編集ソフトでループポイントを調べるのがベストな方法ですが、
Unity内でループポイントを微調整していくだけでもループポイントを設定できると思います（時間がかかるかもしれません）。

## 3. IntroloopAudioアセットファイルを作成する

1.で用意したAudioClipアセットファイルを右クリックして出てくるメニューから、**Create > Introloop > IntroloopAudio**でIntroloopAudioアセットファイルを作成します（下図の1.）。

作成したIntroloopAudioアセットファイルを選択して、設定を行います（下図の2.）。

<img width="500" alt="introloop-asset.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/fad67482-ef24-eb6a-49f9-8446ba8123c2.png">

Audio Clipには対象のオーディオファイルのAudioClipアセットファイルを指定します。

Volume、Pictchを設定します。オーディオファイルの音が大きすぎたり、小さすぎたりする場合にここで調整できます。

LoopモードはIntroloop/Loop/Non Loopingから選べます。イントロ付きループをしたい場合はIntroLoopを選びます。Loopの場合はオーディオファイルの最初と最後をループします。Non Loopingの場合はループしません。IntroLoopでは、これらのモードを同じIntroloopPlayerシングルトンで操作できます。

さらに、モードがIntoroloopの場合は、上で説明した２つのループポイント（Intro BoundaryとLooping Bundary）を設定して、イントロ付きループの境界を指定します。
<img width="435" alt="introloop-audio-set.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/e4102852-20e9-d6ca-15f4-f34ce14e3435.png">

## 4. IntroloopPlayerシングルトンを使ってIntroloopAudioを再生する

以下のようなコードを書いて3.で用意したIntroloopAudioをコントロールします。
コントロール内容は（再生する／ポーズする／再開する／シークする／停止する）などです。

```csharp:MyTest.cs
using System;
using System.Collections;
using UnityEngine;
using E7.Introloop;

public class MyTest : MonoBehaviour
{
    public IntroloopAudio introloopAudio;
    
    // 再生する
    public void Play()
    {
        // Introloopならイントロ付きループで、
        // Loopならループで、
        // Non loopingならループなしで再生されます。
        IntroloopPlayer.Instance.Play(introloopAudio);
        
        // フェードインしながら再生もできる
        // IntroloopPlayer.Instance.Play(introloopAudio, fadetime);
    }
    
    // ポーズする
    public void Pause()
    {
        IntroloopPlayer.Instance.Pause();
        
        // フェードアウトしながらポーズもできる
        // IntroloopPlayer.Instance.Pause(fadetime);
    }

    // 再開する
    public void Resume()
    {
        IntroloopPlayer.Instance.Resume();
        
        // フェードインしながら再開もできる
        // IntroloopPlayer.Instance.Resume(fadetime);
    }

    // 指定した時間にシークする
    public void Seek(float elapsedTime)
    {
        IntroloopPlayer.Instance.Seek(elapsedTime);
    }

    // 停止する
    public void Stop()
    {
        IntroloopPlayer.Instance.Stop();
        
        // フェードアウトしながら停止もできる
        // IntroloopPlayer.Instance.Stop(fadetime);
    }
}
```

上記コードのように、IntroloopAudioの（再生する／ポーズする／再開する／シークする／停止する）はIntroloopPlayerを使って行われます。
IntroloopPlayerはシングルトンとして実装されています。シングルトンについては以下を参照してください。

[[Unity]シングルトンを使ってみよう - Qiita](https://qiita.com/Teach/items/c146c7939db7acbd7eee)

その他、IntroloopPlayerにはAudioMixerの設定項目があります。
ここにAudioMixerを指定することで、AudioMixerの機能を利用できます。
![Untitled-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58282/be02f130-881f-8b06-5da8-2b5174c4b4ad.png)


# デモでIntroLoopの挙動を確認

デモプログラムはここで確認できます。購入前に確認してみましょう。

[Demo | Introloop](https://exceed7.com/introloop/demo/index.html)

# サポートは日本語で大丈夫のようです

作者様はタイの方のようですが、Forumを見たところ日本語でのサポート可能なようです。日本人でも安心してアセットを利用できます。

[Introloop - Easily play looping music with intro section - Unity Forum](https://forum.unity.com/threads/introloop-easily-play-looping-music-with-intro-section.378370/)

# リンク

関連するリンクのまとめです。

[Introloop（AssetStoreへのリンク）](https://assetstore.unity.com/packages/tools/audio/introloop-51095?utm_source=jppt&utm_medium20191216)

[Introloop（ホームページ）](https://exceed7.com/introloop/)

[Introloop（フォーラム（日本語可能））](https://forum.unity.com/threads/introloop-easily-play-looping-music-with-intro-section.378370/)

# 最後に

とても便利なので、Unityでお手軽にイントロ付きループをしたい人は是非IntroLoopを使いましょう！