Мой метод в основном похож на решения, предоставленные другими :) Я постараюсь подробно объяснить подход, который я использую, чтобы сделать игру независимой от размера экрана.
Ориентация экрана
В зависимости от ориентации экрана (альбомная или книжная) необходимо учитывать, будет ли камера масштабироваться с фиксированной высотой или фиксированной шириной. В основном я выбираю фиксированную ширину для пейзажно-ориентированных игр и фиксированную высоту для портретно-ориентированных игр.
Масштабирование камеры
Как уже говорилось, это может быть либо фиксированная высота, либо фиксированная ширина.
Фиксированная высота : вертикальная область игры всегда будет соответствовать высоте экрана. А по мере изменения соотношения сторон экрана слева и справа от экрана будет добавлено дополнительное пространство. Чтобы реализовать это, вам не нужно ничего кодировать, это стандартное поведение камеры для единства.
Фиксированная ширина : горизонтальная область игры всегда будет соответствовать ширине экрана. А дополнительное пространство будет добавлено сверху и снизу при изменении соотношения сторон экрана. Для реализации этого вам нужно написать небольшой кусочек кода. Позже убедитесь, что вы удалили функцию обновления формы кода и поместили ее в активное состояние.
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-игр :)
Unite 2014 - 2D лучшие практики в Unity
Соотношение сторон
Следующее соотношение сторон, перечисленное от самого широкого до самого узкого, охватывает практически все размеры экрана как для Android, так и для iOS
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
Я обычно устанавливаю все эти пропорции в заданном порядке под окном игры, так как это удобно при тестировании на экранах разных размеров :)
Расходная область
Это область, которая добавляется на экран по бокам или сверху / снизу в зависимости от выбранного вами масштаба камеры.
Для фиксированной высоты все игровые элементы должны предпочтительно соответствовать соотношению 16: 9, которое является самым узким. И фон должен расширяться до 5: 4. Что гарантирует, что ваша игра никогда не имеет черных полос по бокам.
Для фиксированной ширины это почти то же самое, но здесь элементы должны соответствовать соотношению 5: 4, а BG должен быть увеличен до 16: 9.
Bounds
Иногда мы не можем использовать подход с использованием расходных площадей, поскольку нам нужно использовать весь доступный экран для игры.
Например, рассмотрим портретную игру с фиксированной высотой, ловящую монеты, падающие с неба. В этом нам нужно дать игроку возможность перемещаться горизонтально по доступной ширине экрана.
Следовательно, нам нужны границы камеры в терминах мировых координат, чтобы знать, где именно слева, справа, сверху или снизу камеры закрепляются на мировой позиции.
Мы также можем использовать эти границы для привязки игровых элементов или пользовательского интерфейса к желаемой стороне камеры.
Используя Camera.ViewportToWorldPoint, мы можем получить границы bounds.Viewport по отношению к камере. Нижний левый угол камеры (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 UI и наличия плагинов, таких как NGUI, это не будет большой проблемой :)