最近又接了一次平台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代码。
细节就不多说,网上有很多,主要是一些比较坑的地方记下来,防止以后继续掉坑里。