Contents
- 1 1. Giới thiệu về Audio trong Unity
- 2 2. Sử dụng AudioSource và AudioClip
- 3 3. Mối quan hệ giữa AudioListener, AudioSource và AudioClip
- 4 4. Sử dụng AudioListener
- 5 5. Sử dụng AudioMixer
- 6 6. Xử lý 3D Audio
- 7 7. Có được add nhiều AudioListener trong một project không?
- 8 8. Kết luận
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:
- AudioSource: Thành phần phát âm thanh.
- AudioClip: Dữ liệu âm thanh được phát bởi
AudioSource. - AudioListener: Thành phần nhận âm thanh, thường được gắn với camera.
- 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, AudioSource và AudioListener để quản lý âm thanh.
Mối quan hệ:
AudioClip: Là dữ liệu âm thanh (file âm thanh). Nó không thể tự phát mà cần được gắn vàoAudioSourceđể phát.AudioSource: Thành phần phát âm thanh. Nó lấy dữ liệu từAudioClipvà 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.AudioListener: Đóng vai trò như tai nghe, nhận âm thanh từ tất cả cácAudioSourceđang phát trong scene và gửi đến người chơi.
Quá trình phát âm thanh:
AudioClipchứa dữ liệu âm thanh.AudioSourcegắn vớiAudioClip, khi gọiPlay(), âm thanh được phát.AudioListenernhận âm thanh từAudioSourcevà 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ộtAudioListener, Unity sẽ hiển thị cảnh báo và có thể gây ra lỗi âm thanh. AudioListenerthườ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
AudioCliplà dữ liệu âm thanh.AudioSourcephátAudioClipvà gửi âm thanh đếnAudioMixerthông qua thuộc tính Output.AudioMixernhận âm thanh từ nhiềuAudioSource, 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
- Nhấn chuột phải vào thư mục trong Project > Create > Audio Mixer.
- Đặt tên cho AudioMixer, ví dụ:
MasterMixer.
Bước 2: Tạo các nhóm (Group) trong AudioMixer
- Mở
AudioMixervừa tạo. - 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.
- Đặt tên cho nhóm, ví dụ:
MusicvàSFX.
Bước 3: Gắn AudioSource vào nhóm
- Chọn GameObject chứa
AudioSource. - Trong phần Output của
AudioSourcetrongInspector, kéo thả nhóm tương ứng từAudioMixervào.- Gắn nhóm
MusicchoAudioSourcephát nhạc nền. - Gắn nhóm
SFXchoAudioSourcephát hiệu ứng âm thanh.
- Gắn nhóm
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
- Chọn nhóm trong
AudioMixer. - Nhấn vào dấu
+ở góc phải dưới củaAudioMixerđể thêm hiệu ứng như Reverb, Echo, Distortion, v.v. - Đ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:MusicvàSFX. - Gắn các
AudioSourcephát nhạc nền vào nhómMusic, và cácAudioSourcephát hiệu ứng vào nhómSFX. - Khi người chơi vào menu Pause, bạn có thể giảm âm lượng nhóm
SFXvề 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
AudioSourcelạ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
AudioSourceriê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
- Chọn GameObject có
AudioSource. - Trong phần
Spatial Blend, kéo thanh trượt về phía3D.
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.