123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- using System;
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using Newtonsoft.Json;
- using UnityEngine.SceneManagement;
- 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()
- {
- 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;
- }
- else
- {
- //启动自动采用Login Token 登录。其他登录方式为手动登录。
- StartCoroutine(LoginTokenPost());
- }
- }
- // 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<Dictionary<string, string>>(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)
- {
- // 启动获取用户信息请求
- StartCoroutine(GetUserData());
- }
- else
- {
- Debug.Log("LoginTokenCallback 登陆失败");
- Debug.Log(json);
- }
- }
- IEnumerator GetUserData()
- {
- yield return null; // 跳过第一帧
- // 提交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<Dictionary<string, string>>(json);
- if (data != null && data["status"] == "success")
- {
- var user_info = JsonConvert.DeserializeObject(data["user_info"]) as Dictionary<string, string>;
- UserProperty.name = user_info["name"];
- UserProperty.coin = int.Parse(user_info["coin"]);
- UserProperty.mobile = user_info["mobile"];
- UserProperty.email = user_info["email"];
- UserProperty.level = user_info["level"];
- UserProperty.isRegUser = bool.Parse(user_info["isRegUser"]);
- Dictionary<string, string>[] dogs = JsonConvert.DeserializeObject<Dictionary<string, string>[]>(data["dogs"]);
- // todo 保存狗的数据
- }
- // 判断用户狗的数量,如果为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<string, string> 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<Dictionary<string, string>>(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<CinemachineVirtualCamera>();
- var initDogCam = GameObject.Find("V Cam Init Dog").GetComponent<CinemachineVirtualCamera>();
- loginCam.Priority = 0;
- initDogCam.Priority = 10;
- }
- }
|