U
tab 04Thế giới & Vòng lặp game7 bài — chạm để mở
05 / 07 · 10 phút
Thế giới & Vòng lặp game

Âm thanh và không khí

dự án của bạn tới lúc này

Assets/

Scenes/

Arena.unity

Terrain

Scripts/

PropScatter.csGameAudioSettings.csFootstepPlayer.cs

Prefabs/

Knight prefab

Animations/

AC_Knight

Audio/

MainMixer

đã có sẵnbài này thêm

Ngoài nhạc nền và tiếng bấm nút đã thêm ở tab 01, mọi thứ bạn dựng tới giờ đều im lặng. Knight đi không có tiếng bước chân, dùng skill không có tiếng, và khu rừng thì không có tiếng gió.

Tắt tiếng bất kỳ game nào bạn thích, nó lập tức trông rẻ tiền hẳn. Âm thanh là một nửa của không khí, và là nửa mà người mới hay bỏ qua hoàn toàn.

sơ đồ động

Ba lớp, một mixer, và tiếng 3D nhỏ dần theo khoảng cách cho mọi thứ có vị trí trong thế giới.

Ba lớp âm thanh

  • Nhạc nền — một bản lặp, 2D, không đổi âm lượng theo khoảng cách. Đặt Spatial Blend là 0.

  • Tiếng nền — gió, chim, suối. Để 2D cho nền chung, để 3D cho một cái thác cụ thể.

  • Hiệu ứng — bước chân, trúng đòn, dùng skill. Luôn 3D, luôn ngắn, luôn pool lại.

Thiết lập import quyết định ngân sách bộ nhớ

  1. 1

    Nhạc và tiếng nền dài → Load Type = Streaming, Compression = Vorbis, Quality 60–70%.

  2. 2

    Hiệu ứng ngắn → Load Type = Decompress On Load, Compression = PCM hoặc ADPCM. Chúng phải kêu ngay lập tức.

  3. 3

    Bỏ tick Preload Audio Data với mọi thứ không cần trong giây đầu tiên của cảnh.

  4. 4

    Tick Force To Mono cho mọi tiếng 3D — để stereo là vô nghĩa vì Unity sẽ tự định vị nó, mà chuyển sang mono thì dung lượng giảm một nửa.

Audio Mixer — mỗi lớp một thanh âm lượng

  1. 1

    Window▸Audio▸Audio Mixer → tạo một mixer tên MainMixer.

  2. 2

    Thêm ba group dưới Master: Music, Ambience, SFX.

  3. 3

    Chuột phải vào Volume của từng group → Expose to script, rồi đổi tên tham số thành MusicVol, AmbienceVol, SfxVol.

  4. 4

    Trỏ Output của mọi AudioSource vào đúng group. Giờ một thanh trượt điều khiển cả một nhóm.

GameAudioSettings.cs — the settings menu talks to the mixer
using UnityEngine;
using UnityEngine.Audio;

public class GameAudioSettings : MonoBehaviour
{
    [SerializeField] private AudioMixer mixer;

    //thanh trượt cho 0..1, mixer cần decibel
    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 là im lặng. Dùng Log10 để thanh trượt nghe có vẻ tuyến tính với tai người.
        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));
    }
}

Tiếng 3D nghe ra chất 3D

  • Spatial Blend = 1 làm nguồn âm thành 3D hoàn toàn. Để 0 thì chỗ nào cũng nghe to như nhau.

  • Volume Rolloff = Linear dễ chỉnh hơn Logarithmic, nhất là với màn chơi nhỏ.

  • Min Distance là bán kính còn nghe to nhất; Max Distance là chỗ tắt hẳn. Thường dùng: 2 m và 20 m.

  • Trong cảnh phải có đúng một AudioListener, và nó nằm trên camera.

Tiếng bước chân không nghe như súng máy

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 mẫu khác nhau

    private int last = -1;

    /// gọi từ Animation Event đặt trên clip đi và chạy
    public void Step()
    {
        if (clips.Length == 0) return;

        //không phát trùng clip hai lần liền
        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);      // lệch cao độ chút xíu
        source.PlayOneShot(clips[i], Random.Range(0.8f, 1f));
    }
}
  • Bốn mẫu tiếng cộng cao độ ngẫu nhiên là khác biệt giữa 'một game' và 'một bản nháp'. Chỉ tốn mười phút.

  • PlayOneShot cho phép tiếng chồng lên nhau; source.Play() cắt phăng tiếng trước đó.

  • Animation Event đặt tiếng bước đúng khung hình chân chạm đất — dùng bộ đếm giờ không bao giờ khớp được.

Kiếm âm thanh ở đâu

  • freesound.org — kho khổng lồ, miễn phí, nhưng phải xem giấy phép từng file (CC0 là loại an toàn).

  • Unity Asset Store có các gói hiệu ứng miễn phí; lọc giá 0.

  • Tự thu bằng điện thoại. Bước chân trên sỏi, tiếng cửa, tiếng bàn phím — hiệu quả hơn bạn tưởng nhiều.

  • Đừng bao giờ dùng nhạc lấy từ YouTube. Dính bản quyền trên store là gỡ nguyên ứng dụng.