Metode saya sebagian besar mirip dengan solusi yang diberikan oleh orang lain :) Saya akan mencoba menjelaskan secara rinci pendekatan yang saya ambil untuk membuat game independen dari ukuran layar.
Orientasi layar
Bergantung pada orientasi layar (Lanskap atau Potret), Anda perlu mempertimbangkan apakah kamera akan menskala dengan ketinggian tetap atau lebar tetap. Sebagian besar saya memilih lebar tetap untuk game berorientasi lanskap dan tinggi tetap untuk game berorientasi potret.
Penskalaan Kamera
Seperti yang dibahas ini dapat berupa ketinggian tetap atau lebar tetap.
Fixed Height : Area vertikal game akan selalu pas dengan ketinggian layar. Dan saat rasio aspek layar berubah, akan ada ruang tambahan yang ditambahkan ke kiri dan kanan layar. Untuk menerapkan ini Anda tidak perlu kode apa pun, itu adalah perilaku default kamera persatuan.
Fixed Width : Area horizontal game akan selalu pas dengan lebar layar. Dan ruang ekstra akan ditambahkan ke atas dan bawah saat rasio aspek layar berubah. Untuk mengimplementasikan ini, Anda perlu menulis sepotong kecil kode. Kemudian pastikan Anda menghapus fungsi pembaruan bentuk kode, dan tempatkan di tempat terjaga.
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;
}
}
Di editor Anda dapat mengubah targetWidth untuk menentukan area ruang dunia yang ingin Anda tampilkan. Kode ini dijelaskan dalam video berikut bersama dengan banyak praktik lainnya untuk game 2D :)
Unite 2014 - Praktik Terbaik 2D Dalam Persatuan
Rasio Aspek
Mengikuti rasio aspek yang terdaftar dari terluas ke tersempit, mencakup hampir semua ukuran layar untuk Android dan iOS
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
Saya biasanya mengatur semua rasio aspek ini dalam urutan yang diberikan di bawah jendela permainan, karena berguna saat menguji ukuran layar yang berbeda :)
Area yang Dapat Terjangkau
Ini adalah area yang ditambahkan ke layar ke samping atau atas / bawah tergantung pada skala kamera yang telah Anda pilih.
Untuk ketinggian tetap, semua elemen permainan sebaiknya sesuai dengan rasio 16: 9 yang merupakan yang tersempit. Dan latar belakang harus diperluas hingga mencakup rasio 5: 4. Yang memastikan bahwa gim Anda tidak pernah memiliki strip hitam ke samping.
Untuk lebar tetap hampir sama tetapi di sini elemen harus sesuai dengan rasio 5: 4 dan BG harus diperpanjang hingga 16: 9.
Batas
Kadang-kadang kita tidak bisa menggunakan pendekatan area yang dapat dibuang karena kita perlu memanfaatkan seluruh layar yang tersedia untuk bermain game.
Misalnya, perhatikan permainan potret dengan ketinggian tetap, menangkap koin yang jatuh dari langit. Dalam hal ini kita perlu memberi pemain kemampuan untuk bergerak secara horizontal di atas lebar layar yang tersedia.
Karenanya kita membutuhkan batasan kamera dalam hal koordinat dunia untuk mengetahui di mana tepatnya kiri, kanan, atas atau bawah klip kamera di posisi dunia.
Kami juga dapat menggunakan batas ini untuk menambatkan elemen permainan atau UI ke sisi kamera yang diinginkan.
Menggunakan Camera.ViewportToWorldPoint kita bisa mendapatkan bounds.Viewport space dinormalisasi dan relatif terhadap kamera. Kiri bawah kamera adalah (0,0); kanan atas adalah (1,1). Posisi z berada di unit dunia dari kamera. Untuk 2D / ortografis, z tidak masalah.
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;
UI
Untuk UI kami dapat menerapkan konsep yang sama yang kami gunakan untuk elemen game. Setelah pengenalan Unity5 UI dan ketersediaan plugin seperti NGUI ini tidak akan menjadi masalah :)