using System; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; namespace WS { [ObjectSystem] public class MapControllerUpdateSystem : UpdateSystem { public override void Update(MapController self) { //正面布局 if (FacadeComponent.Instance.GetController() != null) { self.playerPos = Player.Inst.transform.position; float angle = Mathf.DeltaAngle( self.VRCameraRotY, Player.Inst.hmdTransform.localEulerAngles.y ); float num = Mathf.Abs(angle) / self.angle; if (num > 1) { self.VRCameraRotY += (int)num * 2 * self.angle * Mathf.Sign(angle); if (self.VRCameraRotY > 360) { self.VRCameraRotY -= 360; } Vector3 uiToPlayer = self.GetUITranfrom().position - self.playerPos; self.startDir = Quaternion.Euler(0, Mathf.Sign(angle) * 2 * self.angle, 0) * uiToPlayer; self.uiRot = Quaternion.Euler( 70, self.GetUITranfrom().rotation.eulerAngles.y + 2 * self.angle * Mathf.Sign(angle), 0 ); } else { if (self.startRotY != Player.Inst.transform.localEulerAngles.y) { self.GetUITranfrom().LookAt(self.playerPos); float angleValue = Mathf.DeltaAngle( self.startRotY, Player.Inst.transform.localEulerAngles.y ); self.startDir = Quaternion.Euler(0, angleValue, 0) * self.startDir; float uiAngle = self.uiRot.eulerAngles.y + angleValue; if (uiAngle >= 180) { uiAngle -= 360; } self.uiRot = Quaternion.Euler(new Vector3(70, uiAngle, 0)); self.startRotY = Player.Inst.transform.localEulerAngles.y; } else { self.uiRot = self.GetUITranfrom().localRotation; } } self.uiPos = self.startDir + self.playerPos; self.SetViewPos(self.uiPos / self.canvasScale, self.uiRot); } } } public class MapController : Controller { /// 限制角度 public float angle = 90; /// VR相机Y轴旋转 public float VRCameraRotY; /// Y轴距离 public float uiDistanceY = 380; /// Z轴距离 public float uiDistanceZ = 450; /// ui到玩家的向量 public Vector3 startDir; /// UI位置 public Vector3 uiPos; /// UI旋转 public Quaternion uiRot; /// 画布缩放(用于计算世界坐标) public float canvasScale = 0.001f; /// 玩家位置 public Vector3 playerPos; /// 玩家初始旋转 public float startRotY; protected override void BindingViewModel() { _Model.Bind(_View.ReturnBtn, OnReturnBtnClick); } public override void OpenView() { base.OpenView(); MapListAddListener(); VRCameraRotY = 0; startRotY = 0; GameManager.Instance.ProcessManager.OnEndProcessCallback += OnProcessComplete; var playerPos = Player.Inst.transform.position; if (GameManager.Instance.Data.Pattern == PatternType.漫游) { _View.ReturnBtn.gameObject.SetActive(true); SetBtnStatus((int)Enum.Parse(typeof(SceneName), SceneComponent.Instance.ThisScene)); } else { _View.ReturnBtn.gameObject.SetActive(false); } uiPos = playerPos / canvasScale + new Vector3(0, uiDistanceY, uiDistanceZ); uiRot = Quaternion.Euler(new Vector3(70, 0, 0)); _View.SetPosition(uiPos, uiRot); startDir = _View.UIGameObject.transform.position - playerPos; } public override void Dispose() { GameManager.Instance.ProcessManager.OnEndProcessCallback += OnProcessComplete; base.Dispose(); } private void OnReturnBtnClick() { //SceneComponent.Instance.LoadScene( // SceneName.发电机层.ToString(), // () => // { // ChoosePopController choosePop = // FacadeComponent.Instance.CreateController(); // choosePop.OpenView(); // GameObject startPoint = GameObject.Find("StartPoint"); // Player.Inst.transform.position = startPoint.transform.position; // Player.Inst.transform.rotation = startPoint.transform.rotation; // CloseView(); // } //); } public void SetViewPos(Vector3 pos, Quaternion quaternion) { _View.SetPosition(pos, quaternion); } /// 获取UI的Transform public Transform GetUITranfrom() { return _View.UIGameObject.transform; } public void SetView(SceneName sceneName, UnityAction action) { _Model.OnCompleteCallBack = action; SetBtnStatus((int)sceneName - 1); } public void OnProcessComplete() { CloseView(); } /// /// 设置按钮状态 /// /// 按钮索引 public void SetBtnStatus(int sceneIndex) { var buttons = _View.MapList.GetComponentsInChildren