自从Unity2019.2以后的版本升级以后,各种奇葩事情层次不穷,废了我好久的功夫才能在Android端继承UnityPlayerActivity后正常交互,但是如果不继承UnityPlayerActivity的话,是可以很容易正常交互的,但是我们这里只讲Android端集成UnityPlayerActivity的方式
参考博客:
首先创建安卓项目,使用AndroidStudio3.6.3
在菜单栏选择File->New->NewProject创建一个项目
显示选择界面 点击Empty Activity - Next
填写项目名称Unity2Android (这个名可以随便填后面用不到),Minimum SDK 最好和Unity的项目选择一样的
做到这一步你就建成一个新的AS项目了
添加Modules
这个是重点
有两种方式添加
方式一:在菜单栏选择File->New->New Module...
方式二:在菜单栏选择File-> Project Structure
两种方式都可以打开Create New Module窗口
但是两种方式会在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和安卓的通信类和添加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,
此时你的文件结构应该如下图
设置AndroidStudio自动导入包
File->Settings->Editor->General->Auto Import
编写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位置在
在末尾添加
登录后复制
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包
选中.jar包,右键Show In Explorer,打开.jar包所在目录
将.jar包复制到Unity项目的Assets/Plugins/Android/目录下
将AndroidManifest.xml也一起复制到该目录下
然后选中.jar包,使用WinARA压缩管理器打开(不是解压),进到目录底层将BuildConfig.class删除,否则发布时会报错
然后便可以发布了
注意:不能讲.jar包放到Plugins/Android/Lib文件夹下,否则会闪退,可以放到Plugins/Android/目录或者Pligins/Android/bin目录下面
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删