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

发布时间:2024年01月14日

??上篇文章我们实现了模块化调用,运用了模块化设计思想和简化了调用流程,本篇文章讲述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文件,后续处理方法与前文一致。

文章来源:https://blog.csdn.net/yolon3000/article/details/135588583
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。