通常,游戲開發(fā)商并不會只在一個渠道上線他們的游戲,接入越多的渠道,代表著可能獲取越多的用戶,但同時也代表著越多的接入SDK工作量、工期和費用。一款游戲要有足夠的用戶,甚至需要接入30家以上的各種渠道,以保障自己的市場覆蓋率。
單個SDK接入流程在一位有經(jīng)驗的全職客戶端程序、一位全職服務端程序員、一位全職QA處理的情況下,需要3天時間才能完成。因此當一款產品面對30個甚至更多不同需求的渠道SDK時,人員成本和時間成本就會急劇增加。
所以我們需要一個通用接口,來處理各種渠道的需求,這就是統(tǒng)一渠道SDK接入框架。
下載地址:https://github.com/typesdk/TypeSdkClient
將TypeSDKLibrary文件夾整個添加到Unity工程中,注意結構需要與截圖統(tǒng)一。建議游戲中與當前導入的腳本命名沖突的文件,需要由開發(fā)者自行修改沖突的類名
添加后的目錄結構如下所示
SDK普通接入邏輯示意圖
1.1在調用其它API前需先調用初始化接口對SDK進行初始化。
1.2在完成初始化接口調用后方可調用登錄接口,登錄成功選擇角色進入游戲后需要調用提交用戶信息接口。
1.3登錄成功后如果需要切換賬號,需調用登出接口。
1.4對于有依賴于登錄用戶的接口,如支付,提交用戶信息接口,需要調用獲取用戶信息接口拿到相關數(shù)據(jù),如user_id….
1.5在游戲退出時需要調用退出接口。
SDK的接入需要接入程序員實現(xiàn)接口的調用和回調函數(shù)的響應兩個部分邏輯
a. 回調函數(shù)的響應主要通過設置監(jiān)聽來實現(xiàn),具體請看第二節(jié)(回調函數(shù)的處理)
回調偵聽的事件類型 | 事件說明 |
TypeEventType.EVENT_INIT_FINISH | SDK初始化完畢 |
TypeEventType.EVENT_LOGIN_SUCCESS | 登錄成功回調 |
TypeEventType.EVENT_PAY_RESULT | 支付結果回調 |
TypeEventType.EVENT_LOGOU | 登出完畢回調 |
TypeEventType.EVENT_RELOGIN | 重新登錄成功回調 |
TypeEventType.EVENT_CANCEL_EXIT_GAME | 取消殺應用回調 |
b. 接口的調用主要為以下的接口調用,將會下后面詳細講解每個接口的調用
接口列表
函數(shù)名稱 | 功能說明 |
InitSDK | SDK初始化 |
Login | 顯示登錄界面 |
Logout | 執(zhí)行渠道登出,清理渠道用戶緩存 |
PayItem | 顯示支付界面 |
ShowPersonCenter | 顯示用戶中心(如果渠道支持) |
ExitGame | 大退游戲(等于殺進程) |
IsHasRequest | 判斷渠道是否支持某功能(例如:用戶中心) |
UpdatePlayerInfo | 提交用戶信息到渠道(渠道要求在進入游戲后調用) |
typesdkbaselib中已經(jīng)提供了預先注冊完畢所有回調偵聽的cs文件:U3DTypeEventListener.cs接入方需要在U3DTypeEventListener監(jiān)聽類中,根據(jù)不同回調事件實現(xiàn)相應的游戲邏輯。
也可以根據(jù)自己需要,在游戲內合適的地方,參考demo自行注冊相關的函數(shù)偵聽。
注:接入方只能修改以下方法實現(xiàn)相應的邏輯,U3DTypeEventListener類中其它代碼段建議不要更改,以免影響功能。
部分需要界面響應的監(jiān)聽,請判斷當時場景,避免造成游戲邏輯混亂。如,在PVP時檢測到用戶切換賬號。
//初始化完成后回調函數(shù) void NotifyInitFinish(U3DTypeEvent evt) { //游戲需要等待此回調才允許調用登錄接口。 } //登錄操作完成后的回調函數(shù) void NotifyLogin(U3DTypeEvent evt){ //解析渠道登錄成功返回的信息,一般有user_token,user_id... //此時返回的結果不能作為登錄依據(jù),需要進過服務端驗證,取的服務器返回的最終數(shù)據(jù)。 //CP方需要將信息解析為CP服務器約定的數(shù)據(jù)格式轉發(fā)給游戲服務器,并由游戲服務器轉發(fā)至TypeSDK Server以完成游戲的登錄驗證 string userId = evt.evtData.GetData(U3DTypeAttName.USER_ID); } //更新渠道更新檢測完成后回調 void NotifyUpdateFinish(U3DTypeEvent evt){ //建議等待此更新完成后,再進行游戲的更新邏輯,否則會造成渠道更新和游戲自身更新沖突。 } //支付結果通知回調,CP需根據(jù)支付返回結果完成相應邏輯,此處為客戶端返回結果,不可作為支付到賬依據(jù),游戲需等待TypeSDK Server的支付成功回調。 void NotifyPayResult(U3DTypeEvent evt){ if (evt.evtData.GetData(U3DTypeAttName.PAY_RESULT).Equals("1")) { //支付完成,可嘗試延遲刷新賬戶余額信息。 Debug.Log("pay finished:" + evt.evtData.GetData(U3DTypeAttName.PAY_RESULT_DATA)); } else {//支付失敗,或取消。 Debug.Log("pay failed:" + evt.evtData.GetData(U3DTypeAttName.PAY_RESULT_REASON)); } } //登出結果通知回調,說明用戶已經(jīng)做了退出賬戶操作,需要返回登錄界面,并重新調用登錄 void NotifyLogout(U3DTypeEvent evt){ } //重登錄結果通知回調,用戶在渠道SDK進行用戶切換操作,需要切換到新賬號界面。 void NotifyRelogin(U3DTypeEvent evt){ } //取消退出游戲通知回調,把退出游戲邏輯說明一下。 void NotifyCancelExit(U3DTypeEvent evt){ }
sdk用到的數(shù)據(jù)類型 都繼承于U3DTypeBaseData,相關使用示例如下:
3.1創(chuàng)建U3DTypeBaseData對象
U3DTypeBaseData baseData = new U3DTypeBaseData();
3.2設置一條屬性
函數(shù)名 | public void SetData(string attName,string attValue) | |
參數(shù)列表 | string attName, | U3DTypeAttName中定義的字段 |
string attValue | 目前支持int,string,boolean 三種類型基本數(shù)據(jù) | |
返回值 | Void |
示例:
//(鍵名使用U3DTypeAttName定義的字段) baseData.SetData(“鍵名”,”值”);
3.3獲得一個string類型的屬性 attname為標識
函數(shù)名 | public string GetData(string attName) | |
參數(shù)列表 | string attName, | U3DTypeAttName中定義的字段 |
返回值 | String | 指定key值的string類型value |
3.4獲得一個int類型的屬性 attname為標識
函數(shù)名 | public int GetInt (string attName) | |
參數(shù)列表 | string attName, | U3DTypeAttName中定義的字段 |
返回值 | Int | 指定key值的int類型value |
3.5獲得一個bool類型的屬性 attname為標識
函數(shù)名
函數(shù)名 | public bool GetBool(string attName) | |
參數(shù)列表 | string attName, | U3DTypeAttName中定義的字段 |
返回值 | Bool | 指定key值的boolean類型value |
使用例子:
//新建一個對象 U3DTypeBaseData egData = new U3DTypeBaseData (); //給該對象賦值 egData.SetData (U3DTypeAttName.APP_KEY, "123456789"); //讀取一個string類型數(shù)據(jù)readStr = "123456789 string readStr = egData.GetData (U3DTypeAttName.APP_KEY); //讀取一個int類型數(shù)據(jù)readInt int readInt = egData.GetInt(U3DTypeAttName.APP_KEY); = 123456789
響應消息傳遞的消息類型
public class U3DTypeEvent
函數(shù)名 | public bool GetBool(string attName) | |
成員變量列表 | public TypeEventType evtType | 該事件的類型(枚舉) |
public U3DTypeBaseData evtData | 該事件所包含的數(shù)據(jù)(可以通過上述函數(shù)獲取相關數(shù)據(jù)) |
事件對象例子
void LoginResult(U3DTypeEvent evt) { U3DTypeBaseData data = evt.evtData; string userID = data.GetData(U3DTypeAttName.USER_ID); string userToken = data.GetData(U3DTypeAttName.USER_TOKEN); }
函數(shù)名 | public void InitSDK() |
說明 | sdk的初始化接口,再調用其他sdk功能前,請務必先執(zhí)行該接口,所有渠道都要求在應用啟動開始就調用此接口。 |
調用例子
U3DTypeSDK.Instance.InitSDK();
(2)登錄
函數(shù)名 | public void Login () |
說明 | 顯示登錄界面,若登錄成功則會發(fā)送TypeEventType.EVENT_LOGIN_SUCCESS消息。請在登錄界面自動執(zhí)行調用,不要出現(xiàn)需要點擊按鈕才顯示的情況。 當用戶登錄失敗時需要,再次調用此接口。 |
調用例子
U3DTypeSDK.Instance.Login();
函數(shù)名 | public void UpdatePlayerInfo () |
說明 | 在有些指定事件,需要設置用戶相關信息并且提交。登錄完成進入游戲、用戶升級、建角。 |
調用例子
U3DTypeSDK.Instance.UpdatePlayerInfo()
當用戶成功完全登錄進入游戲后,需要設置用戶相關信息并且提交
該函數(shù)的所有內容,不能使用SDK客戶端本地緩存的數(shù)據(jù),建議從服務端獲得
需要設置的屬性如下,當沒有該屬性時,請傳空字符串
string ROLE_TYPE = “create_role”;//角色統(tǒng)計信息類型即調用時機,(createRole:創(chuàng)建角色,levelUp:角色升級,enterGame:選定角色進入游戲)(不能為空) string SAVED_BALANCE = “0”;//當前角色余額(RMB購買的游戲幣),默認為0 string USER_NAME = "user_name"; //用戶名 string USER_TOKEN = "user_token"; //用戶渠道驗證用token string USER_ID = "user_id"; //用戶id string USER_HEAD_ID = "user_head_id"; //用戶頭像id string USER_HEAD_URL = "user_head_url"; //用戶頭像url string VIP_LEVEL = “vip_level”;//VIP等級,沒有傳0 string PARTY_NAME = “party_name”;//工會名稱,如:天下第一 string ROLE_ID = "role_id"; //角色id string ROLE_NAME = "role_name"; //角色名字 string ROLE_LEVEL = "role_level"; //角色等級 string ROLE_CREATE_TIME = “role_create_time”;//角色創(chuàng)建時間,一定要服務器時間(單位/秒) string ROLE_LEVELUP_TIME = “role_levelup_time”;//角色升級時間(單位/秒) string ZONE_ID = "zone_id"; //所在大區(qū)id string ZONE_NAME= "zone_name"; //所在大區(qū)名稱 string SEVER_ID = "server_id"; //所在服務器id string SERVER_NAME = “server_name”;//所在服務器名稱 string EXTRA ="extra";
參數(shù)值 | 說明 |
"0" | 進入游戲主場景(即正式登錄游戲) |
"1" | 創(chuàng)建新角色 |
"2" | 角色升級 |
設置方法示例:
U3DTypeSDK.Instance.GetUserData().SetData(U3DTypeAttName.USER_ID, "123"); U3DTypeSDK.Instance.GetUserData().SetData(U3DTypeAttName.EXTRA, "1"); U3DTypeSDK.Instance.UpdatePlayerInfo();
(4)支付
函數(shù)名 | public string PayItem (U3DTypeBaseData _in_pay); |
說明 | 在獲取服務器訂單號,并在TypeSDK Server服務器提交訂單信息后,調用此接口啟動渠道的支付界面,進行支付行為 |
調用例子
U3DTypeSDK.Instance.PayItem (U3DTypeBaseData _in_pay);
其中U3DTypeBaseData中
U3DTypeBaseData userData = U3DTypeSDK.Instance.GetUserData();
必填參數(shù)為:
//用戶ID,渠道返回,沒有填空 payData.SetData(U3DTypeAttName.USER_ID,userData.GetData(U3DTypeAttName.USER_ID)); //用戶token,登錄驗簽完成后由游戲服務端返回,沒有填空 payData.SetData(U3DTypeAttName.USER_TOKEN,userData.GetData(U3DTypeAttName.USER_TOKEN)); //商品支付價格(單位:分) payData.SetData(U3DTypeAttName.REAL_PRICE,”100"); //商品名稱 payData.SetData(U3DTypeAttName.ITEM_NAME,"sk bi”); //商品數(shù)量 payData.SetData(U3DTypeAttName.ITEM_COUNT,”1"); //所在服務器id(如果沒有填“0”) payData.SetData(U3DTypeAttName.SERVER_ID,”1”); //所在服務器名字(如果沒有填“server_name”) payData.SetData(U3DTypeAttName.SERVER_NAME,”安卓一區(qū)”); //所在大區(qū)id(如果沒有填“0”),注意應用寶要求:賬戶分區(qū)ID_角色ID。每個應用都有一個分區(qū)ID為1的默認分區(qū),分區(qū)可以在cpay.qq.com/mpay上自助配置。如果應用選擇支持角色,則角色ID接在分區(qū)ID號后用"_"連接,角色ID需要進行urlencode。payData.SetData(U3DTypeAttName.ZONE_ID,”1”); //所在大區(qū)名字(如果沒有填“server_name”) payData.SetData(U3DTypeAttName.ZONE_NAME,”華北一區(qū)”); //內部訂單號(必須填寫,并保證多區(qū)情況下,訂單號唯一) payData.SetData(U3DTypeAttName.BILL_NUMBER,”NO_123456”); //商品id(需和TypeSDK Server商品列表保持一致) payData.SetData(U3DTypeAttName.ITEM_SEVER_ID,”id”); //傳遞的額外參數(shù)(建議傳入需要用來做訂單標識的信息) payData.SetData(U3DTypeAttName.EXTRA,”extra"); //商品描述 payData.SetData(U3DTypeAttName.ITEM_DESC,”desc”); //玩家在游戲中的角色ID payData.SetData(U3DTypeAttName.ROLE_ID,”role_1234”); //玩家在游戲中的角色名字 payData.SetData(U3DTypeAttName.ROLE_NAME,”玩家編號001”);
當支付行為在客戶端完成后,會接到回調消息:EVENT_PAY_RESULT
其中event的使用類似 login
event中data的參數(shù)包括以下內容
PAY_RESULT//支付結果(1/0/2)成功/失敗(除取消)/支付取消 //說明:客戶端收到“失敗或支付取消”狀態(tài),建議客戶端可以使用戶直接發(fā)起下筆充值。 PAY_RESULT_REASON//支付結果的原因(失敗原因) PAY_RESULT_DATA
(5)登出
函數(shù)名 | public void Logout (); |
說明 | 調用渠道的登出邏輯,不會有界面顯示,但是會把渠道賬戶注銷,需要由cp自行回到登錄界面 |
調用例子:
U3DTypeSDK.Instance.Logout()
登出成功則會發(fā)送 TypeEventType.EVENT_LOGOUT消息,發(fā)送的參數(shù)U3DTypeBaseData數(shù)據(jù)
函數(shù)名 | public void ExitGame (); |
說明 | 調用渠道退出應用程序邏輯,執(zhí)行成功,則會關閉應用 |
U3DTypeSDK.Instance.ExitGame();
整個游戲的退出行為 ,建議交給sdk處理,并且添加 退出行為取消響應事件偵聽TypeEventType.EVENT_CANCEL_EXIT_GAME 的函數(shù)
當退出成功后 由sdk執(zhí)行系統(tǒng)的退出,當退出取消后,則會發(fā)送 取消退出事件,接入方需完成相應的邏輯。
U3DTypeSDK.Instance.GetPlatformData()
包括以下內容:
CHANNEL_ID//渠道的id(由SDK組定義 和ConfigSever上的channel id統(tǒng)一) SDK_NAME//渠道標記 CP_ID
以上參數(shù) 在CPSeting.txt中填寫(接入方無需關心)
顯示渠道用戶中心
U3DTypeSDK.Instance.ShowPersonCenter()
隱藏用戶中心
U3DTypeSDK.Instance.HidePersonCenter()
在調用這2個函數(shù)之前 需要先執(zhí)行IsHasRequest(U3DTypeAttName.SUPPORT_PERSON_CENTER)函數(shù) 用以判定 是否需要支持該函數(shù)。
當支持時 這2個函數(shù)才會起效,并且需要在游戲內,需要有相應的圖形入口,
當不支持時,這2個函數(shù)不會生效,游戲內頁不需要相應的圖形入口。
使用示例:
if(IsHasRequest(U3DTypeAttName.SUPPORT_PERSON_CENTER)){ U3DTypeSDK.Instance.ShowPersonCenter();
或
U3DTypeSDK.Instance.HidePersonCenter(); pushData.DataToString(_json_data); U3DSDK.instance.SendMessage(“receive_local_notify”,pushData); }
U3DTypeSDK.Instance.IsHasRequest(“support_exit_window”)
更多建議: