目录

一、SDK调用Unity3D

二、Unity3D调用SDK

1、在Unity中新建一个脚本,调用MySDkPlatform中的方法

四、打包

1、方式一:SDK打成plugins给Unity(unity版)

2、方式二:Unity导出安卓工程接入SDK(studio版)


本例子中使用的Android Studio为3.2.0版本,Unity为2018.3.12版本

一、SDK调用Unity3D

1、一般第三方SDK都会有一个暴露给接入方(即Unity3D)的一个接口类,该类中包含了一些SDK功能的各个调用方法,例如下面这个SDK接口类中包含了初始化、登录、登出三个功能的接入类,里面的每个方法跟参数都加了注释;

先看SDK库工程目录,mysdk是SDK库工程,app是一个依赖于SDK库工程的demo,其中只有一个MainActivity类,便于开发时进行测试,mysdk中只有一个MySDkPlatform类,这个类就是unity接入需要调用的接口类;

/*** 类说明:unity接入SDK的接口类*/
public class MySDkPlatform {private static String gameObjectName;//unity传过来的接收SDK回调的类名,SDK根据此类名调用unity类中的方法private static String unityInitCallbackName;//unity传过来的接收SDK回调的类中的方法,SDK根据此方法名调用unity中的方法private String unityLoginCallbackName;//同上private String unityLogoutCallbackName;//同上//单例模式public static MySDkPlatform mySDkPlatform;public static MySDkPlatform getInstance(){if (mySDkPlatform == null) {mySDkPlatform = new MySDkPlatform();}return mySDkPlatform;}//初始化public void init(Activity activity){System.out.println("调用了mysdk的初始化方法");//该方法的三个参数//gameObjectName:unity中的gameObject的类名//unityInitCallbackName:unity中gameObject绑定的c#脚本里的方法名//第三个参数:SDK向unity传递的字符串UnityPlayer.UnitySendMessage(gameObjectName,unityInitCallbackName,"这是SDK初始化结果回调");}//登录public void login(String arg1){System.out.println("调用了mysdk的登录方法;arg1 = "+arg1);UnityPlayer.UnitySendMessage(gameObjectName,unityLoginCallbackName,"这是SDK登录结果回调");}//登出,静态,跟以上非静态方法做不同例子演示public static void logout(String arg1){System.out.println("调用了mysdk的登出方法");UnityPlayer.UnitySendMessage(gameObjectName,unityLogoutCallbackName,"这是SDK登出结果回调");}//拿到unity的类名public void setGameObjectName(String gameObjectName){this.gameObjectName = gameObjectName;}//拿到unity接收SDK初始化结果的方法名public void setUnityInitCallbackName(String unityInitCallbackName) {this.unityInitCallbackName = unityInitCallbackName;}//拿到unity接收SDK登录结果的方法名public void setUnityLoginCallbackName(String unityLoginCallbackName) {this.unityLoginCallbackName = unityLoginCallbackName;}//拿到unity接收SDK登出结果的方法名public void setUnityLogoutCallbackName(String unityLogoutCallbackName) {this.unityLogoutCallbackName = unityLogoutCallbackName;}
}

2、类中的UnityPlayer.UnitySendMessage(gameObjectName,callbackName,arg1)方法是Unity中的一个unity-classes.jar包下的方法,SDK需要引入该包才能编译,在引入过程中需要注意,因为unity中已经有这个jar包,SDK库工程只在编译的时候需要用到,真正接入的时候,只需要拷贝SDK库工程生成的aar包即可,不需要把unity-classes.jar编译进去,否则会报异常,引入unity-classes.jar方法如下:

(1)新建一个unity3dlibs文件夹,保证与工程中的libs不重名,将unity-classes.jar放入该文件夹下

(2)在工程的build.gradle中加入依赖

//添加一个本地仓库,并将unity3dlibs目录作为仓库地址
repositories{flatDir {dirs 'unity3dlibs'}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:28.0.0'testImplementation 'junit:junit:4.12'compileOnly files('unity3dlibs/unity-classes.jar')//只在编译的时候用到
}

(3)清单文件;如果SDK中需要在manifest中application根节点下注册信息,在清单文件中需要编写以下代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.sdk.mysdk"><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme">//方式一:SDK的接口类继承了unity的UnityPlayerActivity,这里启动入口填写SDK的接口类路径//方式二:SDK的接口类没有继承unity的UnityPlayerActivity,这里填写"com.unity3d.player.UnityPlayerActivity"//本例子中使用方式二//Unity启动入口activity<activity android:name="com.unity3d.player.UnityPlayerActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

清单文件中注册UnityPlayerActivity是为了将SDK做成符合Unity接入的plugins,Unity编译时会将自身生成的manifest和SDK的manifest进行合并,但SDK的manifest优先级比较高,所以需要SDK在manifest中注册启动的UnityPlayerActivity。                     (注:如果SDK中有Activity并且继承了UnityPlayerActivity,则启动应用的main入口需要改为SDK的Activity)

二、Unity3D调用SDK

1、在Unity中新建一个脚本,调用MySDkPlatform中的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class NewBehaviourScript : MonoBehaviour
{AndroidJavaClass unityPlayer;AndroidJavaObject currentActivity;AndroidJavaClass androidJavaClass;AndroidJavaObject androidJavaObject;// Start is called before the first frame updatevoid Start(){步骤一:拿到接口对象实例//方式一//通过包名获取UnityPlayer,目的为了获取下面当前activity对象用//使用这种方式,SDK的接口类需要继承UnityPlayerActivity//拿到unityPlayer(固定写法,不用修改),即可调用SDK接口类中的静态方法,unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//通过unityPlayer获取当前的activity (注:固定写法,不用修改),拿到currentActivity,即可调用SDK接口类中的非静态方法currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//方式二(本例中使用的该方式)//获取SDK的MySDkPlatform类对象,可以直接使用androidJavaClass调用MySDkPlatform的静态方法androidJavaClass = new AndroidJavaClass("com.sdk.mysdk.MySDkPlatform");//获取SDK的MySDkPlatform类中的单例对象,可以直接使用androidJavaObject调用MySDkPlatform中的非静态方法androidJavaObject = androidJavaClass.CallStatic<AndroidJavaObject>("getInstance");//步骤二:告诉SDK返回参数时要调用Unity的哪一个方法名//unity调用SDK的方法,传入一个参数,该参数为定义在unity中的方法名,当unity调用SDK的接口,//且需要SDK返回参数时,SDK会根据这里传入的方法名,调用定义在unity中的方法//setGameObjectName为SDK里定义的方法名,Main Camera为untiy当前挂载的脚本androidJavaObject.Call("setGameObjectName", "Main Camera");//setUnityInitCallbackName为SDK里定义的方法名,initCallback为unity定义的方法名,用于接收SDK回调,下面两个一样androidJavaObject.Call("setUnityInitCallbackName", "initCallback");androidJavaObject.Call("setUnityLoginCallbackName", "loginCallback");androidJavaObject.Call("setUnityLogoutCallbackName", "logoutCallback");//步骤三:调用SDK的接口方法//SDK初始化Button btn = GameObject.Find("Button").GetComponent<Button>();btn.onClick.AddListener(() => {Debug.Log("-->初始化");//调用初始化方法,传入当前activity对象(注:这里的activity参数就是方式一中获取到的currentActivity)androidJavaObject.Call("init", currentActivity);});//登录Button btn2 = GameObject.Find("Button2").GetComponent<Button>();btn2.onClick.AddListener(() =>{androidJavaObject.Call("login", "unity调用了SDK的登录");});//登出Button btn3 = GameObject.Find("Button3").GetComponent<Button>();btn3.onClick.AddListener(() =>{//这里使用的是androidJavaClass调用的SDK的登出,在SDK接口类中logout方法为静态的,                //所以这里使用androidJavaClass类直接调用,而上面登录方法为非静态的,所以使用的是androidJavaObjectandroidJavaClass.Call("logout", "unity调用了SDK的登出");});}//步骤四:定义unity接收SDK返回参数的方法,这里的方法名与步骤二中传入的参数名必须一致//SDK初始化后,会调用该方法,参数为回调结果void initCallback(string callback){Debug.Log("-->收到SDK初始化的回调:"+callback);}//SDK登录后,会回调该方法,参数为回调结果void loginCallback(string callback){Debug.Log("-->收到SDK登录的回调:" + callback);}//SDK登出后,会回调该方法,参数为回调结果void logoutCallback(string callback){Debug.Log("-->收到SDK登出的回调:" + callback);}// Update is called once per framevoid Update(){}
}

四、打包

1、方式一:SDK打成plugins给Unity(unity版)

把SDK编译成aar,然后把aar文件、manifest文件放入Unity对应的Assets文件夹下的plugins下的Android下,以及libs下,没有的文件夹自己新建一个,目录对应如下:

Manifest放入Android文件夹下(如上图)

SDK的aar包放入libs文件夹下(如上图)

配置好以上步骤即可开始打包编译;

2、方式二:Unity导出安卓工程接入SDK(studio版)

这种方式接入更为简单,将SDK的aar包拷贝到游戏导出的studio工程的libs文件夹下,并在gradle中添加aar依赖,然后修改Manifest清单文件即可;(注:SDK工程中unity-classes.jar不需要拷贝进去,untiy导出的studio工程中已经有了这个jar包)。

Unity3D接入Android第三方SDK流程相关推荐

  1. Android 第三方SDK整理

    Android 第三方SDK整理 此文章为转载,仅用于学习使用,具体内容访问此链接 import java.util.HashMap;public class Sdk {/***by:默小坑2020. ...

  2. android 第三方社区,从友盟微社区看Android第三方SDK架构实践

    原标题:从友盟微社区看Android第三方SDK架构实践 开发Android第三方SDK说难不难,但说简单也不简单,要开发一个给很多人使用的第三方SDK,如何在保证稳定性的同时,增强SDK的灵活性,让 ...

  3. Android 第三方SDK的检测与提取

    Android 第三方SDK的检测一直是研究领域的热点与难点: 目前检测Android第三方SDK的方法主要分为两类 下手的目标也主要存在三点 首先说检测的点: AndroidManifest.xml ...

  4. Android接入融云sdk流程(思路)

    1.导入RongImKit以及v4包. 2.在融云控制台为自己的App申请AppKey和AppSecret. 3.在AndroidManifest中添加相应权限.服务.广播和app对应的AppKey. ...

  5. 如何做Android第三方SDK准入测试

    最近在做客户端测试的过程中,自己负责的功能模块涉及到了第三方SDK的接入.准入测试,期间自己也踩了不少坑,所以特此写一篇文章总结一下. 先说一下SDK的概念吧,sdk就是软件工具开发包(外语全称:So ...

  6. Android第三方SDK集成 —— 极光推送

    前言: 本文前篇,可以帮助朋友们快速集成极光推送.本文后篇,是我自己项目实践的一些总结和心得,应该对读者们还是很有参考价值的,相信读完这篇文章,你会对极光推送有更加深入的理解,而不仅仅只是会集成而已. ...

  7. android 支付sdk流程,支付SDK

    1. 集成准备 1.1 获得DBKEY和APPKEY 访问地址:https://pay.dangbei.com/open,注册并添加应用后,系统会自动生成DBKEY和APPKEY,也可在配置页面查看 ...

  8. Android第三方SDK使用分析

    上一篇博文中介绍了如何开发一个自动化识别APP使用第三方SDK的情况,总共采集了1000来款APP,现在对采集的数据进行简单做一下统计分析,从统计中可以大概看到哪些SDK使用的最多,不同类型的APP使 ...

  9. android 第三方SDK接入一般流程

    1 官方文档必看 官方文档接入一般包括常规接入和自定义接入.这里的建议是:先常规接入,跑起来,并测试正常之后,然后实现自定义的接入. 目前我接入过的包括:常用的支付,地图,推送,分享,热更新,功能性s ...

最新文章

  1. 负数显示红字html语言,需要将单元格内的负数显示为红色且不带负号显示两位小数的格式代码是下面哪一种A、 0.00;[红色...
  2. 请解释和、|和||的区别?
  3. 四十七、Tableau地理可视化
  4. c++11特性move和forward区别
  5. 深入理解springboot starter
  6. 面向对象编程(OOP)和函数式编程(FP)的思考
  7. python字典嵌套循环_python使用for循环更新嵌套字典值
  8. 肿瘤全外显子--记录
  9. ffmepg处理10bit 和8bit yuv总结
  10. windows桌面ui开发
  11. 场论:关于矢量场梯度=0的证明
  12. call和apply详解-利用借充电宝模拟用法
  13. OpenCV相关操作(cv2) (python)
  14. linux ftp 虚拟目录,Linux搭建FTP之vsftpd 虚拟用户配置步骤
  15. 萌新必看—10种前端存储哪家强,一文读尽!
  16. C语言中sizeof用法
  17. 2D弹簧质点系统的隐式求解
  18. 数据结构代码题--头插法和尾插法的应用
  19. 好看视频上传软件批量发布视频讲解
  20. ISkyShop多用户商城系统之微信店铺隆重发布

热门文章

  1. 我靠跨境电商5个月全款买房:那个你看不起的行业,未来十年最赚钱!
  2. 学习笔记:多目标跟踪对车辆进行测速
  3. freemarker 解析对象的某元素_FreeMarker标签介绍及各种数据类型处理
  4. 用dw 删除重复html文件,Dreamweaver怎么撤销重做,DW怎么返回上一步,看完就明白了...
  5. SAP ERP FI(Financial Accounting)财务会计--BW方向--初级--2
  6. OceanBase上云、91道MySQL面试题…… - 墨天轮数据库周刊第17期
  7. java中form用法_SpringMVC表单标签使用详解
  8. 监督学习和无监督学习简单理解
  9. Bugku 哥哥的秘密
  10. 事件分发(EventDispatcher)模式