Ánh Sáng Cuối Cùng
← Tất cả nhật ký
Nhật ký #0302/10/2026· 9 phút đọcÂm thanhCode

Âm thanh: 189 file, 6 lớp ưu tiên, và nghệ thuật làm cho bớt ồn

Đi tìm tiếng cho từng thao tác đã mệt, nhưng nhét hết vào game mới là phần khó: 8 con zombie cùng rên thì thành một bức tường ồn. Đây là cách mình chia lớp và cắt bớt để từng tiếng còn nghe ra được.

Âm thanh là thứ làm đúng thì không ai để ý, làm sai thì chơi vào thấy giả ngay mà không chỉ ra được vì sao. Mấy tuần nay mình làm phần này cho màn xí nghiệp, và nó ngốn thời gian hơn mình tưởng nhiều.

Chương 1Phần mệt nhất: đi tìm tiếng cho từng thao tác

Lúc ngồi liệt kê ra mới thấy sợ. Nhân vật không chỉ "đi" và "đánh" — cậu ấy đi bộ, chạy, ngồi thấp đi, nhảy, chạm đất, đấm trúng, đấm trượt, vung vũ khí, chém trúng thân, nạp đạn, bóp cò khi hết đạn, thở gắng sức, kêu lúc trúng đòn. Zombie còn nhiều hơn: đi tuần, chạy đuổi, rên, gầm, vung móng vuốt, cào trúng, cào trượt, ngã xuống sàn, hấp hối.

Mỗi thao tác lại không thể chỉ có một tiếng. Nghe lặp đúng một file hai lần liên tiếp là tai nhận ra ngay, cảm giác máy móc hiện lên lập tức. Nên mỗi loại phải có nhiều biến thể để bốc ngẫu nhiên.

Kết quả: 189 file âm thanh cho một màn chơi.

Kho âm thanh: 189 file chia theo từng loại thao tác
Kho âm thanh: 189 file chia theo từng loại thao tác

Riêng tiếng thở gắng sức khi ra đòn đã 30 file, bước chân zombie 24 file cho lúc đi và 18 file cho lúc chạy. Nghe thì nhiều, nhưng đánh nhau tầm một phút là chạy qua gần hết.

Nói thì khó hình dung, nghe thử là rõ ngay. Đây là tiếng thật đang chạy trong game — bấm vài lần vào cùng một thao tác để thấy mỗi lần một tiếng khác:

Đang tải bảng nghe thử...

Chương 2Bước chân: bám theo khung hình, không bám theo đồng hồ

Lỗi đầu tiên mình mắc: phát tiếng bước chân theo bộ đếm giờ — cứ chừng đó phần giây thì kêu một tiếng.

Nghe thì hợp lý, nhưng animation của nhân vật chạy nhanh chậm theo tốc độ di chuyển thật. Đi chậm thì khung hình chạy chậm, chạy nhanh thì khung chạy nhanh. Đồng hồ thì vẫn đều đều. Thế là tiếng bước và chân chạm đất lệch nhau — nhìn chân còn đang lơ lửng mà đã nghe cộp.

Cách sửa: bỏ đồng hồ, bám thẳng vào khung hình nào chân chạm đất (khung 0 và khung giữa) rồi phát đúng lúc đó.

So sánh phát tiếng theo khung hình và theo đồng hồ
So sánh phát tiếng theo khung hình và theo đồng hồ

Một chi tiết nhỏ nữa: bước chân của nhân vật chính mình cho chạy tuần tự 1 → 9 rồi quay lại, không bốc ngẫu nhiên. Bốc ngẫu nhiên thì thỉnh thoảng trúng hai tiếng giống nhau liền nhau, nghe như vấp. Zombie thì ngược lại — bốc ngẫu nhiên lại tốt, vì nhiều con đi cùng lúc, đều nhịp quá mới là lạ.

Tình huống: tiếng bước chân không chỉ để nghe cho vui

Chỗ này mới là lý do mình kỹ với bước chân đến vậy: zombie dùng chính tiếng đó để tìm mình.

Lấy một cảnh cụ thể trong hành lang xí nghiệp. Có một con đứng chắn đường, mình cần lách qua lưng nó. Mình dừng cách đúng 100px:

Tầm nhìn và tầm nghe của zombie thay đổi khi người chơi ngồi thấp hoặc bật đèn pin
Tầm nhìn và tầm nghe của zombie thay đổi khi người chơi ngồi thấp hoặc bật đèn pin

Đứng mà đi thì 100px nằm gọn trong cả tầm nhìn (130px) lẫn tầm nghe (110px) — lộ hai đường một lúc. Ngồi thấp xuống thì tầm nhìn của nó co lại còn 35%, tụt xuống 45px, và tiếng bước chân ngồi thấp không đánh thức tai nó nữa. Cùng một chỗ đứng, chỉ khác tư thế, mà một bên là bị rượt còn một bên là đi lọt.

Cái đèn pin thì đúng kiểu con dao hai lưỡi mình thích nhất: bật lên, tầm nhìn của zombie nở ra 1.6 lần thành 208px. Sáng để mình thấy đường, nhưng cũng là tự khai báo vị trí từ xa gấp rưỡi.

Chương 3Chia lớp: ai được nghe trước

Đây mới là phần "nghệ thuật tinh chỉnh" mà mình không lường trước.

Lúc mọi thứ đã có tiếng, chơi vào thì... ồn không chịu nổi. Đang đánh nhau với ba con zombie: bước chân mình, bước chân tụi nó, tiếng rên, tiếng vung tay, tiếng trúng đòn, tiếng nền căn phòng — tất cả cùng một mức. Tiếng súng bắn ra chìm nghỉm giữa đống đó, trong khi đó mới là thứ phải nghe rõ nhất.

Mình xếp lại tất cả thành 6 mức ưu tiên. Khi quá nhiều tiếng chen nhau, mức thấp bị cắt trước để mức cao còn nguyên:

Sáu lớp ưu tiên âm thanh trong game
Sáu lớp ưu tiên âm thanh trong game

Nguyên tắc mình tự rút ra: thứ gì phản hồi trực tiếp cho hành động người chơi vừa bấm thì đứng trên; thứ gì là không khí nền thì nằm dưới và chấp nhận bị cắt. Tiếng súng ở trên cùng vì bắn mà không nghe thấy thì người chơi tưởng game đứng máy.

Riêng bước chân zombie, ngoài việc để ở mức gần thấp nhất, mình còn hạ âm lượng xuống 35%. Lý do đơn giản: một con thì dễ thương, năm con là tiếng chân lấn hết mọi thứ khác.

Tình huống: bắn một phát trong hành lang

Nói mức ưu tiên thì khô khan, lấy đúng một khoảnh khắc ra mổ sẽ rõ hơn. Mình đang đi trong hành lang, có ba con zombie rải rác phía trước, và mình bóp cò:

Một phát súng đánh động zombie trong bán kính 420px và năm tiếng cùng phát ra lúc đó
Một phát súng đánh động zombie trong bán kính 420px và năm tiếng cùng phát ra lúc đó

Chỉ một cái bóp cò mà năm tiếng nổ ra cùng lúc: tiếng súng, tiếng thở gắng sức, tiếng con A gầm lên vì nó đã thấy mình, bước chân mình, rồi bước chân hai con đang lao tới. Nếu tất cả cùng một mức thì tiếng súng — thứ quan trọng nhất — sẽ bị chôn dưới đống còn lại.

Phát súng cũng đánh động mọi zombie trong bán kính 420px. Con A cách 150px và con B cách 380px đều nghe thấy và bỏ tuần tra để lao tới. Con C ở 560px thì không — nó vẫn đi tuần như chưa có gì xảy ra, và cũng không góp thêm tiếng nào vào mớ âm thanh đang chen nhau. Giới hạn khoảng cách vừa là luật chơi, vừa là cách giữ cho hành lang khỏi biến thành bức tường ồn mỗi lần nổ súng.

Chương 4Một đàn zombie mà không thành bức tường ồn

Vấn đề khó nhất nằm ở tiếng rên và gầm của zombie.

Mỗi con cứ vài giây lại phát ra một tiếng. Một con thì rợn người đúng ý. Nhưng khi tám con cùng dồn vào một phòng thì tám tiếng rên chồng lên nhau thành một khối tiếng ù ù, vừa chói vừa mất hẳn cảm giác đáng sợ — mà còn đè chết tiếng đánh nhau.

Giải pháp: cả đàn dùng chung một "chỗ trống". Con nào muốn rên thì phải xem chỗ đó có trống không; trống thì mới được phát, và nó giữ chỗ đúng bằng độ dài của tiếng đó. Trong lúc đó mọi con khác muốn rên đều phải im.

Cơ chế chỗ trống giới hạn số zombie được phát tiếng cùng lúc
Cơ chế chỗ trống giới hạn số zombie được phát tiếng cùng lúc

Nghe thì có vẻ "ăn gian", nhưng chơi vào lại đúng cảm giác hơn hẳn: vẫn biết trong phòng có cả đàn, nhưng mỗi lần chỉ một tiếng vọng ra từ đâu đó trong bóng tối.

Tình huống: tám con dồn vào một phòng

Để thấy cơ chế đó khắc nghiệt cỡ nào, mình vẽ lại đúng 14 giây của một phòng có tám con:

Dòng thời gian 14 giây cho thấy chỉ 3 trong số các lần đòi phát tiếng được chấp nhận
Dòng thời gian 14 giây cho thấy chỉ 3 trong số các lần đòi phát tiếng được chấp nhận

Con số đáng nói nằm ở đây: tiếng rên dài 6.85 giây. Con nào giành được chỗ trống là giữ nguyên chừng đó — gần bảy giây cả đàn phải câm. Trong 14 giây của cảnh này có mười lăm lần zombie đòi phát tiếng, mà chỉ ba lần lọt: một tiếng rên lúc đầu, rồi hai tiếng gầm sau khi mình bị phát hiện. Mười hai lần còn lại rơi đúng vào lúc chỗ đang bận, và tụi nó đành im.

Nghe thì phí, nhưng đó chính là thứ cứu cả đoạn. Tám tiếng rên chồng lên nhau là một khối ù ù vô nghĩa; một tiếng rên lẻ loi vọng ra từ trong tối thì rợn hơn nhiều — mà lại chừa chỗ cho tiếng súng và tiếng đánh nhau còn nghe ra được.

Thêm hai lớp nữa trên cùng cơ chế đó:

  • Âm lượng giảm dần theo khoảng cách — xa quá 650px thì gần như không nghe, sàn ở mức 12%. Nhờ vậy tiếng rên còn làm được việc định hướng: nghe to dần là biết nó đang tới gần.
  • Chưa thấy mình thì rên, thấy rồi thì gầm. Hai tiếng khác hẳn nhau, nên không cần nhìn cũng biết mình vừa bị lộ. Nhịp phát cũng nhanh hơn khi đã phát hiện ra người chơi.

Chương 5Một cú đánh là hai lớp chồng lên nhau

Chi tiết nhỏ nhưng tạo khác biệt lớn: mỗi lần ra đòn, game phát hai tiếng cùng lúc ở hai mức khác nhau — tiếng thở gắng sức của nhân vật (mức 4) và tiếng vũ khí rẽ gió (mức 3). Trúng đòn thì cộng thêm tiếng va chạm vào thân.

Ba lớp đó chồng lên nhau mới ra được cái cảm giác "cú đánh này nặng". Bỏ tiếng thở đi, chỉ còn tiếng gió, lập tức thấy nhẹ hẫng như đang vung vào không khí.

Chương 6Chỗ khó nhất hoá ra không phải đi tìm tiếng

Mình tưởng phần cực nhất là lùng cho đủ 189 file. Thật ra việc đó chỉ tốn thời gian, không khó.

Khó là ở khâu sau: khi tất cả đã nằm trong game và cùng kêu một lúc. Không có lớp lang thì càng thêm tiếng, game càng tệ đi chứ không hay lên — thêm vào thì ồn, bỏ ra thì trống trải. Phải ngồi chơi đi chơi lại, mỗi lần chỉnh một mức ưu tiên hay một nấc âm lượng, rồi nghe lại xem có còn nhận ra tiếng quan trọng không.

Và cũng như mấy thứ vô hình bên phần nhân vật — chỉnh xong rồi thì không ai nhận ra là mình đã chỉnh gì cả. Người chơi chỉ thấy "nghe đã". Nhưng đó đúng là mục tiêu.

Chương 7Tiếp theo

Phần còn thiếu là nhạc nền và tiếng động theo khu vực — hành lang, nhà xưởng, ngoài đường mưa đều phải khác nhau. Và mình muốn thử cho âm lượng tiếng nền hạ xuống lúc đánh nhau, rồi dâng lại khi yên — để lúc căng và lúc thở được tách bạch bằng tai, không chỉ bằng mắt.