Unity——与Android(Java)交互

Unity和Android交互

一、前言

Unity做安卓项目时,经常会碰到接安卓sdk的问题,需要获取Android权限,或者调用sdk中写好的Java代码;

1.前期准备:

1)配置java环境;

下载jdk,同时配置环境变量;

2)下载AndroidSDK;

image-20210929002501590

image-20210929002523089

以下查看sdk,jdk,ndk安装是否正常;

image-20210929002946051

3)下载AndroidStudio;

二、安卓打包成Jar/arr

1.操作流程

1.android studio中创Empty项目,项目名和sdk版本设置与Unity一致;

image-20210929162349244

image-20210929162447608

2.修改项目build.gradle中id从application 改为library——同时注释defaultConfig中applicationID(或者重新创建Moudle);

image-20210929162700203

3.导入unity的classes.jar在lib中,右键mark as library;

classes.jar分为Release和Mono版本;

image-20210929162857106

4.src-java-com…中导入UnityPlayerActivity类;并创建新方法类继承UnityPlayerActivity;

image-20210929163021419

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;

image-20210929163209050

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导出;

image-20210929163429077

四、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代码中的静态方法
DisposeIDisposable 回调
Get获取Android代码中的非静态字段
GetRawClass获取一个指向Java class的原始引用
GetRawObject获取一个指向Java object的原始引用
GetStatic获取Android代码中的静态字段
Set设置Android代码中的非静态字段
SetStatic设置Android代码中的静态字段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小紫苏0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值