ADX for Unityで作る、軒下での雨音表現（基本編）

# はじめに

ゲームのBGMを変えるほどではないが、雰囲気に変化を出したい、といった状況があるかと思います。特に3Dのフィールドを自由に動き回るようなゲームの場合は機会が多いでしょう。
一つの例として、BGMではなく雨の音などの環境音を変化させるというものがあります。そこで雨天の屋外から屋内へ進入するシチュエーションをもとに仕様を考えてみます。
1つ目は室内に入ったトリガーを使い雨音を消すことです。
2つ目は室内であっても雨音を影響させるため、前述のタイミングで音をくぐもらせる（もしくは別の音に差し替える）ことでしょう。
3つ目は更に発展させ、軒下に入った状態になったら、段々と雨の音をくぐもらせながらフェードアウトさせればかなり自然な雨音の変化になりそうです。
本記事ではUnityとサウンドミドルウェア「ADX for Unity」を用い、雨音を題材に上記のような環境音コントロールの実装例を紹介します。

※この記事は「UE4+ADX2で作る、軒下での雨音表現（基本編）」のUnity版です。元記事作者の[Sig](https://qiita.com/SigRem )さんの許可を得て作成しています。

[https://qiita.com/SigRem/items/7a534e5f2fa4109015dc](https://qiita.com/SigRem/items/7a534e5f2fa4109015dc)

# 前提

### 動作確認環境

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

### 前提記事

本記事はAISACを用いた実装例の一つとなります。本記事の通り作れば大丈夫ですが、より詳しい設定や操作を知りたい場合は以下の記事を参照して下さい。

Unityでインタラクティブミュージックを実装 with ADX 基礎編
[https://qiita.com/Takaaki_Ichijo/items/8a18f72d4cb6a10f77e1](https://qiita.com/Takaaki_Ichijo/items/8a18f72d4cb6a10f77e1)

ADX2 for UE4でインタラクティブミュージック（AtomCraft編)
[https://qiita.com/SigRem/items/8af9b7d8445477906741](https://qiita.com/SigRem/items/8af9b7d8445477906741)

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

Unityのサウンド機能をADXで強化する
[https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377](https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377)

# やること

- AtomCraftでキューを作成
- AISACコントロールを使用し、動的なエフェクトを作成
- Unityにインポート
- サンプルシーンを作り、雨の音にエフェクトをかける

# 実装

## **AtomCraft側**

まずは、再生する音データの作成を行います。ADXにおいては、再生用のデータはUnityとは別のツール「AtomCraft」を使います。
その手順については、元の記事（UE4向け記事）の同名の項と同じになりますので省略しています。本記事の手順を試す場合は、まず元の記事の[該当項目](https://qiita.com/SigRem/items/7a534e5f2fa4109015dc#atomcraft%E5%81%B4)を進めてから本記事を進めてください。
UE4版との違いとして1点、「Atomキューシートバイナリのビルド」画面で、一番左下のオプション「UnityAssets出力」にチェックを入れるのを忘れないようにして下さい。

## Unity側の実装

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

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

### テストシーン用のスクリプト作成

以下のスクリプトをRainController.csとして作成します。

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

public class RainController : MonoBehaviour
{
    public CriAtomSource criAtomSource;
    public string controlName1;
    public string controlName2;
    public float maxValue;
    public float minValue;

    private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.tag == "Indoor")
        {
            criAtomSource.SetAisacControl(controlName1, minValue);
            criAtomSource.SetAisacControl(controlName2, minValue);
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.tag == "Indoor")
        {
            criAtomSource.SetAisacControl(controlName1, maxValue);
            criAtomSource.SetAisacControl(controlName2, maxValue);
        }
    }
}
```

プレイヤーが別のColliderに入った（出た）場合、その属性をtagで判断し、AISAC値を変化させるという処理になります。SetAisacControlで指定のAISACコントロール値を変更できます。

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

以下のようなシーンを作成します。

![サンプルシーン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/e3d0b725-b88c-676f-ff24-601083f6c75c.png)

- CriWareLibraryInitializer、CriWareErrorHandler
    - 基本コンポーネント、GameObject＞CRIWAREから作成
- CRIWARE
    - 自動生成
- BGS_Rain(CriAtomSource)
    - 前項でインポートした音源
    - PlayOnStartにチェック
- Stage　空のGameObject
    - Cube　屋根　マテリアルで色を変えると見分けやすい
    - Plane　床　同上

![屋根オブジェクトの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/26e702e7-5af3-5784-6d88-6e283ad93ca1.png)

- 屋根代わりのCubeの設定
    - Indoorタグを作成して変更
    - BoxColliderを自身～Plane間を埋めるようなサイズに変更する

![プレイヤーオブジェクトの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/fb780fe3-e88e-25ba-e203-f742db5e15ac.png)

- プレイヤー代わりのCubeの設定
    - BoxColliderのIsTriggerにチェックを入れる
    - Rigidbodyコンポーネントをアタッチし、UseGravityのチェックを外す
    - RainControllerコンポーネントをアタッチし、画像の通り設定する
        - ControlNameはAtomCraftのAISACコントロールの名前を入れる

### テストシーンの実行

ここまで出来たら忘れずに保存し、実行しましょう。
プレイヤーのCubeを屋根下へ動かすと、瞬時に雨の音が変化するのが確認できます。

## 演出の強化

ここまでの実装では「はじめに」で紹介した2つ目までしか実現できていません。3つ目、すなわち音をだんだんと変化させる機能を実現するため、先程のスクリプトを修正します。

### DOTweenのインストール

「段々と変化させる」という処理を手軽に記述するため、DOTweenという無料アセットを利用します。Unityのアセットストアからインポートできます。

https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676?locale=ja-JP

インポート後、設定用の窓（DOTween Utility Panel）が開くのでSetup DOTween→Applyと選んで初期設定を必ず行って下さい。

### テストシーン用のスクリプト修正

先程作成したRainController.cs を以下のように修正します。

```RainController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class RainController : MonoBehaviour
{
    public CriAtomSource criAtomSource;
    public string controlName1;
    public string controlName2;
    public float maxValue;
    public float minValue;

    private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.tag == "Indoor")
        {
            DOTween.To(() => maxValue,
                (x) => {
                    criAtomSource.SetAisacControl(controlName1, x);
                    criAtomSource.SetAisacControl(controlName2, x);
                },
                minValue,
                0.5f);
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.tag == "Indoor")
        {
            DOTween.To(() => minValue,
                (x) => {
                    criAtomSource.SetAisacControl(controlName1, x);
                    criAtomSource.SetAisacControl(controlName2, x);
                },
                maxValue,
                0.5f);
        }
    }
}
```

DOTween.Toは数字を段々と変化させるための汎用的なメソッドになります。OnTriggerEnterでの処理を解説すると以下のようになります。

- 2つのメソッドのxに対し
    - criAtomSource.SetAisacControl(controlName1, x);
    - criAtomSource.SetAisacControl(controlName2, x);
- maxValueから
- minValueまで線形的に
- 0.5f（秒）かけて代入して実行し続ける

メソッドのオプションとしてeasingがありますが、AtomCraftとの二重管理にならないように利用していません。

### テストシーンの実行

修正したら保存し、実行しましょう。
プレイヤーのCubeを屋根下へ動かすと、先程と違い段々と雨の音が変化するのが確認できます。

## 応用

より自然な演出を作る手法として、建物に雨が当たる音を表現するというのがあります。またゲーム的な都合として、プレイヤーオブジェクトよりもカメラを基準にしたほうが自然に感じる場合があります。
また、実装の効率化として屋内外の判定を頭上のオブジェクトを利用するというのがあります。複雑な地形全てに屋内判定を設置するのはかなりの手間になる可能性があるため、プレイヤーオブジェクト自身が判定したほうがより多くの状況に対応できます。
これらの内容に関しては次の記事で解説していますので、興味があれば参照して下さい。

（執筆中）ADX for Unityで作る、軒下での雨音表現（発展編）