void CreateRay(Action <GameObject> action) { bool hitObject = false; switch (_mode) { case Mode.GameObject: int layerMask = _interaction != null ? 1 << _interaction.GetLayer() : 0; ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask) && IsValidTarget(hit.collider.gameObject)) { action(hit.collider.gameObject); hitObject = true; } break; case Mode.UI: _pointerEventData = new PointerEventData(_eventSystem); _pointerEventData.position = Input.mousePosition; _results.Clear(); _raycaster.Raycast(_pointerEventData, _results); foreach (RaycastResult result in _results) { if (IsValidTarget(result.gameObject)) { action(result.gameObject); hitObject = true; break; } } break; default: throw new NotImplementedException(); } if (!hitObject) { action(null); } }
public void UpdateInteraction() { int layerMask = 1 << _interaction.GetLayer(); ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask)) { if (!_isOver) { _isOver = true; _interaction.OnMouseEnter(hit.point); } else { if (Input.GetMouseButtonDown(0)) { _interaction.OnMouseClick(hit.point); } else { _interaction.OnMouseOver(hit.point); } } } else if (_isOver) { _isOver = false; _interaction.OnMouseExit(); } if (Input.GetKeyDown(KeyCode.Escape)) { CancelInteraction(); } }