最近又接了一次平台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 private static SDKManager _instance; public static SDKManager Instance set { _instance = value; } get { return _instance; } public int GetPlatformId() AddResult("GetPlatformId: " + sdk.GetPlatformId() + "---"); return sdk.GetPlatformId(); AddResult("GetUID: " + sdk.GetUid() + "---"); sdk = new SDKForAndroid(); sdk = new SDKForIphone(); /// <param name="uid">登录后用户id,由登录传给游戏的用户id</param> /// <param name="sid">游戏区服id</param> public void SDKLoginGame(string uid, string sid) AddResult("SDKLoginGame"); /// <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) AddResult("SDKCreateRole"); sdk.CreateRole(uid, sid, roleId, roleName); /// <param name="result"></param> public void OnSDKInit(string result) sdk.SetPlatformId(result); /// result = bIsSuccess + uid + nickName /// <param name="result"></param> public void OnSDKLogin(string result) string[] strs = result.Split('|'); public void OnSDKLogout(string result) public void OnSDKPay(string result) public void OnSDKLoginGame(string result) public void OnSDKCreateRole(string result) public static bool bIsTest = false; if (GUI.Button(new Rect(100, 0, 100, 100), "SDK登录")) SDKManager.Instance.SDKLogin(); if (GUI.Button(new Rect(200, 0, 100, 100), "SDK登出")) SDKManager.Instance.SDKLogout(); GUI.TextField(new Rect(0, 100, 300, 200), m_showText); private void AddResult(string result) if (!string.IsNullOrEmpty(result))
SDK父类
protected int platformId = 0; 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() public bool CheckIsInitSDK() public void SetUid(string uid) public bool IsNumber(string value) string pattern = @"^\d*$"; return Regex.IsMatch(value, pattern);
SDK安卓
public class SDKForAndroid : SDKBase private AndroidJavaObject jc; public SDKForAndroid():base() AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); private void Call(string funcName, params object[] args) catch (System.Exception e) Debug.LogWarning(e.Message); public override void Init() public override void Login() if (!CheckIsInitSDK()) return; public override void Logout() if (!CheckIsInitSDK()) return; public override void Pay() if (!CheckIsInitSDK()) return; public override void LoginGame(string uid, string sid) if (!CheckIsInitSDK()) return; Call("SDKLoginGame", uid, sid); public override void CreateRole(string uid, string sid, string roleId, string roleName) if (!CheckIsInitSDK()) return; Call("SDKCreateRole", uid, sid, roleId, roleName);
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() public override void Login() if (!CheckIsInitSDK()) return; public override void Logout() if (!CheckIsInitSDK()) return; public override void Pay() if (!CheckIsInitSDK()) return; public override void LoginGame(string uid, string sid) if (!CheckIsInitSDK()) return; public override void CreateRole(string uid, string sid, string roleId, string roleName) if (!CheckIsInitSDK()) return;
第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代码。
细节就不多说,网上有很多,主要是一些比较坑的地方记下来,防止以后继续掉坑里。
|