using System; using UnityEngine; using System.Collections; using System.Collections.Generic; using Newtonsoft.Json; using UnityEngine.SceneManagement; using Cinemachine; using UnityEngine.UI; using TMPro; /* 使用login token进行登录和数据读取保存 * TestDataInjection 是测试用的假数据注入 * LoginTokenCheck 验证login token是否有效,和服务器比对 * 比较版本是否可以符合游戏可以允许最低版本 * 弹出用户注册窗口 */ public class LoginController : MonoBehaviour { // Start is called once before the first execution of Update after the MonoBehaviour is created private GameObject canvasPlaceholder, regCanvas, createAdoptCanvas, loginCanvas; public static LoginController instance; // 用于在其他脚本中调用LoginController的函数 private void Awake() { // 确保loginController在Awake阶段被正确赋值 if (instance == null) { instance = this; } } void Start() { canvasPlaceholder = GameObject.Find("Canvas Placeholder"); regCanvas = canvasPlaceholder.transform.Find("Register Canvas").gameObject; createAdoptCanvas = canvasPlaceholder.transform.Find("Create Or Adopt Canvas").gameObject; loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject; StartCoroutine(PingServer()); // 判断是否要切换到注册狗的子场景 if (GameData.subScene == "Login_InitDog") { SwitchToInitDogScene(); GameData.subScene = null; } else { //启动自动采用Login Token 登录。其他登录方式为手动登录。 StartCoroutine(LoginTokenRequest()); } } // Update is called once per frame //void Update() //{ //} // 检测是否可以ping到服务器 IEnumerator PingServer() { Uri uri = new Uri(EnviromentSetting.serverIP); var ping = new Ping(uri.Host); float pingStartTime = Time.time; while (!ping.isDone) { yield return null; } if (ping.time == -1) { Debug.LogError("Ping失败"); string textValue = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "network_error", EnviromentSetting.languageCode }); MessageBoxController.ShowMessage(textValue, ShutDown); } } // LoginToken登录方法 IEnumerator LoginTokenRequest() { Debug.Log("LoginToken Request start"); string UUID = SystemInfo.deviceUniqueIdentifier; // 这里需要考虑这段代码执行在Enviroment Controller之前 string LoginToken = PlayerPrefs.GetString("LoginToken", null); string LoginTokenTime = PlayerPrefs.GetString("LoginTokenTime", null); // 比较LoginTokenTime 如果超时直接放弃后面代码。比较UUID是否是null如果是直接放弃后面代码 if (LoginToken == null) { yield break; } ; if (LoginTokenTime == null) { yield break; } ; DateTime tokenTime; DateTime now = DateTime.Now; if (DateTime.TryParse(LoginTokenTime, out tokenTime)) { TimeSpan span = now - tokenTime; if (span.TotalHours > 7 * 24) { yield break; } } else { yield break; } // 提交POST string url = "/api/login/token/"; WWWForm form = new(); form.AddField("login_token", LoginToken); form.AddField("UUID", UUID); StartCoroutine(WebController.PostRequest(url, form, callback: LoginTokenCallback)); } // Post之后callback的函数 void LoginTokenCallback(string json) { LoginSucessHandler(json); if (UserProperty.userId != null && EnviromentSetting.accessToken != null) { // 启动获取用户信息请求 GetUserData(); } else { Debug.Log("LoginTokenCallback 登陆失败"); Debug.Log(json); } } void LoginSucessHandler(string json) { var data = JsonConvert.DeserializeObject>(json); if (data != null && data["status"] == "success") { Debug.Log("Login Token sucess!"); PlayerPrefs.SetString("LoginToken", data["login_token"]); PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString()); EnviromentSetting.accessToken = data["access_token"]; EnviromentSetting.accessTokenReceivedTime = DateTime.Now; UserProperty.userId = data["user_id"]; // 比较游戏版本 // TODO 等后台更改后删除 //string allowed_client_ver = data["allowed_client_ver"]; string allowed_client_ver = "0.1"; string current_ver = EnviromentSetting.version; Version curVer = new Version(current_ver); Version allowVer = new Version(allowed_client_ver); int verCompare = curVer.CompareTo(allowVer); if (verCompare < 0) { // 弹窗,然后退出 string err_msg; if (EnviromentSetting.platform == "IPhonePlayer") { err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_IOS", EnviromentSetting.languageCode }); } else if (EnviromentSetting.platform == "Android") { if (EnviromentSetting.languageCode == "zh-cn") // 安卓中文环境 { err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Andriod_CN", EnviromentSetting.languageCode }); } else { // 安卓其他语言 err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Andriod_WW", EnviromentSetting.languageCode }); } } else { // 不明操作系统 err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Generic", EnviromentSetting.languageCode }); } MessageBoxController.ShowMessage(err_msg, ShutDown); } } else { Debug.Log("Login Token fail!"); Debug.Log(json); } } // 当版本检查不符合游戏时退出游戏 public void ShutDown() { Application.Quit(); } public void GetUserData() { Debug.Log("GetUserData request"); // 提交POST string url = "/api/user/info/"; WWWForm form = new(); form.AddField("user_id", UserProperty.userId); StartCoroutine(WebController.PostRequest(url, form, callback: GetUserDataCallback)); } void GetUserDataCallback(string json) { var data = JsonConvert.DeserializeObject>(json); if (data != null && data["status"].ToString() == "success") { var user_info = data["user_info"].ToString(); UserProperty.RefreshUserInfo(user_info); var user_info_dict = JsonConvert.DeserializeObject>(user_info); // todo 将用户运行环境保存到设定中 // EnviromentSetting.runEnv = user_info_dict["runEnv"].ToString(); // 保存狗的数据 string dogsJson = data["dogs"].ToString(); UserProperty.RefreshDogInfo(dogsJson); // 保存道具数据 UserProperty.RefreshUserItems(data["props"].ToString()); // 判断用户狗的数量,如果为0就跳转用户创建狗。 if (UserProperty.dogs.Count < 1) { SwitchToInitDogScene(); } // 如果非注册用户,提示用户注册 else if (!UserProperty.isRegUser) { // 如果没有提醒过 if (!GameData.hasRemindedRegister) { GameData.hasRemindedRegister = true; var canvasPlaceholder = GameObject.Find("Canvas Placeholder"); var loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject; loginCanvas.SetActive(false); string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "reg_reminder", EnviromentSetting.languageCode }); //MessageBoxController.YorN_Message(msg, ()=> regCanvas.SetActive(true), ()=> SceneManager.LoadScene("Home")); MessageBoxController.YorN_Message(msg, () => regCanvas.SetActive(true), () => MaskTransitions.TransitionManager.Instance.LoadLevel("Home")); } else { MaskTransitions.TransitionManager.Instance.LoadLevel("Home"); } } else { ShowStartGameUI(); } } else { Debug.Log(data["message"]); } } void ShowStartGameUI() { var uiPlaceholder = GameObject.Find("Canvas Placeholder"); if (uiPlaceholder != null) { var startGameUI = uiPlaceholder.transform.Find("Start Game Canvas").gameObject; startGameUI.SetActive(true); var loginCanvas = uiPlaceholder.transform.Find("Login Canvas").gameObject; loginCanvas.SetActive(false); } } // Quick Start 登录方式,用UUID换取Login Token public void QuickStart() { Debug.Log("Quick start post request."); string url = "/api/game/quick_start/"; Dictionary formData = new(); WWWForm form = new(); form.AddField("UUID", EnviromentSetting.UUID); StartCoroutine(WebController.PostRequest(url, form, callback: QuickStartCallback)); } void QuickStartCallback(string json) { var data = JsonConvert.DeserializeObject>(json); if (data != null && data["status"] == "success") { PlayerPrefs.SetString("LoginToken", data["login_token"]); PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString()); UserProperty.userId = data["user_id"]; StartCoroutine(LoginTokenRequest()); } else { string errMsg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "login_fail", EnviromentSetting.languageCode }); MessageBoxController.ShowMessage(errMsg); } } public void ResetPassword() { var uiPlaceholder = GameObject.Find("Canvas Placeholder"); if (uiPlaceholder != null) { var resetUI = uiPlaceholder.transform.Find("Reset Pasword").gameObject; var loginCanvas = uiPlaceholder.transform.Find("Login Canvas").gameObject; resetUI.SetActive(true); loginCanvas.SetActive(false); } } // 切换到生成狗的子场景 void SwitchToInitDogScene() { createAdoptCanvas.SetActive(true); loginCanvas.SetActive(false); regCanvas.SetActive(false); var loginCam = GameObject.Find("V Cam Login").GetComponent(); var initDogCam = GameObject.Find("V Cam Init Dog").GetComponent(); loginCam.Priority = 0; initDogCam.Priority = 10; } // 使用账户密码登录方法 public void Login() { string account = GameObject.Find("Account input").GetComponent().text; string password = GameObject.Find("Password input").GetComponent().text; string url = "/api/login/"; Dictionary formData = new(); WWWForm form = new(); form.AddField("client_language", EnviromentSetting.languageCode); if (EnviromentSetting.languageCode == "zh-cn") { form.AddField("mobile_number", account.Trim()); } else { form.AddField("email", account.Trim()); } form.AddField("password", password.Trim()); StartCoroutine(WebController.PostRequest(url, form, callback: LoginCallback)); } void LoginCallback(string json) { var data = JsonConvert.DeserializeObject>(json); if (data != null && data["status"].ToString() == "success") { LoginSucessHandler(json); if (UserProperty.userId != null && EnviromentSetting.accessToken != null) { // 启动获取用户信息请求 GetUserData(); } else { Debug.Log("LoginTokenCallback 登陆失败"); Debug.Log(json); } } else { string errMsg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "login_fail", EnviromentSetting.languageCode }); MessageBoxController.ShowMessage(errMsg); } } }