Unity
EliasStudio

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

前回でレベル変化部分をやってしまったので残るはActionPreset。ただしこの機能はEliasPlayer.RunActionPreset関数のみで完結するので、例のHPによる変化部分の処理についても書きます。

ActionPresetの実行

PresetActionはEliasPlayerにたいしてRunActionPresetでPreset名を実行すればいける。

SoundManager.cs
    public static void RunActionPreset(string actionName)
    {
        if (null == instance_ || null == instance_.elias_player_)
        {
            return;
        }
        instance_.elias_player_.RunActionPreset(actionName);
    }

ただし、RunActionPresetで実行できるPresetは現在アクティブなThemeのみ。別のThemeに属するPresetを実行しようとするとエラーとなる。

スクリーンショット 2017-12-02 21.21.47.png

このエラーが出た場合はEliasStudioでPreset名とそのPresetが属するThemeを確認すると幸せになれるかも。

残りHPにあわせたBGM変化実装例

SoundManager.cs
    /// <summary>
    /// 現在再生しているThemeの最大レベルをえる
    /// </summary>
    /// <returns>最大レベル</returns>
    static 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;
    }

まず現在再生中のThemeの最大レベルを確認する。
この値をキャッシュしてもいいし、Level設定頻度がそれほど多くないなら毎回問い合わせてもいい。

BossMonster.cs
    void ControlMusic()
    {
        var max_lv = SoundManager.GetGreatestLevelInActiveTheme();
        // 適当に敵のダメージ量割合を計算する
        var ratio = (float)((MAXHP - HP) / MAXHP);
        // lv=0にしてしまうとミュートになるので1~maxの間にclampする
        var lv = (int) Mathf.Clamp(ratio*(float)max_lv , 1.0f, (float)max_lv);
        SoundManager.SetLevel(lv);
    }

この関数を敵ボスがダメージを受けるたびに実行する。
たったこれだけでインタラクティブミュージックが実現できる。

まとめ

EliasStudioによるインタラクティブミュージックは簡単すぎて説明することがない。