Разделы на этой странице:
- Расширение файла UnityPlayerActivity
- Указание аргументов запуска Unity из пользовательского файла UnityPlayerActivity
- Файл примера UnityPlayerActivity с образцом манифеста
Расширение файла UnityPlayerActivity
При разработке приложения Unity для Android можно использовать подключаемые модулиНабор кода, созданный вне Unity, который создает функциональность в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
См. в Словарь, чтобы расширить стандартный UnityPlayerActivity
(основной класс Java для проигрывателя Unity на Android, аналогичный AppController.mm
на Unity iOS). Приложение может переопределить все основные взаимодействия между ОС Android и Android-приложением Unity.
Чтобы переопределить действие по умолчанию:
- Создайте новую
Activity
, производную отUnityPlayerActivity
(см. документацию Android на Активность); - Измените манифест приложения Android, чтобы использовать новую
Activity
в качестве точки входа приложения.
Самый простой способ добиться этого — экспортировать проект из Unity, а затем внести необходимые изменения в класс UnityPlayerActivity
в Android Studio. Или вы можете создать новый класс, расширить его, изменить AndroidManifest.xml
в проекте unityLibrary, а затем заменить UnityPlayerActivity
на ваш класс.
Чтобы создать подключаемый модуль с новым Activity
и добавить его в свой проект, выполните следующие действия:
- Расширьте файл UnityPlayerActivity. Лучше всего это сделать в Android Studio после экспорта проекта из Unity. Затем у вас есть следующие варианты:
- Поместите файл .java или .kt, содержащий класс активности, непосредственно в проект Unity. По умолчанию файл находится по адресу:
-
macOS::
/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/src/com/unity3d/player
-
Windows::
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\src\com\unity3d\player
-
macOS::
- Создайте библиотеку Java, содержащую ваш класс, скомпилируйте ее и поместите полученный файл .jar в свой проект Unity.
- Создайте библиотеку Android, содержащую ваш класс. Затем вы можете поместить эту библиотеку в свой проект Unity в своем исходном коде. Для этого дайте вашей папке имя с расширением .androidlib или ее можно скомпилировать и поместить полученный файл .aar в ваш проект Unity
- Поместите файл .java или .kt, содержащий класс активности, непосредственно в проект Unity. По умолчанию файл находится по адресу:
- Создайте новый манифест приложения Android, чтобы установить новую
Activity
в качестве точки входа вашего приложения, а затем поместитеAndroidManifest.xml
в папкеAssets/Plugins/Android
вашего проекта.
Указание аргументов запуска Unity из пользовательского файла UnityPlayerActivity
При расширении UnityPlayerActivity
можно переопределить String UnityPlayerActivity.updateUnityCommandLineArguments
(String cmdLine) для передачи аргументов запуска в Unity.
UnityPlayerActivity
вызывает этот метод во время запуска. Он принимает текущие аргументы командной строки, которые могут быть нулевыми или пустыми, и возвращает новую строку аргументов командной строки для передачи в Unity.
Общий обзор интерфейса командной строки Unity см. в разделе Аргументы командной строки.
В следующем примере показано, как использовать это для выбора Graphics API на основе текущего устройства:
package com.company.product;
import com.unity3d.player.UnityPlayerActivity;
import android.os.Bundle;
import android.os.Build;
public class OverrideExample extends UnityPlayerActivity {
private boolean preferVulkan() {
// Use Vulkan on Google Pixel devices
if (Build.MANUFACTURER.equals("Google") && Build.MODEL.startsWith("Pixel"))
return true;
else
return false;
}
private boolean preferES2() {
// Use OpenGL ES 2.0 on devices that run Android 5.1 or older
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1)
return true;
else
return false;
}
private String appendCommandLineArgument(String cmdLine, String arg) {
if (arg == null || arg.isEmpty())
return cmdLine;
else if (cmdLine == null || cmdLine.isEmpty())
return arg;
else
return cmdLine + " " + arg;
}
@Override protected String updateUnityCommandLineArguments(String cmdLine)
{
if (preferVulkan())
return appendCommandLineArgument(cmdLine, "-force-vulkan");
else if (preferES2())
return appendCommandLineArgument(cmdLine, "-force-gles20");
else
return cmdLine; // let Unity pick the Graphics API based on PlayerSettings
}
@Override protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
}
Ниже приведен пример файла UnityPlayerActivity
:
OverrideExample.java:
package com.company.product;
import com.unity3d.player.UnityPlayerActivity;
import android.os.Bundle;
import android.util.Log;
public class OverrideExample extends UnityPlayerActivity {
protected void onCreate(Bundle savedInstanceState) {
// call UnityPlayerActivity.onCreate()
super.onCreate(savedInstanceState);
// print debug message to logcat
Log.d("OverrideActivity", "onCreate called!");
}
public void onBackPressed()
{
// instead of calling UnityPlayerActivity.onBackPressed() we just ignore the back button event
// super.onBackPressed();
}
}
Соответствующий AndroidManifest.xml
может выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.product">
<application android:icon="@drawable/app_icon" android:label="@string/app_name">
<activity android:name="com.YourPackage.name.OverrideExample"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Чтобы создать подключаемый модуль с новой активностью и добавить его в свой проект, необходимо выполнить следующие действия:
- Расширьте файл UnityPlayerActivity. Лучше всего это делать в Android Studio после экспорта проекта из Unity. Есть несколько вариантов:
- Файл .java или .kt, содержащий ваш класс действий, можно поместить в проект Unity.
- Создайте библиотеку Java, содержащую ваш класс, скомпилируйте ее и поместите полученный файл .jar в проект Unity.
- Создайте библиотеку Android, содержащую ваш класс; эту библиотеку можно поместить в проект Unity в исходном коде (назвав папку «расширением» .androidlib) или ее можно скомпилировать, а полученный файл .aar поместить в проект Unity.
- Создайте новый манифест приложения Android, чтобы установить новую активность в качестве точки входа вашего приложения, а затем поместите файл AndroidManifest.xml в папку Assets/Plugins/Android вашего проекта.
- Добавлен новый пример кода в 2019.2.
- Обновленный пример AndroidManifest для Unity 2019.3 и более поздних версий