🎲

Random Audio Containerを使って音をランダムに再生する

2024/11/11に公開

はじめに

ゲームの実装にて「キャラクターの歩く時の足音を入れてみたけど単調」「連続した音が機械的で不自然」といったことの経験は少なからずあるのではないでしょうか。

その場合の解決策として「音の違う効果音を交互に再生」や「ランダムでピッチを変更して再生」といったことを自分はよくしていました。

今回紹介する「Audio Random Container」アセットを使用すると、
それらが少し楽に実装できるようになるので実装の選択肢の一つとして試していただければと思います。

https://docs.unity3d.com/ja/2023.2/Manual/AudioRandomContainer.html

環境

項目 バージョン
Unity 6000.0.25
OS macOS Sonoma 14.6.1

使い方

アセットの作成

Projectウィンドウで右クリック または +ボタンから
Create/Audio/Audio Random Container でアセットを生成

生成されたアセットを選択してInspectorのEdit Audio Random Containerでアセットを編集するウィンドウが表示されます。

UI

https://docs.unity3d.com/ja/2023.2/Manual/AudioRandomContainer-UI.html

Play

▶️ボタンでプレビュー再生ができます。
音量やピッチ等がどのように再生されるかを確認できます。

Volume

音量決めるセクションです。
音源を何db(デシベル)で再生するかを設定できます。
範囲は0 ~ -80db

Randomization

サイコロマークのトグルをオンにすると
再生する音量をランダムにすることが可能です。

Volumeセクションで設定したdbから上下に振り幅を与えることが可能。
ただし「+方向のみ確率を上げたい」といった詳細な設定はできなさそうです。

Pitch


再生時の音程を変えることができ、基準となるピッチを設定できます。

Randomization

Volumeのときと同様で基準からの振れ幅を設定できます。
下限:-1200ct, 上限:1200ctとなってます。

Audio Clips

再生したいAudioClipアセットを数設定することが可能で、
各AudioClipに基準となる音量を設定できます。

再生される順番等については後述の機能にて説明します。

Trigger

プロパティ 説明
Manual 手動で再生
Automatic ループを有効にする

Manual

手動で再生するモード。
AudioSourceのAudioResourceフィールドに設定できるようになっています。
従来通り、PlayOnAwakeAudioResource.Play()で任意のタイミングで再生。

[SerializeField]
private AudioSource _audioSource;

private void Start()
{
    _audioSource.Play();
}

Automatic

後述するAutomatic Trigger Modeが有効になります。

Playback Mode

プロパティ 説明
Sequential AudioClipsリストの上から順番に再生する
Shuffle AudioClipsリストをシャッフルして再生。全Clipを再生しきるまで重複しない。
Random ランダムに再生

Automatic Trigger Mode

プロパティ 説明
Pulse 上から順番に再生する
Offset リストをシャッフルして再生

Pulse

AudioClipが再生されてからn秒後に再生します。
連続で再生した場合、再生される音声の長さに関わらず一定間隔で再生されます。

Offset

最後に再生されたAudioClipが終了してから、n秒後に次のAudioClipを再生します。

Time

PulseまたはOffsetの間隔を設定。
0 ~ 120秒の間で設定可能。

Randomization

Timeで設定した時間から -60 ~ +60秒の間でランダムとして設定可能。

Loop

ループ方法の設定。

プロパティ 説明
Infinite 停止せず無限に再生する。
Clips Countが有効になり、Count数分AudioClipを再生する。
Cycles Countが有効になり、オーディオの再生サイクル数分再生する。

Infinite

停止をしない限り、無限に再生し続けます。

Clips

Countパラメータの数分AucioClipを再生します。

いくつか例

例1.
AudioClipを3つ設定しCountを2と設定していた場合、
1, 2 と再生されます。

例2.
AudioClipを3つ設定しCountを4と設定していた場合、
1, 2, 3, 1 と再生されます。

Cycles

設定されている複数のAudioClipを1サイクルとして、
そのサイクルのループ数分再生します。

いくつか例

例1.
AudioClipを2つ設定しCountを1と設定していた場合、
1, 2, と再生されます。

例2.
AudioClipを2つ設定しCountを4と設定していた場合、
1, 2, 1, 2, 1, 2 と再生されます。

Count

前述したClip数やCycle数を設定。
0 ~ 10000回まで設定可能。

Randomaize

Countで設定した値を基準に -10 ~ 10回の幅でランダムとして設定可能。

スクリプト上での扱い

AudioRandomContainerアセットをSerializedFieldで設定可能にする場合は、
現時点ではAudioRandomContainerクラスがinternalとなっているため、

[SerializedField]
private AudioRandomContainer _audioRandomContainer;

と定義することができない点に注意が必要です。

AudioClipと同じ、AudioResourceというクラスを継承されているため、
以下のようにAudioResourceとして定義する形にすればInspector上に露出させることが可能です。

[SerializedField]
private AudioResource _audioResouce;

AudioClipも同じくAudioResourceを継承しているため、
AudioClipとAudioRandomContainerのどちらも設定可能です。

また、AudioSource.resourceというのが生えているので
AudioResourceを手動で設定することも可能になっています。

public class Test : MonoBehaviour
{
    [SerializeField]
    private AudioSource _audioSource;

    [SerializeField]
    private AudioResource _audioResource;
    
    private void Start()
    {
        _audioSource.resource = _audioResource;
        _audioSource.Play();
    }
}

まとめ

足音などは自然に聞こえるようにコード上で都度実装していましたが、
複雑な再生サイクルやランダマイズはできないものの単純な繰り返しや簡単なランダム、ピッチや音量程度であれば、AudioRandomContainerは大変便利そうです。
ノーコーディングで実装可能になる部分が増えて素晴らしい。

是非、ランダムな音の再生が必要になったときに試してみてはいかがでしょうか。

Discussion