← Về blog

Vùng An Toàn UI Game và QA Thiết Bị: Thứ Tự Debug và Sửa Prefab cho Kỹ Sư

Khi Unity Editor trông ổn nhưng notch cắt HUD hoặc chạm bị lệch: phân loại lỗi, debug Canvas Scaler và Screen.safeArea, sửa Prefab so với tái xuất Studio—với dấu vùng an toàn thiết kế làm hỗ trợ.

Đăng ngày
  • game-ui-design
  • game-dev-ai
  • ui-to-engine
  • safe-area
  • unity
  • godot
  • cocos
  • vberai
  • qa
  • 2026
Vùng An Toàn UI Game và QA Thiết Bị: Thứ Tự Debug và Sửa Prefab cho Kỹ Sư

Báo cáo kỹ thuật phổ biến nhất: Game view trông ổn, nhưng trên điện thoại màn hình dài HUD nằm dưới notch, hoặc nút trông có thể chạm nhưng lại trượt. Vùng An Toàn không phải là “đẩy nhẹ Anchor”—nó là chính sách Canvas gốc, nền full-bleed so với nội dung inset, và liệu safeArea runtime có khớp với kênh hay không.

các lớp lỗi, thứ tự debug Unity UGUI, quy tắc sửa Prefab, và lưu ý về kênh/mini-game. Dấu vùng an toàn của mục bàn giao thiết kế số 7 được tóm tắt trong phần “những gì thiết kế phải cung cấp”; phạm vi thiết bị của mục trước khi ship số 1 được mở rộng ở đây—không lặp lại checklist engine + MCP Raycast / lần Play đầu tiên.

Godot / Cocos: Ánh xạ sang DisplayServer.get_display_safe_area() / widget SafeArea của engine; cùng thứ tự bước như Unity bên dưới.

Tiêu chí không đạt (bất kỳ điều nào = không đạt): UI đọc được chính hoặc nút bắt buộc nằm dưới che khuất hệ thống (notch, home indicator, góc bo tròn); lệch rõ ràng giữa hình ảnh và điểm chạm; chỉ Editor 16:9 mà không có tỷ lệ mục tiêu trên thiết bị; hành vi Vùng An Toàn Dev so với Release khác nhau mà không có đặc tả.


Phân loại trước: cắt, lệch, hay chỉ nền

Triệu chứngNghi ngờ đầu tiênHành động kỹ thuật
Cắt hình ảnh (chữ/icon trong notch)Nội dung chưa inset; gốc bị coi là toàn màn hìnhKiểm tra safeArea so với rect nội dung
Lệch điểm chạm (trông đúng, lại trượt)Chế độ scale Canvas, nhiều Canvas, camera không khớpRaycast EventSystem + renderMode của Canvas
Nền bị cắt, nút vẫn ổnNền full-bleed theo thiết kế, nội dung insetKhông phải lỗi nếu đặc tả cho phép
Sai sau khi xoayKhông có listener cho thay đổi hướng / safeAreaTính lại inset khi xoay
Chỉ một bản build kênhSDK thay đổi safeArea hoặc độ phân giảiSmoke bản build đó; đừng chỉ dựa vào Android chung

Notch clip vs correct safe inset

Visual button vs hit area offset


Unity UGUI: thứ tự debug đề xuất (6 bước)

1. Khóa việc tái hiện

Ghi lại thiết bị, OS, Dev/Release, hướng, độ phân giải Game view. Mục trước khi ship số 5: chạy HUD chính trên Dev và Release.

2. Log safeArea và độ phân giải tham chiếu

Sau khi UI chính tải, log:

  • Screen.width / Screen.height
  • Screen.safeArea
  • Display.cutouts (Android 11+ nếu dùng)

Đọc: safeArea nhỏ hơn màn hình → cần inset nội dung. Trong Editor safeArea thường bằng toàn màn hình → không thay thế được thiết bị.

3. Canvas gốc và Canvas Scaler

Kiểm traLỗi thường gặpHướng khắc phục
Render Mode gốcTrộn Screen Space / Camera UI → lệch rayMột chế độ cho UI
Canvas ScalerĐộ phân giải tham chiếu ≠ baseline dọc của dự ánKhớp checklist engine mục 1
Match width/heightTỷ lệ dài scale sai; widget rìa trôiThống nhất Match với thiết kế/prod; sửa Prefab chứ không chỉ Scene
Sắp xếp nhiều CanvasĐiểm chạm vào sai lớpCăn chỉnh sortingOrder và raycast target

4. Lớp: nền full-bleed so với nội dung an toàn

Gợi ý phân cấp Prefab:

Canvas
├── Background_FullBleed   (anchor đầy đủ, có thể vào notch, không nhận input)
└── SafeRoot               (component Safe Area hoặc padding dựa trên safeArea)
    ├── HUD_Content
    └── Popups

Background_FullBleed and SafeRoot hierarchy

Dùng Safe Area của Unity (hoặc code dự án đặt offsetMin/Max từ Screen.safeArea). Không kéo giãn nút tương tác toàn màn hình mà không inset.

Xuất từ Studio với một lớp phẳng: xem nine-slice / tái xuất có cấu trúc và canvas → Prefab.

5. Kiểm tra điểm chạm trên thiết bị

3–5 nút quan trọng trên luồng chính; so sánh tâm hình ảnh với ngón tay. Chỉ lệch trên một popup → kiểm tra Canvas lồng nhau hoặc Scaler kép.

6. Commit Prefab vào repo

Tiêu chí đạt nằm trong Prefab có version, không phải override Scene test (mục trước khi ship số 6). Sau khi đổi Anchor, chạy smoke tràn văn bản đa ngôn ngữ trên các ngôn ngữ stress.


Kênh / mini-game (kỹ thuật)

Tình huốngLưu ý
Ứng dụng nativeScreen.safeArea + thiết bị thật
Một số mini-game / ứng dụng nhanhsafeArea / systemInfo của container ≠ mô phỏng Editor
Cutout Androidcutout so với safeArea có thể khác
PC / decksafeArea thường toàn màn hình

Mẫu: ISafeAreaProvider (hoặc tương đương); inject theo nền tảng—tránh #if trong Prefab HUD.


Định tuyến khắc phục

Triệu chứngNguyên nhân khả năngHành độngChủ sở hữu
Cắt trên thiết bị, Editor ổnKhông có SafeRoot / không có driver safeAreaPhân lớp Prefab + Safe Area; test lại thiết bịKỹ thuật
Nền ổn, nút bị cắtNút nằm dưới lớp trànChuyển sang SafeRoot; Studio tái xuất lớpKỹ thuật + Thiết kế
Lệch điểm chạmNhiều Canvas / camera UI / Scaler lồng nhauGộp Canvas hoặc thống nhất camera raycastKỹ thuật
Trôi khi đổi độ phân giảiChỉ dùng anchor cố địnhSửa anchor; mục engine số 6Kỹ thuật
Thiết kế không có khung an toànThiếu mục bàn giao số 7Thiết kế thêm tham chiếu notch/home; tái xuấtThiết kế
Xuất Studio phẳngBG + HUD chưa táchTách tại chỗ rồi tái xuấtKỹ thuật + Thiết kế

Những gì thiết kế cung cấp (thứ yếu)

Bàn giaoKỹ thuật dùng
Độ phân giải mục tiêu + tham chiếu an toàn (notch / home bar)Reference Resolution và kỳ vọng inset
Lớp full-bleed so với HUD được đặt tênPrefab Background_* / SafeRoot
Tab rìa nằm trong vùng an toàn hay tràn có chủ đíchChiến lược Anchor

Nhà thiết kế không cần viết script—dấu rõ ràng giảm việc đoán px inset.


Câu hỏi thường gặp

Độ phân giải Game view iPhone có đủ không?
Chỉ smoke Dev; ship cần thiết bị mục tiêu (mục trước khi ship số 1). safeArea trong Editor thường khác.

Component Safe Area so với offset thủ công?
Lựa chọn của nhóm; thủ công phải làm mới khi safeArea/hướng thay đổi—tránh logic trùng lặp.

Chỉ sửa cắt bằng Canvas Scaler?
Scaler scale; inset là riêng biệt. Cắt là rect nội dung; Scaler là scale toàn cục.

MCP/Cursor có giúp được không?
Tốt cho đổi tên Prefab, gắn Safe Area, smoke Play—số liệu vẫn từ log thiết bị. Checklist engine + MCP.

Vùng An Toàn cộng với tràn ngôn ngữ?
Sửa layout SafeRoot trước, rồi ngôn ngữ stress—inset làm hẹp chiều rộng.

VberAI Studio so với Google AI Studio?
Không. Xem so sánh.

Các bài hướng dẫn bạn có thể thích