7 Audio

1. Giới thiệu về Audio trong Unity

Unity cung cấp một hệ thống quản lý audio mạnh mẽ để xử lý các hiệu ứng âm thanh (SFX) và nhạc nền (BGM) trong game. Hệ thống này bao gồm các thành phần chính như AudioSource, AudioClip, AudioListener, và AudioMixer.

Thành phần cơ bản:

  1. AudioSource: Thành phần phát âm thanh.
  2. AudioClip: Dữ liệu âm thanh được phát bởi AudioSource.
  3. AudioListener: Thành phần nhận âm thanh, thường được gắn với camera.
  4. AudioMixer: Dùng để trộn nhiều âm thanh và điều chỉnh hiệu ứng.

2. Sử dụng AudioSource và AudioClip

a. Thêm AudioSource vào GameObject

Để phát âm thanh, trước tiên bạn cần gắn một AudioSource vào một GameObject.

using UnityEngine;

public class PlayAudio : MonoBehaviour
{
    public AudioClip audioClip;  // Gắn clip từ Inspector
    private AudioSource audioSource;

    void Start()
    {
        // Thêm component AudioSource nếu chưa có
        audioSource = gameObject.AddComponent<AudioSource>();
        audioSource.clip = audioClip;
    }

    void Update()
    {
        // Phát âm thanh khi nhấn phím Space
        if (Input.GetKeyDown(KeyCode.Space))
        {
            audioSource.Play();
        }
    }
}

Giải thích:

  • audioClip: Clip âm thanh sẽ được phát.
  • audioSource.Play(): Phương thức để bắt đầu phát âm thanh.

b. Các thuộc tính của AudioSource

1. loop

Thuộc tính loop cho phép phát lặp lại âm thanh khi clip kết thúc.

audioSource.loop = true;  // Lặp lại âm thanh

2. volume

Điều chỉnh âm lượng của âm thanh, giá trị từ 0.0 (im lặng) đến 1.0 (to nhất).

audioSource.volume = 0.5f;  // Giảm âm lượng xuống một nửa

3. pitch

Điều chỉnh cao độ của âm thanh, giá trị mặc định là 1.0. Giá trị lớn hơn sẽ tăng cao độ, nhỏ hơn sẽ giảm cao độ.

audioSource.pitch = 1.5f;  // Tăng cao độ 1.5 lần

4. mute

Tắt hoặc bật âm thanh.

audioSource.mute = true;  // Tắt âm thanh

5. playOnAwake

Quy định liệu âm thanh có được phát tự động khi GameObject được khởi tạo hay không.

audioSource.playOnAwake = false;  // Không phát tự động khi bắt đầu

c. Các phương thức của AudioSource

1. Play()

Phát âm thanh từ đầu clip.

audioSource.Play();

2. Pause()

Tạm dừng phát âm thanh.

audioSource.Pause();

3. Stop()

Dừng phát âm thanh.

audioSource.Stop();

4. PlayOneShot()

Phát một clip duy nhất mà không ảnh hưởng đến clip hiện tại đang phát.

audioSource.PlayOneShot(audioClip);

5. IsPlaying

Kiểm tra xem âm thanh có đang phát hay không.

if (audioSource.isPlaying)
{
    Debug.Log("Audio is playing");
}

3. Mối quan hệ giữa AudioListener, AudioSource và AudioClip

Unity sử dụng sự phối hợp giữa ba thành phần chính là AudioClip, AudioSourceAudioListener để quản lý âm thanh.

Mối quan hệ:

  1. AudioClip: Là dữ liệu âm thanh (file âm thanh). Nó không thể tự phát mà cần được gắn vào AudioSource để phát.
  2. AudioSource: Thành phần phát âm thanh. Nó lấy dữ liệu từ AudioClip và phát ra âm thanh. Có thể điều chỉnh các thuộc tính như âm lượng, cao độ, và lặp lại âm thanh.
  3. AudioListener: Đóng vai trò như tai nghe, nhận âm thanh từ tất cả các AudioSource đang phát trong scene và gửi đến người chơi.

Quá trình phát âm thanh:

  • AudioClip chứa dữ liệu âm thanh.
  • AudioSource gắn với AudioClip, khi gọi Play(), âm thanh được phát.
  • AudioListener nhận âm thanh từ AudioSource và phát cho người chơi dựa trên vị trí và khoảng cách của nguồn âm thanh.
AudioClip  ---->  AudioSource  ---->  AudioListener  ---->  Người chơi
  (Dữ liệu)       (Phát âm)           (Nhận âm)

4. Sử dụng AudioListener

AudioListener là gì?

AudioListener là thành phần quan trọng trong hệ thống âm thanh của Unity, đóng vai trò như một chiếc micro thu âm thanh từ các AudioSource đang phát trong scene. Nó thường được gắn vào camera chính để người chơi nghe được âm thanh dựa trên góc nhìn của họ.

Các thuộc tính và phương thức của AudioListener

1. pause

Thuộc tính pause cho phép tạm dừng hoặc tiếp tục nhận âm thanh từ tất cả các AudioSource trong scene.

AudioListener.pause = true;  // Tạm dừng nhận âm thanh
AudioListener.pause = false; // Tiếp tục nhận âm thanh

2. GetOutputData()

Phương thức này cho phép lấy dữ liệu âm thanh đang phát dưới dạng một mảng float.

float[] samples = new float[256];
AudioListener.GetOutputData(samples, 0);

Lưu ý quan trọng khi sử dụng AudioListener

  • Mỗi scene chỉ nên có một AudioListener đang hoạt động. Nếu có nhiều hơn một AudioListener, Unity sẽ hiển thị cảnh báo và có thể gây ra lỗi âm thanh.
  • AudioListener thường được gắn vào camera chính vì âm thanh mà người chơi nghe được sẽ phụ thuộc vào vị trí và góc nhìn của camera.

Ví dụ sử dụng AudioListener

Dưới đây là ví dụ về việc tạm dừng và tiếp tục nhận âm thanh khi người chơi bật hoặc tắt menu Pause:

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    private bool isPaused = false;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            isPaused = !isPaused;
            AudioListener.pause = isPaused;  // Tạm dừng hoặc tiếp tục nhận âm thanh
        }
    }
}

5. Sử dụng AudioMixer

AudioMixer là gì?

AudioMixer là công cụ giúp bạn quản lý và điều chỉnh nhiều AudioSource một cách hiệu quả bằng cách nhóm các âm thanh lại với nhau. Thay vì điều chỉnh âm lượng hay thêm hiệu ứng cho từng AudioSource, bạn có thể sử dụng AudioMixer để điều chỉnh các nhóm âm thanh một cách tập trung.

Mối quan hệ giữa AudioMixer, AudioSource và AudioClip

  • AudioClip là dữ liệu âm thanh.
  • AudioSource phát AudioClip và gửi âm thanh đến AudioMixer thông qua thuộc tính Output.
  • AudioMixer nhận âm thanh từ nhiều AudioSource, cho phép bạn điều chỉnh âm lượng, áp dụng hiệu ứng, hoặc tắt tiếng theo từng nhóm âm thanh.

Cách sử dụng AudioMixer

Bước 1: Tạo AudioMixer

  1. Nhấn chuột phải vào thư mục trong Project > Create > Audio Mixer.
  2. Đặt tên cho AudioMixer, ví dụ: MasterMixer.

Bước 2: Tạo các nhóm (Group) trong AudioMixer

  1. Mở AudioMixer vừa tạo.
  2. Nhấp chuột phải vào nhóm mặc định Master và chọn Create Group để tạo nhóm mới.
  3. Đặt tên cho nhóm, ví dụ: MusicSFX.

Bước 3: Gắn AudioSource vào nhóm

  1. Chọn GameObject chứa AudioSource.
  2. Trong phần Output của AudioSource trong Inspector, kéo thả nhóm tương ứng từ AudioMixer vào.
    • Gắn nhóm Music cho AudioSource phát nhạc nền.
    • Gắn nhóm SFX cho AudioSource phát hiệu ứng âm thanh.

Bước 4: Điều chỉnh âm lượng qua script

Bạn có thể điều chỉnh âm lượng của các nhóm trong AudioMixer bằng cách sử dụng AudioMixer.SetFloat().

Ví dụ:

using UnityEngine;
using UnityEngine.Audio;

public class AudioManager : MonoBehaviour
{
    public AudioMixer audioMixer;

    public void SetMusicVolume(float volume)
    {
        audioMixer.SetFloat("MusicVolume", Mathf.Log10(volume) * 20);
    }

    public void SetSFXVolume(float volume)
    {
        audioMixer.SetFloat("SFXVolume", Mathf.Log10(volume) * 20);
    }
}

Thêm hiệu ứng vào nhóm âm thanh

  1. Chọn nhóm trong AudioMixer.
  2. Nhấn vào dấu + ở góc phải dưới của AudioMixer để thêm hiệu ứng như Reverb, Echo, Distortion, v.v.
  3. Điều chỉnh các thông số của hiệu ứng theo ý muốn.

Ví dụ thực tế

Giả sử bạn có một game với hai loại âm thanh: nhạc nền và hiệu ứng âm thanh.

  • Bạn tạo hai nhóm trong AudioMixer: MusicSFX.
  • Gắn các AudioSource phát nhạc nền vào nhóm Music, và các AudioSource phát hiệu ứng vào nhóm SFX.
  • Khi người chơi vào menu Pause, bạn có thể giảm âm lượng nhóm SFX về 0 để tắt tất cả hiệu ứng âm thanh:
public void OnPauseGame()
{
    audioMixer.SetFloat("SFXVolume", -80f);  // Giảm âm lượng nhóm SFX về -80 dB (tắt tiếng)
}

public void OnResumeGame()
{
    audioMixer.SetFloat("SFXVolume", 0f);  // Khôi phục âm lượng nhóm SFX về 0 dB
}

Tóm lại, AudioMixer dùng để làm gì?

  • Quản lý âm lượng: Điều chỉnh âm lượng của nhiều âm thanh cùng lúc bằng cách nhóm các AudioSource lại.
  • Thêm hiệu ứng: Áp dụng các hiệu ứng âm thanh như Reverb, Echo, Pitch Shift, v.v.
  • Quản lý dễ dàng: Cho phép điều chỉnh toàn bộ một nhóm âm thanh mà không cần thao tác trên từng AudioSource riêng lẻ.

6. Xử lý 3D Audio

Unity hỗ trợ âm thanh 3D, nghĩa là âm thanh sẽ thay đổi dựa trên vị trí của người nghe và nguồn phát.

a. Cài đặt AudioSource cho 3D

  1. Chọn GameObject có AudioSource.
  2. Trong phần Spatial Blend, kéo thanh trượt về phía 3D.

b. Điều chỉnh phạm vi nghe

  • Min Distance: Khoảng cách tối thiểu mà người nghe nghe thấy âm thanh ở âm lượng lớn nhất.
  • Max Distance: Khoảng cách tối đa mà âm thanh có thể được nghe thấy.
audioSource.spatialBlend = 1.0f;  // Chuyển sang hoàn toàn 3D
audioSource.minDistance = 1.0f;
audioSource.maxDistance = 20.0f;

7. Có được add nhiều AudioListener trong một project không?

Trong Unity, một scene chỉ được phép có một AudioListener đang hoạt động tại một thời điểm. Mặc dù bạn có thể thêm nhiều AudioListener vào các GameObject khác nhau, nhưng chỉ có một AudioListener sẽ thực sự nhận và xử lý âm thanh. Khi Unity phát hiện có nhiều hơn một AudioListener hoạt động, nó sẽ hiển thị cảnh báo như sau:

There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.

8. Kết luận

Audio là một phần quan trọng trong việc tạo trải nghiệm chân thực cho người chơi. Unity cung cấp đầy đủ các công cụ và API để xử lý âm thanh hiệu quả. Việc hiểu và sử dụng thành thạo các thành phần như AudioSource, AudioClip, AudioListener, và AudioMixer sẽ giúp bạn tạo ra những trò chơi sống động và hấp dẫn hơn.

Để lại một bình luận 0

Your email address will not be published. Required fields are marked *