using System.Collections.Generic;
using Games.Events;
using GCGame.Table;
using UnityEngine;
using XLua;
/// sdk管理器
[LuaCallCSharp]
public class SdkControl : MonoBehaviour
{
private const string _sdkControlName = "SdkControl";
//属性
/// 唯一实例
private static SdkControl _instance;
/// sdk的接口元件
private SdkBase _sdkItem;
public LoginData.ServerListData currentServerData { get; private set; }
///
/// 表格版本
///
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();
// 不要试图改这个为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判定指令
///
/// Sdk登录是否完成
///
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);
}
///
/// 手机震动
///
public void ShakeDevice()
{
_sdkItem.ShakeDevice();
}
///
/// 登录Php服务器
///
public void LoginPhp(LoginData.ServerListData serverData)
{
currentServerData = serverData;
_sdkItem.LoginPhp(serverData.m_id);
}
///
/// 从Php服务器获得游戏服列表
///
public void GetServerList()
{
_sdkItem.GetServerList();
}
///
/// Sdk内部使用的服务器列表回调
/// SdkItem组合好不同类型的服务器情况,然后推送给Control
///
public void PostServerList(List serverList)
{
EventDispatcher.Instance.Dispatch(EventId.ServerListCallback, serverList);
}
public void SubmitLoadData(LoadDataType action)
{
_sdkItem.SubmitLoadData(action);
}
///
/// 向Sdk发送玩家数据
///
public void SubmitData(RoleDataSubmit submitType)
{
// 注:不同Sdk要的数据不一样
// 所以Sdk内存处理这些问题
_sdkItem.SubmitData(submitType);
}
///
/// 唤起Sdk登录操作
///
public void LoginSdk(bool isAuto)
{
_sdkItem.LoginSdk(isAuto);
}
///
/// 唤起Sdk退出游戏进程
///
public void CloseGame()
{
_sdkItem.CloseGame();
}
public void Payment(int goodsId)
{
_sdkItem.Payment(goodsId);
}
#endregion
#region Sdk输入指令
///
/// Sdk接收到手机退出键
/// 仅仅在Sdk自身无法处理时,试图唤起游戏内的退出窗口
///
public void StartCloseGame(string args)
{
// 如果Sdk不包含退出窗口,则使用游戏本身的功能
var dicStr = StrDictionary.GetClientDictionaryString("#{4933}");
MessageBoxLogic.OpenOKCancelBox(dicStr, "", CloseGame,
() => { });
}
///
/// Sdk登录完成回调
///
public void LoginComplete(string args)
{
var success = _sdkItem.LoginComplete(args);
EventDispatcher.Instance.Dispatch(EventId.SdkCallback, new SdkEventData(SdkEventType.LoginSdk, success, args));
}
///
/// Sdk登出账号完成回调
///
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));
}
///
/// Sdk支付完成回调
///
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支付完成
}