/// <summary> /// 更新UI /// </summary> protected override void Update() { GameplayProxy gameplayProxy = Facade.RetrieveProxy(ProxyName.GameplayProxy) as GameplayProxy; SpacecraftEntity main = gameplayProxy.GetEntityById <SpacecraftEntity>(gameplayProxy.GetMainPlayerUID()); if (main == null) { return; } bool needCrosshair = !IsWatchOrUIInputMode() && !IsDead() && !IsLeaping() && !IsBattling(); bool hasMineral = false; if (needCrosshair) { SpacecraftEntity target = m_RaycastProxy.Raycast(); hasMineral = target != null && target.GetHeroType() == Assets.Scripts.Define.KHeroType.htMine && target.GetAttribute(AttributeName.kHP) > 0; } m_Crosshair.gameObject.SetActive(needCrosshair); m_JumpCrosshair.gameObject.SetActive(!hasMineral); m_MineralCrosshair.gameObject.SetActive(hasMineral); float w = m_Root.rect.width; float h = m_Root.rect.height; m_ScaleBox.localScale = w > h ? new Vector3(1, h / w, 1) : new Vector3(w / h, 1, 1); m_HaveMissionFlagPoints.Clear(); List <TaskTrackingProxy.TrackingInfo> trackingList = m_TaskTracking.GetAllTrackings(); for (int i = 0; i < trackingList.Count; i++) { if (trackingList[i].Mode == TaskTrackingProxy.TrackingMode.LeapPoint) { m_HaveMissionFlagPoints.Add((uint)trackingList[i].LeapPointID); } } ulong currentAreaID = MapManager.GetInstance().GetCurrentAreaUid(); uint[] visibleLeapIDs = null; for (int i = 0; i < m_LeapCfgs.Count; i++) { if (m_LeapCfgs[i].LeapId == currentAreaID) { visibleLeapIDs = m_LeapCfgs[i].GetVisibleLeapListArray(); break; } } int hitedPointIndex = -1; bool allowVisible = !IsDead() && !IsWatchOrUIInputMode();// && !IsBattling(); Vector2 screenCenter = new Vector2(Screen.width / 2, Screen.height / 2); for (int i = 0; i < m_LeapCfgs.Count; i++) { RectTransform point = m_PointBox.GetChild(i).GetComponent <RectTransform>(); RectTransform arrow = m_ArrowBox.GetChild(i).GetComponent <RectTransform>(); if (!allowVisible) { arrow.gameObject.SetActive(false); point.gameObject.SetActive(false); continue; } LeapItem leapVO = m_LeapCfgs[i]; uint leapID = (uint)leapVO.LeapId; if (visibleLeapIDs != null && System.Array.IndexOf(visibleLeapIDs, leapID) == -1) { arrow.gameObject.SetActive(false); point.gameObject.SetActive(false); continue; } Vector3 targetWorldPosition = gameplayProxy.WorldPositionToServerAreaOffsetPosition(new Vector3((float)leapVO.Position.Value.X, (float)leapVO.Position.Value.Y, (float)leapVO.Position.Value.Z)); //目标过远,忽略 float distance = Vector3.Distance(targetWorldPosition, main.transform.position); if (distance <= leapVO.Range * GameConstant.METRE_PER_UNIT) { arrow.gameObject.SetActive(false); point.gameObject.SetActive(false); continue; } Vector3 viewportPoint = Camera.main.WorldToViewportPoint(targetWorldPosition); if (viewportPoint.x >= 0 && viewportPoint.y >= 0 && viewportPoint.x <= 1 && viewportPoint.y <= 1 && viewportPoint.z >= Camera.main.nearClipPlane) { //屏幕内 Vector3 screenPoint = Camera.main.WorldToScreenPoint(targetWorldPosition); Vector2 iconPosition; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(m_PointBox, screenPoint, m_Camera, out iconPosition)) { arrow.gameObject.SetActive(false); point.gameObject.SetActive(true); point.anchoredPosition = iconPosition; point.localScale = Vector3.one * LEAP_POINT_SCALE; point.Find("JumpTips/TextBox/Distance").GetComponent <TMP_Text>().text = FormatMetre(distance * GameConstant.METRE_PER_UNIT); if (hitedPointIndex == -1) { Vector2 crosshairPosition; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(m_Crosshair, screenPoint, m_Camera, out crosshairPosition)) { //确定选中项 if (crosshairPosition.magnitude <= m_Crosshair.rect.width * 0.5f) { hitedPointIndex = i; } } } } } else { if (m_HaveMissionFlagPoints.Contains(leapID)) { arrow.gameObject.SetActive(false); point.gameObject.SetActive(false); continue; } //屏幕外 point.gameObject.SetActive(false); arrow.gameObject.SetActive(true); Vector3 inCameraPosition = Camera.main.transform.InverseTransformPoint(targetWorldPosition); Vector2 arrowPosition = m_ScaleBox.InverseTransformPoint(m_Root.TransformPoint(((Vector2)inCameraPosition))); arrowPosition = arrowPosition.normalized * (Mathf.Max(m_Root.rect.width, m_Root.rect.height) / 2); arrowPosition = m_Root.InverseTransformPoint(m_ScaleBox.TransformPoint(arrowPosition)); arrow.anchoredPosition = arrowPosition; arrow.localScale = Vector3.one * ARROW_SCALE; RectTransform arrowArrow = FindComponent <RectTransform>(arrow, "Arrow"); arrowArrow.localRotation = Quaternion.Euler(0, 0, Mathf.Atan2(inCameraPosition.y, inCameraPosition.x) * Mathf.Rad2Deg - 90); } } //如果处理战斗状态,强制取消选中 if (IsBattling()) { hitedPointIndex = -1; } //只能在NORMAL状态下换目标 if (m_LeapState == LEAP_PHASE.NORMAL && m_CurrentIndex != hitedPointIndex) { if (m_CurrentIndex != -1) { RectTransform point = m_PointBox.GetChild(m_CurrentIndex).GetComponent <RectTransform>(); Animator tipAnimator = point.Find("JumpTips").GetComponent <Animator>(); Animator iconBgAnimator = point.Find("IconBg").GetComponent <Animator>(); Animator iconAnimator = point.Find("Icon").GetComponent <Animator>(); Transform missionBox = point.Find("MissionBox"); tipAnimator.ResetTrigger("Closed"); tipAnimator.ResetTrigger("Open"); tipAnimator.SetTrigger("Closed"); iconBgAnimator.ResetTrigger("Closed"); iconBgAnimator.ResetTrigger("Open"); iconBgAnimator.SetTrigger("Closed"); iconAnimator.SetBool("selected", false); missionBox.gameObject.SetActive(true); } //Debug.LogError(m_LeapState + "=>" + m_CurrentIndex + " -> " + hitedPointIndex); m_CurrentIndex = hitedPointIndex; if (m_CurrentIndex != -1) { RectTransform point = m_PointBox.GetChild(m_CurrentIndex).GetComponent <RectTransform>(); Animator tipAnimator = point.Find("JumpTips").GetComponent <Animator>(); Animator iconBgAnimator = point.Find("IconBg").GetComponent <Animator>(); Animator iconAnimator = point.Find("Icon").GetComponent <Animator>(); Transform missionBox = point.Find("MissionBox"); tipAnimator.ResetTrigger("Closed"); tipAnimator.ResetTrigger("Open"); tipAnimator.SetTrigger("Open"); iconBgAnimator.ResetTrigger("Closed"); iconBgAnimator.ResetTrigger("Open"); iconBgAnimator.SetTrigger("Open"); iconAnimator.SetBool("selected", true); missionBox.gameObject.SetActive(false); m_HotKeyBox.SetParent(point.Find("JumpTips/TextBox/HotKeyBox")); m_HotKeyBox.gameObject.SetActive(true); SetHotKeyVisible("f_hold", true); SetHotKeyVisible("f_press", false); } else { m_HotKeyBox.SetParent(GetTransform()); m_HotKeyBox.gameObject.SetActive(false); SetHotKeyVisible("f_hold", false); SetHotKeyVisible("f_press", false); } } UpdateMissionState(); }
/// <summary> /// 更新任务状态 /// </summary> private void UpdateMissionState() { TaskTrackingProxy trakingProxy = Facade.RetrieveProxy(ProxyName.TaskTrackingProxy) as TaskTrackingProxy; for (int i = 0; i < m_LeapCfgs.Count; i++) { LeapItem leapVO = m_LeapCfgs[i]; uint leapID = (uint)leapVO.LeapId; RectTransform point = m_PointBox.GetChild(i).GetComponent <RectTransform>(); if (point.gameObject.activeSelf) { RectTransform box1 = point.Find("MissionBox").GetComponent <RectTransform>(); RectTransform box2 = point.Find("JumpTips/MissionBox").GetComponent <RectTransform>(); int index = 0; List <TaskTrackingProxy.TrackingInfo> trackingList = trakingProxy.GetLeapTrackings(leapID); if (trackingList != null) { for (int j = 0; j < trackingList.Count; j++) { TaskTrackingProxy.TrackingInfo tracking = trackingList[j]; RectTransform icon1 = index < box1.childCount ? box1.GetChild(j).GetComponent <RectTransform>() : null; if (icon1 == null) { if (m_MissionIdleBox.childCount > 0) { icon1 = m_MissionIdleBox.GetChild(0).GetComponent <RectTransform>(); } else { icon1 = Object.Instantiate(m_MissionTemplate, box1); } icon1.SetParent(box1); icon1.gameObject.SetActive(true); } RectTransform icon2 = index < box2.childCount ? box2.GetChild(j).GetComponent <RectTransform>() : null; if (icon2 == null) { if (m_MissionIdleBox.childCount > 0) { icon2 = m_MissionIdleBox.GetChild(0).GetComponent <RectTransform>(); } else { icon2 = Object.Instantiate(m_MissionTemplate, box2); } icon2.SetParent(box2); icon2.gameObject.SetActive(true); } string missionIcon = GetMissionIcon(tracking.MissionType); UIUtil.SetIconImage(icon1.Find("Icon").GetComponent <Image>(), GameConstant.FUNCTION_ICON_ATLAS_ASSETADDRESS, missionIcon); UIUtil.SetIconImage(icon2.Find("Icon").GetComponent <Image>(), GameConstant.FUNCTION_ICON_ATLAS_ASSETADDRESS, missionIcon); bool missionFinished = tracking.MissionState == MissionState.Finished; icon1.GetComponent <Animator>().SetBool("Finished", missionFinished); icon2.GetComponent <Animator>().SetBool("Finished", missionFinished); index++; } } while (index < box1.childCount) { box1.GetChild(index).gameObject.SetActive(false); box1.GetChild(index).SetParent(m_MissionIdleBox); } while (index < box2.childCount) { box2.GetChild(index).gameObject.SetActive(false); box2.GetChild(index).SetParent(m_MissionIdleBox); } } } }
/// <summary> /// 重建所有跳点 /// </summary> private void ResetJumpPoints() { CfgEternityProxy eternityProxy = Facade.RetrieveProxy(ProxyName.CfgEternityProxy) as CfgEternityProxy; GameLocalizationProxy localizationProxy = Facade.RetrieveProxy(ProxyName.GameLocalizationProxy) as GameLocalizationProxy; m_LeapCfgs.Clear(); int index = 0; Eternity.FlatBuffer.Map map = eternityProxy.GetCurrentMapData(); for (int i = 0; i < map.AreaListLength; i++) { Eternity.FlatBuffer.Area area = map.AreaList(i).Value; for (int j = 0; j < area.LeapListLength; j++) { LeapItem leapVO = area.LeapList(j).Value; m_LeapCfgs.Add(leapVO); if (index >= m_PointBox.childCount) { Object.Instantiate(m_PointTemplate, m_PointBox); } if (index >= m_ArrowBox.childCount) { Object.Instantiate(m_ArrowTemplate, m_ArrowBox); } Transform leapPointItem = m_PointBox.GetChild(index); Image icon = leapPointItem.Find("Icon/Image_Icon").GetComponent <Image>(); TMP_Text nameField1 = leapPointItem.Find("JumpTips/TextBox/Name").GetComponent <TMP_Text>(); TMP_Text distanceField = leapPointItem.Find("JumpTips/TextBox/Distance").GetComponent <TMP_Text>(); Transform leapPointArrow = m_ArrowBox.GetChild(index); Image arrowIcon = FindComponent <Image>(leapPointArrow, "Icon"); if (leapVO.IconConfId == 0) { UIUtil.SetIconImage(icon, 31320); arrowIcon.gameObject.SetActive(false); } else { UIUtil.SetIconImage(icon, leapVO.IconConfId); arrowIcon.gameObject.SetActive(true); UIUtil.SetIconImage(arrowIcon, leapVO.IconConfId); } nameField1.text = localizationProxy.GetString("leap_name_" + eternityProxy.GetCurrentGamingMapId() + "_" + leapVO.LeapId); distanceField.text = ""; //Debug.LogError("LeapType : "+leapVO.LeapType+", LeapID : " + leapVO.LeapId + " , MainLeapId : " + leapVO.MainLeapId + ", Name : " + nameField1.text + ", VisibleLeapList[" + string.Join(",", leapVO.GetVisibleLeapListArray()) + "]"); index++; } } for (int i = m_PointBox.childCount - 1; i >= index; i--) { m_PointBox.GetChild(i).gameObject.SetActive(false); } for (int i = m_ArrowBox.childCount - 1; i >= index; i--) { m_ArrowBox.GetChild(i).gameObject.SetActive(false); } }