using System; using UnityEngine; using UnityEngine.Networking; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using Newtonsoft.Json; using UnityEngine.SceneManagement; using UnityEditor; using Cinemachine; /* 使用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, initDogCanvas, loginCanvas; void Start() { //启动自动采用Login Token 登录。其他登录方式为手动登录。 StartCoroutine(LoginTokenPost()); canvasPlaceholder = GameObject.Find("Canvas Placeholder"); regCanvas = canvasPlaceholder.transform.Find("Register Canvas").gameObject; initDogCanvas = canvasPlaceholder.transform.Find("Init Dog Canvas").gameObject; loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject; // 判断是否要切换到注册狗的子场景 if ( GameData.subScene == "Login_InitDog") { SwitchToInitDogScene(); GameData.subScene = null; } } // Update is called once per frame //void Update() //{ //} // LoginToken登录方法 IEnumerator LoginTokenPost() { //yield return null; // 跳过第一帧(可以考虑去掉,数据加载已经移到awake()了。 string UUID = SystemInfo.deviceUniqueIdentifier; // 这里需要考虑这段代码执行在Enviroment Controller之前 string LoginToken = PlayerPrefs.GetString("LoginToken", null); string LoginTokenTime = PlayerPrefs.GetString("LoginTokenTime", null); // todo 比较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) { var data = JsonConvert.DeserializeObject>(json); if (data != null && data["status"] == "success") { 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 用user id 获取用户数据并保存 } if (UserProperty.userId != null && EnviromentSetting.accessToken != null) { // 判断用户狗的数量,如果为0就跳转用户创建狗。 if (UserProperty.dogs.Count < 1) { SwitchToInitDogScene(); } else { SceneManager.LoadScene("Home"); } } } // Quick Start 登录方式,用UUID换取Login Token public void QuickStart() { 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"]); UserProperty.userId = data["user_id"]; StartCoroutine(LoginTokenPost()); } } // 切换到生成狗的子场景 void SwitchToInitDogScene() { initDogCanvas.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; } }