Eliasでインタラクティブミュージック　Unity組み込み編(1)


## 下準備
まずUnity側で新規にプロジェクトを作成する。

つぎにそのプロジェクトのAssets直下にStreamingAssetsを作成し、StreamingAssetsの下にELIAS_Themesフォルダを作成する

![スクリーンショット 2017-11-29 10.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/18557/a7e2416d-1430-e47c-4627-5054218b695a.png "スクリーンショット 2017-11-29 10.37.48.png")

のようなフォルダ構成を作成する。
その中にOfficial Elias Audio Demoをofficial_demoと名前変更したものをいれる。

![スクリーンショット 2017-11-29 10.41.24.png](https://qiita-image-store.s3.amazonaws.com/0/18557/6f97ca02-e7e5-40ae-74ec-f032424d8eba.png "スクリーンショット 2017-11-29 10.41.24.png")

ここまでで上記画像のような構成になっていればOK。
ほんとうはELIAS_Themesなどはこの名前でなくても大丈夫そうだが他のアセットと混ざった際などを考えて慣習にのっとってなづけた。

## Demoの確認

UnityにほうりこんだOfficial Elias Audio DemoをひらくとElias Studioでそのファイルがひらかれる。

なんとプロジェクトファイル＝ランタイム用ファイルというおそろしい設計なのだ。

![スクリーンショット 2017-11-29 10.48.43.png](https://qiita-image-store.s3.amazonaws.com/0/18557/f3e8ae35-8516-ac00-6140-e5c15db6abaf.png "スクリーンショット 2017-11-29 10.48.43.png")

このデモを再生(緑の三角ボタン)すると、音楽が流れ始めて50秒でシークバーがループする。そして右側のLoopTrackをみると全部で20Levelほどあるらしい。つまり最長で1000秒=16.6...15分程度は変化しつづけることができるらしい。なんて壮大なんだ...

さすがにそれはながすぎるのでこれを5分程度に短縮するイメージのデモでいきたい。具体的には時間とともに敵のHPが減少していき、残りHPが10%変化するごとにレベルを2ずつ変化させていくイメージでいきたい。

また、ActionPresetに”Objective Level Complete”
というのがあるので敵のHPが0になったらこれを実行したい。

ここで重要なのはTheme名："Objective"とAction Preset名："Objective Level Complete"なのでこれをおさえておく。

## pluginをいれる

EliasのDOWNLOADSページからelias_unity_pluginをダウンロードして実行する

![スクリーンショット 2017-11-23 17.03.27.png](https://qiita-image-store.s3.amazonaws.com/0/18557/5d4e9c18-ce4b-a1d6-c1b2-d5ba21ced325.png "スクリーンショット 2017-11-23 17.03.27.png")

必要なのはPlugins以下だけなので他のチェックをはずす。
※demosがはいっているけどまったく別のデモなのでいれるとややこしくなる

![スクリーンショット 2017-11-29 11.05.13 1.png](https://qiita-image-store.s3.amazonaws.com/0/18557/06a57d89-fd77-27ae-0c17-9df9603cfff1.png "スクリーンショット 2017-11-29 11.05.13 1.png")

## Elias再生部分をつくる

インポートが終わったらHierachyに空のGameObjectをつくり(Create Emptyし)SoundManagerと名付ける。

つぎにこのGameObjectにAddComponentでEliasPlayerをくっつける。するとAudioSourceと一緒にEliasPlayerがAddされる。

ここで、
- PlayOnStartにチェック
- ThemeからObjectiveを選択
- Levelを1に設定

![スクリーンショット 2017-11-29 11.10.02.png](https://qiita-image-store.s3.amazonaws.com/0/18557/5d2f7c0b-61e4-a611-8ebd-bc4952fb68cc.png "スクリーンショット 2017-11-29 11.10.02.png")

した状態で再生ボタンをおしてみる。

なんということでしょう。これだけであの壮大なテーマをくみこむことができてしまいました。

しかし再生中にLevelを変化させても楽曲は変化しません。なのでLevel変化を操作する機能とPresetActionを叩く機能をつくっていきます。

## 適当にSoundPlayerをつくる

とりあえずLevel変化さえできればいいかなということで以下のようなSoundManagerを作成する。

``` SoundManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SoundManager : MonoBehaviour
{
    protected static SoundManager instance_ = null;
    EliasPlayer elias_player_ = null;
    EliasSetLevel setLevelData = null;

    private void Awake () {
        instance_ = this;
        elias_player_ = GetComponent<EliasPlayer> ();
        setLevelData = new EliasSetLevel ();
    }
    /// <summary>
    /// Themeを再生する
    /// </summary>
    /// <param name="theme"></param>
    private void PlayTheme (string theme) {
        elias_player_.customPreset.themeName = theme;
        elias_player_.StartElias ();
    }
    static public void SetLevel(int level)
    {
        if (null == instance_)
        {
            return;
        }
        instance_.SetLevel_(level);
    }
    /// <summary>
    /// Themeにレベルをセットする
    /// </summary>
    /// <param name="level"></param>
    private void SetLevel_ (int level) {
        var theme = elias_player_.GetActiveTheme ();
        var level_max = elias_player_.GetGreatestLevelInTheme (theme);
        if (level < 0 || level > level_max) {
            return;
        }
        setLevelData.themeName = theme;
        setLevelData.level = level;
        elias_player_.QueueEvent (setLevelData.CreateSetLevelEvent (elias_player_.Elias));
    }
    /// <summary>
    /// 現在再生しているThemeの最大レベルをえる
    /// </summary>
    /// <returns>最大レベル</returns>
    public int GetGreatestLevelInActiveTheme () {
        if (null == instance_|| null == instance_.elias_player_)
        {
            return 1;
        }
        var elias = instance_.elias_player_;
        var theme = elias.GetActiveTheme ();
        var greatest_level = elias.GetGreatestLevelInTheme (theme);
        return greatest_level;
    }
}
```

あとは確認する手段もほしいのでEditorフォルダを作成してその中にSoundManagerEditorスクリプトを作成する

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

[CustomEditor(typeof(SoundManager))]
public class SoundManagerEditor : Editor
{
    int level;
    public override void OnInspectorGUI()
    {
        EditorGUI.BeginChangeCheck();
        level = EditorGUILayout.IntField("level", level);
        if (EditorGUI.EndChangeCheck())
        {
            SoundManager.SetLevel(level);
        }
    }
}
```

最後にSoundManagerをEliasPlayerをつけたGameObjectにくっつければとりあえずのSoundManagerが完成である。

![スクリーンショット 2017-11-29 11.43.10.png](https://qiita-image-store.s3.amazonaws.com/0/18557/2fd3e23f-f83a-01fb-3ba9-3688d34e81b3.png "スクリーンショット 2017-11-29 11.43.10.png")


シーンを再生してSoundManagerのLevel欄にLevel値をたたきこんでEnterすればそのLevelに応じた演奏にきりかわる。

## まとめ

めちゃくちゃ簡単にEliasは再生、レベル変化が表現できる。みんなもEliasしようよ！！

すごく長くなったのでこの辺で一回きってPresetActionは次回にします。