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 应用程序由四种组件组成
- Activity : 主要用于实现用户界面,代表一个屏幕或窗口,包含了各种 UI 组件,按钮,输入框等
- Server : 一种可以在后台执行长时间运行操作的组件,没有用户界面,一般用于处理和交互无关的逻辑,例如上传,下载,音频播放等
- Broadcast Receiver : 主要用于接受系统或其他应用程序发出的广播消息
- Content Provider : 用于管理应用程序数据,可以让其它应用或系统访问本应用中的数据,也可以让本应用访问其他应用或系统的数据
AndroidManifest 文件的作用
AndroidManifest 是应用程序的应用清单文件,每个 APK 都必须包含一个,并且文件名必须是 AndroidManifest.xml,该文件中包含了应用程序的配置信息,Android 系统会根据该配置来运行应用程序。
该文件包含的重要信息如下所示。
- 应用程序包含的四大组件的内容
- 应用程序的权限
- 应用程序元数据
- 应用程序启动信息
常见的标签如下。
- 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 之类资源后打包生成的文件
- 使用 Android Studio 创建 Empty Activity 项目。
- 删除工程中两个没有用的 Test 项目,以及 res 下的默认资源。
- 修改 build.gradle 文件中 plugins 的 id 属性,将
com.android.application
修改为com.android.library
- 删除 build.gradle 文件中 android 的 defaultConfig 相关配置
- 从 Unity 安装目录中导入 classes.jar 文件到 Android 工程的
app/libs
目录下,右键菜单点击Add As Library…
- 从 Unity 安装目录拷贝
Editor/Data/PlaybackEngine/AndroidPlayer/Source/com/unity3d
到 Android 工程的app/src/main/java
的目录下 - 修改 MainActivity 脚本,将其改为继承 UnityPlayerActivity,并删除
onCreate
方法中的setContentView
代码 - 修改 AndroidManifest.xml 配置文件,删除 application 元素中的无用内容,并在
application/activity
元素中加入<meta-data android:name=”unityplayer.UnityActivity” android:value=”true” />
- 选中 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 进行打包可能出现以下问题。
- 打包过后运行时闪退,找不对对应的类。在 build.gradle 中引用缺失的包后重新打包
- 安装后出现两个图标。修改 AndroidManifest.xml 配置文件,移除 LAUNCHER 相关配置
- 界面 XML 报错。修改构建配置文件,加一个对应的引用,并在 gradle.properties 当中将
android.useAndroidX
设置为 true - 出现 AppCompat 报错。修改配置文件,加上
android:theme=”@style/Theme.AppCompat.Dialog”
。或者让新建的 Activity 直接继承 Activity
在 Android 中嵌入 Unity 内容
在进行 Android 开发的时候,有时候会有需要显示 Unity 开发的 3D 内容。
需要注意的是, Android 中嵌入 Unity 存在限制问题,退出 Unity 所在的 Activity 会导致整个应用程序退出,因此如果存在 Android 和 Unity 混合开发的情况,更建议 Unity 中嵌入 Android 的方式。
- 新建 Android 工程
- 将 Unity 导出的 unityLibrary 文件夹拷贝到 Android 工程中
- 将 launcher 文件夹中的 res 中的内容拷贝到 unityLibrary 文件夹中合并
- 修改 Android 工程中的 settings.gradle 文件,并在其中添加
include ':unityLibrary'
- 修改 Android 工程中的 gradle.properties 文件,并在最后添加上
unityStreamAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist
- 修改 Android 工程中的 build.gradle 文件,在依赖项中添加
implementation project(’:unityLibrary’)
Reference
Unity - 手册:从 C# 脚本调用 Java 和 Kotlin 插件代码 - Unity 游戏引擎
【唐老狮】Unity移动平台相关—Android - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho