当前位置:   article > 正文

[Unity]Unity接平台SDK(3种方式)_unity接入sdk

unity接入sdk

    最近又接了一次平台SDK,顺带着也学习了接IOS的SDK。IOS的也是边做边学的,现在还没这么清楚,就不讲了。还是来说下安卓SDK的接法,因为平台需求,我用了2种方式来接平台SDK。随便总结下,方便以后查阅。3种方式是我目前知道的,我不清楚是否还有其他接法。个人认为第一种和第三种是比较麻烦的。

    1.Unity导出Andorid工程,再导入SDK库,开始写SDK代码,然后就可以打APK。这个比较简单粗暴,就不多说了。

    2.SDK导出aar包,作为插件导入Unity,然后Unity生成APK,这个方式比较好,也是我刚开始采用的,基于此,还写了个一键打包方法。

    3.Unity导出aar包,作为插件导入Android工程,开始写SDK代码,然后就可以打APK。其实这跟第一种方法类似,但由于平台要弄聚合SDK,我们这安卓SDK代码不需要自己写,由平台方写,所以后续采用了这种方式。

    先上SDK代码

SDK管理类:

  1. public class SDKManager : MonoBehaviour
  2. {
  3. #region 单例
  4. private static SDKManager _instance;
  5. public static SDKManager Instance
  6. {
  7. set { _instance = value; }
  8. get { return _instance; }
  9. }
  10. #endregion
  11. private SDKBase sdk;
  12. #region sdk 参数
  13. public int GetPlatformId()
  14. {
  15. if (sdk != null)
  16. {
  17. AddResult("GetPlatformId: " + sdk.GetPlatformId() + "---");
  18. return sdk.GetPlatformId();
  19. }
  20. return 0;
  21. }
  22. public string GetUID()
  23. {
  24. if (sdk != null)
  25. {
  26. AddResult("GetUID: " + sdk.GetUid() + "---");
  27. return sdk.GetUid();
  28. }
  29. return "";
  30. }
  31. #endregion
  32. private void Awake()
  33. {
  34. _instance = this;
  35. }
  36. private void Start()
  37. {
  38. #if UNITY_EDITOR
  39. sdk = new SDKBase();
  40. #elif UNITY_ANDROID
  41. sdk = new SDKForAndroid();
  42. #elif UNITY_IPHONE
  43. sdk = new SDKForIphone();
  44. #endif
  45. SDKInit();
  46. }
  47. /// <summary>
  48. /// SDK初始化
  49. /// </summary>
  50. public void SDKInit()
  51. {
  52. if (sdk == null) return;
  53. AddResult("SDKInit");
  54. sdk.Init();
  55. }
  56. /// <summary>
  57. /// SDK登录
  58. /// </summary>
  59. public void SDKLogin()
  60. {
  61. if (sdk == null) return;
  62. AddResult("SDKLogin");
  63. sdk.Login();
  64. }
  65. /// <summary>
  66. /// SDK登出
  67. /// </summary>
  68. public void SDKLogout()
  69. {
  70. if (sdk == null) return;
  71. AddResult("SDKLogout");
  72. sdk.Logout();
  73. }
  74. /// <summary>
  75. /// SDK付费
  76. /// </summary>
  77. public void SDKPay()
  78. {
  79. if (sdk == null) return;
  80. AddResult("SDKPay");
  81. sdk.Pay();
  82. }
  83. /// <summary>
  84. /// SDK登录游戏服务器
  85. /// </summary>
  86. /// <param name="uid">登录后用户id,由登录传给游戏的用户id</param>
  87. /// <param name="sid">游戏区服id</param>
  88. public void SDKLoginGame(string uid, string sid)
  89. {
  90. if (sdk == null) return;
  91. AddResult("SDKLoginGame");
  92. sdk.LoginGame(uid, sid);
  93. }
  94. /// <summary>
  95. /// SDK创建角色
  96. /// </summary>
  97. /// <param name="uid">登录后用户id,由登录传给游戏的用户id</param>
  98. /// <param name="sid">游戏区服id</param>
  99. /// <param name="roleId">游戏角色id</param>
  100. /// <param name="roleName">游戏角色名</param>
  101. public void SDKCreateRole(string uid, string sid, string roleId, string roleName)
  102. {
  103. if (sdk == null) return;
  104. AddResult("SDKCreateRole");
  105. sdk.CreateRole(uid, sid, roleId, roleName);
  106. }
  107. #region SDK事件回调
  108. /// <summary>
  109. /// result = platformId
  110. /// </summary>
  111. /// <param name="result"></param>
  112. public void OnSDKInit(string result)
  113. {
  114. AddResult(result);
  115. sdk.SetPlatformId(result);
  116. }
  117. /// <summary>
  118. /// result = bIsSuccess + uid + nickName
  119. /// </summary>
  120. /// <param name="result"></param>
  121. public void OnSDKLogin(string result)
  122. {
  123. AddResult(result);
  124. string[] strs = result.Split('|');
  125. if(strs.Length > 1)
  126. {
  127. string uid = strs[1];
  128. sdk.SetUid(uid);
  129. }
  130. //抛事件到lua
  131. }
  132. public void OnSDKLogout(string result)
  133. {
  134. AddResult(result);
  135. //抛事件到lua
  136. }
  137. public void OnSDKPay(string result)
  138. {
  139. AddResult(result);
  140. }
  141. public void OnSDKLoginGame(string result)
  142. {
  143. AddResult(result);
  144. }
  145. public void OnSDKCreateRole(string result)
  146. {
  147. AddResult(result);
  148. }
  149. #endregion
  150. #region 测试
  151. public static bool bIsTest = false;
  152. string m_showText = " ";
  153. private void OnGUI()
  154. {
  155. if (!bIsTest) return;
  156. if (GUI.Button(new Rect(100, 0, 100, 100), "SDK登录"))
  157. {
  158. m_showText = "SDK登录";
  159. SDKManager.Instance.SDKLogin();
  160. }
  161. if (GUI.Button(new Rect(200, 0, 100, 100), "SDK登出"))
  162. {
  163. m_showText = "SDK登出";
  164. SDKManager.Instance.SDKLogout();
  165. }
  166. GUI.TextField(new Rect(0, 100, 300, 200), m_showText);
  167. }
  168. private void AddResult(string result)
  169. {
  170. if (!bIsTest) return;
  171. if (!string.IsNullOrEmpty(result))
  172. m_showText = result;
  173. }
  174. #endregion
  175. }

SDK父类

  1. public class SDKBase
  2. {
  3. protected int platformId = 0;
  4. private string uid = "";
  5. public SDKBase() { }
  6. public virtual void Init() { }
  7. public virtual void Login() { }
  8. public virtual void Logout() { }
  9. public virtual void Pay() { }
  10. public virtual void LoginGame(string uid, string sid) {}
  11. public virtual void CreateRole(string uid, string sid, string roleId, string roleName) { }
  12. public void SetPlatformId(string platformIdStr)
  13. {
  14. if (string.IsNullOrEmpty(platformIdStr) || !IsNumber(platformIdStr)) return;
  15. platformId = int.Parse(platformIdStr);
  16. }
  17. public int GetPlatformId()
  18. {
  19. return (int)platformId;
  20. }
  21. public bool CheckIsInitSDK()
  22. {
  23. return platformId != 0;
  24. }
  25. public string GetUid()
  26. {
  27. return uid;
  28. }
  29. public void SetUid(string uid)
  30. {
  31. this.uid = uid;
  32. }
  33. public bool IsNumber(string value)
  34. {
  35. string pattern = @"^\d*$";
  36. return Regex.IsMatch(value, pattern);
  37. }
  38. }

 

SDK安卓

 

  1. public class SDKForAndroid : SDKBase
  2. {
  3. private AndroidJavaObject jc;
  4. AndroidJavaObject jo;
  5. public SDKForAndroid():base()
  6. {
  7. AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  8. jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  9. }
  10. private void Call(string funcName, params object[] args)
  11. {
  12. try
  13. {
  14. if(jo != null)
  15. jo.Call(funcName, args);
  16. }
  17. catch (System.Exception e)
  18. {
  19. Debug.LogWarning(e.Message);
  20. }
  21. }
  22. public override void Init()
  23. {
  24. Call("SDKInit");
  25. }
  26. public override void Login()
  27. {
  28. if (!CheckIsInitSDK()) return;
  29. switch(platformId)
  30. {
  31. case 0:
  32. break;
  33. default:
  34. Call("SDKLogin");
  35. break;
  36. }
  37. }
  38. public override void Logout()
  39. {
  40. if (!CheckIsInitSDK()) return;
  41. switch (platformId)
  42. {
  43. case 0:
  44. break;
  45. default:
  46. Call("SDKLogout");
  47. break;
  48. }
  49. }
  50. public override void Pay()
  51. {
  52. if (!CheckIsInitSDK()) return;
  53. switch (platformId)
  54. {
  55. case 0:
  56. break;
  57. default:
  58. Call("SDKPay");
  59. break;
  60. }
  61. }
  62. public override void LoginGame(string uid, string sid)
  63. {
  64. if (!CheckIsInitSDK()) return;
  65. switch (platformId)
  66. {
  67. case 0:
  68. break;
  69. default:
  70. Call("SDKLoginGame", uid, sid);
  71. break;
  72. }
  73. }
  74. public override void CreateRole(string uid, string sid, string roleId, string roleName)
  75. {
  76. if (!CheckIsInitSDK()) return;
  77. switch (platformId)
  78. {
  79. case 0:
  80. break;
  81. default:
  82. Call("SDKCreateRole", uid, sid, roleId, roleName);
  83. break;
  84. }
  85. }
  86. }

SDKios

  1. public class SDKForIphone : SDKBase
  2. {
  3. [DllImport("__Internal")]
  4. private static extern void SDKInit();
  5. [DllImport("__Internal")]
  6. private static extern void SDKLogin();
  7. [DllImport("__Internal")]
  8. private static extern void SDKLogout();
  9. public override void Init()
  10.         {
  11. SDKInit();
  12. }
  13. public override void Login()
  14. {
  15. if (!CheckIsInitSDK()) return;
  16. switch(platformId)
  17. {
  18. case 0:
  19. break;
  20. default:
  21. SDKLogin();
  22. break;
  23. }
  24. }
  25. public override void Logout()
  26. {
  27. if (!CheckIsInitSDK()) return;
  28. switch (platformId)
  29. {
  30. case 0:
  31. break;
  32. default:
  33. SDKLogout();
  34. break;
  35. }
  36. }
  37. public override void Pay()
  38. {
  39. if (!CheckIsInitSDK()) return;
  40. switch (platformId)
  41. {
  42. case 0:
  43. break;
  44. default:
  45. break;
  46. }
  47. }
  48. public override void LoginGame(string uid, string sid)
  49. {
  50. if (!CheckIsInitSDK()) return;
  51. switch (platformId)
  52. {
  53. case 0:
  54. break;
  55. default:
  56. break;
  57. }
  58. }
  59. public override void CreateRole(string uid, string sid, string roleId, string roleName)
  60. {
  61. if (!CheckIsInitSDK()) return;
  62. switch (platformId)
  63. {
  64. case 0:
  65. break;
  66. default:
  67. break;
  68. }
  69. }
  70. }

第2种方式:

    新建一个Android library工程,按照平台给的SDK文档配置AndroidManifest.xml,然后添加SDK的aar或者jar库到libs目录下,不要忘了去Unity安装目录找到classes.jar,放入libs目录下,然后配置gradle。

    接着就开始写SDK代码,这个网上一大堆就不多说了。写完之后直接生成aar库,直接导入到Unity就可以用了。

 

第3种方式:

    Unity导出aar包,首先Unity导出gradle工程(Android studio),用Android studio打开。

    一、build.gradle配置

    1.将apply plugin: 'com.android.application'改为apply plugin: 'com.android.library'。

    2.去掉applicationId。

  3.修改gradle版本,将classpath 'com.android.tools.build:gradle:2.1.0'改成classpath 'com.android.tools.build:gradle:3.0.1'

 

    二、修改AndroidManifest.xml

    去掉 intent-filter 标签。

    三、编译会报Java heap space错误(重要

    

    Unity官网说是Unity打包会减少方法应用,但是和导出Android工程的实现是不一样的,因此用Android studio打包,你有可能会遇到java heap space报错,这个地方坑了我一天,后面找到了解决方法:

 

    修改gradle.properties,将org.gradle.jvmargs改成org.gradle.jvmargs=-Xmx5120m-XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

    四、生成aar包

    点击(Android studio)右边gradle按钮,选择build下的assembleRelease运行。

    五、使用aar包

    1.将aar包导入到新工程中,不要忘记导入SDK,继续配置gradle,在repositories中添加flatDir {dirs 'libs'},不然不能读取aar包。

    2.修改applicationId,改成与Unity工程一致。

    3.在dependencies中添加依赖,前面Unity工程生成的aar和sdk。

    4.继续配置AndroidManifest.xml,跟Unity工程布局一样,不然会强退。

    5.修改appname

    接下来就还是写SDK代码。

    细节就不多说,网上有很多,主要是一些比较坑的地方记下来,防止以后继续掉坑里。

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

闽ICP备14008679号