unity Androidstudio生成的aar在哪里 android studio unity3d

自从Unity2019.2以后的版本升级以后,各种奇葩事情层次不穷,废了我好久的功夫才能在Android端继承UnityPlayerActivity后正常交互,但是如果不继承UnityPlayerActivity的话,是可以很容易正常交互的,但是我们这里只讲Android端集成UnityPlayerActivity的方式



参考博客:

首先创建安卓项目,使用AndroidStudio3.6.3

unity Androidstudio生成的aar在哪里 android studio unity3d_android

在菜单栏选择File->New->NewProject创建一个项目

unity Androidstudio生成的aar在哪里 android studio unity3d_android_02

显示选择界面 点击Empty Activity - Next

unity Androidstudio生成的aar在哪里 android studio unity3d_unity_03

填写项目名称Unity2Android (这个名可以随便填后面用不到),Minimum SDK 最好和Unity的项目选择一样的

unity Androidstudio生成的aar在哪里 android studio unity3d_unity_04

做到这一步你就建成一个新的AS项目了

unity Androidstudio生成的aar在哪里 android studio unity3d_jar_05

添加Modules



这个是重点

有两种方式添加

方式一:在菜单栏选择File->New->New Module...

方式二:在菜单栏选择File-> Project Structure

unity Androidstudio生成的aar在哪里 android studio unity3d_jar_06

两种方式都可以打开Create New Module窗口

unity Androidstudio生成的aar在哪里 android studio unity3d_jar_07

但是两种方式会在Unity中出现不同的效果

方式一:打包成jar包后,放到unity中会出现闪退现象

方式二:打包成jar包后,放到unity中正常调用

一开始我以为方式一出现闪退是因为unity发布设置时的PackageName和安卓包的PackageName不一致导致的,后来将方式一的包名设置一致,依然闪退,将方式二中的包名设置为不一致,依然正常调用

所以我们使用方式二:在菜单栏选择File-> Project Structure

创建完成以后,添加Unity的jar包,位置:classes.jar路径:Unity(Unity的安装路径下)\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes

据我所知classes.jar在Unity2019.2以下的版本中有UnityPlayerActivity类,在Unity2019.2以上的版本中将UnityPlayerActivity取消了不过可以在Unity(Unity的安装路径下)\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player中找到

找到classes.jar包,按下Ctrl+C,进入到项目中的我们刚刚创建的Module下的lib文件夹,选中它,Ctrl+V

lib下的classes.jar包,右键 Add AS Library

unity Androidstudio生成的aar在哪里 android studio unity3d_unity_08

unity Androidstudio生成的aar在哪里 android studio unity3d_android_09

添加Unity和安卓的通信类和添加UnityPlayerActivity.java

将Unity(Unity的安装路径下)\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player中的UnityPlayerActivity.java拷贝到u2a\main\java\com.xiaoma.u2a(这里你是自己的包名)中

在u2a\main\java\com.xiaoma.u2a中新建一个Empty Activity,

unity Androidstudio生成的aar在哪里 android studio unity3d_jar_10

unity Androidstudio生成的aar在哪里 android studio unity3d_unity_11

此时你的文件结构应该如下图

unity Androidstudio生成的aar在哪里 android studio unity3d_jar_12

设置AndroidStudio自动导入包

File->Settings->Editor->General->Auto Import

unity Androidstudio生成的aar在哪里 android studio unity3d_android_13

编写MainActivity.java

登录后复制


package com.wish.utoa;

import android.os.Bundle;
import android.widget.Toast;

import com.unity3d.player.UnityPlayer;

public class MainActivity extends UnityPlayerActivity  {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public void UnityCallAndroid () {

        Toast.makeText(this,"unity调用android成功", Toast.LENGTH_LONG).show();

        AndroidCallUnity();
    }
    //android调用unity
    public void AndroidCallUnity () {

        //第1个参数为Unity场景中用于接收android消息的对象名称
        //第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
        //第3个参数为unity方法的参数
        UnityPlayer.UnitySendMessage("receiveObj", "UnityMethod", "This is args.");
    }
}

修改我们创建的Module中的AndroidManifest.xml

登录后复制


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wish.utoa">

    <application>
        <!-- 这个android:name的值必须为包名+类名-->
        <activity android:name="com.wish.utoa.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <!-- 这一行不能少,否则会闪退-->
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>

</manifest>

修改build.gradle,添加打包jar的代码

注意这个build.gradle是我们刚刚创建的Modules的build.gradle文件不是项目的build.gradle

我们刚刚创建的Modules的build.gradle位置在

unity Androidstudio生成的aar在哪里 android studio unity3d_jar包_14

在末尾添加

登录后复制


android {....}
dependencies {....}

task deleteOldJar(type: Delete) {
    delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
    from('build/intermediates/aar_main_jar/release/')
    into('release/')
    include('classes.jar')
    ///Rename the jar
    rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)

发布包我们有两种方式:

方式一:发布.arr包

方式二:发布.jar包

2019.2以下的可以使用方式一,因为.aar包中包括了所有的资源,AndroidManifest.xml、lib文件夹、.jar包等

但是我们使用的是2019.3.8

为什么呢?原因不知道,但是我经过多次测试,如果发布.aar包,哪怕将.aar包里面的资源删除的只剩下项目所必须的.jar包和AndroidManifest.xml,放到Plugins/Android/文件夹下,Unity发布安卓后,在小米9pro上运行时程序都会出现两个图标,还不能正常调用安卓代码,但是我解压后,将两个文件取出来,放到Plugins/Android/文件夹下后,再次发布就能运行正常,不知道在其他机型上有没有这个问题

所以我们发布.jar包

在我们写下build.gradle中的代码后,点击右上角SyncNow,然后就可以在右上角的Gradle->项目名称->创建的Module名称->Task->other->exportJar

双击exportJar,我们就会在创建的Module名字->release文件夹下找到我们需要放在Unity中的.jar包

unity Androidstudio生成的aar在哪里 android studio unity3d_jar包_15

unity Androidstudio生成的aar在哪里 android studio unity3d_unity_16

选中.jar包,右键Show In Explorer,打开.jar包所在目录

unity Androidstudio生成的aar在哪里 android studio unity3d_android_17

将.jar包复制到Unity项目的Assets/Plugins/Android/目录下

将AndroidManifest.xml也一起复制到该目录下

然后选中.jar包,使用WinARA压缩管理器打开(不是解压),进到目录底层将BuildConfig.class删除,否则发布时会报错

unity Androidstudio生成的aar在哪里 android studio unity3d_jar_18

unity Androidstudio生成的aar在哪里 android studio unity3d_android_19

然后便可以发布了

注意:不能讲.jar包放到Plugins/Android/Lib文件夹下,否则会闪退,可以放到Plugins/Android/目录或者Pligins/Android/bin目录下面

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空