Мій метод здебільшого схожий на рішення, які дають інші :) Я спробую детально пояснити підхід, який я використовую, щоб гра не залежала від розміру екрана.
Екранна орієнтація
Залежно від орієнтації екрана (Пейзаж або Портрет), вам слід врахувати, чи буде фотокамера масштабуватися з фіксованою висотою або фіксованою шириною. Здебільшого я вибираю фіксовану ширину для ігор, орієнтованих на пейзаж, і фіксовану висоту для ігор, орієнтованих на портрет.
Масштабування камери
Як обговорювалося, це може бути як фіксованої висоти, так і фіксованої ширини.
Фіксована висота : вертикальна область гри завжди буде відповідати висоті екрану. І коли зміна співвідношення екрана змінюватиметься додаткове місце ліворуч та праворуч від екрана. Для цього вам не потрібно нічого кодувати, це поведінка камери єдності за замовчуванням.
Фіксована ширина : Горизонтальна область гри завжди буде відповідати ширині екрану. І додаткове місце додаватиметься вгорі та внизу, оскільки зміна співвідношення сторін екрана. Для цього вам потрібно написати невеликий фрагмент коду. Згодом переконайтесь, що ви видалили функцію оновлення кодової форми та помістили її у стан.
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;
}
}
У редакторі ви можете змінити targetWidth, щоб визначити область світового простору, яку ви хочете відобразити. Цей код пояснюється у наступному відео разом із багатьма іншими практиками щодо 2D ігор :)
Об'єднайте 2014 - 2D кращі практики в єдності
Співвідношення сторін
Наступне співвідношення сторін, перелічене від найширшого до самого вузького, охоплює майже всі розміри екрана як для android, так і для iOS
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
Зазвичай я встановлюю всі ці пропорції в заданому порядку під вікном гри, оскільки це зручно під час тестування на різні розміри екрана :)
Площа, що витрачається
Це область, яка додається до екрана в сторони або вгору / внизу залежно від обраного вами масштабування камери.
Для фіксованої висоти бажано, щоб всі ігрові елементи розміщувались у співвідношенні 16: 9, яке є найвужчим. А фон повинен подовжуватися, поки він не охоплює співвідношення 5: 4. Це гарантує, що у вашій грі ніколи немає чорних смужок в сторони.
Для фіксованої ширини вона майже однакова, але тут елементи повинні відповідати співвідношенню 5: 4, а БГ повинен подовжуватися до 16: 9.
Межі
Іноді ми не можемо використати підхід, що витрачається на область, оскільки нам потрібно використовувати весь доступний екран для гри.
Наприклад, розглянемо портретну гру з фіксованою висотою, ловлячи монети, що падають з неба. У цьому нам потрібно дати можливість гравцеві рухатися горизонтально по доступній ширині екрана.
Отже, нам потрібні межі камери з точки зору світових координат, щоб знати, де саме ліворуч, праворуч, верхній або нижній частині камери на світовому положенні.
Ми також можемо використовувати ці межі для прив’язки ігрових елементів або інтерфейсу користувача до потрібної сторони камери.
Використовуючи Camera.ViewportToWorldPoint, ми можемо отримати межі. Простір перегляду в порталі нормалізується і відносно камери. У нижній лівій частині камери розмір (0,0); праворуч вгорі (1,1). Позиція z знаходиться у світових одиницях від камери. Для 2D / ортографічного z не має значення.
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
Для користувальницького інтерфейсу ми можемо застосувати ті самі поняття, які використовувались для ігрових елементів. Після введення інтерфейсу Unity5 та наявності плагінів типу NGUI це не складе особливих проблем :)