NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/Input/InputManager.cs

1 line
8.3 KiB
C#
Raw Normal View History

2024-01-19 16:05:24 +08:00
using System; using Framework; using PhxhSDK; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.EnhancedTouch; using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch; public class InputManager : SingletonMono<InputManager> { public delegate void OnFingerMoveEvent(Vector2 delta); public delegate void OnFingerUpEvent(Vector2 screenPosition); public delegate void OnFingersMoveEvent(float delta); public OnFingerMoveEvent OnFingerMove; public OnFingerMoveEvent OnFingerMoveUI; public OnFingerUpEvent OnFingerUp; public OnFingerUpEvent OnFingerUpUI; public OnFingerUpEvent OnClick; public OnFingersMoveEvent OnFingersMove; private bool handledThisFrame; private bool isOverUI = false; public bool IsOverUI => isOverUI; # if UNITY_STANDALONE || UNITY_EDITOR private float moveDelta = 2f; private bool isMousePressedLastFrame; private bool isMouseMovedSincePressed; private Vector2 lastMousePosition; private ButtonControl mouseButtonAsFinger; private bool isMosuePressUI; #endif private void Awake() { DontDestroyOnLoad(gameObject); var eventSystem = FindObjectOfType<EventSystem>(); if (eventSystem == null) { DebugUtil.LogError($"找不到EventSystem"); return; } DontDestroyOnLoad(eventSystem.gameObject); } private void OnEnable() { EnhancedTouchSupport.Enable(); Touch.onFingerMove += _OnFingerMove; Touch.onFingerUp += _OnFingerUp; # if UNITY_STANDALONE || UNITY_EDITOR mouseButtonAsFinger = Mouse.current.leftButton; #endif } private void OnDisable() { Touch.onFingerMove -= _OnFingerMove; Touch.onFingerUp -= _OnFingerUp; EnhancedTouchSupport.Disable(); } private void Update() { isOverUI = IsPointerOverUI(); //CheckIsBackKeyDown(); # if UNITY_STANDALONE || UNITY_EDITOR if (IsPointerOverUI() && mouseButtonAsFinger.isPressed && !isMousePressedLastFrame) { isMosuePressUI = true; } if (!IsPointerOverUI() && !mouseButtonAsFinger.isPressed) { isMosuePressUI = false; } var currentMouse = Mouse.current; if (isMousePressedLastFrame && mouseButtonAsFinger.isPressed) { var delta = currentMouse.position.ReadValue() - lastMousePosition; isMouseMovedSincePressed |= delta.sqrMagnitude > float.Epsilon; if (IsPointerOverUI() || isMosuePressUI) { OnFingerMoveUI?.Invoke(delta); } else { OnFingerMove?.Invoke(delta); } } if (!IsPointerOverUI() && !isMosuePressUI) { if (isMousePressedLastFrame && !mouseButtonAsFinger.isPressed) { if (!isMouseMovedSincePressed) { OnClick?.Invoke(currentMouse.position.ReadValue()); } OnFingerUp?.Invoke(currentMouse.position.ReadValue()); isMouseMovedSincePressed = false; } } if (IsPointerOverUI()) { if (isMousePressedLastFrame && !mouseButtonAsFinger.isPressed) { OnFingerUpUI?.Invoke(currentMouse.position.ReadValue()); isMouseMovedSincePressed = false; } } // cache mouse state for next frame isMousePressedLastFrame = mouseButtonAsFinger.isPressed; if (isMousePressedLastFrame) { lastMousePosition = currentMouse.position.ReadValue(); } if (Mouse.current.scroll.ReadValue().y != 0) { OnFingersMove?.Invoke(Mouse.current.scroll.ReadValue().y); } if (Keyboard.current.aKey.isPressed) { OnFingerMove?.Invoke(new Vector2(m