Android4U3D插件开发
目标
实现Unity中调用安卓原生方法,并传递参数;实现安卓方法中调用Unity3D中的方法,并传递参数,本文主要教会大家开发方式与流程,具体需要在安卓原生代码下执行哪些功能,因人而异,可自由发挥。
工具
需要用到Unity3D提供的安卓工具类,即classes.jar,在Unity3D安装路径下的AndroidPlayer下面的PlaybakEngine下的Release文件夹下可找到。
实现方法一
使用jar包的方式调用插件。
使用AndroidStudio创建安卓应用工程,导入classes.jar库到libs中并加入到库引用;
创建主Activity继承至UnityPlayerActivity或UnityPlayerNativeActivity,后者Manifest文件中不添加事件传递的meta的话则安卓无法接受到点击事件等;
编写相应的公共方法,用来在Unity3D中进行调用,例如创建了方法:FooFunction(),在安卓中调用Unity3D的方式为:
// 第一个参数为游戏对象,第二个参数为对象上挂在的脚本中的方法名,第三个参数为方法需要传递的参数 UnityPlayer.UnitySendMessage("GameObject", "Callback", "Params01")完成类与方法的编写后,修改相应的AndroidManifest.xml文件,添加工程将使用到的相应的权限,若不需要可跳过;
使用AndroidStudio的Build功能下的RebuildProject功能编译项目,在BuildVariants界面下可设置编译Release或Debug版本;
编译完成使用命令行 cd 到工程目录下的 build/intermediates/classes/debug (或者是release,根据BuildVariants设置而决定);
请注意,先删除包文件下的带 R 字的所有.class文件(感兴趣的同学可以不删除就编译jar文件拿来使用,会发现在Unity3D中编译时会报文件已添加的错误,具体错误原因可仔细查看英文内容或上网搜寻);
删除相关的R文件后,在该目录下执行命令行指令:jar -c fooclasses.jar * 注意,fooclasses.jar这个名字大家随意,符合自己工程即可;
将生成的fooclasses.jar文件复制到Unity3D工程下的Assets/Plguins/Android/libs目录下,同时将安卓工程的AndroidManifest.xml文件复制到Unity3D工程下的Assets/Plguins/Android目录下;
若Unity3D工程因一些原因已导入过一些库,导致Assets/Plguins/Android已经存在AndroidManifest.xml文件,则根据文件内容添加自己工程中创建的Activity并设置为启动的Activity即可;
此时可在c#文件中编写调用安卓原生代码的方法了,调用方式为:
// 调用方式一 AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("FooFunction", "Params01", "Params02"); // 调用方式二(此方法将尽可能早的释放安卓对象,毕竟调用安卓原生代码将带来一定的性能开销): using (AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("FooFunction", "Params01", "Params02"); }编译导出apk运行,没差错顺利的话应该能正常编译执行;
实现方法二
使用aar包的方式调用插件。
使用AndroidStudio创建安卓应用工程;
工程创建成功后继续新建模块,选择新建AndroidLibrary方式,创建成功后导入classes.jar库到libs中并加入到库引用;
创建主Activity继承至UnityPlayerActivity或UnityPlayerNativeActivity,后者Manifest文件中不添加事件传递的meta的话则安卓无法接受到点击事件等;
编写相应的公共方法,用来在Unity3D中进行调用,例如创建了方法:FooFunction(),在安卓中调用Unity3D的方式为:
// 第一个参数为游戏对象,第二个参数为对象上挂在的脚本中的方法名,第三个参数为方法需要传递的参数 UnityPlayer.UnitySendMessage("GameObject", "Callback", "Params01")完成类与方法的编写后,修改相应的AndroidManifest.xml文件,添加工程将使用到的相应的权限,若不需要可跳过;
设置BuildVariants界面下的编译方式为 Debug 版本,否则不生成outputs文件夹,使用AndroidStudio的Build功能下的RebuildProject功能编译项目;
编译成功后即可在Project视图下的build/outputs/aar目录下找到对应的.aar文件;
cd 到 aar 目录下,执行 zip 文件名.aar -d libs/classes.jar 来删除该Unity3D提供的 classes.jar 文件,否则打包时提示无法迁移jar文件的错误;
当然,也可以使用zip工具解压缩该 .aar 文件后删除libs下的 classes.jar 文件,再重新压缩成 .aar 文件,一样可行;
将生成的 .aar 文件复制到Unity3D工程下的Assets/Plguins/Android/libs目录下,同时将安卓工程的AndroidManifest.xml文件复制到Unity3D工程下的Assets/Plguins/Android目录下;
若Unity3D工程因一些原因已导入过一些库,导致Assets/Plguins/Android已经存在AndroidManifest.xml文件,则需要对应调整该文件的启动Activity,此AndroidManifest.xml文件将与 .aar 文件中的AndroidManifest.xml文件自动合并,若存在冲突则无法合并,同理,需要保证这两个AndroidManifest.xml文件中的相关 mini-SDK、target-SDK 及 build-tools 的版本一致,否则无法自动合并编译报错;
此时可在c#文件中编写调用安卓原生代码的方法了,调用方式为:
// 调用方式一: AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("FooFunction", "Params01", "Params02"); // 调用方式二(此方法将尽可能早的释放安卓对象,毕竟调用安卓原生代码将带来一定的性能开销): using (AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity"); jo.Call ("FooFunction", "Params01", "Params02"); }编译导出apk运行,没差错顺利的话应该能正常编译执行;