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代码中的静态方法
Dispose IDisposable 回调
Get 获取Android代码中的非静态字段
GetRawClass 获取一个指向Java class的原始引用
GetRawObject 获取一个指向Java object的原始引用
GetStatic 获取Android代码中的静态字段
Set 设置Android代码中的非静态字段
SetStatic 设置Android代码中的静态字段
posted @ 2021-09-29 16:55  小紫苏  阅读(1047)  评论(0编辑  收藏  举报