/// <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);
        }
    }