在 com.unity3d.player 中找不到 UnityPlayerActivity class

Cannot find the UnityPlayerActivity class inside com.unity3d.player

我正在尝试为我的 Unity 游戏创建一个 Android 插件。我看过很多教程(其中大部分基于 eclipse 已经过时)并且还阅读了文档。我使用的是 Unity 2019.3.0f6。我想使用 UnityPlayerActivity

在 Android Studio 项目中扩展我的主要 activity

我不明白最后几行是什么意思“Locate the file, and add classes.jar to the classpath Unity uses to compile the new Activity. Compile your Activity source file and package it into a JAR or AAR package, then copy it into your Project folder

我知道 UnityPlayerActivity 在 PlaybackEngines/AndroidPlayer/Variations/mono 或 il2cpp/Development 或 Release/Classes/ 的 classes.jar 中不存在,所以我无法导入 com.unity3d.player.UnityPlayerActivity;我只能导入 UnityPlayer 和 IUnityPlayerLifecycleEvents。我也有兴趣了解什么是 UnityPlayer class 和 IUnityPlayerLifecycleEvents 在这种情况下。

但是 UnityPlayerActivity.java 位于 C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\src\com\unity3d\player

如何将其添加到 Unity3d 库或 classes.jar。或者甚至导入它来扩展我的 mainactivity。我不明白我在这里做错了什么。 我正在使用 Android Studio,虽然我是新手。

别担心,开始时为 unity 创建 android 插件可能有点混乱,如果您没有任何 Android 的使用经验,则更是如此!

一些小技巧:

  • 项目目录结构应该是:Assets/Plugins/Android(它是 重要的是,我一直在为这个愚蠢而挣扎)
  • app/libs 中的 AndroidStudio 项目中插入 classes.jar
  • 插入外部依赖项(如果你正在使用它)像 "support-v4-24.1.1" 变成 Android/libs

要在 AndroidStudio 上创建插件,您需要创建一个库(此步骤是从 activity 创建它):

  • 在 gradle 上删除 ID 行
  • 在同一个文件上,将 .implementation 更改为 .library

要重新编译插件,请执行以下操作:

  1. 重建AndroidStudio解决方案

  2. 转到 AndroidStudio 解决方案...app\build\outputs\aar 获取 .aar 文件

  3. 复制并粘贴,将扩展名从 .aar 更改为 .zip.rar
  4. 打开修改后的文件并提取2项:

    • classes.jar(这是另一个 classes.jar,与您的 AndroidStudio 项目中 app/libs 中存储的不同)
    • AndroidManifest.xml
  5. 将这些文件复制到 Assets/Plugins/Android 中的 Unity 项目中 (记住,项目目录结构很重要!)

您可以从我的 Utility_Repo 或您命名的路径 D:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\classes.jar.

下载 classes.jar 文件(第一个)

关于如何制作本机 Android 插件并整合到 Unity 3D 中,有一个非常棒的教程和随附的 YouTube 视频。

http://www.cwgtech.com/using-android-webview-to-display-a-webpage-on-top-of-the-unity-app-view/

我遇到了同样的情况,经过一些搜索我发现您应该 take that class from elsewhere 并将其简单地复制到您的项目中。在我的机器上 class 在 "...path-to-unity-installation...\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player".

不过,我认为回避使用 UnityPlayerActivity 的新方法完全值得关注。

  1. 创建一个新模块,例如:将其命名为“UnityActivity”。
  2. 在“CompileOnly”的方法中添加classes.jar作为Dependences,可以在unity安装文件夹中找到
  3. 将“UnityPlayerActivity”的源代码添加到UnityActivity模块中。
  4. 在“CompileOnly”方法中将新模块作为依赖项添加到“您的模块”

现在您可以创建从 UnityPlayerActivity 扩展的 CustomActivity。并构建到 *.aar.

这个想法是模拟依赖关系 com.unity3d.player。在 Android 工作室中:

  • 创建一个“没有 activity”的新项目 (MyUnityPlayerActivity)。
  • File/New/New Module,创建包名称为 com.unity3d.player 的新模块 (Player)。

将这些应用于“两个”模块(appplayer):

  • AndroidManifest.xml.
  • 中清除所有非库引用(图标、主题等)
  • 删除文件夹 res 下的所有内容,除了 res/values/strings.xml.
  • 在模块的build.gradle中:
    • id 'com.android.application'替换为id 'com.android.library'
    • 删除行applicationId "...".
    • 删除所有与测试相关的行。
    • 删除所有依赖。
    • 将本地 Unity 安装依赖项添加为“仅编译”(这样它就不会包含在构建中)。
dependencies {
    compileOnly files('C:/Program Files/Unity/Hub/Editor/2019.4.32f1/Editor/Data/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar)
}

在模块 player 中:

  • UnityPlayerActivity.javaC:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\src\com\unity3d\player\ 复制到 /player/java/com.unity3d.player

在模块 app 中:

  • 在模块 MyUnityPlayerActivitybuild.gradle 中,将仅编译依赖项添加到我们刚刚创建的模块 player
dependencies {
    compileOnly files('C:/Program Files/Unity/Hub/Editor/2019.4.32f1/Editor/Data/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar)
    compileOnly project(':player')
}
  • 新建classMyUnityPlayerActivity.
package com.mycompany.myapplication.player;

import android.os.Bundle;
import android.util.Log;

import com.unity3d.player.UnityPlayerActivity;

public class MyUnityPlayerActivity extends UnityPlayerActivity {
    private static final String TAG = "Unity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "Running MyUnityPlayerActivity.");
    }
}

应该可以走了。