UE5 + ADXを使った、ホラーゲームのサウンド演出（環境音）

# はじめに


ADXアンバサダーとして記事を書いておりますSigと申します。
この記事では、その土台となる「アンビエント」（環境音）に焦点を当て、プレイヤーの恐怖心を高める環境音の設計と実装方法を解説します。

ホラーのシチュエーションを作成するデモンストレーション記事がありますので、そちらも参照していただけるとより分かりやすいでしょう。
記事の最後に、ふたつの記事の実装を連携させる例もあります。

**UE5 + ADXを使った、ホラーゲームの「怖い」サウンド演出（効果音&ジャンプスケア）**

https://qiita.com/SigRem/private/51d5a68af9c0f2a21edc


## 環境音とは？
ゲーム内の環境を表現する背景音のことです。
ゲームにおいては、森の中の鳥の声や風の音、都会の雑踏などのシチュエーションで、その場の雰囲気を伝えるために使用されます。ホラーゲームにおけるアンビエントは単なる「背景で鳴っている音」にとどまらず、恐怖を演出するための重要な要素となります。場合によっては場の主役ともなりえるでしょう。
ホラーにおける環境音は、いくつかの武器を持っています。

- 不安感と緊張感の強調
- プレイヤーに空間認識をさせる
- 心理的な圧迫感を与える
- 不規則な音による恐怖の増強

この記事では「不規則な音」を作っていく工程を、順を追って見ていきます。
また、メインとなる恐怖演出と連携する方法も紹介します。


当記事ではUE5.5を使用します。基本的にブループリントのみでの実装を想定しています。
ADX for UEはインディー向けの「LE版」であれば、無料で使用できます。
https://game.criware.jp/products/adx-le/

実装にはUE5.5 + ADX LEを使用します。導入や基本的な使い方は以下の記事にあります。
未導入の方もこの記事を読んで興味を持ったら、ここを読んで導入してみてください。

**ADX for UEの導入で、一歩上のサウンド表現を（導入編）**

https://qiita.com/SigRem/items/4250925f6d66a4fd287a

**ADX for UEの導入で、一歩上のサウンド表現を（実践編）**

https://qiita.com/SigRem/items/c089b71c42e898980a46


それでは、これらを踏まえて実際に「恐怖のアンビエント」を実装していきましょう。

# 実装
## 基本的な環境音の再生
まずは、とりあえずの環境音を再生してみましょう。

建物に吹き込む隙間風の素材を用意し、AtomCraftにインポートします。
![A01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/7edfbf9d-f648-48cb-9034-1cea22dd2290.png)
キューを作り、風の音を入れます。
![A02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/2ee11999-e8ce-43c4-84b8-d72e9c7695f1.png)
UE5にインポートし、コンテンツドロワーからレベル上にドラッグ＆ドロップで配置し、再生してみましょう。
![A03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/6688fa23-492b-48c8-b66a-35da72998ae6.png)


<iframe width="560" height="315" src="https://www.youtube.com/embed/Xim58QTt3mY?si=aSpHOid6efqeapZy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

だいたいの雰囲気は伝わりますが、単調な音なので次第に存在感が薄れ、プレイヤーの印象には残りません。環境音だからといえばそれまでですが、背景があやふやなホラーは急速にその怖さを失ってしまいます。

ここからさまざまな環境の要素を足して、ちょっと豪華なアンビエントに仕上げていきます。

## 多層的な環境音の作成
このシチュエーションを想像すると、様々な音が鳴っているのが自然でしょう。

- 建物に吹き込んでくる、微かな隙間風の音
- 外でしとしとと降り続ける雨の音
- 不定期に鳴り響く家鳴り
- 何者かがいると錯覚してしまう衣擦れの音

上ふたつは絶えず鳴り続ける音で、下ふたつは不定期に発生する音です。便宜上、ループする音、ループしない音と分類します。

ポイントは、これらの音を再生し続けながら、完全な繰り返しにならないよう変化を持たせることです。
ADXには再生している音をリアルタイムで変化させられる機能があるため、風や雨の強さをわずかに変動させたり、建物の軋み音の発生頻度をランダム化できます。

### ループする音（隙間風、雨音）
再生中の音をリアルタイムに変化させるには、ADXの「Aisacコントロール」機能を使用します。
これは予め音の変化量をグラフで作成しておき、ロジック（コードやブループリント）から数値を入力して実際に音を変化するものです。

Aisac機能の動作を見てみましょう。
上部のスライダーを動かすと、風や雨の音のピッチが変動し、聞こえ方がリアルタイムに変化します。
<iframe width="560" height="315" src="https://www.youtube.com/embed/G9MGDnvzEIA?si=Zo9qLht2tZGeOSyv" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

AtomCraftで、環境音のキューに風の音、雨の音を別トラックとして配置します。
![B01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/82bb2278-17f7-45c4-b998-663d4d80a243.png)
トラックを右クリックし、「新規オブジェクト」→「AISACの作成」を選択します。
![B02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/02f290c3-638d-4e90-803e-684b4cf0d03c.png)
「AISACグラフタイプ」を「ピッチ」にし、名前をつけます。
![B03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/107536cb-1c56-4140-9f7a-6e110798bdfe.png)
グラフの変動量を設定します。右肩上がりのシンプルなものでいいでしょう。
大きく変化させたければ傾斜を急に、そうでなければ緩やかな形にします。
![B04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d4f8637a-8329-4f31-b2da-1b1e30f669ca.png)

UE5に再インポートし、ブループリント側でAisacグラフに渡す数値を変動させます。
カスタムイベントが発火されると、風と雨のふたつのAisacコントロールに対してランダムな数値を渡します。
![B05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/412e1648-b4c7-437c-816a-6f45cb9c9619.png)
その処理のあとに、再度ランダムな時間を待って同じイベントが発火するよう**Set Timer by Event**ノードを配置します。
赤い▢のインプットピンから**Create Event**ノードで発火するイベントが指定できます。
![B06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/32295318-f494-4ba7-9983-fa57b6ff447a.png)

再生してみましょう。
この実装例では変化を分かりやすくするため、数値を大げさに変動させています。


<iframe width="560" height="315" src="https://www.youtube.com/embed/UAZtCI8o_Ms?si=DgFKy6E-6g0lSn5-" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

単純なループ音が変化し続け、ちょっとした驚きと不安を与えられるようになりました。
なにもないところでも少しだけ雰囲気が変化するため、プレイヤーは周囲になにか不穏なところがないか警戒することでしょう。

### ループしない音（家鳴り、衣擦れ）

家鳴りや衣擦れについては、何度も同じ音を鳴らすのではなくランダムなサウンドを、ランダムな場所から再生することで「立体的かつ、プロシージャルな環境音」として活かすことができます。
単純なループするサウンドと異なり、プレイするたびに聞こえ方が変わるためリアリティと自然さを増すでしょう。

ランダムな場所とはレベル上の完全なランダムなところではなく、プレイヤーの周囲のランダムな場所とします。
多少演出上の嘘を混ぜることで、分かりやすい音となるでしょう。

こちらの実装は、詳しい原理については次の記事で紹介しています。

**UE5+ADXで、ブループリントで作る立体的な環境音**

https://qiita.com/SigRem/private/be2e63defbf5eacf7622

ここではシンプルに実装の工程を紹介します。

AtomCraftに、効果音のバリエーションを追加します。
家鳴りの音4種、衣擦れの音4種を用意しました。
![C01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8a937ab3-da76-4ed5-a024-67b958c22121.png)

キューシートを右クリックし、「新規オブジェクト」→「キュー『ランダム』の作成」を選択します。
![C02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/3e43fa61-327d-4749-a6dd-5b09e04239b4.png)

家鳴り用のキュー、衣擦れ用のキューをそれぞれ作り、対応するサウンドを別トラックとして置いていきます。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/1e292f2a-43a7-46c9-815a-2991537c3c3e.png)

ここでインスペクターの「ランダム」を選択すると、各トラックの再生確率を個別に設定可能です。
![C04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/34838711-1227-4248-98ec-7200b0781900.png)

「パンタイプ」を「3Dポジショニング」に設定し、立体的な音（定位感の付加）にしておきます。
![C05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/d2e1f99b-2ec4-487a-9cf3-ad1da1313628.png)

UE5に再インポートし、レベルブループリントにカスタムイベントを追加します。
イベントが発火されたら、ランダムな時間待機します。これにより、ランダムな周期でサウンドが再生されることになります。
![C06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/58b01bc6-2d5f-4725-865d-e9737f7fb677.png)

ランダムで家鳴りか衣擦れか、どちらかのキューを再生します。
どちらの音が再生されたか分かるよう、デバッグメッセージを表示します。
![C07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/55d71297-8fdf-4000-925a-3a3f0b53d1b2.png)

**Play Sound at Location**でキューを再生します。
この際、**ノードはAtomカテゴリのものを使用**してください。
![C08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/8412d7b8-caaa-432e-992b-347453a4b4ec.png)

座標はプレイヤーの周囲からランダムな場所をとります。
**Random Point in Bounding Box**を使用することで簡単に出せます。
![C09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/b5ce77a2-7572-4756-8c24-c98b41ee2212.png)

これでランダムな場所から聞こえてくる音の完成です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/Jy1_bbBACQ4?si=BKIyaFSbjMMOt9g4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


コンソールコマンドで再生されている音を視覚化してみましょう。
コンソールコマンド「atom.3dVisualize Enabled 1」を入力することで、再生されているキューが見えるようになります。
動画では分かりやすくするため、サウンドが再生される位置をカメラ前方に限定しています。
<iframe width="560" height="315" src="https://www.youtube.com/embed/WCTMfKmfHJA?si=jP0TtaxGDkDz3fHI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


この調子で、雨漏りの音や何かが鳴く音なども追加していくと、さらに情報量を付加することができます。
ただし、あまり情報量が多くなるとプレイヤーはそれらを雑多な環境音としか認識できなくなってしまいます。一番重要な音にフォーカスし、ゲームに集中しつつも音が主張できるくらいに「音の交通整理」をしておきましょう。


### メインの恐怖演出との連携

ジャンプスケア（突然プレイヤーを驚かす演出）の発生時に、環境音が遠のくような演出を足すと、さりげなくメインの演出に集中させることができます。
また、ジャンプスケア直前に音を引かせることで「これから何かが起こるんだな」という予感を植え付け、プレイヤーが身構えるように促す効果もあります。
ブループリントのイベントディスパッチャを利用して、この連携を実装してみましょう。

レベル上に配置された環境音のキューを選択しておき……
![D01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/a79c1b09-08f1-4b0c-826b-88948e50671c.png)

レベルブループリントを開きます。
![D02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/0c18d836-4e4b-4e77-92ec-aa10821f5b75.png)

ジャンプスケアが発生した際の処理を追加します。
**Fade Out**ノードで音を引かせ、眺めの**Delay**をとって静寂を作り、直後にジャンプスケアの演出と音を再生します。
![D03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154452/ed8174f0-0b24-4c10-9348-9ef7cdc79b41.png)


<iframe width="560" height="315" src="https://www.youtube.com/embed/Kr0bPntotys?si=6qVl9WA0NGSDuycy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

怪異の足が止まると……周囲の音が一瞬引いてジャンプスケア！
違和感なく、演出が一体化するような流れを作ることができました。

環境音は基本的に場を盛り上げるための雰囲気づくりや脇役といった意味合いが強いですが、ホラーにおいてはメインの演出との連携をさせるような大役を務められることもあります。
ぜひ両方に気を配り、恐ろしい空間づくりを実践してみてください。