331 lines
8.3 KiB
C#
331 lines
8.3 KiB
C#
|
using System.Collections.Generic;
|
|||
|
using Games.Events;
|
|||
|
using GCGame.Table;
|
|||
|
using UnityEngine;
|
|||
|
using XLua;
|
|||
|
|
|||
|
/// <summary>sdk管理器</summary>
|
|||
|
[LuaCallCSharp]
|
|||
|
public class SdkControl : MonoBehaviour
|
|||
|
{
|
|||
|
private const string _sdkControlName = "SdkControl";
|
|||
|
|
|||
|
//属性
|
|||
|
/// <summary>唯一实例</summary>
|
|||
|
private static SdkControl _instance;
|
|||
|
|
|||
|
/// <summary>sdk的接口元件</summary>
|
|||
|
private SdkBase _sdkItem;
|
|||
|
|
|||
|
public LoginData.ServerListData currentServerData { get; private set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 表格版本
|
|||
|
/// </summary>
|
|||
|
public string TableVariant
|
|||
|
{
|
|||
|
get { return _sdkItem.tableVariant; }
|
|||
|
}
|
|||
|
|
|||
|
public bool useGm
|
|||
|
{
|
|||
|
get { return _sdkItem.useGm; }
|
|||
|
}
|
|||
|
|
|||
|
public static SdkControl instance
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_instance == null && !appQuit)
|
|||
|
{
|
|||
|
var go = new GameObject(_sdkControlName);
|
|||
|
DontDestroyOnLoad(go);
|
|||
|
_instance = go.AddComponent<SdkControl>();
|
|||
|
// 不要试图改这个为var,会判定成SDKForAndroid,导致赋值SDKBase编译不通过。
|
|||
|
// ReSharper disable once SuggestVarOrType_SimpleTypes
|
|||
|
// ReSharper disable once IdentifierTypo
|
|||
|
SdkBase sdkItem = //new SdkEmpty();
|
|||
|
#if UNITY_EDITOR
|
|||
|
new SdkEditor();
|
|||
|
#elif UNITY_ANDROID
|
|||
|
SdkAndroidBase.CreateSdkLink();
|
|||
|
#elif UNITY_IOS || UNITY_IPHONE
|
|||
|
SdkIosBase.CreateSdkLink();
|
|||
|
#else
|
|||
|
new SdkEmpty();
|
|||
|
#endif
|
|||
|
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
|||
|
if (sdkItem == null)
|
|||
|
{
|
|||
|
// ReSharper disable once HeuristicUnreachableCode
|
|||
|
sdkItem = new SdkEmpty();
|
|||
|
Debug.LogError("SdkItem fell to SdkEmpty!");
|
|||
|
}
|
|||
|
|
|||
|
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
|||
|
// 注:使用宏进行判定,在非Editor环境需要处理Sdk初始化失败的问题
|
|||
|
var success = sdkItem != null;
|
|||
|
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
|||
|
if (success)
|
|||
|
_instance._sdkItem = sdkItem;
|
|||
|
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
|||
|
EventDispatcher.Instance.Dispatch(EventId.SdkCallback,
|
|||
|
new SdkEventData(SdkEventType.SdkInit, success, string.Empty));
|
|||
|
}
|
|||
|
|
|||
|
return _instance;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static bool appQuit { get; private set; }
|
|||
|
|
|||
|
public int GetDefaultServer()
|
|||
|
{
|
|||
|
return _sdkItem.defaultServer;
|
|||
|
}
|
|||
|
|
|||
|
private void OnDestroy()
|
|||
|
{
|
|||
|
if (_sdkItem != null && !appQuit)
|
|||
|
{
|
|||
|
_sdkItem.Dispose();
|
|||
|
_sdkItem = null;
|
|||
|
}
|
|||
|
|
|||
|
_instance = null;
|
|||
|
}
|
|||
|
|
|||
|
private void OnApplicationQuit()
|
|||
|
{
|
|||
|
appQuit = true;
|
|||
|
}
|
|||
|
|
|||
|
#region Unity判定指令
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Sdk登录是否完成
|
|||
|
/// </summary>
|
|||
|
public bool IsSdkLogin()
|
|||
|
{
|
|||
|
return _sdkItem.IsLogin();
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region SdkItem输入指令
|
|||
|
|
|||
|
public void LoginPhpComplete(string ip, int port)
|
|||
|
{
|
|||
|
var success = port >= 0;
|
|||
|
var data = new SdkPhpLoginResult(success, ip, port);
|
|||
|
EventDispatcher.Instance.Dispatch(EventId.SdkPhpLogin, data);
|
|||
|
}
|
|||
|
|
|||
|
public void NoticeComplete(string title, string description, bool willOpen)
|
|||
|
{
|
|||
|
var success = !string.IsNullOrEmpty(title);
|
|||
|
var data = new SdkNoticeData(success, title, description, willOpen);
|
|||
|
EventDispatcher.Instance.Dispatch(EventId.NoticeCallback, data);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Unity输入指令
|
|||
|
|
|||
|
public void Logout()
|
|||
|
{
|
|||
|
_sdkItem.Logout();
|
|||
|
}
|
|||
|
|
|||
|
public void SwitchAccount()
|
|||
|
{
|
|||
|
_sdkItem.SwitchAccount();
|
|||
|
}
|
|||
|
|
|||
|
public void GetNotice(bool alwaysOpen)
|
|||
|
{
|
|||
|
_sdkItem.Notice(alwaysOpen);
|
|||
|
}
|
|||
|
|
|||
|
public void RedemptionCode(string code)
|
|||
|
{
|
|||
|
_sdkItem.RedemptionCode(code);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 手机震动
|
|||
|
/// </summary>
|
|||
|
public void ShakeDevice()
|
|||
|
{
|
|||
|
_sdkItem.ShakeDevice();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 登录Php服务器
|
|||
|
/// </summary>
|
|||
|
public void LoginPhp(LoginData.ServerListData serverData)
|
|||
|
{
|
|||
|
currentServerData = serverData;
|
|||
|
_sdkItem.LoginPhp(serverData.m_id);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 从Php服务器获得游戏服列表
|
|||
|
/// </summary>
|
|||
|
public void GetServerList()
|
|||
|
{
|
|||
|
_sdkItem.GetServerList();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Sdk内部使用的服务器列表回调
|
|||
|
/// SdkItem组合好不同类型的服务器情况,然后推送给Control
|
|||
|
/// </summary>
|
|||
|
public void PostServerList(List<LoginData.ServerPageData> serverList)
|
|||
|
{
|
|||
|
EventDispatcher.Instance.Dispatch(EventId.ServerListCallback, serverList);
|
|||
|
}
|
|||
|
|
|||
|
public void SubmitLoadData(LoadDataType action)
|
|||
|
{
|
|||
|
_sdkItem.SubmitLoadData(action);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 向Sdk发送玩家数据
|
|||
|
/// </summary>
|
|||
|
public void SubmitData(RoleDataSubmit submitType)
|
|||
|
{
|
|||
|
// 注:不同Sdk要的数据不一样
|
|||
|
// 所以Sdk内存处理这些问题
|
|||
|
_sdkItem.SubmitData(submitType);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 唤起Sdk登录操作
|
|||
|
/// </summary>
|
|||
|
public void LoginSdk(bool isAuto)
|
|||
|
{
|
|||
|
_sdkItem.LoginSdk(isAuto);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 唤起Sdk退出游戏进程
|
|||
|
/// </summary>
|
|||
|
public void CloseGame()
|
|||
|
{
|
|||
|
_sdkItem.CloseGame();
|
|||
|
}
|
|||
|
|
|||
|
public void Payment(int goodsId)
|
|||
|
{
|
|||
|
_sdkItem.Payment(goodsId);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Sdk输入指令
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Sdk接收到手机退出键
|
|||
|
/// 仅仅在Sdk自身无法处理时,试图唤起游戏内的退出窗口
|
|||
|
/// </summary>
|
|||
|
public void StartCloseGame(string args)
|
|||
|
{
|
|||
|
// 如果Sdk不包含退出窗口,则使用游戏本身的功能
|
|||
|
var dicStr = StrDictionary.GetClientDictionaryString("#{4933}");
|
|||
|
MessageBoxLogic.OpenOKCancelBox(dicStr, "", CloseGame,
|
|||
|
() => { });
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Sdk登录完成回调
|
|||
|
/// </summary>
|
|||
|
public void LoginComplete(string args)
|
|||
|
{
|
|||
|
var success = _sdkItem.LoginComplete(args);
|
|||
|
EventDispatcher.Instance.Dispatch(EventId.SdkCallback, new SdkEventData(SdkEventType.LoginSdk, success, args));
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Sdk登出账号完成回调
|
|||
|
/// </summary>
|
|||
|
public void LogoutComplete(string args)
|
|||
|
{
|
|||
|
var success = _sdkItem.LogOutComplete(args);
|
|||
|
if (success)
|
|||
|
LoginData.accountData = null;
|
|||
|
EventDispatcher.Instance.Dispatch(EventId.SdkCallback, new SdkEventData(SdkEventType.Logout, success, args));
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Sdk支付完成回调
|
|||
|
/// </summary>
|
|||
|
public void PaymentComplete(string args)
|
|||
|
{
|
|||
|
var success = _sdkItem.PaymentComplete(args);
|
|||
|
EventDispatcher.Instance.Dispatch(EventId.SdkCallback, new SdkEventData(SdkEventType.Payment, success, args));
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
|
|||
|
public class SdkPhpLoginResult
|
|||
|
{
|
|||
|
public readonly string ip;
|
|||
|
public readonly int port;
|
|||
|
public readonly bool success;
|
|||
|
|
|||
|
public SdkPhpLoginResult(bool success, string ip, int port)
|
|||
|
{
|
|||
|
this.success = success;
|
|||
|
this.ip = ip;
|
|||
|
this.port = port;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class SdkNoticeData
|
|||
|
{
|
|||
|
public readonly string content;
|
|||
|
public readonly bool success;
|
|||
|
public readonly string title;
|
|||
|
public readonly bool willOpen;
|
|||
|
|
|||
|
public SdkNoticeData(bool success, string title, string content, bool willOpen)
|
|||
|
{
|
|||
|
this.success = success;
|
|||
|
this.title = title;
|
|||
|
this.content = content;
|
|||
|
this.willOpen = willOpen;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class SdkEventData
|
|||
|
{
|
|||
|
public readonly string args;
|
|||
|
public readonly bool success;
|
|||
|
public readonly SdkEventType type;
|
|||
|
|
|||
|
public SdkEventData(SdkEventType type, bool success, string args)
|
|||
|
{
|
|||
|
this.success = success;
|
|||
|
this.type = type;
|
|||
|
this.args = args;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public enum RoleDataSubmit
|
|||
|
{
|
|||
|
Create,
|
|||
|
EnterGame,
|
|||
|
LevelUp,
|
|||
|
Other
|
|||
|
}
|
|||
|
|
|||
|
public enum SdkEventType
|
|||
|
{
|
|||
|
SdkInit, // Sdk初始化失败
|
|||
|
LoginSdk, // Sdk登录完成
|
|||
|
Logout, // Sdk登出完成
|
|||
|
Payment // Sdk支付完成
|
|||
|
}
|