上篇文章我们实现了模块化调用,运用了模块化设计思想和简化了调用流程,本篇文章讲述UnityPlayerActivity类的继承和使用。
在一些深度交互场合,比如Activity切换、程序启动预处理等,这时可能会需要继承Application和UnityPlayerActivity类,下面我们演示该功能。
本示例需要引入UnityPlayer类,该类位于Unity提供的Classes.jar包中[ 该包文件位置与Unity安装路径和版本有关,如笔者使用Unity2020.3.15,Unity安装在C盘默认目录,其路径为:C:\Program Files\ Unity\ Hub\ Editor \2020.3.15f1c1\ Editor\ Data\ PlaybackEngines\ AndroidPlayer\ Variations\ il2cpp\ Release\ Classes],所以我们需要先引入该Jar包,首先直接复制Classes.jar包,然后在Android Studio工程app目录(本示例使用模块,所以我们将其放置到android2unity模块的libs目录下)的libs文件夹上鼠标右键,在弹出的菜单中选择Paste粘贴Classes.jar包。然后打开同级目录的build.gradle文件,在其dependencies配置节中引入该Jar包,如图1所示。
在Unity2019以后的版本中,UnityPlayerActivity类不再位于Classes.jar包,而是以独立的UnityPlayerActivity.java文件存在[ 该java文件位置与Unity安装路径和版本有关,如笔者使用Unity2020.3.15,Unity安装在C盘默认目录,其路径为:C:\Program Files\ Unity\ Hub\ Editor\ 2020.3.15f1c1\ Editor\ Data\ PlaybackEngines\ AndroidPlayer\ Source\ com \unity3d\ player],将该文件复制到模块代码文件夹下。
继承Application类的示例代码如下:
//代码片断1
//Java端代码
package com.davidwang.android2unity;
import android.app.Application;public class CustomApplication extends Application {@Overridepublic void onCreate() {super.onCreate();System.out.println("自定义Application");}
}
继承UnityPlayerActivity类的示例代码如下:
//代码片断2
//Java端代码
package com.davidwang.android2unity;
import android.os.Bundle;public class CustomActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle bundle) {super.onCreate(bundle);System.out.println("自定义Activity");}
}
正常导出aar包,将该aar包文件复制到Unity工程Assets/Plugins/Android目录下。由于我们继承了Application和UnityPlayerActivity类,实质上是修改了应用程序的入口,所以需要在Unity工程Assets/Plugins/Android目录下新创建AndroidManifest.xml文件,文件内容如下:
//代码片断3
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.davidwang.android2unity" ><applicationandroid:name="com.davidwang.android2unity.CustomApplication"android:label="@string/app_name"><activity android:name="com.davidwang.android2unity.CustomActivity"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><meta-data android:name="android.app.lib_name" android:value="unity" /><meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /></activity></application>
</manifest>
AndroidManifest.xml文件中第一行定义了应用程序包名,所以Unity工程中的包名必须与该包名一致。然后将应用程序入口(application节)设置为自定义的CustomApplication;将启动Activity设置为自定义的CustomActivity,并设置了相应的intent-filter过滤器。
因为我们是直接继承了Unity的主Activity,所以不需要在Unity场景中做任何处理,打包到真机运行,可以看到正确的自定义内容输出。
提示
在导入该aar包后,unity打包时会引发配置错误,原因是aar包中BuildConfig.class类配置与unity项目配置有冲突。将导入的aar包名后缀改为rar,然后利用rar解压工具直接打开(不是解压出来),可以看到classes.jar包,鼠标双击在另一个解压界面中打开,然后点击项目包名依次展开,可以看到在工程/模块包名下有一个BuildConfig.class文件,鼠标右键在弹出的菜单中选择删除,关闭新打开的解压界面,回到原解压界面时会弹出提示,选择更新压缩文件,完成包内文件的删除,最后再将rar后辍改为aar即可。
如果是打包为jar文件,处理方法类似,但其包内没有classes.jar包,可以直接点击模块包名依次展开,删除BuildConfig.class文件,后续处理方法与前文一致。