using InfraredManager; using ProjectBase.Event; using ShotSimulator.Event; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public enum CursorType { UICursor, DefaultCursor, SnipeCursor } public class VirtualMouse : MonoSingleton { public Vector2 screenPos = new Vector2(); private bool m_TacticalMode; public bool TacticalMode { get { return m_TacticalMode; } set { m_TacticalMode = value; PlayerPrefs.SetInt("TacticalMode", m_TacticalMode ? 1 : 0); } } public Camera m_SnipeCamera; private EventSystem m_eventSystem; private PointerEventData m_pointerEvent; private Selectable m_excluded; private Selectable m_currentSelectable; private RaycastResult m_currentRaycastResult; private IPointerClickHandler m_clickHandler; private IDragHandler m_dragHandler; public override void InitManager() { base.InitManager(); m_eventSystem = EventSystem.current; m_pointerEvent = new PointerEventData(m_eventSystem); m_pointerEvent.button = PointerEventData.InputButton.Left; #if UNITY_ANDROID InfraredCameraHelper.GetInstance().OnPositionUpdate += OnPositionUpdate; #endif TacticalMode = PlayerPrefs.HasKey("TacticalMode") ? PlayerPrefs.GetInt("TacticalMode") == 1 : false; } private void OnDestroy() { InfraredCameraHelper.GetInstance().OnPositionUpdate -= OnPositionUpdate; } public bool IsSelectUIObject() { #if UNITY_EDITOR || UNITY_STANDALONE return EventSystem.current.IsPointerOverGameObject(); #else return m_currentSelectable != null; #endif } private void OnPositionUpdate(Vector2 position, Vector2 cameraLocation) { screenPos = position; } private void UpdateSnipeCameraVisualAngle() { m_SnipeCamera.transform.LookAt(Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, 50))); } void Update() { #if UNITY_EDITOR || UNITY_STANDALONE //screenPos = Input.mousePosition; #endif UpdateSnipeCameraVisualAngle(); m_pointerEvent.position = screenPos; List raycastResults = new List(); m_eventSystem.RaycastAll(m_pointerEvent, raycastResults); // Detect selectable if (raycastResults.Count > 0) { foreach (var result in raycastResults) { var newSelectable = result.gameObject.GetComponentInParent(); if (newSelectable && newSelectable.interactable) { if (newSelectable != m_excluded && newSelectable != m_currentSelectable) { Select(newSelectable); m_currentRaycastResult = result; } break; } } } else { if (m_currentSelectable || m_excluded) { Select(null, null); } } if (Input.GetKeyDown(KeyCode.Space)) { OnShooting(0); } } public void OnShooting(float speed) { if (m_currentSelectable) { if (m_clickHandler != null) { m_clickHandler.OnPointerClick(m_pointerEvent); Select(null, m_currentSelectable); } else if (m_dragHandler != null) { m_pointerEvent.pointerPressRaycast = m_currentRaycastResult; m_dragHandler.OnDrag(m_pointerEvent); } } } void Select(Selectable s, Selectable exclude = null) { m_excluded = exclude; if (m_currentSelectable) m_currentSelectable.OnPointerExit(m_pointerEvent); m_currentSelectable = s; if (m_currentSelectable) { m_currentSelectable.OnPointerEnter(m_pointerEvent); m_clickHandler = m_currentSelectable.GetComponent(); m_dragHandler = m_currentSelectable.GetComponent(); } } }