..

Unity 与 Android 的交互

在 Unity 中调用 Android 内容

在 Android 工程中的 MainActivity 中加入测试用的成员变量

在 Unity 的工程代码中使用 AndroidJavaClass 访问成员变量

 1using (AndroidJavaClass ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
 2{
 3    using (AndroidJavaObject ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity"))
 4    {
 5        // 获取到 MainActivity 之后,就可以调用其中对应的 Java 代码
 6        // 值相关的操作
 7        ajo.Get<ValueType>("ValueName");
 8        ajo.Set<ValueType>("ValueName");
 9        ajo.GetStatic<ValueType>("ValueName");
10        ajo.SetStatic<ValueType>("ValueName", value);
11        // 方法相关的操作
12        ajo.Call("FunctionName", param);
13        ajo.Call<ReturnValueType>("FunctionName", param);
14        ajo.CallStatic("FunctionName", param);
15        ajo.CallStatic<ReturnValueType>("FunctionName", param);
16    }
17}

Android 中调用 Unity 内容

想要被 Android 端调用的 Unity 函数需要是写在继承了 MonoBehaviour 的脚本中,并且需要挂载在场景中处于激活状态的 GameObject 上。

交互时,只需要在 Android 相关的脚本中调用 API,使用以下函数。

Note: 该 API 中的参数只能是 string 或者 null

1UnityPlayer.UnitySendMessage("GameObjectName", "FunctionName", param);

Android 基础知识

Android 应用程序的基本构成

Android SDK : 提供用于开发 Android 应用程序的各种 API 工具

Java or Kotlin : 用于进行 Android 应用开发的语音

XML 配置文件 : Android 应用程序使用 XML 来定义 UI 布局、样式和资源信息等

应用程序组件 : Android 应用程序由四种组件组成

  1. Activity : 主要用于实现用户界面,代表一个屏幕或窗口,包含了各种 UI 组件,按钮,输入框等
  2. Server : 一种可以在后台执行长时间运行操作的组件,没有用户界面,一般用于处理和交互无关的逻辑,例如上传,下载,音频播放等
  3. Broadcast Receiver : 主要用于接受系统或其他应用程序发出的广播消息
  4. Content Provider : 用于管理应用程序数据,可以让其它应用或系统访问本应用中的数据,也可以让本应用访问其他应用或系统的数据

AndroidManifest 文件的作用

AndroidManifest 是应用程序的应用清单文件,每个 APK 都必须包含一个,并且文件名必须是 AndroidManifest.xml,该文件中包含了应用程序的配置信息,Android 系统会根据该配置来运行应用程序。

该文件包含的重要信息如下所示。

  1. 应用程序包含的四大组件的内容
  2. 应用程序的权限
  3. 应用程序元数据
  4. 应用程序启动信息

常见的标签如下。

  • manifest : 包含包名、版本号等。
  • user-permission : 应用程序权限。
  • application : 应用程序各组件包含在其中,还可以配置图标、文本、样式等信息。
  • activity : Activity 组件的具体信息。
  • meta-data : 为 Activity 提供元数据,可以通过 API 获取该数据。
  • intent-filter : 为组件声明意图(intent),其中还可以包含意图类型(action)和意图类别(category)两个子标签。

在 Unity 中嵌入 Android 内容

第一步:导出 aar 包

aar 包全程是 Android Archive 的缩写,包含 Android 工程中的 src, res, lib 之类资源后打包生成的文件

  1. 使用 Android Studio 创建 Empty Activity 项目。
  2. 删除工程中两个没有用的 Test 项目,以及 res 下的默认资源。
  3. 修改 build.gradle 文件中 plugins 的 id 属性,将 com.android.application 修改为 com.android.library
  4. 删除 build.gradle 文件中 android 的 defaultConfig 相关配置
  5. 从 Unity 安装目录中导入 classes.jar 文件到 Android 工程的 app/libs 目录下,右键菜单点击 Add As Library…
  6. 从 Unity 安装目录拷贝 Editor/Data/PlaybackEngine/AndroidPlayer/Source/com/unity3d 到 Android 工程的 app/src/main/java 的目录下
  7. 修改 MainActivity 脚本,将其改为继承 UnityPlayerActivity,并删除 onCreate 方法中的 setContentView 代码
  8. 修改 AndroidManifest.xml 配置文件,删除 application 元素中的无用内容,并在 application/activity 元素中加入 <meta-data android:name=”unityplayer.UnityActivity” android:value=”true” />
  9. 选中 MainActivity 脚本,工具栏 -> Build -> Make Moudle …

第二步:删除 aar 包中的文件

删除 libs 目录下的 classes.jar ,Unity 会自带,避免重复报错

删除 UnityPlayerActivity.class ,Unity 会自带,避免重复报错

删除 BuildConfig.class ,通过 Unity 打包不需要配置

第三步:将相关文件导入 Unity

将导出的 aar 包与 AndroidManifest.xml 文件放入 Unity 中的 Plugin/Android 文件夹。

Note : 如果需要实现内嵌 Android Activity,就不能在 Unity 中直接打 APK,而是导出工程文件后使用 Android Studio 进行打包。因为 Unity 中无法联网下载相关联的包,这将导致打包出去的内容报错。

第四步:在 Android Studio 中进行打包(可选)

使用 Android Studio 进行打包可能出现以下问题。

  1. 打包过后运行时闪退,找不对对应的类。在 build.gradle 中引用缺失的包后重新打包
  2. 安装后出现两个图标。修改 AndroidManifest.xml 配置文件,移除 LAUNCHER 相关配置
  3. 界面 XML 报错。修改构建配置文件,加一个对应的引用,并在 gradle.properties 当中将 android.useAndroidX 设置为 true
  4. 出现 AppCompat 报错。修改配置文件,加上 android:theme=”@style/Theme.AppCompat.Dialog” 。或者让新建的 Activity 直接继承 Activity

在 Android 中嵌入 Unity 内容

在进行 Android 开发的时候,有时候会有需要显示 Unity 开发的 3D 内容。

需要注意的是, Android 中嵌入 Unity 存在限制问题,退出 Unity 所在的 Activity 会导致整个应用程序退出,因此如果存在 Android 和 Unity 混合开发的情况,更建议 Unity 中嵌入 Android 的方式。

  1. 新建 Android 工程
  2. 将 Unity 导出的 unityLibrary 文件夹拷贝到 Android 工程中
  3. 将 launcher 文件夹中的 res 中的内容拷贝到 unityLibrary 文件夹中合并
  4. 修改 Android 工程中的 settings.gradle 文件,并在其中添加 include ':unityLibrary'
  5. 修改 Android 工程中的 gradle.properties 文件,并在最后添加上 unityStreamAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist
  6. 修改 Android 工程中的 build.gradle 文件,在依赖项中添加 implementation project(’:unityLibrary’)

Reference

Unity - 手册:从 C# 脚本调用 Java 和 Kotlin 插件代码 - Unity 游戏引擎

【唐老狮】Unity移动平台相关—Android - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho

There is nothing new under the sun.