上篇文章我们实现了模块化调用,运用了模块化设计思想和简化了调用流程,本篇文章讲述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所示。

图1引入classes.jar包

  由于我们只是引入其进行编译,保证编译正确进行,打包的时候并不需要classes.jar包,所以使用complieOnly指令确保该Jar包只用于编译[

修改完build.gradle文件后不要忘记点击Sync Now按钮以使配置起作用]。

  在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 {

@Override

public void onCreate() {

super.onCreate();

System.out.println("自定义Application");

}

}

  继承UnityPlayerActivity类的示例代码如下:

//代码片断2

//Java端代码

package com.davidwang.android2unity;

import android.os.Bundle;

public class CustomActivity extends UnityPlayerActivity {

@Override

protected 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

android:name="com.davidwang.android2unity.CustomApplication"

android:label="@string/app_name">

android:label="@string/app_name"

android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">

  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文件,后续处理方法与前文一致。

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: