Unity 第三方SDK框架接入 (Android Studio)一 Unity
在上一篇中,我實現Android項目的實現,現在我們來完善Unity端的封裝
IPlatformSdkHelper 接口
public interface IPlatformSdkHelper
{
/// <summary>
/// 通知 SDK 初始化
/// </summary>
void Init();
/// <summary>
/// 執行特殊命令,如執行自更新指令
/// </summary>
/// <param name="command">指令</param>
/// <param name="arg0">參數</param>
bool Exec(string command, string arg0);
/// <summary>
/// 執行特殊命令,如執行自更新指令
/// </summary>
/// <param name="command">指令</param>
bool Exec(string command);
/// <summary>
/// 通知 SDK 啓動登錄界面
/// </summary>
void Login();
/// <summary>
/// 通知 SDK 用戶註銷
/// </summary>
void Logout();
/// <summary>
/// 通知 SDK 應用退出
/// </summary>
void Exit();
/// <summary>
/// 嘗試遊戲客戶端自升級
/// </summary>
bool TryAppUpgrade(string downloadUrl);
/// <summary>
/// 獲取配置信息
/// </summary>
string GetConfig(string key);
/// <summary>
/// 顯示懸浮求
/// </summary>
void ShowToolBar();
/// <summary>
/// 關閉懸浮求
/// </summary>
void HideToolBar();
/// <summary>
/// 判斷當前渠道是否有用戶中心功能
/// </summary>
bool HasUserCenter();
/// <summary>
/// 進入用戶中心
/// </summary>
void EnterUserCenter();
/// <summary>
/// 判斷當前渠道是否有客服中心功能
/// </summary>
bool HasCustomerCenter();
/// <summary>
/// 進入客服中心
/// </summary>
void EnterCustomerCenter();
/// <summary>
/// 判斷當前渠道是否有論壇功能
/// </summary>
bool HasForum();
/// <summary>
/// 進入論壇
/// </summary>
void EnterForum();
/// <summary>
/// 玩家創建角色時調用
/// </summary>
/// <param name="roleInfo"></param>
void ReportRoleCreated(GameRoleInfo roleInfo);
/// <summary>
/// 玩家選擇角色,併成功登錄遊戲後調用
/// </summary>
void ReportRoleLogin();
/// <summary>
/// 玩家角色等級變化時調用
/// </summary>
void ReportRoleUpgrade();
/// <summary>
/// 玩家退出遊戲時調用
/// </summary>
void ReportRoleLogout();
/// <summary>
/// 發起購買
/// </summary>
/// <param name="order">訂單信息</param>
void Pay(OrderInfo order);
/// <summary>
/// 報告支付結果
/// </summary>
/// <param name="order"></param>
void ReportPaymentResult(OrderInfo order);
}
public class GameRoleInfo
{
public int Id = 1000;
public string Name = "xxx004";
public byte Gender = 2;
public int Level = 99;
public int Power = 9999;
public int ProfessionId = 240;
public string Profession = "Unity";
public int ServerId = 1;
public string ServerName = "unityServer";
public int UnionId = 10;
public string UnionName = "Union";
public int UnionMemberId = 10;
public string UnionMemberName = "MemberName";
public string FriendId = "12_12_12_41";
public int VipLevel = 10;
public float VipExp = 240000;
public long DiamondCount = 12222;
public long GoldCoins = 10000;
public long LoginAt { get; set; }
public long LogoutAt { get; set; }
public long CreatedAt { get; set; }
public string ServerToken { get; set; }
public string SdkAppId { get; set; }
public string SdkName { get; set; }
public string SdkChannel { get; set; }
public string SdkUID { get; set; }
public string SdkUName { get; set; }
public string SdkToken { get; set; }
}
public class OrderInfo
{
/// <summary>
/// 訂單對應的商品
/// </summary>
public GoodsInfo Goods;
/// <summary>
/// 是否首次購買此商品
/// </summary>
public bool isFirstPaymentOfGoods;
/// <summary>
/// 廠商訂單
/// </summary>
public string cpOrderId;
/// <summary>
/// 訂單回調地址
/// </summary>
public string callbackUrl;
/// <summary>
/// 與渠道對接時的透傳參數
/// </summary>
public string extraParams;
/// <summary>
/// 交易結束後後設置,用於統計報告
/// </summary>
public bool success;
/// <summary>
/// 交易結束後設置,訂單獲得額外代幣
/// </summary>
public int rewardCount;
}
public class GoodsInfo
{
/// <summary>
/// 商品編號
/// </summary>
public string Id;
/// <summary>
/// 商品代幣名稱,如“鑽石”
/// </summary>
public string Name;
/// <summary>
/// 商品代幣數量
/// </summary>
public int count;
/// <summary>
/// 首衝獎勵
/// </summary>
public int firstRewardCount;
/// <summary>
/// 首衝之後,每次購買的額外獎勵
/// </summary>
public int rewardCount;
/// <summary>
/// 商品描述,用於在UI顯示
/// </summary>
public string description;
/// <summary>
/// 商品量詞,如“個”
/// </summary>
public string quantifier;
/// <summary>
/// 貨幣名稱,如"USD"
/// </summary>
public string currency;
/// <summary>
/// 單價
/// </summary>
public double price;
}
PlatformSdkHelper
PlatformSdkHelper 實現 IPlatformSdkHelper 接口,這裏是和Android交互的場所,所有的和Android相關的接口都寫着在這裏。方面項目管理。也是符合設計模式的單一職責。
using System;
using UnityEngine;
public class PlatformSdkHelper : IPlatformSdkHelper
{
private static PlatformSdkHelper singleton;
public static PlatformSdkHelper Singleton
{
get
{
if (singleton == null)
{
singleton = new PlatformSdkHelper();
}
return singleton;
}
}
private AndroidJavaObject GetAndroidJavaObject()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
return jc.GetStatic<AndroidJavaObject>("currentActivity");
}
private AndroidJavaObject sdk
{
get { return _sdk ?? (_sdk = GetAndroidJavaObject()); }
}
private AndroidJavaObject _sdk;
public void ShowToolBar()
{
sdk.Call("requestShowToolBar");
}
public void HideToolBar()
{
sdk.Call("requestHideToolBar");
}
public bool HasUserCenter()
{
return sdk.Call<bool>("requestHasUserCenter");
}
public void EnterUserCenter()
{
sdk.Call("requestEnterUserCenter");
}
public bool HasCustomerCenter()
{
return sdk.Call<bool>("requestHasCustomerCenter");
}
public void EnterCustomerCenter()
{
sdk.Call("requestEnterCustomerCenter");
}
public bool HasForum()
{
return sdk.Call<bool>("requestHasForum");
}
public void EnterForum()
{
sdk.Call("requestEnterForum");
}
public void Init()
{
sdk.Call("requestInit");
}
public bool Exec(string command, string arg0)
{
return sdk.Call<bool>("requestCommand", command, arg0);
}
public bool Exec(string command)
{
return Exec(command, "");
}
public void Login()
{
sdk.Call("requestLogin");
}
public void Logout()
{
sdk.Call("requestLogout");
}
public void Exit()
{
sdk.Call("requestExit");
}
public string GetConfig(string key)
{
return sdk.Call<string>("requestConfig", key);
}
public bool TryAppUpgrade(string downloadUrl)
{
return sdk.Call<bool>("requestUpgrade", downloadUrl);
}
public void ReportRoleCreated(GameRoleInfo roleInfo)
{
ReportRoleInfo("register", roleInfo);
}
public void ReportRoleLogin()
{
ReportRoleInfo("login");
}
public void ReportRoleUpgrade()
{
ReportRoleInfo("upgrade");
}
public void ReportRoleLogout()
{
ReportRoleInfo("logout");
}
private void ReportRoleInfo(string reason, GameRoleInfo roleInfo)
{
GameRoleInfo role = new GameRoleInfo();
sdk.Call("reportRoleInfo", reason,
role.Id.ToString(),
role.Name,
role.Level.ToString(),
role.Gender.ToString(),
role.Power.ToString(),
role.CreatedAt.ToString(),
role.LoginAt.ToString(),
role.LogoutAt.ToString(),
role.ProfessionId.ToString(),
role.Profession,
role.ServerId.ToString(),
role.ServerName,
role.UnionId.ToString(),
role.UnionName,
role.UnionMemberId.ToString(),
role.UnionMemberName,
role.FriendId,
role.VipLevel.ToString(),
role.VipExp.ToString("0.00"),
role.DiamondCount.ToString(),
role.GoldCoins.ToString()
);
}
private void ReportRoleInfo(string reason)
{
ReportRoleInfo(reason, null);
}
public void Pay(OrderInfo order)
{
ReportRoleInfo("payment");
sdk.Call("requestPay",
order.Goods.Id,
order.Goods.Name,
order.Goods.count.ToString(),
order.Goods.firstRewardCount.ToString(),
order.Goods.rewardCount.ToString(),
order.Goods.quantifier.ToString(),
order.Goods.currency,
order.Goods.price.ToString("0.00"),
order.isFirstPaymentOfGoods ? "1" : "0",
order.cpOrderId,
order.callbackUrl,
order.extraParams
);
}
public void ReportPaymentResult(OrderInfo order)
{
sdk.Call("reportPaymentResult",
order.Goods.Id,
order.Goods.Name,
order.Goods.count.ToString(),
order.Goods.firstRewardCount.ToString(),
order.Goods.rewardCount.ToString(),
order.Goods.quantifier.ToString(),
order.Goods.currency,
order.Goods.price.ToString("0.00"),
order.isFirstPaymentOfGoods ? "1" : "0",
order.rewardCount.ToString(),
order.success ? "1" : "0"
);
}
}
基本上算是完成了,只需要在項目需要調用的地方調用相關的接口。也可以以這個爲基礎,以後的項目中,直接導入使用。
下載工程鏈接