一般,遊戲開發商並不會只在一個渠道上線他們的遊戲,接入越多的渠道,表明着可能獲取越多的用戶,但同時也表明着越多的接入SDK工做量、工期和費用。一款遊戲要有足夠的用戶,甚至須要接入30家以上的各類渠道,以保障本身的市場覆蓋率。
單個SDK接入流程在一位有經驗的全職客戶端程序、一位全職服務端程序員、一位全職QA處理的狀況下,須要3天時間才能完成。所以當一款產品面對30個甚至更多不一樣需求的渠道SDK時,人員成本和時間成本就會急劇增長。git
因此咱們須要一個通用接口,來處理各類渠道的需求,這就是統一渠道SDK接入框架。程序員
下載地址:https://github.com/typesdk/TypeSdkClientgithub
將TypeSDKLibrary文件夾整個添加到Unity工程中,注意結構須要與截圖統一。建議遊戲中與當前導入的腳本命名衝突的文件,須要由開發者自行修改衝突的類名json
添加後的目錄結構以下所示緩存
SDK普通接入邏輯示意圖服務器
1.1在調用其它API前需先調用初始化接口對SDK進行初始化。框架
1.2在完成初始化接口調用後方可調用登陸接口,登陸成功選擇角色進入遊戲後須要調用提交用戶信息接口。ide
1.3登陸成功後若是須要切換帳號,需調用登出接口。函數
1.4對於有依賴於登陸用戶的接口,如支付,提交用戶信息接口,須要調用獲取用戶信息接口拿到相關數據,如user_id….url
1.5在遊戲退出時須要調用退出接口。
SDK的接入須要接入程序員實現接口的調用和回調函數的響應兩個部分邏輯
a. 回調函數的響應主要經過設置監聽來實現,具體請看第二節(回調函數的處理)
回調偵聽的事件類型 |
事件說明 |
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. 接口的調用主要爲如下的接口調用,將會下後面詳細講解每一個接口的調用
接口列表
二、回調函數的處理
typesdkbaselib中已經提供了預先註冊完畢全部回調偵聽的cs文件:U3DTypeEventListener.cs接入方須要在U3DTypeEventListener監聽類中,根據不一樣回調事件實現相應的遊戲邏輯。
也能夠根據本身須要,在遊戲內合適的地方,參考demo自行註冊相關的函數偵聽。
注:接入方只能修改如下方法實現相應的邏輯,U3DTypeEventListener類中其它代碼段建議不要更改,以避免影響功能。
部分須要界面響應的監聽,請判斷當時場景,避免形成遊戲邏輯混亂。如,在PVP時檢測到用戶切換帳號。
//初始化完成後回調函數 void NotifyInitFinish(U3DTypeEvent evt) { //遊戲須要等待此回調才容許調用登陸接口。 } //登陸操做完成後的回調函數 void NotifyLogin(U3DTypeEvent evt){ //解析渠道登陸成功返回的信息,通常有user_token,user_id... //此時返回的結果不能做爲登陸依據,須要進過服務端驗證,取的服務器返回的最終數據。 //CP方須要將信息解析爲CP服務器約定的數據格式轉發給遊戲服務器,並由遊戲服務器轉發至TypeSDK Server以完成遊戲的登陸驗證 string userId = evt.evtData.GetData(U3DTypeAttName.USER_ID); } //更新渠道更新檢測完成後回調 void NotifyUpdateFinish(U3DTypeEvent evt){ //建議等待此更新完成後,再進行遊戲的更新邏輯,不然會形成渠道更新和遊戲自身更新衝突。 } //支付結果通知回調,CP需根據支付返回結果完成相應邏輯,此處爲客戶端返回結果,不可做爲支付到帳依據,遊戲需等待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)); } } //登出結果通知回調,說明用戶已經作了退出帳戶操做,須要返回登陸界面,並從新調用登陸 void NotifyLogout(U3DTypeEvent evt){ } //重登陸結果通知回調,用戶在渠道SDK進行用戶切換操做,須要切換到新帳號界面。 void NotifyRelogin(U3DTypeEvent evt){ } //取消退出遊戲通知回調,把退出遊戲邏輯說明一下。 void NotifyCancelExit(U3DTypeEvent evt){ }
sdk用到的數據類型 都繼承於U3DTypeBaseData,相關使用示例以下:
3.1建立U3DTypeBaseData對象
U3DTypeBaseData baseData = new U3DTypeBaseData();
3.2設置一條屬性
函數名 |
public void SetData(string attName,string attValue) |
|
參數列表 |
string attName, |
U3DTypeAttName中定義的字段 |
|
string attValue |
目前支持int,string,boolean 三種類型基本數據 |
返回值 |
Void |
|
示例:
//(鍵名使用U3DTypeAttName定義的字段) baseData.SetData(「鍵名」,」值」);
3.3得到一個string類型的屬性 attname爲標識
函數名 |
public string GetData(string attName) |
|
參數列表 |
string attName, |
U3DTypeAttName中定義的字段 |
返回值 |
String |
指定key值的string類型value |
3.4得到一個int類型的屬性 attname爲標識
函數名 |
public int GetInt (string attName) |
|
參數列表 |
string attName, |
U3DTypeAttName中定義的字段 |
返回值 |
Int |
指定key值的int類型value |
3.5得到一個bool類型的屬性 attname爲標識
函數名
函數名 |
public bool GetBool(string attName) |
|
參數列表 |
string attName, |
U3DTypeAttName中定義的字段 |
返回值 |
Bool |
指定key值的boolean類型value |
使用例子:
//新建一個對象 U3DTypeBaseData egData = new U3DTypeBaseData (); //給該對象賦值 egData.SetData (U3DTypeAttName.APP_KEY, "123456789"); //讀取一個string類型數據readStr = "123456789 string readStr = egData.GetData (U3DTypeAttName.APP_KEY); //讀取一個int類型數據readInt int readInt = egData.GetInt(U3DTypeAttName.APP_KEY); = 123456789
響應消息傳遞的消息類型
public class U3DTypeEvent
函數名 |
public bool GetBool(string attName) |
|
成員變量列表 |
public TypeEventType evtType |
該事件的類型(枚舉) |
|
public U3DTypeBaseData evtData |
該事件所包含的數據(能夠經過上述函數獲取相關數據)
|
事件對象例子
void LoginResult(U3DTypeEvent evt) { U3DTypeBaseData data = evt.evtData; string userID = data.GetData(U3DTypeAttName.USER_ID); string userToken = data.GetData(U3DTypeAttName.USER_TOKEN); }
函數名 |
public void InitSDK() |
說明 |
sdk的初始化接口,再調用其餘sdk功能前,請務必先執行該接口,全部渠道都要求在應用啓動開始就調用此接口。 |
調用例子
U3DTypeSDK.Instance.InitSDK();
函數名 |
public void Login () |
說明 |
顯示登陸界面,若登陸成功則會發送TypeEventType.EVENT_LOGIN_SUCCESS消息。請在登陸界面自動執行調用,不要出現須要點擊按鈕才顯示的狀況。 當用戶登陸失敗時須要,再次調用此接口。 |
調用例子
U3DTypeSDK.Instance.Login();
函數名 |
public void UpdatePlayerInfo () |
說明 |
在有些指定事件,須要設置用戶相關信息而且提交。登陸完成進入遊戲、用戶升級、建角。 |
調用例子
U3DTypeSDK.Instance.UpdatePlayerInfo()
當用戶成功徹底登陸進入遊戲後,須要設置用戶相關信息而且提交
該函數的全部內容,不能使用SDK客戶端本地緩存的數據,建議從服務端得到
須要設置的屬性以下,當沒有該屬性時,請傳空字符串
string ROLE_TYPE = 「create_role」;//角色統計信息類型即調用時機,(createRole:建立角色,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」;//角色建立時間,必定要服務器時間(單位/秒) string ROLE_LEVELUP_TIME = 「role_levelup_time」;//角色升級時間(單位/秒) string ZONE_ID = "zone_id"; //所在大區id string ZONE_NAME= "zone_name"; //所在大區名稱 string SEVER_ID = "server_id"; //所在服務器id string SERVER_NAME = 「server_name」;//所在服務器名稱 string EXTRA ="extra";
參數值 |
說明 |
"0" |
進入遊戲主場景(即正式登陸游戲) |
"1" |
建立新角色 |
"2" |
角色升級 |
設置方法示例:
U3DTypeSDK.Instance.GetUserData().SetData(U3DTypeAttName.USER_ID, "123"); U3DTypeSDK.Instance.GetUserData().SetData(U3DTypeAttName.EXTRA, "1"); U3DTypeSDK.Instance.UpdatePlayerInfo();
函數名 |
public string PayItem (U3DTypeBaseData _in_pay); |
說明 |
在獲取服務器訂單號,並在TypeSDK Server服務器提交訂單信息後,調用此接口啓動渠道的支付界面,進行支付行爲 |
調用例子
U3DTypeSDK.Instance.PayItem (U3DTypeBaseData _in_pay);
其中U3DTypeBaseData中
U3DTypeBaseData userData = U3DTypeSDK.Instance.GetUserData();
必填參數爲:
//用戶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」); //商品數量 payData.SetData(U3DTypeAttName.ITEM_COUNT,」1"); //所在服務器id(若是沒有填「0」) payData.SetData(U3DTypeAttName.SERVER_ID,」1」); //所在服務器名字(若是沒有填「server_name」) payData.SetData(U3DTypeAttName.SERVER_NAME,」安卓一區」); //所在大區id(若是沒有填「0」),注意應用寶要求:帳戶分區ID_角色ID。每一個應用都有一個分區ID爲1的默認分區,分區能夠在cpay.qq.com/mpay上自助配置。若是應用選擇支持角色,則角色ID接在分區ID號後用"_"鏈接,角色ID須要進行urlencode。payData.SetData(U3DTypeAttName.ZONE_ID,」1」); //所在大區名字(若是沒有填「server_name」) payData.SetData(U3DTypeAttName.ZONE_NAME,」華北一區」); //內部訂單號(必須填寫,並保證多區狀況下,訂單號惟一) payData.SetData(U3DTypeAttName.BILL_NUMBER,」NO_123456」); //商品id(需和TypeSDK Server商品列表保持一致) payData.SetData(U3DTypeAttName.ITEM_SEVER_ID,」id」); //傳遞的額外參數(建議傳入須要用來作訂單標識的信息) 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的參數包括如下內容
PAY_RESULT//支付結果(1/0/2)成功/失敗(除取消)/支付取消 //說明:客戶端收到「失敗或支付取消」狀態,建議客戶端可使用戶直接發起下筆充值。 PAY_RESULT_REASON//支付結果的緣由(失敗緣由) PAY_RESULT_DATA
函數名 |
public void Logout (); |
說明 |
調用渠道的登出邏輯,不會有界面顯示,可是會把渠道帳戶註銷,須要由cp自行回到登陸界面 |
調用例子:
U3DTypeSDK.Instance.Logout()
登出成功則會發送 TypeEventType.EVENT_LOGOUT消息,發送的參數U3DTypeBaseData數據
函數名 |
public void ExitGame (); |
說明 |
調用渠道退出應用程序邏輯,執行成功,則會關閉應用 |
U3DTypeSDK.Instance.ExitGame();
整個遊戲的退出行爲 ,建議交給sdk處理,而且添加 退出行爲取消響應事件偵聽TypeEventType.EVENT_CANCEL_EXIT_GAME 的函數
當退出成功後 由sdk執行系統的退出,當退出取消後,則會發送 取消退出事件,接入方需完成相應的邏輯。
U3DTypeSDK.Instance.GetPlatformData()
包括如下內容:
CHANNEL_ID//渠道的id(由SDK組定義 和ConfigSever上的channel id統一) SDK_NAME//渠道標記 CP_ID
以上參數 在CPSeting.txt中填寫(接入方無需關心)
顯示渠道用戶中心
U3DTypeSDK.Instance.ShowPersonCenter()
隱藏用戶中心
U3DTypeSDK.Instance.HidePersonCenter()
在調用這2個函數以前 須要先執行IsHasRequest(U3DTypeAttName.SUPPORT_PERSON_CENTER)函數 用以斷定 是否須要支持該函數。
當支持時 這2個函數纔會起效,而且須要在遊戲內,須要有相應的圖形入口,
當不支持時,這2個函數不會生效,遊戲內頁不須要相應的圖形入口。
使用示例:
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」)
該項目已開源,你們有興趣能夠本身研究或使用接入
項目地址:https://code.csdn.net/typesdk_code
項目地址:https://github.com/typesdk