Phương pháp của tôi gần giống với các giải pháp do người khác đưa ra :) Tôi sẽ cố gắng giải thích chi tiết cách tiếp cận mà tôi thực hiện để làm cho trò chơi độc lập với kích thước màn hình.
Định hướng màn hình
Tùy thuộc vào hướng màn hình (Phong cảnh hoặc Chân dung), bạn cần xem xét liệu máy ảnh sẽ chia tỷ lệ với chiều cao cố định hay chiều rộng cố định. Chủ yếu tôi chọn chiều rộng cố định cho các trò chơi định hướng theo chiều ngang và chiều cao cố định cho các trò chơi định hướng dọc.
Camera thu nhỏ
Như đã thảo luận, đây có thể là chiều cao cố định hoặc chiều rộng cố định.
Chiều cao cố định : Diện tích dọc của trò chơi sẽ luôn vừa với chiều cao màn hình. Và khi tỷ lệ khung hình màn hình thay đổi, sẽ có thêm không gian được thêm vào bên trái và bên phải màn hình. Để thực hiện điều này, bạn không cần mã hóa bất cứ điều gì, đó là hành vi mặc định của máy ảnh thống nhất.
Chiều rộng cố định : Diện tích ngang của trò chơi sẽ luôn vừa với chiều rộng màn hình. Và không gian thêm sẽ được thêm vào trên cùng và dưới cùng khi tỷ lệ khung hình của màn hình thay đổi. Để thực hiện điều này, bạn cần viết một đoạn mã nhỏ. Sau đó, hãy đảm bảo bạn loại bỏ chức năng cập nhật biểu mẫu mã và đặt nó ở trạng thái thức.
using UnityEngine;
[ExecuteInEditMode]
public class ScaleWidthCamera : MonoBehaviour {
public int targetWidth = 640;
public float pixelsToUnits = 100;
void Update() {
int height = Mathf.RoundToInt(targetWidth / (float)Screen.width * Screen.height);
camera.orthographicSize = height / pixelsToUnits / 2;
}
}
Trong trình chỉnh sửa, bạn có thể thay đổi targetWidth để xác định vùng không gian thế giới bạn muốn hiển thị. Mã này được giải thích trong video sau đây cùng với nhiều thực tiễn khác cho trò chơi 2D :)
Đoàn kết 2014 - Thực tiễn tốt nhất 2D trong đoàn kết
Tỷ lệ khung hình
Theo tỷ lệ khung hình được liệt kê từ rộng nhất đến hẹp nhất, bao gồm hầu hết tất cả các kích thước màn hình cho cả Android và iOS
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
Tôi thường đặt tất cả các tỷ lệ khung hình này theo thứ tự nhất định trong cửa sổ trò chơi, vì nó tiện dụng trong khi kiểm tra các kích thước màn hình khác nhau :)
Khu vực mong đợi
Đây là khu vực được thêm vào màn hình sang hai bên hoặc trên / dưới tùy thuộc vào tỷ lệ camera bạn đã chọn.
Đối với chiều cao cố định, tất cả các yếu tố trò chơi tốt nhất nên phù hợp với tỷ lệ 16: 9 là hẹp nhất. Và nền sẽ mở rộng cho đến khi nó bao gồm tỷ lệ 5: 4. Điều này đảm bảo rằng trò chơi của bạn không bao giờ có dải màu đen sang hai bên.
Đối với chiều rộng cố định, nó gần như giống nhau nhưng ở đây các yếu tố phải phù hợp với tỷ lệ 5: 4 và BG sẽ kéo dài đến 16: 9.
Giới hạn
Đôi khi chúng ta không thể sử dụng phương pháp tiếp cận khu vực có thể sử dụng vì chúng ta cần sử dụng toàn bộ màn hình có sẵn để chơi trò chơi.
Ví dụ, hãy xem xét một trò chơi chân dung với chiều cao cố định, bắt những đồng xu rơi từ trên trời xuống. Trong phần này, chúng ta cần cung cấp cho người chơi khả năng di chuyển theo chiều ngang trên chiều rộng màn hình có sẵn.
Do đó, chúng ta cần các giới hạn của máy ảnh theo tọa độ thế giới để biết chính xác vị trí bên trái, bên phải, trên cùng hoặc dưới cùng của các clip camera ở vị trí thế giới.
Chúng tôi cũng có thể sử dụng các giới hạn này để neo các thành phần trò chơi hoặc giao diện người dùng vào một phía mong muốn của máy ảnh.
Sử dụng Camera.ViewportToWorldPoint, chúng tôi có thể nhận được giới hạn. Không gian xem cổng được chuẩn hóa và liên quan đến máy ảnh. Phía dưới bên trái của máy ảnh là (0,0); phía trên bên phải là (1,1). Vị trí z là trong các đơn vị thế giới từ máy ảnh. Đối với 2D / orthographic, z không thành vấn đề.
Vector3 leftBottom = camera.ViewportToWorldPoint(new Vector3(0, 0, camera.nearClipPlane));
Vector3 rightTop = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane));
float left = leftBottom.x;
float bottom = leftBottom.y;
float right = rightTop.x;
float top = rightTop.y;
Giao diện người dùng
Đối với UI chúng ta có thể áp dụng các khái niệm tương tự mà chúng ta đã sử dụng cho các yếu tố trò chơi. Sau khi giới thiệu Unity5 UI và các plugin như NGUI, điều này sẽ không có vấn đề gì :)