LoginController.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using UnityEngine;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using Newtonsoft.Json;
  6. using UnityEngine.SceneManagement;
  7. using Cinemachine;
  8. /* 使用login token进行登录和数据读取保存
  9. * TestDataInjection 是测试用的假数据注入
  10. * LoginTokenCheck 验证login token是否有效,和服务器比对
  11. */
  12. public class LoginController : MonoBehaviour
  13. {
  14. // Start is called once before the first execution of Update after the MonoBehaviour is created
  15. private GameObject canvasPlaceholder, regCanvas, initDogCanvas, loginCanvas;
  16. void Start()
  17. {
  18. canvasPlaceholder = GameObject.Find("Canvas Placeholder");
  19. regCanvas = canvasPlaceholder.transform.Find("Register Canvas").gameObject;
  20. initDogCanvas = canvasPlaceholder.transform.Find("Init Dog Canvas").gameObject;
  21. loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject;
  22. // 判断是否要切换到注册狗的子场景
  23. if ( GameData.subScene == "Login_InitDog")
  24. {
  25. SwitchToInitDogScene();
  26. GameData.subScene = null;
  27. }
  28. else
  29. {
  30. //启动自动采用Login Token 登录。其他登录方式为手动登录。
  31. StartCoroutine(LoginTokenPost());
  32. }
  33. }
  34. // Update is called once per frame
  35. //void Update()
  36. //{
  37. //}
  38. // LoginToken登录方法
  39. IEnumerator LoginTokenPost()
  40. {
  41. //yield return null; // 跳过第一帧(可以考虑去掉,数据加载已经移到awake()了。
  42. string UUID = SystemInfo.deviceUniqueIdentifier; // 这里需要考虑这段代码执行在Enviroment Controller之前
  43. string LoginToken = PlayerPrefs.GetString("LoginToken", null);
  44. string LoginTokenTime = PlayerPrefs.GetString("LoginTokenTime", null);
  45. // todo 比较LoginTokenTime 如果超时直接放弃后面代码。比较UUID是否是null如果是直接放弃后面代码
  46. if (LoginToken == null) { yield break; };
  47. if (LoginTokenTime == null) { yield break; };
  48. DateTime tokenTime;
  49. DateTime now = DateTime.Now;
  50. if (DateTime.TryParse(LoginTokenTime, out tokenTime))
  51. {
  52. TimeSpan span = now - tokenTime;
  53. if (span.TotalHours > 7 * 24)
  54. {
  55. yield break;
  56. }
  57. }
  58. else { yield break; }
  59. // 提交POST
  60. string url = "/api/login/token/";
  61. WWWForm form = new();
  62. form.AddField("login_token", LoginToken);
  63. form.AddField("UUID", UUID);
  64. StartCoroutine(WebController.PostRequest(url, form, callback:LoginTokenCallback));
  65. }
  66. // Post之后callback的函数
  67. void LoginTokenCallback(string json)
  68. {
  69. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  70. if (data != null && data["status"] == "success") {
  71. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  72. PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString());
  73. EnviromentSetting.accessToken = data["access_token"];
  74. EnviromentSetting.accessTokenReceivedTime = DateTime.Now;
  75. UserProperty.userId = data["user_id"];
  76. // todo 用user id 获取用户数据并保存
  77. }
  78. if (UserProperty.userId != null && EnviromentSetting.accessToken != null)
  79. {
  80. // 启动获取用户信息请求
  81. StartCoroutine(GetUserData());
  82. }
  83. else
  84. {
  85. Debug.Log("LoginTokenCallback 登陆失败");
  86. Debug.Log(json);
  87. }
  88. }
  89. IEnumerator GetUserData()
  90. {
  91. yield return null; // 跳过第一帧
  92. // 提交POST
  93. string url = "/api/user/info/";
  94. WWWForm form = new();
  95. form.AddField("user_id", UserProperty.userId);
  96. StartCoroutine(WebController.PostRequest(url, form, callback: GetUserDataCallback));
  97. }
  98. void GetUserDataCallback(string json)
  99. {
  100. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  101. if (data != null && data["status"] == "success")
  102. {
  103. var user_info = JsonConvert.DeserializeObject(data["user_info"]) as Dictionary<string, string>;
  104. UserProperty.name = user_info["name"];
  105. UserProperty.coin = int.Parse(user_info["coin"]);
  106. UserProperty.mobile = user_info["mobile"];
  107. UserProperty.email = user_info["email"];
  108. UserProperty.level = user_info["level"];
  109. UserProperty.isRegUser = bool.Parse(user_info["isRegUser"]);
  110. Dictionary<string, string>[] dogs = JsonConvert.DeserializeObject<Dictionary<string, string>[]>(data["dogs"]);
  111. // todo 保存狗的数据
  112. }
  113. // 判断用户狗的数量,如果为0就跳转用户创建狗。
  114. if (UserProperty.dogs.Count < 1)
  115. {
  116. SwitchToInitDogScene();
  117. }
  118. else
  119. {
  120. SceneManager.LoadScene("Home");
  121. }
  122. }
  123. // Quick Start 登录方式,用UUID换取Login Token
  124. public void QuickStart()
  125. {
  126. string url = "/api/game/quick_start/";
  127. Dictionary<string, string> formData = new();
  128. WWWForm form = new();
  129. form.AddField("UUID", EnviromentSetting.UUID);
  130. StartCoroutine(WebController.PostRequest(url, form, callback: QuickStartCallback));
  131. }
  132. void QuickStartCallback(string json)
  133. {
  134. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  135. if (data != null && data["status"] == "success")
  136. {
  137. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  138. UserProperty.userId = data["user_id"];
  139. StartCoroutine(LoginTokenPost());
  140. }
  141. }
  142. // 切换到生成狗的子场景
  143. void SwitchToInitDogScene()
  144. {
  145. initDogCanvas.SetActive(true);
  146. loginCanvas.SetActive(false);
  147. regCanvas.SetActive(false);
  148. var loginCam = GameObject.Find("V Cam Login").GetComponent<CinemachineVirtualCamera>();
  149. var initDogCam = GameObject.Find("V Cam Init Dog").GetComponent<CinemachineVirtualCamera>();
  150. loginCam.Priority = 0;
  151. initDogCam.Priority = 10;
  152. }
  153. }