U
タブ 04世界とゲームループ7 レッスン — タップで開く
05 / 07 · 10 分
世界とゲームループ

音と雰囲気

ここまでのプロジェクト

Assets/

Scenes/

Arena.unity

Terrain

Scripts/

PropScatter.csGameAudioSettings.csFootstepPlayer.cs

Prefabs/

Knight prefab

Animations/

AC_Knight

Audio/

MainMixer

すでにあるものこのレッスンで追加

tab 01 で追加した音楽とクリック音を除くと、これまで作ったものはすべて無音です。Knight は足音をたてて歩かず、スキルは音もなく発動し、森には風も吹いていません。

どんなゲームでもいいので音を切って再生してみてください。一気に安っぽく見えます。雰囲気づくりの半分は音で、しかも初心者がまるごと飛ばしてしまうのは、たいていその半分です。

アニメーション図

3 つのレイヤー、1 つの mixer、そしてワールド上に位置を持つ音には 3D の減衰を。

3 つのレイヤー

  • Music —— ループする 1 トラック、2D で、距離によって音量は変わりません。Spatial Blend は 0 にします。

  • Ambience —— 風、小鳥、川。全体を覆うベースは 2D、特定の滝なら 3D にします。

  • SFX —— 足音、命中、スキル発動。常に 3D、常に短く、常にプールして使います。

Import 設定がメモリの予算を決める

  1. 1

    音楽や長い環境音は Load Type = Streaming、Compression = Vorbis、Quality 60–70% にします。

  2. 2

    短い SFX は Load Type = Decompress On Load、Compression = PCM か ADPCM。一瞬で鳴らないといけないからです。

  3. 3

    シーンの最初の 1 秒で必要でないものは、Preload Audio Data のチェックを外してください。

  4. 4

    3D の音にはすべて Force To Mono をオンに——どうせ Unity が位置を決めるのでステレオの意味はなく、サイズも半分になります。

Audio Mixer —— レイヤーごとに音量スライダー 1 本

  1. 1

    Window▸Audio▸Audio Mixer を開き、MainMixer という名前の mixer を作成します。

  2. 2

    Master の下に group を 3 つ追加します:Music、Ambience、SFX。

  3. 3

    各 group の Volume を右クリックして Expose to script を選び、パラメータ名を MusicVol、AmbienceVol、SfxVol に変更します。

  4. 4

    すべての AudioSource の Output を正しい group に向けます。これでスライダー 1 本でカテゴリ全体を制御できます。

GameAudioSettings.cs — the settings menu talks to the mixer
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 です。

マシンガンのように聞こえない足音

FootstepPlayer.cs — on the Knight, driven by Animation Events on AC_Knight
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 で見つけた音をそのまま出荷するのは絶対にやめてください。ストアで著作権ストライクを喰らうとアプリごと削除されます。