音と雰囲気
Assets/
Scenes/
Arena.unity
Scripts/
Prefabs/
Animations/
Audio/
すでにあるものこのレッスンで追加
tab 01 で追加した音楽とクリック音を除くと、これまで作ったものはすべて無音です。Knight は足音をたてて歩かず、スキルは音もなく発動し、森には風も吹いていません。
どんなゲームでもいいので音を切って再生してみてください。一気に安っぽく見えます。雰囲気づくりの半分は音で、しかも初心者がまるごと飛ばしてしまうのは、たいていその半分です。
3 つのレイヤー、1 つの mixer、そしてワールド上に位置を持つ音には 3D の減衰を。
3 つのレイヤー
Music —— ループする 1 トラック、2D で、距離によって音量は変わりません。Spatial Blend は 0 にします。
Ambience —— 風、小鳥、川。全体を覆うベースは 2D、特定の滝なら 3D にします。
SFX —— 足音、命中、スキル発動。常に 3D、常に短く、常にプールして使います。
Import 設定がメモリの予算を決める
- 1
音楽や長い環境音は Load Type = Streaming、Compression = Vorbis、Quality 60–70% にします。
- 2
短い SFX は Load Type = Decompress On Load、Compression = PCM か ADPCM。一瞬で鳴らないといけないからです。
- 3
シーンの最初の 1 秒で必要でないものは、Preload Audio Data のチェックを外してください。
- 4
3D の音にはすべて Force To Mono をオンに——どうせ Unity が位置を決めるのでステレオの意味はなく、サイズも半分になります。
Audio Mixer —— レイヤーごとに音量スライダー 1 本
- 1
を開き、MainMixer という名前の mixer を作成します。
- 2
Master の下に group を 3 つ追加します:Music、Ambience、SFX。
- 3
各 group の Volume を右クリックして Expose to script を選び、パラメータ名を MusicVol、AmbienceVol、SfxVol に変更します。
- 4
すべての AudioSource の Output を正しい group に向けます。これでスライダー 1 本でカテゴリ全体を制御できます。
using UnityEngine;
using UnityEngine.Audio;
public class GameAudioSettings : MonoBehaviour
{
[SerializeField] private AudioMixer mixer;
/// slider gives 0..1, the mixer wants decibels
public void SetMusic(float value01) => SetVolume("MusicVol", value01);
public void SetAmbience(float value01) => SetVolume("AmbienceVol", value01);
public void SetSfx(float value01) => SetVolume("SfxVol", value01);
void SetVolume(string param, float value01)
{
// -80 dB is silence. Log10 makes the slider feel linear to the ear.
float db = value01 <= 0.0001f ? -80f : Mathf.Log10(value01) * 20f;
mixer.SetFloat(param, db);
PlayerPrefs.SetFloat(param, value01);
}
void Start()
{
SetMusic(PlayerPrefs.GetFloat("MusicVol", 0.6f));
SetAmbience(PlayerPrefs.GetFloat("AmbienceVol", 0.8f));
SetSfx(PlayerPrefs.GetFloat("SfxVol", 1f));
}
}本当に 3D らしく聞こえる音
Spatial Blend = 1 で音が完全な 3D になり、0 だとどこでも同じ音量で聞こえます。
Volume Rolloff は Logarithmic より Linear のほうが調整しやすく、小さいレベルならなおさらです。
Min Distance は満々の音量で聞こえ続ける半径、Max Distance は完全に無音になる距離です。目安は 2 m と 20 m。
AudioListener はシーンに必ず 1 つだけ。置く場所は camera です。
マシンガンのように聞こえない足音
using UnityEngine;
public class FootstepPlayer : MonoBehaviour
{
[SerializeField] private AudioSource source;
[SerializeField] private AudioClip[] clips; // 4–6 variations
private int last = -1;
/// called from an Animation Event on the walk / run clips
public void Step()
{
if (clips.Length == 0) return;
// never play the same clip twice in a row
int i = Random.Range(0, clips.Length);
if (clips.Length > 1 && i == last) i = (i + 1) % clips.Length;
last = i;
source.pitch = Random.Range(0.92f, 1.08f); // tiny pitch jitter
source.PlayOneShot(clips[i], Random.Range(0.8f, 1f));
}
}クリップ 4 本とランダムな pitch があれば、「ゲーム」と「試作版」の差になります。かかるのは 10 分だけです。
PlayOneShot なら音を重なって鳴らせますが、source.Play() は前の音を切ってしまいます。
足が着地したフレームちょうどの位置に足音を置けるのが Animation Event で、タイマーでは絶対に合いません。
音の入手先
freesound.org —— 大量で無料ですが、ファイルごとのライセンスを確認してください(無難なのは CC0)。
Unity Asset Store にも無料の SFX パックがあります。価格 0 で絞り込めば見つかります。
スマホで自分で録る手もあります。砂利を歩く足音、ドア、キーボード——想像より使えます。
YouTube で見つけた音をそのまま出荷するのは絶対にやめてください。ストアで著作権ストライクを喰らうとアプリごと削除されます。