|
最近又接了一次平臺SDK,順帶著也學(xué)習(xí)了接IOS的SDK。IOS的也是邊做邊學(xué)的,現(xiàn)在還沒這么清楚,就不講了。還是來說下安卓SDK的接法,因為平臺需求,我用了2種方式來接平臺SDK。隨便總結(jié)下,方便以后查閱。3種方式是我目前知道的,我不清楚是否還有其他接法。個人認為第一種和第三種是比較麻煩的。
1.Unity導(dǎo)出Andorid工程,再導(dǎo)入SDK庫,開始寫SDK代碼,然后就可以打APK。這個比較簡單粗暴,就不多說了。
2.SDK生產(chǎn)aar包,作為插件導(dǎo)入Unity,然后Unity生成APK,這個方式比較好,也是我剛開始采用的,基于此,還寫了個一鍵打包方法。
3.Unity導(dǎo)出aar包,作為插件導(dǎo)入Android工程,開始寫SDK代碼,然后就可以打APK。其實這跟第一種方法類似,但由于平臺要弄聚合SDK,我們這安卓SDK代碼不需要自己寫,由平臺方寫,所以后續(xù)采用了這種方式。
先上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">游戲區(qū)服id</param> public void SDKLoginGame(string uid, string sid) AddResult("SDKLoginGame"); /// <param name="uid">登錄后用戶id,由登錄傳給游戲的用戶id</param> /// <param name="sid">游戲區(qū)服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代碼,這個網(wǎng)上一大堆就不多說了。寫完之后直接生成aar庫,直接導(dǎo)入到Unity就可以用了。
第3種方式:
Unity導(dǎo)出aar包,首先Unity導(dǎo)出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 標(biāo)簽。
三、編譯會報Java heap space錯誤(重要)

Unity官網(wǎng)說是Unity打包會減少方法應(yīng)用,但是和導(dǎo)出Android工程的實現(xiàn)是不一樣的,因此用Android studio打包,你有可能會遇到j(luò)ava 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包導(dǎo)入到新工程中,不要忘記導(dǎo)入SDK,繼續(xù)配置gradle,在repositories中添加flatDir {dirs 'libs'},不然不能讀取aar包。
2.修改applicationId,改成與Unity工程一致。
3.在dependencies中添加依賴,前面Unity工程生成的aar和sdk。
4.繼續(xù)配置AndroidManifest.xml,跟Unity工程布局一樣,不然會強退。

5.修改appname
接下來就還是寫SDK代碼。
細節(jié)就不多說,網(wǎng)上有很多,主要是一些比較坑的地方記下來,防止以后繼續(xù)掉坑里。
|