LoginMgr.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Newtonsoft.Json;
  5. using JCUnityLib;
  6. /* 登录管理者,用户数据定义和存储 */
  7. public class LoginMgr : MonoBehaviour
  8. {
  9. [SerializeField] GameObject loginView;
  10. [SerializeField] GameObject registerView;
  11. public static UserInfo myUserInfo = new UserInfo();
  12. public void showRegisterView()
  13. {
  14. loginView.SetActive(false);
  15. registerView.SetActive(true);
  16. AgreenmentOption.ins.gameObject.SetActive(true);
  17. }
  18. public void showLoginView()
  19. {
  20. loginView.SetActive(true);
  21. registerView.SetActive(false);
  22. AgreenmentOption.ins.gameObject.SetActive(true);
  23. }
  24. public void showForgetPWD_View()
  25. {
  26. Instantiate(SceneResourceManager.Instance.GetPrefab("RetrievePasswordView"));
  27. }
  28. public const string LoginTokenKey = "LoginToken";
  29. public static bool HasToken()
  30. {
  31. string loginToken = PlayerPrefs.GetString(LoginMgr.LoginTokenKey, "");
  32. return string.IsNullOrEmpty(loginToken) ? false : true;
  33. }
  34. void Awake()
  35. {
  36. transform.Find("AgreementPopup").gameObject.SetActive(true);
  37. ViewMgr.Instance.DestroyAllViews();
  38. }
  39. void Start()
  40. {
  41. //退出到登录界面,也要把蓝牙断开
  42. if (BluetoothAim.ins) {
  43. if (BluetoothAim.ins.status == BluetoothStatusEnum.ConnectSuccess) BluetoothAim.ins.DoConnect();
  44. else BluetoothAim.ins.connectCanceled = true;
  45. }
  46. }
  47. }
  48. public class UserInfo
  49. {
  50. public int id;
  51. public int avatarID = 0;
  52. public string avatarUrl = "";
  53. public string nickname = "超级射手";
  54. public int gender = 1;
  55. public string phone = "";
  56. public string email = "";
  57. public string birthday = "";
  58. public string country = "";
  59. public string state = "";
  60. public string city = "";
  61. public int integral = 0;
  62. public int coin = 0;
  63. public int diamond = 1000;
  64. public string mac = "";
  65. public List<PropInfo> bagList = new List<PropInfo>();
  66. public List<DeviceInfo> deviceList = new List<DeviceInfo>();
  67. /// <summary>
  68. /// 显示游戏最高分(不同距离分数独立)
  69. /// 2023-7-16兼容WildAttack最高分纪录
  70. /// </summary>
  71. public Dictionary<string, float> timeLimitGameScores = new Dictionary<string, float>();
  72. //闯关记录(gameType:通关数)(野兔、野鸡、野狼的通关数)
  73. public Dictionary<int, int> challengeLevels = new Dictionary<int, int>();
  74. public string guideRecord = "";
  75. public static UserInfo LoadLocal(int id)
  76. {
  77. UserInfo result = null;
  78. if (CommonConfig.StandaloneMode)
  79. {
  80. try
  81. {
  82. //result = JsonConvert.DeserializeObject<UserInfo>(PlayerPrefs.GetString("UserInfo_" + id));
  83. //if (result == null) throw new Exception("UserInfo.LoadLocal Null");
  84. string userInfoString = PlayerPrefs.GetString("UserInfo_" + id);
  85. if (string.IsNullOrEmpty(userInfoString))
  86. {
  87. return null;
  88. }
  89. result = JsonConvert.DeserializeObject<UserInfo>(userInfoString);
  90. if (result == null)
  91. {
  92. throw new Exception("UserInfo.LoadLocal Null");
  93. }
  94. }
  95. catch (Exception e)
  96. {
  97. Debug.LogError(e);
  98. }
  99. }
  100. return result;
  101. }
  102. public void Save()
  103. {
  104. if (CommonConfig.StandaloneMode)
  105. {
  106. PlayerPrefs.SetString("UserInfo_" + id, JsonConvert.SerializeObject(this));
  107. return;
  108. }
  109. try { UserComp.Instance.saveUserInfo(this); } catch (System.Exception e) { Debug.LogError(e.Message); }
  110. }
  111. public void SetChallengeLevelPass(int gameType, int level)
  112. {
  113. if (gameType != 3 && gameType != 4 && gameType != 5) return;
  114. if (challengeLevels.ContainsKey(gameType))
  115. {
  116. if (level <= challengeLevels[gameType])
  117. {
  118. return;
  119. }
  120. }
  121. challengeLevels.Remove(gameType);
  122. challengeLevels.Add(gameType, level);
  123. }
  124. public int GetChallengeLevelPass(int gameType)
  125. {
  126. if (challengeLevels.ContainsKey(gameType))
  127. {
  128. return challengeLevels[gameType];
  129. }
  130. return 0;
  131. }
  132. //判断引导是否完成(服务端保存)
  133. //index0: 新手引导NewUserGuide
  134. public bool IsGuideFinish(int index)
  135. {
  136. if (index == 0)
  137. {
  138. return PlayerPrefs.GetInt("NewUserGuideFinish_" + LoginMgr.myUserInfo.id, 0) == 1;
  139. }
  140. char[] chars = guideRecord.ToCharArray();
  141. if (index < chars.Length)
  142. {
  143. return chars[index] == '1';
  144. }
  145. return false;
  146. }
  147. public void SaveGuideFinish(int index)
  148. {
  149. if (index == 0)
  150. {
  151. PlayerPrefs.SetInt("NewUserGuideFinish_" + LoginMgr.myUserInfo.id, 1);
  152. return;
  153. }
  154. char[] chars = guideRecord.ToCharArray();
  155. if (index < chars.Length)
  156. {
  157. if (chars[index] == '1') return;
  158. chars[index] = '1';
  159. }
  160. else
  161. {
  162. int newLen = index + 1;
  163. char[] newChars = new char[newLen];
  164. for (int i = 0; i < newLen; i++)
  165. {
  166. newChars[i] = i < chars.Length ? chars[i] : '0';
  167. }
  168. newChars[index] = '1';
  169. chars = newChars;
  170. }
  171. this.guideRecord = string.Join("", chars);
  172. UserPlayer.ins?.call("userComp.saveGuideRecord", this.guideRecord);
  173. }
  174. }
  175. public class UserSettings
  176. {
  177. //打开BGM
  178. public bool openBGM = true;
  179. //打开音效
  180. public bool openEffect = true;
  181. //是否打开准心
  182. public bool openCrossHair = true;
  183. //射击难度
  184. public int shootLevel = 0;
  185. //游戏里的箭重,单位克
  186. public float actualArrowWeight = 20;
  187. //弓箭旋转转化
  188. public BowRotateConvert bowRotateConvert = new BowRotateConvert();
  189. //游戏中是否固定镜头
  190. public bool bowCameraFixed = true;
  191. //训练模式
  192. public bool trainMode = false;
  193. //游戏里面视角重置时间(3秒改成默认5秒)
  194. public float calibrationTime = 5f;
  195. //游戏里面的弓箭手臂(在所有游戏中,游戏设置里的‘手臂弓箭’这个选项,默认为关;即在游戏中,不出现手臂和弓箭的模型)
  196. public bool openBowAndArrow = false;
  197. //选择的红外连接设备
  198. public string selectDevicesName = "";
  199. //激光设备开启状态 默认关闭
  200. public bool lightState = false;
  201. //b端 每一局的设置
  202. public int PerRoundCoin = 2; //投币
  203. public int PerRoundSeconds = 1200;//时间
  204. public int TotalCoinsNum = 0;//总投币数
  205. public int ChangeTicket = 0;//多少分兑换一张票
  206. public int TotalTicketNum = 0;//总出票数量
  207. public int NeedCoin = 1;//是否需要投币
  208. public int GiveTicket = 0;//是否出票
  209. //设备校准引导-是否已经完成
  210. public bool deviceCalibrateGuideFinish = false;
  211. //游戏规则引导-是否已经完成(完成则保存对应的GameType)
  212. public HashSet<int> gameRuleGuideFinish = new HashSet<int>();
  213. private static UserSettings _ins;
  214. public static UserSettings ins
  215. {
  216. get
  217. {
  218. if (_ins == null)
  219. {
  220. string dataStr = PlayerPrefs.GetString("UserSettings", "{}");
  221. try
  222. {
  223. _ins = JsonConvert.DeserializeObject<UserSettings>(dataStr);
  224. }
  225. catch (System.Exception) { }
  226. if (_ins == null)
  227. {
  228. _ins = new UserSettings();
  229. }
  230. if (CommonConfig.SpecialVersion1)
  231. {
  232. if (PlayerPrefs.GetInt("sv1_UserSettings_2", 0) == 0)
  233. {
  234. PlayerPrefs.SetInt("sv1_UserSettings_2", 1);
  235. UserSettings us = _ins;
  236. us.bowRotateConvert.screenSize = 60;
  237. us.bowRotateConvert.screenDistance = 1.5f;
  238. us.Save();
  239. }
  240. }
  241. }
  242. return _ins;
  243. }
  244. }
  245. public void Save()
  246. {
  247. PlayerPrefs.SetString("UserSettings", JsonConvert.SerializeObject(this));
  248. }
  249. }
  250. /*
  251. 描述1
  252. 已知:
  253. 屏幕宽高比例w:h=16:9,屏幕尺寸s=60.11英寸,屏幕距离d=2.50米,实际指向右边树的角度为e=5.56°。
  254. 可知:
  255. 屏幕尺寸s1 = (s * 0.0254)米
  256. 屏幕单位大小为unit,关系式(w*unit)^2 + (h*unit)^2 = s1^2
  257. 结果:
  258. 向量(玩家->右边树)在屏幕上投影的长度比例q = tan(e) * d / unit
  259. */
  260. /*
  261. 描述2(适配各种尺寸的屏幕)
  262. 已知:
  263. 屏幕宽高比例w:h=16:9,屏幕尺寸s=(任意)英寸,屏幕距离d=(任意)米,游戏指向右边树的角度为r=27.30°。
  264. 借用描述1的结果q
  265. 可知:
  266. 屏幕尺寸s1 = (s * 0.0254)米
  267. 屏幕单位大小为unit,关系式(w*unit)^2 + (h*unit)^2 = s1^2
  268. 实际指向右边树的角度为e = atan(q * unit / d)
  269. 结果:
  270. 游戏转动角度:实际转动角度 = r / e
  271. */
  272. public class BowRotateConvert
  273. {
  274. public float screenSize = 60; //屏幕尺寸(英寸)
  275. public float screenDistance = 2.5f; //玩家距离屏幕多远(米)
  276. [NonSerialized] public float fieldOfView = 25;
  277. //获取建议的屏幕距离
  278. public float GetAdviseScreenDistance()
  279. {
  280. float w = 16;
  281. float h = 9;
  282. float s1 = screenSize * 0.0254f;
  283. float unit = s1 / Mathf.Sqrt(w * w + h * h);
  284. float screenHeight = 9 * unit;
  285. return screenHeight * 0.5f / Mathf.Tan(fieldOfView / 2 / 180 * Mathf.PI);
  286. }
  287. // 游戏旋转角度 : 实际旋转角度 (这个版本丢弃掉这个功能-所以直接返回1)
  288. public float GetRate()
  289. {
  290. return 1;
  291. }
  292. // 游戏旋转角度 : 实际旋转角度
  293. // public float GetRate() {
  294. // double w = 16;
  295. // double h = 9;
  296. // double s = Convert.ToDouble(screenSize);
  297. // double d = Convert.ToDouble(screenDistance);
  298. // double r = 27.3 / 180 * Math.PI;
  299. // double q = get_q();
  300. // double s1 = s * 0.0254;
  301. // double unit = Math.Sqrt(Math.Pow(s1, 2) / (Math.Pow(w, 2) + Math.Pow(h, 2)));
  302. // double e = Math.Atan(q * unit / d);
  303. // return (float) (r / e);
  304. // }
  305. // private double get_q() {
  306. // double w = 16;
  307. // double h = 9;
  308. // double s = 60.11;
  309. // double d = 2.5;
  310. // double e = 5.56 / 180 * Math.PI;
  311. // double s1 = s * 0.0254;
  312. // double unit = Math.Sqrt(Math.Pow(s1, 2) / (Math.Pow(w, 2) + Math.Pow(h, 2)));
  313. // double q = Math.Tan(e) * d / unit;
  314. // return q;
  315. // }
  316. }