FMODをつかってインタラクティブミュージック(2) 組み込み編


FMODをつかってノンリニア＆インタラクティブなMusicを作ってみたいとおもいます。オーサリングと組み込みで必要とする人がちがうとおもいます。[前回](https://qiita.com/dTAT/items/8cf855ada87cae88f6ff)ですでに再生する音源はつくれたので本文書ではUnityへの組み込みの手順を説明します

## Bankの作成

FMODStudioのBankタブをひらき、MasterBankの下あたりで右クリック>New Bankとします。名前がつけられるのでMusicと名付けます。

![スクリーンショット 2018-01-26 19.46.29.png](https://qiita-image-store.s3.amazonaws.com/0/18557/0ca56456-0346-5ec3-4de2-67cbf95274eb.png "スクリーンショット 2018-01-26 19.46.29.png")

次にEventsタブにもどり、すべてのEventを選択して右クリック>AssignToBankで先ほど作成したMusic Bankを選択します。

![スクリーンショット 2018-01-26 19.44.38.png](https://qiita-image-store.s3.amazonaws.com/0/18557/dc21d782-68c9-db27-c94c-492f3ab2cf9d.png "スクリーンショット 2018-01-26 19.44.38.png")

最後にBankタブに戻り、Music Bankを選択して右クリック>Buildをおします。これで完了です。

![スクリーンショット 2018-01-26 20.36.59.png](https://qiita-image-store.s3.amazonaws.com/0/18557/095a77de-7cb3-c419-58de-07a09b998844.png "スクリーンショット 2018-01-26 20.36.59.png")


## Integration準備

まず[FMODダウンロードページ](https://www.fmod.com/download)からUnityIntegrationをダウンロードしておきます

![スクリーンショット 2018-01-26 19.12.59.png](https://qiita-image-store.s3.amazonaws.com/0/18557/9f38ffed-cdf4-4aaa-90c1-1521dfbe7e0f.png "スクリーンショット 2018-01-26 19.12.59.png")

ダウンロードできたら新しく作ったUnityプロジェクトにImport
します。とりあえず全部Importします。

## 設定

おそらくエラーがでます。
エラー内容はFMODの初期設定がまだなことを意味しているので設定します。Unity上部のFMODメニュー>EditSettiong>Studio Project PathのよこのBrowseボタンをおして、オーサリングしたさいの*.fsproファイルを選択します。

![スクリーンショット 2018-01-26 19.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/18557/6fcfd060-7bed-25be-d5b2-53b5a564680a.png "スクリーンショット 2018-01-26 19.38.12.png")

選択したらまず新規にGameObjectを作成します。作成したGameObjectのAdd ComponentよりStudio Bank Loaderを追加します。AddBankボタン＞Browseボタン(虫眼鏡アイコン)>先ほど作成したMusic Bankkを選択します。

![スクリーンショット 2018-01-26 19.49.33.png](https://qiita-image-store.s3.amazonaws.com/0/18557/abb6174b-0914-e544-2ecf-6ad632f54268.png "スクリーンショット 2018-01-26 19.49.33.png")

つぎにStudio Event EmitterをAddComponentして追加し、Event行のBrowse(虫眼鏡)ボタンをおしてEvents一覧のなかからMusic Eventを選択します。そしてPlay EventをObject Start、StopEventをObject Destroyに変更します。

![スクリーンショット 2018-01-26 19.49.22.png](https://qiita-image-store.s3.amazonaws.com/0/18557/f1366a82-8045-6b5a-220b-c3afbeeac6b3.png "スクリーンショット 2018-01-26 19.49.22.png")

これでEditorをPlayするとIntroが再生されるかと思います。

## 音を切り換えて遊ぶ

現状でもInitialParameterValuesをいじると再生される曲が変わっておもしろいのですが、どうせなら再生中にも変更できるようにします。

まず以下のスクリプトを作成します。
作成したら先ほどまでつかっていたGameObjectにAdd Componentします。

BGMPlayerLT.cs


```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FMODUnity;

[RequireComponent(typeof(StudioEventEmitter))]
public class BGMPlayerLT : MonoBehaviour
{
    StudioEventEmitter eventEmitter;
    private void Awake()
    {
        eventEmitter = GetComponent<StudioEventEmitter>();
    }

    public void ApplyParamater()
    {
        var instance = eventEmitter.EventInstance;
        foreach (var p in eventEmitter.Params)
        {
            instance.setParameterValue(p.Name, p.Value);
        }
    }

    public void ChangeParameter(string paramName, float value)
    {
        eventEmitter.SetParameter(paramName, value);
    }
}

```

つぎに以下のようなスクリプトをEditorフォルダの中に作成します。

BGMPlayerExt.cs

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(BGMPlayerLT))]
public class BGMPlayerLTExt : Editor
{
    float changeParamValue = 0.0f;
    string changeParamName = "";
    public override void OnInspectorGUI()
    {
        var t = target as BGMPlayerLT;
        if (GUILayout.Button("Apply"))
        {
            t.ApplyParamater();
        }

        GUILayout.BeginVertical("box");
        {
            changeParamName = EditorGUILayout.TextField("ParamName", changeParamName);
            changeParamValue = EditorGUILayout.FloatField("ParamValue", changeParamValue);
            if (GUILayout.Button("ChangeParam"))
            {
                t.ChangeParameter(changeParamName, changeParamValue);
            }
        }
        GUILayout.EndVertical();
    }
}
```


これでPlay中、EventEmitterの値を変更したあとにApplyボタンを押すと、その場でプロパティの再更新をかけられます。Applyを押した時の値が、0あたりだとInst、　0.4くらいだとBreakdown、0.7くらいだとBreakdownを聞くことができるかと思います。

また、直値指定の方法も用意しておきましたParamNameに"Intensity"、ParamValueに適当な値(0~1)を入力してChangeParamボタンを押せば前述と同じような動作をするのが確認できるかと思います。

## まとめ

FMODはオーサリングツールだけでなく、組み込みも結構簡単におこなうことができます。エンジニア的には嬉しいところです。

参考
- [公式APIドキュメント](https://www.fmod.com/resources/documentation-api?page=content/generated/engine_new_unity/overview.html#/)