在上一篇中,我实现Android项目的实现,现在我们来完善Unity端的封装
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 实现 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"
);
}
}
基本上算是完成了,只需要在项目需要调用的地方调用相关的接口。也可以以这个为基础,以后的项目中,直接导入使用。
下载工程链接