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ừ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.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:
AudioClip
chứa dữ liệu âm thanh.AudioSource
gắn vớiAudioClip
, khi gọiPlay()
, â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ộtAudioListener
, 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átAudioClip
và gửi âm thanh đếnAudioMixer
thông qua thuộc tính Output.AudioMixer
nhậ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ở
AudioMixer
vừ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ụ:
Music
vàSFX
.
Bước 3: Gắn AudioSource vào nhóm
- Chọn GameObject chứa
AudioSource
. - Trong phần Output của
AudioSource
trongInspector
, kéo thả nhóm tương ứng từAudioMixer
vào.- Gắn nhóm
Music
choAudioSource
phát nhạc nền. - Gắn nhóm
SFX
choAudioSource
phá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
:Music
vàSFX
. - Gắn các
AudioSource
phát nhạc nền vào nhómMusic
, và cácAudioSource
phá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
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
- 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.