Оптимизация игр Unity для больших экранов и складных устройств

1. Введение

В этой практической работе вы узнаете, как оптимизировать игру для Android, созданную в Unity, для устройств с большим экраном и складных устройств. Чтобы реализовать поддержку соотношения сторон, расширить использование полноэкранного режима и реагировать на состояние устройства, вы будете использовать пример проекта Lost Crypt.

Требования

  • Базовые знания Unity и разработки под Android.
  • Устройства Android с большим экраном, например планшеты или складные телефоны.

Что вы узнаете

  • Как реализовать поддержку разных соотношений сторон.
  • Как использовать якоря в интерфейсе и настройках камеры, чтобы автоматически подстраиваться под размер экрана.
  • Как использовать менеджер окон Jetpack для Android, чтобы определять положение устройства и изменять макет.

Что вам потребуется

  • Unity Hub и Editor. Установите Unity 2020 LTS или Unity 2022 с поддержкой сборки для Android.
  • Аппаратное обеспечение. Устройства Android с большим экраном, например планшеты или складные телефоны.
  • Агентная платформа для разработки, например Google Antigravity, если вы планируете использовать навык.

2. Навык агента

При необходимости можно использовать навык агента для оценки проекта игры на Unity. Этот навык помогает добавить поддержку изменения размера, а также устройств с большим экраном и складных устройств. Дополнительная информация приведена на сайте GitHub.

Чтобы использовать этот навык:

  1. Скопируйте файл SKILL.md в каталог агента. Подробнее о том, как добавить навык…
  2. Задайте агенту в своей IDE (например, Antigravity) вопросы о больших экранах, складных устройствах или возможности изменения размера.
  3. Попросите агента добавить поддержку больших экранов и складных устройств.

3. Поддержка соотношения сторон

Чтобы игра корректно отображалась на экранах разных размеров, сначала добавьте поддержку разных соотношений сторон. Вы можете изменить соотношение сторон камеры или холста, чтобы изображение лучше подходило для разных экранов.

  1. Убедитесь, что в приложении используется полноэкранный режим с возможностью изменения размера.
  2. В вашем AndroidManifest.xml (расположенном по адресу Assets/Plugins/Android/AndroidManifest.xml):
    1. Задайте значение android:resizeableActivity="true".
    2. Задайте значение android:screenOrientation="fullSensor".

Пример:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <activity android:name="com.unity.lostcryptlargescreenexample.LargeScreenPlayableActivity"
                  android:theme="@style/UnityThemeSelector"
                  android:screenOrientation="fullSensor"
                  android:launchMode="singleTask"
                  android:resizeableActivity="true"
                  android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
                  android:hardwareAccelerated="false">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>
  1. Проверьте настройки сборки в Unity для конфигураций платформы Android.

Примечание. Поддержка разных соотношений сторон – это первый шаг к тому, чтобы игра хорошо выглядела на планшетах и складных устройствах.

4. Использование полноэкранного режима

После того как вы адаптируете игру к разным соотношениям сторон, убедитесь, что она занимает весь экран. Это сделает игровой процесс более захватывающим.

Чтобы использовать весь экран:

  1. Используйте якоря в настройках камеры и интерфейса игры. Это позволяет элементам интерфейса автоматически подстраивать свое положение в зависимости от размера экрана.
  2. Откройте сцену Anchoring в примере проекта, чтобы посмотреть, как настроено закрепление холста интерфейса.
  3. В сцене Закрепление холст обновляется с учетом безопасной области, а элементы управления перемещением закрепляются в углах экрана.

Чтобы сохранить соотношение сторон для основной камеры, динамически регулируйте pixelRect камеры. В скрипте CameraAspectLock.cs показано, как реагировать на изменение ориентации и использовать леттербокс для вида с камеры:

[SerializeField]
private float minAspectRatio = 4f / 3f;

[SerializeField]
private float maxAspectRatio = 21f / 9f;

public void MaintainAspectRatio() {
    int viewWidth = Display.main.systemWidth;
    int viewHeight = Display.main.systemHeight;

    // 1. Calculate screen aspect ratio
    float scaleScreen = viewWidth / (float)viewHeight;
    Rect rect = _camera.pixelRect;

    // 2. Scale to the fullest of the lower between width or height
    if (scaleScreen > maxAspectRatio) {
        // use height, lock width to max at aspect scale
        rect.width = viewHeight * maxAspectRatio;
        rect.height = viewHeight;
    } else if (scaleScreen < minAspectRatio) {
        // use width, lock height to min at aspect scale
        rect.width = viewWidth;
        rect.height = viewWidth / minAspectRatio;
    } else {
        // within allowed aspect ratio range, use full screen
        rect.width = viewWidth;
        rect.height = viewHeight;
    }

    // make sure to center the rect within the window
    rect.x = Mathf.Floor((viewWidth - rect.width) * 0.5f);
    rect.y = Mathf.Floor((viewHeight - rect.height) * 0.5f);

    Debug.Log("camera view width = " + rect.width +
        " height = " + rect.height +
        " x = " + rect.x +
        " y = " + rect.y);

    // 3. Commit the new size to the camera so that it takes effect
    _camera.pixelRect = rect;
}

5. Поддержка складных устройств

На складных устройствах макет игры должен меняться в зависимости от положения устройства (например, HALF_OPENED, FLAT) и размера экрана.

  1. Используйте менеджер окон Jetpack для Android, чтобы определить состояние устройства.
  2. В примере проекта откройте сцену HingeAware.
  3. Эта сцена содержит объект ConfigurationManager MonoBehaviour, который передает события Jetpack WindowManager из Android в Unity и реагирует на состояние складывания с помощью обратных вызовов UnityEvent.
  4. HingeSensor.cs считывает угол наклона шарнира с помощью плагина Java com.unity.lostcryptlargescreenexample.HingeAngleSensor.

Как использовать ConfigurationManager

ConfigurationManager.cs взаимодействует со специальным действием Android и анализирует строки JSON, представляющие состояние. Он прослушивает обратные вызовы onConfigurationChanged и onFoldChanged из Activity Android.

[System.Serializable]
public class FoldInfo {
	public string orientation;
	public string state;
	public int isSeparating;
	public int boundsLeft;
	public int boundsTop;
	public int boundsRight;
	public int boundsBottom;
}

public void onFoldChanged(string strFoldInfo) {
	FoldInfo info = JsonUtility.FromJson<FoldInfo>(strFoldInfo);

	// Always call the refresh from the main Unity thread
	StartCoroutine(ExecuteOnMainUnityThread(ActionOnFoldChange, info));
}

Вы также можете синхронно запросить статус с помощью свойства getFoldableState:

public static string getFoldableState {
	get {
		if (Application.platform == RuntimePlatform.Android) {
			var foldingFeatureObject = foldablePlayerActivity.Call<AndroidJavaObject>("getFoldingFeature");
			if (foldingFeatureObject != null) {
				var state = foldingFeatureObject.Call<AndroidJavaObject>("getState");
				return state.Call<string>("toString");
			}
		}
		return "NONE";
	}
}

6. Используйте HingeSensor

На некоторых складных устройствах есть физический датчик шарнира, который определяет точный угол сгиба (от 0 до 360 градусов). Его можно использовать для управления игровым процессом или настройки камеры.

В HingeSensor.cs инициализируется плагин Android для считывания данных с датчика. Вы также можете проверить, включен ли шарнир:

public class HingeSensor : IDisposable {
	AndroidJavaObject plugin;

	public static HingeSensor Start() {
		if (Application.platform == RuntimePlatform.Android) {
			return OnPlayer.Run(p => {
				var context = p.GetStatic<AndroidJavaObject>("currentActivity");
				var plugin = new AndroidJavaClass("com.unity.lostcryptlargescreenexample.HingeAngleSensor")
						.CallStatic<AndroidJavaObject>("getInstance", context);

				if (plugin != null) {
					plugin.Call("setupSensor");
					return new HingeSensor(plugin);
				}
				return null;
			});
		}
		return null;
	}

	public float GetHingeAngle() {
		return (Application.platform == RuntimePlatform.Android && plugin != null) ? plugin.Call<float>("getHingeAngle") : -1.0f;
	}

	public bool IsHingeEnabled() {
		return Application.platform == RuntimePlatform.Android && plugin != null && plugin.Call<int>("isHingeEnabled") > 0;
	}
}

Примечание. Чтобы предотвратить разряд батареи, обязательно вызывайте Dispose() или StopSensing() в экземпляре HingeSensor, когда приложение приостанавливается или уничтожается.

7. Как создать AAB-файл

Чтобы создать AAB-файл в Unity Editor, выполните следующие действия:

  1. В редакторе Unity нажмите File > Build settings (Файл > Настройки сборки).
  2. Выберите Build App Bundle (Google Play) (Создать набор приложений (Google Play)). Дополнительную информацию можно найти в справочнике по настройкам сборки Android.
  3. Нажмите Создать.
  4. Скачайте AAB-файл из редактора Unity.

Как создать версию для внутреннего тестирования

Чтобы создать выпуск для внутреннего тестирования и добавить тестировщиков в Play Console, выполните следующие действия:

  1. Выберите игру в Google Play Console.
  2. Перейдите на страницу Тестирование и выпуск (Тестирование> Внутреннее тестирование).
  3. Нажмите Загрузить и выберите файл AAB.
  4. В поле Сведения о выпуске введите название.
  5. Нажмите Далее и проверьте сведения о релизе.
  6. Нажмите Сохранить и опубликовать.

8. Как создать сборку и запустить проект

Теперь вы можете создать проект и протестировать его на устройстве.

  1. Убедитесь, что игра открыта.
  2. В Play Console выберите Файл > Профиль сборки (или Настройки сборки).
  3. Убедитесь, что флажок Создать набор App Bundle (Google Play) установлен, если вы хотите загрузить приложение в Play Console, или нажмите Сборка и запуск, чтобы развернуть приложение непосредственно на подключенном устройстве.
  4. Убедитесь, что игра корректно работает на складных устройствах. Вам нужно будет настроить макет игры в зависимости от положения устройства (например, HALF_OPENED или FLAT) и размера экрана.

9. Поздравляю!

Вы успешно изучили принципы адаптации игры для Android, созданной в Unity, для больших экранов и складных устройств.

Опрос

Мы будем рады вашим отзывам о практической работе. Предлагаем вам пройти небольшой опрос.