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支付完成 }