LoginController.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Networking;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using Unity.VisualScripting;
  7. using Newtonsoft.Json;
  8. using UnityEngine.SceneManagement;
  9. using UnityEditor;
  10. using Cinemachine;
  11. /* 使用login token进行登录和数据读取保存
  12. * TestDataInjection 是测试用的假数据注入
  13. * LoginTokenCheck 验证login token是否有效,和服务器比对
  14. */
  15. public class LoginController : MonoBehaviour
  16. {
  17. // Start is called once before the first execution of Update after the MonoBehaviour is created
  18. private GameObject canvasPlaceholder, regCanvas, initDogCanvas, loginCanvas;
  19. void Start()
  20. {
  21. //启动自动采用Login Token 登录。其他登录方式为手动登录。
  22. StartCoroutine(LoginTokenPost());
  23. canvasPlaceholder = GameObject.Find("Canvas Placeholder");
  24. regCanvas = canvasPlaceholder.transform.Find("Register Canvas").gameObject;
  25. initDogCanvas = canvasPlaceholder.transform.Find("Init Dog Canvas").gameObject;
  26. loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject;
  27. // 判断是否要切换到注册狗的子场景
  28. if ( GameData.subScene == "Login_InitDog")
  29. {
  30. SwitchToInitDogScene();
  31. GameData.subScene = null;
  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. // 判断用户狗的数量,如果为0就跳转用户创建狗。
  81. if (UserProperty.dogs.Count < 1)
  82. {
  83. SwitchToInitDogScene();
  84. }
  85. else
  86. {
  87. SceneManager.LoadScene("Home");
  88. }
  89. }
  90. }
  91. // Quick Start 登录方式,用UUID换取Login Token
  92. public void QuickStart()
  93. {
  94. string url = "/api/game/quick_start/";
  95. Dictionary<string, string> formData = new();
  96. WWWForm form = new();
  97. form.AddField("UUID", EnviromentSetting.UUID);
  98. StartCoroutine(WebController.PostRequest(url, form, callback: QuickStartCallback));
  99. }
  100. void QuickStartCallback(string json)
  101. {
  102. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  103. if (data != null && data["status"] == "success")
  104. {
  105. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  106. UserProperty.userId = data["user_id"];
  107. StartCoroutine(LoginTokenPost());
  108. }
  109. }
  110. // 切换到生成狗的子场景
  111. void SwitchToInitDogScene()
  112. {
  113. initDogCanvas.SetActive(true);
  114. loginCanvas.SetActive(false);
  115. regCanvas.SetActive(false);
  116. var loginCam = GameObject.Find("V Cam Login").GetComponent<CinemachineVirtualCamera>();
  117. var initDogCam = GameObject.Find("V Cam Init Dog").GetComponent<CinemachineVirtualCamera>();
  118. loginCam.Priority = 0;
  119. initDogCam.Priority = 10;
  120. }
  121. }