Ejemplo n.º 1
0
        public void Update()
        {
            m_overUnit = null;
            m_hasDown  = false;

            //如果上一帧点击了, 那么本帧就清理对象
            if (m_hasClicked)
            {
                m_hasClicked = false;
                m_hitUnit    = null;
            }

            if (!m_enabled)
            {
                return;
            }

            var cam = Camera.main;

            if (cam == null)
            {
                return;
            }

            //每帧我们都探测鼠标经过terrain的位置
            m_overWorldPos = Vector3.zero;
            Vector3    mousePos = Input.mousePosition;
            Ray        ray      = cam.ScreenPointToRay(mousePos);
            RaycastHit hit;
            int        layerMask = 1 << LayerMask.NameToLayer(CWorldLayer.LAYER_NAME_TERRAIN);

            if (Physics.Raycast(ray, out hit, 1000f, layerMask))
            {
                m_overWorldPos = hit.point;
            }

            //探测我们是否经过了某个单位
            layerMask = 1 << LayerMask.NameToLayer(CWorldLayer.LAYER_NAME_UNIT);
            if (Physics.Raycast(ray, out hit, 1000f, layerMask))
            {
                m_overUnit = hit.transform;
            }

            if (Input.GetMouseButtonDown(0))
            {
                if (EventSystem.current != null)
                {
                    bool clickUI = EventSystem.current.IsPointerOverGameObject();
                    if (clickUI)
                    {
                        return;
                    }
                }

                m_lastDownTime  = CTimeUtil.GetCurrentMillSecondStamp();
                m_downScreenPos = mousePos;
                m_hasDown       = true;
            }

            //鼠标松开
            if (Input.GetMouseButtonUp(0))
            {
                long delta = CTimeUtil.GetCurrentMillSecondStamp() - m_lastDownTime;
                if (delta > 200)
                {
                    return;
                }

                m_hasClicked = true;

                //探测鼠标点击到的世界坐标和单位.
                if (m_overUnit != null)
                {
                    m_hitUnit      = m_overUnit;
                    m_downWorldPos = m_hitUnit.position;
                }
                else
                {
                    //如果没有点击到单位, 那么就直接赋值在terrain上的世界坐标
                    m_downWorldPos = m_overWorldPos;
                }

                m_clickEvent.WorldPosition = m_downWorldPos;
                m_dispatcher.DispatchEvent(m_clickEvent);
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// 开始cd
 /// </summary>
 private void ApplyCooldown()
 {
     m_lastFireTime = CTimeUtil.GetCurrentMillSecondStamp();
 }