赞
踩
最近又接了一次平台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管理类:
- public class SDKManager : MonoBehaviour
- {
- #region 单例
- private static SDKManager _instance;
- public static SDKManager Instance
- {
- set { _instance = value; }
- get { return _instance; }
- }
- #endregion
-
- private SDKBase sdk;
-
- #region sdk 参数
- public int GetPlatformId()
- {
- if (sdk != null)
- {
- AddResult("GetPlatformId: " + sdk.GetPlatformId() + "---");
- return sdk.GetPlatformId();
- }
-
-
- return 0;
- }
-
- public string GetUID()
- {
- if (sdk != null)
- {
- AddResult("GetUID: " + sdk.GetUid() + "---");
- return sdk.GetUid();
- }
-
-
- return "";
- }
- #endregion
-
- private void Awake()
- {
- _instance = this;
- }
-
- private void Start()
- {
- #if UNITY_EDITOR
- sdk = new SDKBase();
- #elif UNITY_ANDROID
- sdk = new SDKForAndroid();
- #elif UNITY_IPHONE
- sdk = new SDKForIphone();
- #endif
- SDKInit();
- }
-
- /// <summary>
- /// SDK初始化
- /// </summary>
- public void SDKInit()
- {
- if (sdk == null) return;
-
- AddResult("SDKInit");
-
- sdk.Init();
- }
-
- /// <summary>
- /// SDK登录
- /// </summary>
- public void SDKLogin()
- {
- if (sdk == null) return;
-
- AddResult("SDKLogin");
-
- sdk.Login();
- }
-
- /// <summary>
- /// SDK登出
- /// </summary>
- public void SDKLogout()
- {
- if (sdk == null) return;
-
- AddResult("SDKLogout");
-
- sdk.Logout();
- }
-
- /// <summary>
- /// SDK付费
- /// </summary>
- public void SDKPay()
- {
- if (sdk == null) return;
-
- AddResult("SDKPay");
-
- sdk.Pay();
- }
-
- /// <summary>
- /// SDK登录游戏服务器
- /// </summary>
- /// <param name="uid">登录后用户id,由登录传给游戏的用户id</param>
- /// <param name="sid">游戏区服id</param>
- public void SDKLoginGame(string uid, string sid)
- {
- if (sdk == null) return;
-
- AddResult("SDKLoginGame");
-
- sdk.LoginGame(uid, sid);
- }
-
- /// <summary>
- /// SDK创建角色
- /// </summary>
- /// <param name="uid">登录后用户id,由登录传给游戏的用户id</param>
- /// <param name="sid">游戏区服id</param>
- /// <param name="roleId">游戏角色id</param>
- /// <param name="roleName">游戏角色名</param>
- public void SDKCreateRole(string uid, string sid, string roleId, string roleName)
- {
- if (sdk == null) return;
-
- AddResult("SDKCreateRole");
-
- sdk.CreateRole(uid, sid, roleId, roleName);
- }
-
- #region SDK事件回调
- /// <summary>
- /// result = platformId
- /// </summary>
- /// <param name="result"></param>
- public void OnSDKInit(string result)
- {
- AddResult(result);
-
- sdk.SetPlatformId(result);
- }
-
- /// <summary>
- /// result = bIsSuccess + uid + nickName
- /// </summary>
- /// <param name="result"></param>
- public void OnSDKLogin(string result)
- {
- AddResult(result);
-
- string[] strs = result.Split('|');
- if(strs.Length > 1)
- {
- string uid = strs[1];
- sdk.SetUid(uid);
- }
-
- //抛事件到lua
- }
-
- public void OnSDKLogout(string result)
- {
- AddResult(result);
-
- //抛事件到lua
- }
-
- public void OnSDKPay(string result)
- {
- AddResult(result);
-
- }
-
- public void OnSDKLoginGame(string result)
- {
- AddResult(result);
-
- }
-
- public void OnSDKCreateRole(string result)
- {
- AddResult(result);
-
- }
- #endregion
-
- #region 测试
- public static bool bIsTest = false;
- string m_showText = " ";
-
- private void OnGUI()
- {
- if (!bIsTest) return;
-
- if (GUI.Button(new Rect(100, 0, 100, 100), "SDK登录"))
- {
- m_showText = "SDK登录";
- SDKManager.Instance.SDKLogin();
- }
-
- if (GUI.Button(new Rect(200, 0, 100, 100), "SDK登出"))
- {
- m_showText = "SDK登出";
- SDKManager.Instance.SDKLogout();
- }
-
- GUI.TextField(new Rect(0, 100, 300, 200), m_showText);
- }
-
- private void AddResult(string result)
- {
- if (!bIsTest) return;
- if (!string.IsNullOrEmpty(result))
- m_showText = result;
- }
- #endregion
- }

SDK父类
- public class SDKBase
- {
- protected int platformId = 0;
- private string uid = "";
-
- public SDKBase() { }
-
- public virtual void Init() { }
-
- public virtual void Login() { }
-
- public virtual void Logout() { }
-
- public virtual void Pay() { }
-
- public virtual void LoginGame(string uid, string sid) {}
-
- public virtual void CreateRole(string uid, string sid, string roleId, string roleName) { }
-
- public void SetPlatformId(string platformIdStr)
- {
- if (string.IsNullOrEmpty(platformIdStr) || !IsNumber(platformIdStr)) return;
-
- platformId = int.Parse(platformIdStr);
- }
-
- public int GetPlatformId()
- {
- return (int)platformId;
- }
-
- public bool CheckIsInitSDK()
- {
- return platformId != 0;
- }
-
- public string GetUid()
- {
- return uid;
- }
-
- public void SetUid(string uid)
- {
- this.uid = uid;
- }
-
- public bool IsNumber(string value)
- {
- string pattern = @"^\d*$";
- return Regex.IsMatch(value, pattern);
- }
- }

SDK安卓
- public class SDKForAndroid : SDKBase
- {
- private AndroidJavaObject jc;
- AndroidJavaObject jo;
- public SDKForAndroid():base()
- {
- AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
- jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
- }
-
- private void Call(string funcName, params object[] args)
- {
- try
- {
- if(jo != null)
- jo.Call(funcName, args);
- }
- catch (System.Exception e)
- {
- Debug.LogWarning(e.Message);
- }
- }
-
- public override void Init()
- {
- Call("SDKInit");
- }
-
- public override void Login()
- {
- if (!CheckIsInitSDK()) return;
-
- switch(platformId)
- {
- case 0:
- break;
- default:
- Call("SDKLogin");
- break;
- }
- }
-
- public override void Logout()
- {
- if (!CheckIsInitSDK()) return;
-
- switch (platformId)
- {
- case 0:
- break;
- default:
- Call("SDKLogout");
- break;
- }
- }
-
- public override void Pay()
- {
- if (!CheckIsInitSDK()) return;
-
- switch (platformId)
- {
- case 0:
- break;
- default:
- Call("SDKPay");
- break;
- }
- }
-
- public override void LoginGame(string uid, string sid)
- {
- if (!CheckIsInitSDK()) return;
-
- switch (platformId)
- {
- case 0:
- break;
- default:
- Call("SDKLoginGame", uid, sid);
- break;
- }
- }
-
- public override void CreateRole(string uid, string sid, string roleId, string roleName)
- {
- if (!CheckIsInitSDK()) return;
-
- switch (platformId)
- {
- case 0:
- break;
- default:
- Call("SDKCreateRole", uid, sid, roleId, roleName);
- break;
- }
- }
- }

SDKios
- public class SDKForIphone : SDKBase
- {
- [DllImport("__Internal")]
- private static extern void SDKInit();
-
- [DllImport("__Internal")]
- private static extern void SDKLogin();
-
- [DllImport("__Internal")]
- private static extern void SDKLogout();
-
- public override void Init()
- {
- SDKInit();
- }
-
- public override void Login()
- {
- if (!CheckIsInitSDK()) return;
-
- switch(platformId)
- {
- case 0:
- break;
- default:
- SDKLogin();
- break;
- }
- }
-
- public override void Logout()
- {
- if (!CheckIsInitSDK()) return;
-
- switch (platformId)
- {
- case 0:
- break;
- default:
- SDKLogout();
- break;
- }
- }
-
- public override void Pay()
- {
- if (!CheckIsInitSDK()) return;
-
- switch (platformId)
- {
- case 0:
- break;
- default:
- break;
- }
- }
-
- public override void LoginGame(string uid, string sid)
- {
- if (!CheckIsInitSDK()) return;
-
- switch (platformId)
- {
- case 0:
- break;
- default:
- break;
- }
- }
-
- public override void CreateRole(string uid, string sid, string roleId, string roleName)
- {
- if (!CheckIsInitSDK()) return;
-
- switch (platformId)
- {
- case 0:
- break;
- default:
- break;
- }
- }
- }

第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代码。
细节就不多说,网上有很多,主要是一些比较坑的地方记下来,防止以后继续掉坑里。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。