Unity 第三方SDK框架接入 (Android Studio)一 Unity

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"
        );
    }
}

基本上算是完成了,只需要在项目需要调用的地方调用相关的接口。也可以以这个为基础,以后的项目中,直接导入使用。
下载工程链接

发布了37 篇原创文章 · 获赞 11 · 访问量 6176

猜你喜欢

转载自blog.csdn.net/weixin_42422809/article/details/90202682