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); } }
/// <summary> /// 开始cd /// </summary> private void ApplyCooldown() { m_lastFireTime = CTimeUtil.GetCurrentMillSecondStamp(); }