赞
踩
Unity和Android原生交互的方式大概有2种,一种是Android导出jar/aar包给Unity,然后Unity来构建apk;另外一种是Unity勾选Export Project,导出为一个Android工程,然后用AndroidStudio构建APK;这里讲讲第一种方式
classes.jar 位于 {Unity 安装位置}\Editor\Data\PlaybackEngines\AndroidPlayer\Variations{mono或il2cpp}\Release\Classes\ 目录下
先用Android Studio新建一个Android Studio空工程,接着我们创建一个module模块来实现功能
点击 File-New-New Module,拉起创建面板
注意,这里要先切换到Android Library页签,然后可以输入你喜欢的module名字
在模块下创建MainActivity ,也不一定要这个名字,可以根据你喜欢的来
这里MainActivity 改继承自UnityPlayerActivity,不出意外,改继承后这里会报红。这是因为新版本的Unity(大概是2019和之后的版本),导出的 classes.jar 不再包含 UnityPlayerActivity了。所以我们需要再拷贝一个UnityPlayerActivity过来
这个路径在对应Unity版本的 Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player目录下。只要找到前面的classes.jar,相信这个对你来说也是轻松找到
package com.example.linkunitylibrary; //这里拷贝你MainActivity的package
//import导入依赖
import com.unity3d.player.IUnityPlayerLifecycleEvents;
import com.unity3d.player.MultiWindowSupport;
import com.unity3d.player.UnityPlayer;
然后 MainActivity就不报红了
这里我们分别 写一个方法给Unity调用 和 调用Unity里的一个方法
代码如下
package com.example.linkunitylibrary; import android.os.Bundle; import com.unity3d.player.UnityPlayer; /** * Created by super41 on 2024/4/5. */ public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //调用Unity的方法 a2u_add(1,5); } //写一个方法给Unity调用 public int u2a_add(int a,int b){ return a + b; } //调用unity里的方法 public void a2u_add(int a,int b){ sendMsg2Unity("a2u_add",a+"|"+b); } private static final String LinkGameObjectName = "UnityLinkAndroidGo"; /** * 给Unity发消息 * @param methodName 方法名 * @param params 参数 */ private void sendMsg2Unity(String methodName,String params){ //依次传入 GameObjectName, GameObject里的方法,参数 //因为这里 GameObjectName 一般固定,所以封装起来 //只能传递一个参数,多个参数拼接在params里 UnityPlayer.UnitySendMessage(LinkGameObjectName,methodName,params); } }
修改AndroidManifest.xml,这里记得替换为你自己的包名和类名
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:allowBackup="true" android:supportsRtl="true"> <activity android:name="com.example.linklibrary.MainActivity" android:exported="true"> <!--包名和类名,这里换成你自己的包名和类名--> <intent-filter> <action android:name="android.intent.action.MAIN" /> <!--主入口Activity--> <category android:name="android.intent.category.LAUNCHER" /> <!--添加到桌面--> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> </manifest>
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class UnityLinkAndroidScript : MonoBehaviour { public Text Txt1; public Text Txt2; // Start is called before the first frame update void Start() { u2a_add(100,200); } /// <summary> /// Unity调用Android /// </summary> void u2a_add(int a, int b) { //标准操作,获取MainActivity对象 AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject javaObject = javaClass.GetStatic<AndroidJavaObject>("currentActivity"); //调用方法 var result = javaObject.Call<int>("u2a_add", a, b); Txt1.text = $"UnityCallAndroid {a} + {b} = {result}"; } /// <summary> /// 给android调用的方法 /// </summary> /// <param name="objs"></param> void a2u_add(string objs) { var arrays = objs.Split('|'); var a = int.Parse(arrays[0]); var b = int.Parse(arrays[1]); var result = a + b; Txt2.text = $"AndroidCallUnity {a} + {b} = {result}"; } }
然后把2个Text附上
一切准备就绪,接下来就是导出和构建APK了
我们一般是导出jar包和aar包文件。其实也可以用导出java文件的方式
如下图,3个文件导出到Unity的Assets/Plugins/Android/目录下,如没有目录则创建
接着就是常规的构建apk了。我们来看运行结果。可以看到成功运行了起来
上面的导出java文件一般不是主流的方式,还是导出成一个压缩包的形式更好管理一点。我们来看看怎么导出jar包
选中你的module,然后点击 Build - Make Module xxx. 然后打开资源管理器,就可以看到这里生成了一个build目录
进入build\intermediates\aar_main_jar\debug\目录(这里不同Android版本可能输出路径不一样,思路是一致的)
可以找到classes.jar
拷贝这里的classes.jar拷贝到Plugins/Android/目录下,并删除掉原来的java文件。如下图
然后就是构建apk了,也可以得到我们想要的效果;
代码如下:
//删除旧jar包
task tryDeleteOldJar(type:Delete){
delete('release/HelloWorld.jar')
}
//导出并重命名jar包
task exportJar(type : Copy){
from('build\\intermediates\\aar_main_jar\\debug')//从这个路径拷贝
into('release') //拷贝到这个路径
include('classes.jar')
rename('classes.jar','HelloWorld.jar')
}
//添加依赖
exportJar.dependsOn(tryDeleteOldJar,build)
然后Sync刷新一下
点击右侧的Gradle,然后点击Task/other
就可以看到exportJar任务了
双击执行它,我们可以得到一个重命名好的HelloWorld.jar
如果看不到Task任务,那是一些版本的AndroidStudio隐藏掉了,可以进入File-Setting-Experimental,然后取消勾选这个Do not build… 选项,然后点击OK后你就可以看到Task了(当然不同版本可能设置不一样,这里主要介绍一种解决思路)
到此,导出Jar包的形式也好了
我们还可以导出aar包,aar和jar包的区别是,jar包一般只包含java文件,而aar包除此之外,还可以包含res和AndroidMainfest.xml
接下来我们来实现导出aar包;
和之前一样,我们选中Module,点击Build-Make Module来构建
可以在build/outputs/aar里面找到aar
aar包本质上是一个压缩包,我们改为.zip格式,然后用压缩文件打开。目录大致如下
还记得我们从unity拷贝了一个classes.jar过来嘛,这个文件也会被构建进aar包,然后当我们把aar包放回unity,那么就会有重名的类。所以我们需要删除掉这个classes.jar
具体的操作方式是:
把libs里的classes.jar删掉,然后箭头的classes.jar拖进libs目录
然后接下来就是重新压缩成一个aar包了。压缩这里有2点很关键,我当时自己也是踩坑了好几个小时。
现在说一下:
如果构建过程中提示AndroidMainfest 合并失败,如下图。是因为最小sdk版本要改一下
这里你可以对aar包里的minSdkVersion进行修改,改成提示的版本,比如我这里是改成19,然后导出为压缩包
也可以对Modudle的build.gradle改下minsdk版本,我这里是改成19,这种方式更好一点。然后重新构建aar包
使用导出aar的方式构建出的apk,桌面上可能会有2个程序入口,也就是2个图标。
我们需要修改下AndroidMainfest.xml
进入PlayerSetting,勾选 CustomMainfest.xml
然后会自动生成AndroidMainfest.xml
进入AndroidMainfest.xml,把这个activity整段删掉,然后再构建apk即可
最后导出APK就可以了。至此我们就完成了3种导出方式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。