Version: 2019.1
JAR 插件
适用于 Android 的原生 (C++) 插件

扩展 UnityPlayerActivity Java 代码

本页面包含以下部分:

Extending the UnityPlayerActivity file

在开发 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) 的部分);
  • 修改 Android 清单以将新 Activity 作为应用程序的入口点。

为实现此目的,最简单的方法是从 Unity 导出项目,然后在 Android Studio 中对 UnityPlayerActivity 类进行必要的修改。

要用新 Activity 创建插件并将其添加到项目,必须执行以下步骤:

1. Extend the UnityPlayerActivity file

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 包中,然后将其复制到项目文件夹。

2. Create a new Android manifest

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.

从自定义 UnityPlayerActivity 文件指定 Unity 启动参数

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 示例文件

以下是 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


  • 2017–05–18 页面已发布但未经编辑审查
  • 2019–07–17 页面已修订并进行了编辑审查
  • 在 2019.2 中添加了新代码示例。
JAR 插件
适用于 Android 的原生 (C++) 插件