MapController.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Events;
  4. using UnityEngine.UI;
  5. namespace WS
  6. {
  7. [ObjectSystem]
  8. public class MapControllerUpdateSystem : UpdateSystem<MapController>
  9. {
  10. public override void Update(MapController self)
  11. {
  12. //正面布局
  13. if (FacadeComponent.Instance.GetController<MapController>() != null)
  14. {
  15. self.playerPos = Player.Inst.transform.position;
  16. float angle = Mathf.DeltaAngle(
  17. self.VRCameraRotY,
  18. Player.Inst.hmdTransform.localEulerAngles.y
  19. );
  20. float num = Mathf.Abs(angle) / self.angle;
  21. if (num > 1)
  22. {
  23. self.VRCameraRotY += (int)num * 2 * self.angle * Mathf.Sign(angle);
  24. if (self.VRCameraRotY > 360)
  25. {
  26. self.VRCameraRotY -= 360;
  27. }
  28. Vector3 uiToPlayer = self.GetUITranfrom().position - self.playerPos;
  29. self.startDir =
  30. Quaternion.Euler(0, Mathf.Sign(angle) * 2 * self.angle, 0) * uiToPlayer;
  31. self.uiRot = Quaternion.Euler(
  32. 70,
  33. self.GetUITranfrom().rotation.eulerAngles.y
  34. + 2 * self.angle * Mathf.Sign(angle),
  35. 0
  36. );
  37. }
  38. else
  39. {
  40. if (self.startRotY != Player.Inst.transform.localEulerAngles.y)
  41. {
  42. self.GetUITranfrom().LookAt(self.playerPos);
  43. float angleValue = Mathf.DeltaAngle(
  44. self.startRotY,
  45. Player.Inst.transform.localEulerAngles.y
  46. );
  47. self.startDir = Quaternion.Euler(0, angleValue, 0) * self.startDir;
  48. float uiAngle = self.uiRot.eulerAngles.y + angleValue;
  49. if (uiAngle >= 180)
  50. {
  51. uiAngle -= 360;
  52. }
  53. self.uiRot = Quaternion.Euler(new Vector3(70, uiAngle, 0));
  54. self.startRotY = Player.Inst.transform.localEulerAngles.y;
  55. }
  56. else
  57. {
  58. self.uiRot = self.GetUITranfrom().localRotation;
  59. }
  60. }
  61. self.uiPos = self.startDir + self.playerPos;
  62. self.SetViewPos(self.uiPos / self.canvasScale, self.uiRot);
  63. }
  64. }
  65. }
  66. public class MapController : Controller<MapView, MapModel>
  67. {
  68. /// <summary> 限制角度 </summary>
  69. public float angle = 90;
  70. /// <summary> VR相机Y轴旋转 </summary>
  71. public float VRCameraRotY;
  72. /// <summary> Y轴距离 </summary>
  73. public float uiDistanceY = 380;
  74. /// <summary> Z轴距离 </summary>
  75. public float uiDistanceZ = 450;
  76. /// <summary> ui到玩家的向量 </summary>
  77. public Vector3 startDir;
  78. /// <summary> UI位置 </summary>
  79. public Vector3 uiPos;
  80. /// <summary> UI旋转 </summary>
  81. public Quaternion uiRot;
  82. /// <summary> 画布缩放(用于计算世界坐标) </summary>
  83. public float canvasScale = 0.001f;
  84. /// <summary> 玩家位置 </summary>
  85. public Vector3 playerPos;
  86. /// <summary> 玩家初始旋转 </summary>
  87. public float startRotY;
  88. protected override void BindingViewModel()
  89. {
  90. _Model.Bind(_View.ReturnBtn, OnReturnBtnClick);
  91. }
  92. public override void OpenView()
  93. {
  94. base.OpenView();
  95. MapListAddListener();
  96. VRCameraRotY = 0;
  97. startRotY = 0;
  98. GameManager.Instance.ProcessManager.OnEndProcessCallback += OnProcessComplete;
  99. var playerPos = Player.Inst.transform.position;
  100. if (GameManager.Instance.Data.Pattern == PatternType.漫游)
  101. {
  102. _View.ReturnBtn.gameObject.SetActive(true);
  103. SetBtnStatus((int)Enum.Parse(typeof(SceneName), SceneComponent.Instance.ThisScene));
  104. }
  105. else
  106. {
  107. _View.ReturnBtn.gameObject.SetActive(false);
  108. }
  109. uiPos = playerPos / canvasScale + new Vector3(0, uiDistanceY, uiDistanceZ);
  110. uiRot = Quaternion.Euler(new Vector3(70, 0, 0));
  111. _View.SetPosition(uiPos, uiRot);
  112. startDir = _View.UIGameObject.transform.position - playerPos;
  113. }
  114. public override void Dispose()
  115. {
  116. GameManager.Instance.ProcessManager.OnEndProcessCallback += OnProcessComplete;
  117. base.Dispose();
  118. }
  119. private void OnReturnBtnClick()
  120. {
  121. //SceneComponent.Instance.LoadScene(
  122. // SceneName.发电机层.ToString(),
  123. // () =>
  124. // {
  125. // ChoosePopController choosePop =
  126. // FacadeComponent.Instance.CreateController<ChoosePopController>();
  127. // choosePop.OpenView();
  128. // GameObject startPoint = GameObject.Find("StartPoint");
  129. // Player.Inst.transform.position = startPoint.transform.position;
  130. // Player.Inst.transform.rotation = startPoint.transform.rotation;
  131. // CloseView();
  132. // }
  133. //);
  134. }
  135. public void SetViewPos(Vector3 pos, Quaternion quaternion)
  136. {
  137. _View.SetPosition(pos, quaternion);
  138. }
  139. /// <summary> 获取UI的Transform </summary>
  140. public Transform GetUITranfrom()
  141. {
  142. return _View.UIGameObject.transform;
  143. }
  144. public void SetView(SceneName sceneName, UnityAction action)
  145. {
  146. _Model.OnCompleteCallBack = action;
  147. SetBtnStatus((int)sceneName - 1);
  148. }
  149. public void OnProcessComplete()
  150. {
  151. CloseView();
  152. }
  153. /// <summary>
  154. /// 设置按钮状态
  155. /// </summary>
  156. /// <param name="sceneIndex">按钮索引</param>
  157. public void SetBtnStatus(int sceneIndex)
  158. {
  159. var buttons = _View.MapList.GetComponentsInChildren<Button>();
  160. for (int i = 0; i < buttons.Length; i++)
  161. {
  162. if (GameManager.Instance.Data.Pattern != PatternType.漫游)
  163. {
  164. buttons[i].interactable = i == sceneIndex;
  165. }
  166. buttons[i].transform.GetChild(0).gameObject.SetActive(i == sceneIndex);
  167. }
  168. }
  169. /// <summary> 每个按钮注册回调 </summary>
  170. private void MapListAddListener()
  171. {
  172. var buttons = _View.MapList.GetComponentsInChildren<Button>();
  173. for (int i = 0; i < buttons.Length; i++)
  174. {
  175. int index = i;
  176. string sceneName;
  177. string pointName = null;
  178. if (GameManager.Instance.Data.Pattern == PatternType.漫游)
  179. {
  180. if (index == 1)
  181. {
  182. sceneName = WanderScene.发电机层_漫游.ToString();
  183. pointName = "StartPoint_进场交通洞";
  184. }
  185. else
  186. {
  187. sceneName = Enum.GetName(typeof(WanderScene), index + 1);
  188. pointName = "StartPoint";
  189. }
  190. }
  191. else
  192. {
  193. if (index == 1)
  194. {
  195. sceneName = SceneName.发电机层.ToString();
  196. }
  197. else
  198. {
  199. sceneName = Enum.GetName(typeof(SceneName), index + 1);
  200. }
  201. }
  202. buttons[index].onClick.AddListener(async () =>
  203. {
  204. await SceneComponent.Instance.LoadSceneAsync(sceneName);
  205. Game.Scene.GetComponent<TeleportPointController>().RefreshTeleport();
  206. if (GameManager.Instance.Data.Pattern == PatternType.漫游)
  207. {
  208. //漫游高亮
  209. SetBtnStatus(index);
  210. GameObject startPoint = GameObject.Find(pointName);
  211. Player.Inst.transform.position = startPoint.transform.position;
  212. Player.Inst.transform.rotation = startPoint.transform.rotation;
  213. }
  214. else
  215. {
  216. SceneDataSaveComponent.Instance.LoadScene(sceneName);
  217. _Model.OnCompleteCallBack?.Invoke();
  218. CloseView();
  219. }
  220. });
  221. }
  222. }
  223. }
  224. public class MapView : View
  225. {
  226. public GameObject MapList;
  227. public Button ReturnBtn;
  228. public override void LoadInit()
  229. {
  230. ShowModeType = ViewShowModeType.World;
  231. ReferenceCollector rc = UIGameObject.GetComponent<ReferenceCollector>();
  232. MapList = rc.Get<GameObject>("MapList");
  233. ReturnBtn = rc.GetComponent<Button>("ReturnBtn");
  234. }
  235. }
  236. public class MapModel : Model
  237. {
  238. public UnityAction OnCompleteCallBack;
  239. public override void InitProperty() { }
  240. }
  241. }