ゲームの状況に合わせて効果音にバリエーションを by ADX for Unity

# はじめに

音で表現力を上げる場合、同じ動作に対して複数音源でバリエーションを持たせるという方法があります。例えば、足元の素材に応じて足音が変わる、コンボが続くと少しずつ音が高くなる、などです。

しかしUnityだけで実現しようとした場合、音源が増えると管理コストや実装コストが跳ね上がってしまいます。

そこで、サウンドミドルウェア「ADX for Unity」を使います。専用ツールのAtomCraftで使用できる「セレクタ」を用いると、ひとつのサウンドデータに様々な音を内包できます。そうすることで、コストを抑えつつゲームの状況に応じて異なる効果音が再生出来るようになります。

本記事のサンプルでは、2段ジャンプできるキャラクターが、地上でジャンプしたのか、空中でジャンプしたのかによって音を分岐させています。2種類の音が鳴りますが、アセット上のファイルはひとつにまとまっていることが確認できます。

この記事は「ADX2 for UE4で音量コンフィグを実装」のUnity版です。元記事作者のSigさん ( https://qiita.com/SigRem )の許可を得て作成しています。

[https://qiita.com/SigRem/items/2c1f497ebf0e981dd43c](https://qiita.com/SigRem/items/2c1f497ebf0e981dd43c)

### 動作確認環境

Windows 10 Home 20H2
Unity 2020.3.27f1  + ADX LE Unity SDK 3.06.03
CRI ADX LE Tools for Windows 3.46.02

### 前提記事

CRI ADX導入方法や基本的な操作については以下の記事を参照して下さい。

Unityのサウンド機能をADXで強化する

[https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377](https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377)

# やること

- AtomCraftで複数のサウンドを持つスイッチキューを作成
- Unityにインポート
- テストシーンの作成
- テストプレイ

# 実装

## AtomCraftで複数のサウンドを持つキューを作成

まずは、再生する音データの作成を行います。ADXにおいては、再生用のデータはUnityとは別のツール「AtomCraft」を使います。その手順については、元の記事（UE4向け記事）の同名の項と同じになりますので省略しています。

本記事の手順を試す場合は、まず元の記事の[該当項目](https://qiita.com/SigRem/items/2c1f497ebf0e981dd43c#atomcraft%E3%81%A7%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%B5%E3%82%A6%E3%83%B3%E3%83%89%E3%82%92%E6%8C%81%E3%81%A4%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90)を進めてから本記事を進めてください。UE4版との違いとして1点、「Atomキューシートバイナリのビルド」画面で、一番左下のオプション「UnityAssets出力」にチェックを入れるのを忘れないようにして下さい。

## Unityでの実装

### キューシートをインポート

AtomCraftからエクスポートしたファイルをインポートします。

### テスト用シーンの作成

ジャンプするキャラクターと、ジャンプ操作のためのボタンを準備します。

![テスト用シーン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/e542b944-888e-f194-da1e-81093030646e.png)

- CriWareLibraryInitializer、CriWareErrorHandler
    - 基本コンポーネント、GameObject＞CRIWAREから作成
- CRIWARE
    - 自動生成
- Cue_Action_Jump(CriAtomSource)
    - 前項でインポートした音源
- UIのButton
- Plane
- Cube
    - プレイヤー代わり
    - Rgidbodyと後述のJumpAction.csスクリプトをアタッチ

### テスト用スクリプトの設定

以下の内容でJumpAction.csスクリプトを作成し、Cubeにアタッチ、設定を行います。

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

public class JumpAction : MonoBehaviour
{
    public float velocity = 5;
    public bool isGround;
    public CriAtomSource criAtomSource;

    public void Jump()
    {
        GetComponent<Rigidbody>().AddForce(new Vector3(0, velocity, 0), ForceMode.Impulse);
        CriAtomExPlayer ex = criAtomSource.player;
        if (isGround)
        {
            ex.SetSelectorLabel("Action", "Action_Ground");
        }
        else
        {
            ex.SetSelectorLabel("Action", "Action_Air");
        }
        criAtomSource.Play();
    }

    private void OnCollisionStay(Collision collision)
    {
        isGround = true;
    }

    private void OnCollisionExit(Collision collision)
    {
        isGround = false;
    }
}
```

![Cubeの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/5c4111de-641b-ba8c-946d-56c22289c872.png)

- JumpAction.csをCubeにアタッチ
- Cue_Action_Jump(CriAtomSource)をJumpAction.csに登録

![Buttonの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/ac9e7d73-ef37-b1af-d3ca-e4718e903a4b.png)

- ButtonのOnclickにCubeのJumpAction.csのJumpメソッドを割り当てる

### テストプレイ

ここまで出来たら保存して実行してみます。CubeがPlaneに接触している場合としていない場合で、音が変化することを確認します。

これで、Unity側では1つのサウンドデータ（Cue_Action_Jump(CriAtomSource)）だけ用いて複数の音を鳴らすことが出来ることがわかったかと思います。

### JumpAction.csの内容の補足

音を鳴らし分けるには、セレクタ（Action）とセレクタラベル（Action_Ground、Action_Air）を指定する必要がありますが、CriAtomSourceでは再生出来ません。
そのため一旦CriAtomExPlayerを取得し、SetSelectorLabelで再生処理を行っています。

### 応用

今回の例では、接触しているコライダーの情報を一切取得していません。足音を変化させる場合、地面にタグを付けておき、OnCollisionStayの中でそのタグを取得してSetSelectorLabelへ渡す、といった処理になるかと思います。