Unity与Android交互通信系列(4)

  上篇文章我们实现了模块化调用,运用了模块化设计思想和简化了调用流程,本篇文章讲述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
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.davidwang.android2unity" >
    <application
        android: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文件,后续处理方法与前文一致。

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_DavidWang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值