Cân bằng độ khó và nhịp độ chơi
Ở module trước, bạn đã dựng xong prototype: nhân vật di chuyển theo input, va chạm chạy đúng, điểm số đã hiện lên. Nhưng prototype "chạy được" thường mắc một trong hai bệnh: quá dễ đến mức chán, hoặc khó đến mức vừa vào đã chết. Bài này nói về việc vặn các con số đó, để vòng chơi rơi vào khoảng ở giữa.
Sau bài này, bạn sẽ:
- Giải thích được "độ khó cân bằng" nghĩa là gì trong một game 2D nhỏ.
- Nhận ra nhịp độ chơi (pacing) nằm ở đâu trong vòng chơi của bạn.
- Điều chỉnh được ba thứ: tốc độ, tần suất vật phẩm, đường cong độ khó.
- Biết cách chơi thử và ghi lại vài con số đơn giản để quyết định sửa gì.
Độ khó cân bằng là gì
Một game cân bằng không phải là game "khó vừa" theo cảm giác của bạn, mà là game giữ người chơi ở trạng thái _____: thử thách cao hơn kỹ năng một chút, đủ để họ phải tập trung nhưng không đến mức bực bội.
Có hai kiểu lệch thường gặp. Lệch về dễ: người chơi không cần cố gắng, sau 20 giây thì chán và thoát. Lệch về khó: người chơi chết liên tục mà không hiểu vì sao, cảm giác là game "chơi gian" chứ không phải mình kém.
Một nguyên tắc thực dụng cho người mới làm game: độ khó phải tăng chậm hơn bạn nghĩ. Bạn đã chơi prototype của mình hàng chục lần nên bạn giỏi hơn người chơi mới rất nhiều. Hãy lấy người chơi mới làm chuẩn, không lấy bản thân làm chuẩn.
Nhịp độ chơi: căng rồi nghỉ
Pacing là cách bạn phân bổ các đoạn căng thẳng và nghỉ ngơi trong một lượt chơi. Một lượt chơi mobile 2D thường chỉ 30 đến 90 giây, nên nhịp phải rõ ràng:
- Khởi động (buildup): vài giây đầu dễ, ít vật phẩm, để người chơi làm quen điều khiển.
- Đỉnh (peak): đoạn căng nhất, vật phẩm dày, tốc độ cao, đây là lúc người chơi thấy "đã".
- Nghỉ (recovery): một khoảng trống ngắn sau đỉnh để người chơi thở và lấy lại bình tĩnh.
Nếu không có đoạn nghỉ, người chơi bị dồn liên tục và mệt chứ không vui. Nếu không có đoạn khởi động, lượt chơi đầu tiên sẽ là một cú sốc.
Bài tập nhỏ: Bạn muốn người chơi mới sống được ít nhất 30 giây ở lượt đầu. Trong 5 giây đầu, bạn nên làm gì với tần suất vật phẩm?
Xem gợi ý
Giữ tần suất vật phẩm thấp (khoảng cách giữa hai lần sinh vật phẩm lớn) trong 3 đến 5 giây đầu, chỉ cho 1 đến 2 vật phẩm xuất hiện. Mục tiêu là để người chơi học điều khiển trước khi phải né.
Ba nút vặn chính
Hầu hết việc cân bằng game 2D nhỏ gói gọn trong ba tham số. Hãy đưa chúng ra thành biến public hoặc ScriptableObject để chỉnh ngay trong Inspector mà không phải sửa code.
Tốc độ
Tốc độ tăng dần theo thời gian là cách tạo áp lực rẻ nhất. Nhưng luôn đặt _____ cho tốc độ, vì vượt một ngưỡng nào đó thì mắt và tay người chơi không còn theo kịp, game thành không thể thắng chứ không phải khó.
public float baseSpeed = 2f; // tốc độ lúc bắt đầu
public float speedPerMinute = 0.6f; // mỗi phút cộng thêm
public float maxSpeed = 7f; // trần tốc độ
float CurrentSpeed()
{
float minutes = Time.timeSinceLevelLoad / 60f;
return Mathf.Min(baseSpeed + speedPerMinute * minutes, maxSpeed);
}
Lưu ý nhỏ nhưng hay quên: khi áp tốc độ vào chuyển động, hãy nhân với _____ (hoặc dùng Rigidbody2D.velocity) để tốc độ không phụ thuộc frame rate.
Tần suất vật phẩm
Đây là nút ảnh hưởng cảm giác chơi mạnh nhất. Bạn điều khiển nó bằng khoảng cách thời gian giữa hai lần sinh (spawn interval), giảm dần theo thời gian và cũng có trần dưới.
public float startInterval = 1.2f; // giây giữa hai vật phẩm lúc đầu
public float minInterval = 0.35f; // không bao giờ dày hơn mức này
public float shrinkPerMinute = 0.15f;
float CurrentInterval()
{
float minutes = Time.timeSinceLevelLoad / 60f;
return Mathf.Max(startInterval - shrinkPerMinute * minutes, minInterval);
}
Bài tập nhỏ: Với đoạn code trên, sau bao lâu thì spawn interval chạm trần dưới?
Xem đáp án
Chênh lệch cần rút ngắn: 1.2 trừ 0.35 bằng 0.85 giây. Mỗi phút rút 0.15 giây, vậy cần 0.85 chia 0.15, khoảng 5.67 phút, tức khoảng 5 phút 40 giây. Nếu lượt chơi trung bình chỉ 1 phút, phần lớn người chơi sẽ không bao giờ thấy trần này, và đó là điều bình thường.
Đường cong độ khó
Cách bạn tăng độ khó theo thời gian gọi là difficulty curve. Hai dạng cơ bản:
| Dạng | Công thức kiểu | Cảm giác |
|---|---|---|
| Tuyến tính | base + k * minutes |
Tăng đều, dễ đoán, an toàn cho prototype |
| Cấp số nhân | base * Mathf.Pow(1.15f, minutes) |
Tăng rất nhanh về cuối, dễ vượt ngưỡng |
Với game đầu tay, hãy bắt đầu bằng đường tuyến tính có trần. Đường _____ nghe hấp dẫn nhưng rất khó đoán, và chỉ cần lệch một chút ở hệ số là game thành bất khả thi.
Cho prototype capstone, một vòng tinh chỉnh đơn giản như sau:
flowchart TD
A["🎮 Chơi thử"] --> B["📊 Ghi lần chết và điểm"]
B --> C["🎚️ Chọn một biến để sửa"]
C --> D["🧪 Chơi thử lại"]
D --> A
Tinh chỉnh bằng playtest và vài con số
Cảm giác của bạn không đủ tin cậy. Hãy nhờ 2 đến 3 người chưa từng chơi thử và ghi lại ba con số:
| Chỉ số | Cách đo | Ngưỡng tham khảo cho prototype |
|---|---|---|
| Thời gian sống trung bình | Bấm giờ mỗi lượt, lấy trung bình 5 lượt | 30 đến 60 giây ở lượt đầu của người mới |
| Tỉ lệ chết trong 10 giây đầu | Đếm số lượt chết sớm trên tổng lượt | Nếu quá 2 trên 5 lượt thì quá khó |
| Điểm trung bình mỗi lượt | Đọc từ màn hình game over | Nên tăng dần qua các lượt chơi |
Hai ngưỡng trên chỉ là điểm khởi đầu để tham khảo, không phải chuẩn bắt buộc. Điều quan trọng là bạn ghi số trước và sau mỗi lần sửa, thay vì sửa theo cảm tính rồi quên mất mình đã đổi gì.
Khi tinh chỉnh, chỉ đổi _____ mỗi lần. Đổi cùng lúc tốc độ, tần suất và cả điểm số thì bạn sẽ không biết kết quả tốt lên nhờ cái nào.
Bài tập nhỏ: Bạn thêm 3 loại vật phẩm mới, đồng thời tăng tốc và giảm spawn interval. Người chơi thử báo "khó quá". Bạn nên làm gì tiếp theo?
Xem gợi ý
Quay lại trạng thái trước đó, rồi đưa từng thay đổi vào một lần. Thường nên giữ nguyên vật phẩm mới (vì đó là nội dung bạn muốn có) và chỉ nới tốc độ hoặc spawn interval trước, đo lại, rồi mới xét tiếp.
Thẻ ghi nhớ để tự kiểm tra
Front: Độ khó cân bằng nghĩa là gì? Back: Thử thách cao hơn kỹ năng người chơi một chút, đủ để họ tập trung mà không bực bội.
Front: Flow state là gì? Back: Trạng thái người chơi tập trung cao khi thử thách ngang tầm kỹ năng.
Front: Pacing (nhịp độ chơi) là gì? Back: Cách game phân bổ các đoạn căng thẳng và nghỉ ngơi trong một lượt chơi.
Front: Ba nút vặn chính khi cân bằng game 2D trong bài này? Back: Tốc độ, tần suất vật phẩm, đường cong độ khó.
Front: Vì sao phải đặt trần (cap) cho tốc độ và tần suất vật phẩm? Back: Để giá trị không vượt ngưỡng người chơi có thể phản ứng, tránh game thành không thể thắng.
Front: Đường cong tuyến tính khác cấp số nhân thế nào? Back: Tuyến tính cộng đều mỗi phút, dễ đoán. Cấp số nhân tăng theo lũy thừa và rất nhanh vượt ngưỡng.
Front: Mathf.Min dùng để làm gì khi tính tốc độ? Back: Chặn giá trị không vượt quá trần maxSpeed.
Front: Mathf.Max dùng để làm gì khi tính spawn interval? Back: Chặn giá trị không xuống dưới trần dưới minInterval.
Front: Time.deltaTime dùng để làm gì? Back: Nhân vào tốc độ để chuyển động không phụ thuộc frame rate.
Front: Vì sao chỉ đổi một biến mỗi lần khi tinh chỉnh? Back: Để biết kết quả thay đổi đến từ biến nào.
Front: Chỉ số nào cho biết người mới chết quá sớm? Back: Tỉ lệ chết trong 10 giây đầu và thời gian sống trung bình.
Front: Thời gian sống nên nhắm cho lượt đầu của người mới? Back: Khoảng 30 đến 60 giây, đủ để học điều khiển và thấy mình tiến bộ.
Front: Vì sao cần đoạn khởi động dễ ở đầu game? Back: Cho người chơi làm quen điều khiển trước khi áp lực tăng lên.
Front: Đưa tham số thành biến public hoặc ScriptableObject giúp gì? Back: Chỉnh ngay trong Inspector, không phải sửa code mỗi lần thử.
Mẹo và lỗi thường gặp khi cân bằng
- Lấy mình làm chuẩn: bạn đã chơi hàng chục lần, người mới thì chưa. Hãy đo bằng người mới.
- Sửa nhiều thứ cùng lúc: kết quả tốt lên mà bạn không biết vì sao, và lần sau sẽ không lặp lại được.
- Quên đặt trần: mọi tham số tăng theo thời gian đều cần một giá trị tối đa.
- Không có đoạn nghỉ: dồn căng liên tục làm người chơi mệt chứ không thấy vui.
- Chỉnh điểm số để che lỗi độ khó: điểm cao không cứu được một vòng chơi khó chịu.
- Ghi lại số liệu: một dòng trong note như "spawn 1.2s, speed 2, TB sống 25s" tiết kiệm cho bạn cả buổi sau.
Ghi nhớ nhanh và bước tiếp theo
Ba điều cần mang theo: độ khó tăng chậm hơn bạn nghĩ, luôn có trần cho mọi tham số, và mỗi lần chỉ vặn một nút rồi đo lại. Nhịp độ tốt là có khởi động, có đỉnh căng, và có khoảng nghỉ ngắn ở giữa.
Bài tiếp theo sẽ đưa những con số này vào sản phẩm thật: hoàn thiện vòng chơi, gắn UI điểm, và làm màn hình game over cho bản capstone của bạn.