本页面包含以下部分:
在开发 Unity Android 应用程序时,可使用插件来扩展标准的 UnityPlayerActivity
类(这是 Android 上的 Unity Player 的主 Java 类,类似于 Unity iOS 上的 AppController.mm)。应用程序可以覆盖 Android 操作系统和 Unity Android 应用程序之间的任何及所有基本交互。
To override the default activity, you must:
UnityPlayerActivity
派生的 Activity
(请参阅 Android 文档中有关活动 (Activity) 的部分);Activity
作为应用程序的入口点。为实现此目的,最简单的方法是从 Unity 导出项目,然后在 Android Studio 中对 UnityPlayerActivity
类进行必要的修改。
要用新 Activity
创建插件并将其添加到项目,必须执行以下步骤:
By default, the UnityPlayerActivity.java file is located at:
Mac:
/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/src/com/unity3d/player
Windows:
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\src\com\unity3d\player
To extend the UnityPlayerActivity
, locate the classes.jar file included with Unity. You can find it in the installation folder (C:\Program Files\Unity\Editor\Data on Windows, or /Applications/Unity on Mac), in one of these subfolders:
PlaybackEngines/AndroidPlayer/Variations/mono
il2cpp/Development
Release/Classes/
找到该文件,然后将 classes.jar 添加到 Unity 用于编译新 Activity
的类路径中。编译 Activity
源文件并将其打包到 JAR 或 AAR 包中,然后将其复制到项目文件夹。
Create a new Android Manifest to set the new Activity
as the entry point of your application, then place the AndroidManifest.xml file in the Assets/Plugins/Android folder of your Project.
When you extend UnityPlayerActivity
, you can override String UnityPlayerActivity.updateUnityCommandLineArguments(String cmdLine) to pass startup arguments to Unity.
UnityPlayerActivity
会在启动期间调用此方法。它接受当前的命令行参数(这些参数可为 null 或为空),并返回新的命令行参数字符串以传递给 Unity。
有关 Unity 命令行界面的一般概述,请参阅命令行参数。
下面的示例演示了如何使用该文件根据当前设备选择图形 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() {
// 在 Google Pixel 设备上使用 Vulkan
if (Build.MANUFACTURER.equals("Google") && Build.MODEL.startsWith("Pixel"))
return true;
else
return false;
}
private boolean preferES2() {
// 在运行 Android 5.1 或更早版本的设备上使用 OpenGL ES 2.0
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; // 让 Unity 根据 PlayerSettings 选择图形 API
}
@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) {
// 调用 UnityPlayerActivity.onCreate()
super.onCreate(savedInstanceState);
// 将调试消息打印至 logcat
Log.d("OverrideActivity", "onCreate called!");
}
public void onBackPressed()
{
// 不调用 UnityPlayerActivity.onBackPressed(),而是直接忽略 Back 按钮事件
// 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=".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>