当前位置:   article > 正文

Unity3D接入Android第三方SDK流程_unity sdk接入流程

unity sdk接入流程

目录

一、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接入需要调用的接口类;

        

  1. /**
  2. * 类说明:unity接入SDK的接口类
  3. */
  4. public class MySDkPlatform {
  5. private static String gameObjectName;//unity传过来的接收SDK回调的类名,SDK根据此类名调用unity类中的方法
  6. private static String unityInitCallbackName;//unity传过来的接收SDK回调的类中的方法,SDK根据此方法名调用unity中的方法
  7. private String unityLoginCallbackName;//同上
  8. private String unityLogoutCallbackName;//同上
  9. //单例模式
  10. public static MySDkPlatform mySDkPlatform;
  11. public static MySDkPlatform getInstance(){
  12. if (mySDkPlatform == null) {
  13. mySDkPlatform = new MySDkPlatform();
  14. }
  15. return mySDkPlatform;
  16. }
  17. //初始化
  18. public void init(Activity activity){
  19. System.out.println("调用了mysdk的初始化方法");
  20. //该方法的三个参数
  21. //gameObjectName:unity中的gameObject的类名
  22. //unityInitCallbackName:unity中gameObject绑定的c#脚本里的方法名
  23. //第三个参数:SDK向unity传递的字符串
  24. UnityPlayer.UnitySendMessage(gameObjectName,unityInitCallbackName,"这是SDK初始化结果回调");
  25. }
  26. //登录
  27. public void login(String arg1){
  28. System.out.println("调用了mysdk的登录方法;arg1 = "+arg1);
  29. UnityPlayer.UnitySendMessage(gameObjectName,unityLoginCallbackName,"这是SDK登录结果回调");
  30. }
  31. //登出,静态,跟以上非静态方法做不同例子演示
  32. public static void logout(String arg1){
  33. System.out.println("调用了mysdk的登出方法");
  34. UnityPlayer.UnitySendMessage(gameObjectName,unityLogoutCallbackName,"这是SDK登出结果回调");
  35. }
  36. //拿到unity的类名
  37. public void setGameObjectName(String gameObjectName){
  38. this.gameObjectName = gameObjectName;
  39. }
  40. //拿到unity接收SDK初始化结果的方法名
  41. public void setUnityInitCallbackName(String unityInitCallbackName) {
  42. this.unityInitCallbackName = unityInitCallbackName;
  43. }
  44. //拿到unity接收SDK登录结果的方法名
  45. public void setUnityLoginCallbackName(String unityLoginCallbackName) {
  46. this.unityLoginCallbackName = unityLoginCallbackName;
  47. }
  48. //拿到unity接收SDK登出结果的方法名
  49. public void setUnityLogoutCallbackName(String unityLogoutCallbackName) {
  50. this.unityLogoutCallbackName = unityLogoutCallbackName;
  51. }
  52. }

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中加入依赖

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

二、Unity3D调用SDK

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

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class NewBehaviourScript : MonoBehaviour
  6. {
  7. AndroidJavaClass unityPlayer;
  8. AndroidJavaObject currentActivity;
  9. AndroidJavaClass androidJavaClass;
  10. AndroidJavaObject androidJavaObject;
  11. // Start is called before the first frame update
  12. void Start()
  13. {
  14. 步骤一:拿到接口对象实例
  15. //方式一
  16. //通过包名获取UnityPlayer,目的为了获取下面当前activity对象用
  17. //使用这种方式,SDK的接口类需要继承UnityPlayerActivity
  18. //拿到unityPlayer(固定写法,不用修改),即可调用SDK接口类中的静态方法,
  19. unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  20. //通过unityPlayer获取当前的activity (注:固定写法,不用修改),拿到currentActivity,即可调用SDK接口类中的非静态方法
  21. currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
  22. //方式二(本例中使用的该方式)
  23. //获取SDK的MySDkPlatform类对象,可以直接使用androidJavaClass调用MySDkPlatform的静态方法
  24. androidJavaClass = new AndroidJavaClass("com.sdk.mysdk.MySDkPlatform");
  25. //获取SDK的MySDkPlatform类中的单例对象,可以直接使用androidJavaObject调用MySDkPlatform中的非静态方法
  26. androidJavaObject = androidJavaClass.CallStatic<AndroidJavaObject>("getInstance");
  27. //步骤二:告诉SDK返回参数时要调用Unity的哪一个方法名
  28. //unity调用SDK的方法,传入一个参数,该参数为定义在unity中的方法名,当unity调用SDK的接口,
  29. //且需要SDK返回参数时,SDK会根据这里传入的方法名,调用定义在unity中的方法
  30. //setGameObjectName为SDK里定义的方法名,Main Camera为untiy当前挂载的脚本
  31. androidJavaObject.Call("setGameObjectName", "Main Camera");
  32. //setUnityInitCallbackName为SDK里定义的方法名,initCallback为unity定义的方法名,用于接收SDK回调,下面两个一样
  33. androidJavaObject.Call("setUnityInitCallbackName", "initCallback");
  34. androidJavaObject.Call("setUnityLoginCallbackName", "loginCallback");
  35. androidJavaObject.Call("setUnityLogoutCallbackName", "logoutCallback");
  36. //步骤三:调用SDK的接口方法
  37. //SDK初始化
  38. Button btn = GameObject.Find("Button").GetComponent<Button>();
  39. btn.onClick.AddListener(() =>
  40. {
  41. Debug.Log("-->初始化");
  42. //调用初始化方法,传入当前activity对象(注:这里的activity参数就是方式一中获取到的currentActivity)
  43. androidJavaObject.Call("init", currentActivity);
  44. });
  45. //登录
  46. Button btn2 = GameObject.Find("Button2").GetComponent<Button>();
  47. btn2.onClick.AddListener(() =>
  48. {
  49. androidJavaObject.Call("login", "unity调用了SDK的登录");
  50. });
  51. //登出
  52. Button btn3 = GameObject.Find("Button3").GetComponent<Button>();
  53. btn3.onClick.AddListener(() =>
  54. {
  55. //这里使用的是androidJavaClass调用的SDK的登出,在SDK接口类中logout方法为静态的,
  56. //所以这里使用androidJavaClass类直接调用,而上面登录方法为非静态的,所以使用的是androidJavaObject
  57. androidJavaClass.Call("logout", "unity调用了SDK的登出");
  58. });
  59. }
  60. //步骤四:定义unity接收SDK返回参数的方法,这里的方法名与步骤二中传入的参数名必须一致
  61. //SDK初始化后,会调用该方法,参数为回调结果
  62. void initCallback(string callback)
  63. {
  64. Debug.Log("-->收到SDK初始化的回调:"+callback);
  65. }
  66. //SDK登录后,会回调该方法,参数为回调结果
  67. void loginCallback(string callback)
  68. {
  69. Debug.Log("-->收到SDK登录的回调:" + callback);
  70. }
  71. //SDK登出后,会回调该方法,参数为回调结果
  72. void logoutCallback(string callback)
  73. {
  74. Debug.Log("-->收到SDK登出的回调:" + callback);
  75. }
  76. // Update is called once per frame
  77. void Update()
  78. {
  79. }
  80. }

四、打包

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包)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/323021
推荐阅读
相关标签
  

闽ICP备14008679号