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 · 訪問量 9150
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章