331 lines
8.4 KiB
C#
331 lines
8.4 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支付完成
|
||
} |