Bài tập: thành một game thật
everything from tab 01–04 · a run you can win or lose
Biến sân đấu thành một nơi chốn, rồi thành một game. Đắp địa hình quanh chính những khối bạn vẫn đánh nhau trên đó, bake ánh sáng, rải vài trăm cái cây, thêm tiếng nền — rồi nối ba đợt tấn công, màn thua và nút chơi lại. Vẫn phải giữ 60 FPS.
dùng lại những gì
Vẫn sân đấu đó, giờ là nơi đáng để đánh nhau — và là thứ bạn có thể thua thật.
Làm theo năm lượt
Lượt 1 — dựng khối xám
Trước khi có texture nào: đắp dáng đất rồi cho nhân vật đi thử. Nếu không gian ở dạng xám mà đã chán thì trồng bao nhiêu cây cũng không cứu được.
Terrain 200 × 200 m, heightmap resolution 513, đặt ở -100, -0.05, -100.
Dùng Set Height san phẳng một khoảng chừng 40 × 40 m quanh lưới khối đang có — đừng dời khối đi, hãy dựng thế giới quanh chúng.
Đắp đồi quanh rìa để người chơi không nhìn thấy mép terrain.
Làm mượt hai lượt. Địa hình lởm chởm là dấu hiệu số một của cảnh đầu tay.
Lượt 2 — vật liệu và mảnh ghép
Tối đa bốn lớp terrain: cỏ, đường đất, đá trên sườn dốc, và một lớp nhấn.
Tiling 10–15 m mỗi lớp để không lộ hoa văn lặp.
Dựng căn nhà từ 6 module trên lưới 1 m: sàn, tường, tường có cửa, góc, mái, bậc.
Tạo hai prefab variant của tường — đá và gỗ — để căn nhà và phế tích dùng chung một prefab gốc.
Lượt 3 — rải, đừng đặt tay
Trees count 180 radius 80 scaleRange 0.85 – 1.35 groundMask = Terrain
Rocks count 90 radius 70 scaleRange 0.6 – 1.8 groundMask = Terrain
Grass tufts count 260 radius 45 scaleRange 0.8 – 1.2 groundMask = Terrain
// đoạn kiểm tra độ dốc trong PropScatter là thứ giữ cho cây không mọc trên vách đứng
if (Vector3.Angle(hit.normal, Vector3.up) > 30f) continue;Lượt 4 — đánh sáng
Directional light ở 50, -30, 0, Mode = Mixed, bóng mềm, intensity ~1.1, hơi ngả ấm.
Đánh dấu Static cho mọi cây, đá, mảnh nhà. Knight và kẻ địch vẫn để động.
Bake ở Lightmap Resolution 10 trước để xem, rồi bake một lần ở 30 cho bản cuối. .
Sương màu khớp chân trời skybox, kiểu linear, start 90 m end 150 m — rồi hạ Far của camera xuống 160.
Lượt 5 — âm thanh và tối ưu
Một lớp tiếng nền 2D (gió + chim), một nguồn 3D ở căn nhà (tiếng lửa), tiếng bước chân qua Animation Event.
LOD Group trên prefab cây với hai mức cộng vùng Culled.
Bật GPU Instancing trên material của cây, đá và cỏ.
Shadow Distance 40 trong Quality settings. Rồi mở Profiler kiểm tra xem có đạt các mốc dưới đây không.
Khi nào thì xong
- ✓Bạn điều khiển được Knight đi từ căn nhà tới bìa rừng mà không đụng tường vô hình, không lọt sàn.
- ✓Không đứng ở đâu trong cảnh mà nhìn thấy mép terrain hay vệt ghép ở chân trời.
- ✓Bóng đổ đã bake trên vật tĩnh, chỉ nhân vật mới dùng bóng thời gian thực.
- ✓Không có hai cái cây nào trùng hệt kích thước và góc xoay.
- ✓Không cây hay đá nào lơ lửng trên không hay cắm nửa vào vách đá.
- ✓Tiếng nền nghe được ở mọi chỗ; tiếng lửa ở căn nhà nhỏ dần khi bạn đi xa.
- ✓Bảng Stats đạt đủ mọi con số trong bảng dưới, đo lúc đang đi chứ không phải đứng yên.
Con số cần đạt
| Chỉ số | Mục tiêu | Vì sao |
|---|---|---|
| Số batch (lệnh vẽ) | ≤ 100 | Đây là con số giết hiệu năng mobile trước tiên. |
| Tam giác trên màn hình | ≤ 300k | Cao hơn là GPU tầm trung bắt đầu rớt khung hình. |
| Đèn thời gian thực | 1 | Còn lại phải bake hết. Không có ngoại lệ. |
| Tầm đổ bóng | ≤ 50 m | Bóng thời gian thực thường là thứ đắt nhất trong cảnh. |
| Tầm nhìn xa của camera | ≤ 200 m | Sương mù che chỗ cắt, còn phần hiệu năng thì được miễn phí. |
| FPS lúc đang đi | ≥ 60 | Đứng yên chẳng chứng minh được gì — phải đo lúc di chuyển. |
Muốn làm thêm
Gắn script chu kỳ ngày đêm mà không bake lại — xem chỗ nào hỏng và vì sao.
Bake NavMesh và cho một kẻ địch đi tuần giữa các gốc cây.
Thêm một con suối với shader nước cuộn UV và tiếng nước dạng 3D.
Dựng thêm bản ban đêm của sân đấu, dùng chung vật thể nhưng đổi bộ ánh sáng.