Nguyễn Đình Cường
0 comment
09 Nov, 2026
Hai game có cùng luật chơi nhưng game có tiếng "ting" khi nhặt xu và tia sáng bung ra khi trúng đích luôn cho cảm giác sướng hơn hẳn. Bài này hướng dẫn thêm âm thanh bằng AudioSource và hiệu ứng hạt bằng Particle System trong Unity, kèm cách quản lý gọn gàng.
Có ba thành phần chính. AudioClip là tệp âm thanh (wav, mp3, ogg). AudioSource là bộ phát, gắn vào đối tượng để phát clip. AudioListener là "đôi tai", thường nằm sẵn trên Main Camera; mỗi scene chỉ nên có một. Để dùng, hãy kéo tệp âm thanh vào thư mục Assets, tốt nhất là tạo thư mục riêng Audio.
Về nguồn âm thanh, hãy dùng tệp do bạn tự tạo hoặc có giấy phép cho phép dùng, ví dụ các thư viện âm thanh miễn phí bản quyền. Đừng lấy nhạc game thương mại làm tài nguyên cho game của mình.
Music, thêm component Audio Source.Với tiếng ngắn như nhặt xu, nhảy, va chạm, ta cần phát nhiều lần chồng nhau. Hàm PlayOneShot của AudioSource phù hợp, vì nó không cắt tiếng đang phát. Tạo một bộ quản lý âm thanh dùng chung:
using UnityEngine;
public class AudioManager : MonoBehaviour
{
public static AudioManager Instance { get; private set; }
[SerializeField] private AudioSource sfxSource;
[SerializeField] private AudioClip coinClip;
[SerializeField] private AudioClip jumpClip;
[SerializeField] private AudioClip hitClip;
void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
}
public void PlayCoin() => Play(coinClip);
public void PlayJump() => Play(jumpClip);
public void PlayHit() => Play(hitClip);
private void Play(AudioClip clip, float volume = 1f)
{
if (clip == null) return;
// đổi cao độ nhẹ để tiếng lặp lại bớt nhàm
sfxSource.pitch = Random.Range(0.95f, 1.05f);
sfxSource.PlayOneShot(clip, volume);
}
}Mẹo hay: thay đổi nhẹ pitch ngẫu nhiên giúp tiếng lặp lại nghe tự nhiên hơn. Gọi âm thanh từ nơi khác rất đơn giản, ví dụ trong script đồng xu: AudioManager.Instance.PlayCoin(); trước khi hủy đồng xu. Vì âm thanh phát từ bộ quản lý chứ không phải từ đồng xu đang bị hủy, tiếng sẽ không bị cắt giữa chừng.
CoinBurst.using UnityEngine;
public class Coin : MonoBehaviour
{
[SerializeField] private int value = 1;
[SerializeField] private GameObject burstPrefab;
private void OnTriggerEnter2D(Collider2D other)
{
if (!other.CompareTag("Player")) return;
ScoreManager.Instance.AddScore(value);
AudioManager.Instance.PlayCoin();
if (burstPrefab != null)
{
Instantiate(burstPrefab, transform.position, Quaternion.identity);
}
Destroy(gameObject);
}
}Đoạn này giả định bạn đã có ScoreManager từ bài thu thập đồng xu. Nếu chưa, có thể bỏ dòng cộng điểm để thử riêng âm thanh và hạt. Với game 2D, nếu hạt bị nằm sau nền, hãy chỉnh Order in Layer trong mục Renderer của Particle System cho cao hơn.
Khi game lớn dần, hãy tạo Audio Mixer (Window > Audio > Audio Mixer) với nhóm Music và SFX riêng, rồi gán đầu ra của các AudioSource vào nhóm tương ứng. Bạn có thể phơi bày tham số âm lượng để làm thanh trượt cài đặt, và nhớ chuyển giá trị thanh trượt sang thang decibel (dạng logarit) cho cảm giác âm lượng tự nhiên.
Âm thanh và hạt là hai cách rẻ nhất để nâng cảm giác chơi. Một bộ quản lý âm thanh dùng chung, vài hạt vàng bung ra và tiếng hơi khác nhau mỗi lần là đủ để đồng xu của bạn "đã tay" hơn nhiều.
Nếu muốn học làm game có chiều sâu từ thiết kế đến hoàn thiện, hãy khám phá các khóa học tại codebem.com.
Nguyễn Đình Cường
0 comment