Random Audio Containerを使って音をランダムに再生する
はじめに
ゲームの実装にて「キャラクターの歩く時の足音を入れてみたけど単調」「連続した音が機械的で不自然」といったことの経験は少なからずあるのではないでしょうか。
その場合の解決策として「音の違う効果音を交互に再生」や「ランダムでピッチを変更して再生」といったことを自分はよくしていました。
今回紹介する「Audio Random Container」アセットを使用すると、
それらが少し楽に実装できるようになるので実装の選択肢の一つとして試していただければと思います。
環境
項目 | バージョン |
---|---|
Unity | 6000.0.25 |
OS | macOS Sonoma 14.6.1 |
使い方
アセットの作成
Projectウィンドウで右クリック または +ボタンから
Create/Audio/Audio Random Container でアセットを生成
生成されたアセットを選択してInspectorのEdit Audio Random Container
でアセットを編集するウィンドウが表示されます。
UI
Play
▶️ボタンでプレビュー再生ができます。
音量やピッチ等がどのように再生されるかを確認できます。
Volume
音量決めるセクションです。
音源を何db(デシベル)で再生するかを設定できます。
範囲は0 ~ -80db
Randomization
サイコロマークのトグルをオンにすると
再生する音量をランダムにすることが可能です。
Volumeセクションで設定したdbから上下に振り幅を与えることが可能。
ただし「+方向のみ確率を上げたい」といった詳細な設定はできなさそうです。
Pitch
再生時の音程を変えることができ、基準となるピッチを設定できます。
Randomization
Volumeのときと同様で基準からの振れ幅を設定できます。
下限:-1200ct, 上限:1200ctとなってます。
Audio Clips
再生したいAudioClipアセットを数設定することが可能で、
各AudioClipに基準となる音量を設定できます。
再生される順番等については後述の機能にて説明します。
Trigger
プロパティ | 説明 |
---|---|
Manual | 手動で再生 |
Automatic | ループを有効にする |
Manual
手動で再生するモード。
AudioSourceのAudioResourceフィールドに設定できるようになっています。
従来通り、PlayOnAwake
やAudioResource.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