Unity接入Android SDK

文章目录

    • 1.接入准备(如果不具备这些条件,建议放弃)
    • 2.导入unity class
    • 3.Android调用unity
    • 4.unity调用Android
    • 5.查看 AndroidManifest.xml package
      • 非静态方法调用
      • 静态方法调用
    • 6.Java回调

unity 接入第三方SDK 很常见的事情,有的SDK 有官方文档,跟着文档接入即可(比如各大广告SDK),但是有写SDK没有提供unity的接入文档,提供的是Android 的接入文档,所有的接口都是面向Java的,SDK的安装也是Android Studio或者IDEA,而恰巧接SDK这个任务又到了你的手上,作为一个unity C#开发人员,现在要经手一个Java SDK的接入,于是此篇诞生了

1.接入准备(如果不具备这些条件,建议放弃)

既然是面向Java的SDK,那么一个Java的开发环境比不可少,这里暂时使用Android Studio来进行Java的打包(IDEA 原理差不多)

下载好Android Studio,新建一个Empty Activity 工程,将需要的功能整理好(支付SDK,登录SDK等等),SDK 至少会有一个文档(有一个Demo更好,可以参考Demo),会告诉你如何调用接口,如何返回值:
注意:新工程不能有中文路径!所有文件都不允许中文字符
举个栗子
XXX接入指南: 一般会有一个调用示例,一个返回值说明。

Unity接入Android SDK_第1张图片
Unity接入Android SDK_第2张图片

提示:
如果你的SDK没有文档,而你也不精通Java,建议放弃。
如果有SDK文档,但是你一点Java基础都没有,只是听说过Java,推荐放弃。
至少要会在Java中调用SDK的接口,这样才能为后面的打包入unity做准备,或者让安卓工程师 帮你写好接口,打包,然后直接拿到Unity使用,

如果上述条件都达不到,,,建议先学习下Java的函数调用以及目录结构。

2.导入unity class

找到unity editor的安装目录(此Editor 必须具有打包 Android 的模块)
Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar
将这个calsses.jar复制出来
打开File->ProjectStructure,或Ctrl+Shift+Alt+S
在Modules 里创建一个新的Android Library

Unity接入Android SDK_第3张图片

创建好之后,Gradle Scripts会多出一个build.gradle,需要在这里面进行导入SDK操作,打开后面是项目名+刚才创建的library的名字的文件,然后导入SDK
Unity接入Android SDK_第4张图片

导入SDK方式有两种:
小白推荐选择系统导入,还是Ctrl+Shift+Alt+S,打开ProjectStructure,选择Dependence,选择刚才创建的模块,加入
Unity接入Android SDK_第5张图片

将要导入的SDK全部接入即可(可以直接选择文件夹)
**注意:**如果是aar的SDK,必须要转换成Module导入,因为aar的打包,如果包含aar会有包冲突,(全网都这么说,其实只要全部设置为compileOnly即可,因为aar打包含有aar的包会出错)
Direct local .aar file dependencies are not supported when building an AAR. The resulting AAR would be broken because the classes and Android resources from any local .aar file dependencies would not be packaged in the resulting AAR. Previous versions of the Android Gradle Plugin produce broken AARs in this case too (despite not throwing this error). The following direct local .aar file dependencies of the :myapplication project caused this error:

Unity接入Android SDK_第6张图片

Unity接入Android SDK_第7张图片

导入SDK之后,需要将unity 的classes.jar修改为compileOnly,避免unity 打包失败(unity自带这个包,不允许包重复),其余导入的SDK或者SDK文件夹 则是默认的implementation,
全部使用compileOnly 可以解决aar问题,建议全部使用compileOnly
Unity接入Android SDK_第8张图片

3.Android调用unity

虽然接SDK一般都是 unity调用Android代码,但是还是在这里总结一下,Android调用unity的方法,
上一步接入全部SDK 之后,就可以根据需要调用对应的API
java调用unity,需要使用unityPlayer对象,通过反射调用C#函数
举个栗子:参考javaCallUnity

package com.example.myapplication;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;

public class MyActivity{
    private Activity unityActivity;
    private Context context;

    public void init(){
        getActivity();
    }

    private Activity getActivity(){
        if(null == unityActivity) {
            try {
                Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
                Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
                unityActivity = activity;
                context = activity;
            } catch (ClassNotFoundException e) {
                System.out.println(e.getMessage());
            } catch (IllegalAccessException e) {
                System.out.println(e.getMessage());
            } catch (NoSuchFieldException e) {
                System.out.println(e.getMessage());
            }
        }
        return unityActivity;
    }

    public void UnityCallJava(final String content) {
        Log.i("Android", "testInAndroid");
        Toast.makeText(unityActivity, content,Toast.LENGTH_SHORT).show();
    }



    public void javaCallUnity(){
        Log.i("Android", "testCallback");
        UnityPlayer.UnitySendMessage("AndroidRecall", "AndroidCallback", "arg1");
        UnityPlayer.UnitySendMessage("Gameobject","method","param");
    }

}

4.unity调用Android

还是上面代码的例子,参考unityCallJava,只要把SDK的函数写在其中即可(可以带参数,从unity传入),需要参数的SDK就直接写成带参数的SDK即可

假设我们已经写好了所有的函数(静态函数与非静态函数),下一步就是打包入unity,开始编写C#端的代码

建议统一格式,要不全部静态方法,要么全部非静态方法,不同类型,unity端的调用方式不一样

点击library的build.gradle,然后Make Module XXXXXX,
Unity接入Android SDK_第9张图片

然后就可以在outputs目录找到.aar 文件
Unity接入Android SDK_第10张图片

如果不想用Debug版,可以修改为release(实际没啥影响,不过还是建议用release)
Unity接入Android SDK_第11张图片

创建一个Android 目录,然后将aar文件放进去

Unity接入Android SDK_第12张图片

5.查看 AndroidManifest.xml package

查看android studio 要打包的Library的 AndroidManifest.xml,或者以压缩文件方式打开aar,查看aar的AndroidManifest.xml 的package,、
1.
Unity接入Android SDK_第13张图片

Unity接入Android SDK_第14张图片

非静态方法调用

初始化一个AndroidJavaObject,然后进行Call即可,可以看到第一个是方法名,后面的是参数数组,可以向方法传递参数
Unity接入Android SDK_第15张图片

静态方法调用

如图,CallStatic 即可调用静态方法
Unity接入Android SDK_第16张图片

unity调用Android 参考代码


using UnityEngine;

public class TestButton : MonoBehaviour
{
    // Start is called before the first frame update
    private AndroidJavaObject _androidObject;

    private void Start()
    {
        InitAndroidBridge();
    }

    private void InitAndroidBridge()
    {
        Debug.Log("InitAndroidBridge");
         //查看AndroidManifest.xml 中的packname  +类名
        _androidObject = new AndroidJavaObject("com.example.calltest");
        if (_androidObject == null)
        {
            Debug.LogError("Lib没有找到");
        }
        //这里的init是在Android端定义的init方法,SDK的init可以集中在一起进行调用
        _androidObject.Call("init");
        Debug.Log("InitFinish");
    }

    public void UnityCallJava()
    {
        Debug.Log("unityCallJava");
        _androidObject.Call("UnityCallJava", "This is a Unity Content!");
    }

    public void AndroidCallUnity()
    {
        Debug.Log("javaCallUnity");
        _androidObject.Call("javaCallUnity");
    }

    private void AndroidReCall(params string[] args)
    {
        Debug.Log("安卓回调,unity被安卓调用");
    }
}

6.Java回调

刚才在Android 调用unity,第一个参数是游戏物体,第二个是物体身上的方法,第三个是参数
UnityPlayer.UnitySendMessage(“Gameobject”,“AndroidReCall”,“param”);
这样就就可以实现 unity 调用Java,然后Java又回调 unity函数,有什么用呢?
好问题,可以实现 结果回调,
比如回调返回登录结果之类的,unity只能往Java传,所以需要Java向unity调用且传递结果
unity界面

Unity接入Android SDK_第17张图片
Unity接入Android SDK_第18张图片

你可能感兴趣的:(工具)