Unity和Android交互
一、前言
Unity做安卓项目时,经常会碰到接安卓sdk的问题,需要获取Android权限,或者调用sdk中写好的Java代码;
1.前期准备:
1)配置java环境;
下载jdk,同时配置环境变量;
2)下载AndroidSDK;
以下查看sdk,jdk,ndk安装是否正常;
3)下载AndroidStudio;
二、安卓打包成Jar/arr
1.操作流程
1.android studio中创Empty项目,项目名和sdk版本设置与Unity一致;
2.修改项目build.gradle中id从application 改为library——同时注释defaultConfig中applicationID(或者重新创建Moudle);
3.导入unity的classes.jar在lib中,右键mark as library;
classes.jar分为Release和Mono版本;
4.src-java-com…中导入UnityPlayerActivity类;并创建新方法类继承UnityPlayerActivity;
5.在新的java类中写需要调用的方法;
6.在gradle中添加
task makeJar(type: Copy) {
delete 'build/libs/mysdk.jar'
from('build/intermediates/intermediate-jars/release') //从该地址复制
into('build/libs/') //复制到该地址
include('classes.jar') //包含文件
rename ('classes.jar', 'mysdk.jar') //重命名
}
makeJar.dependsOn(build)
7.在终端Terminal中输入gradlew makejar;
8.在build/intermediates/arr_main_jar/debug中找到classes.jar(打包好的插件)放进unity中使用 ;
2.注意事项
1.终端Terminal失败,可能是没有java环境,先配置java环境(下载jdk);
2.unity高版本之后将classes.jar和UnityplayerActivity.jar分开了,分别在Unity目录中:
Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes;
Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player;
3.打包时候的包名和项目名一致;
4.打包完成必须把untiyplayeractivity和classes.jar删除(用压缩文件形式打开),或者添加依赖时使用compileonly;
三、Unity导出Android项目
选择安卓平台,勾选export导出;
四、Unity和Java的互相调用
1.Java调用Unity
UnityPlayer.UnitySendMessage(对象名, 方法名, 参数)API的使用;
对象名:Unity场景中实例的物体名=Hierarchy面板显示的物体名(注意clone);
方法名:该物体上任意脚本中的方法名;
参数:String,只能一个参数,但是String嘛,自己拆分;
2.Unity调用Java
AndroidJavaClass 和 AndroidJavaObject 类的使用;
Unity段只能调用在java中UnityPlayerActivity类的方法;
两种调用方式:
1)静态
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayerActivity"))
{
stirng str = jc.CallStatic<string>("ShowStr",str1,str2);
}
2)非静态
前提在UnityPlayerActivity类中有对应GetInstance方法,如下:
private static UnityPlayerActivity instance;
public static UnityPlayerActivity GetInstance() {
if (instance == null)
instance =new UnityPlayerActivity();
return instance;
}
instance在onCreate中赋值this;
调用端:
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayerActivity"))
{
using (AndroidJavaObject jo = jc.CallStatic<AndroidJavaObject>("GetInstance"))
{
stirng str = jo.CallStatic<string>("ShowStr",str1,str2);
}
}
重要API:
Call | 调用Android代码中的非静态方法 |
---|---|
CallStatic | 调用Android代码中的静态方法 |
Dispose | IDisposable 回调 |
Get | 获取Android代码中的非静态字段 |
GetRawClass | 获取一个指向Java class的原始引用 |
GetRawObject | 获取一个指向Java object的原始引用 |
GetStatic | 获取Android代码中的静态字段 |
Set | 设置Android代码中的非静态字段 |
SetStatic | 设置Android代码中的静态字段 |