using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; [RequireComponent(typeof(ProcessInput))] public class ProcessInputModule : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { // 仅仅追踪两根手指 private InputPointerData[] _fingers; public ProcessInput processInput { get; private set; } public ProcessCamera processCamera { get; private set; } // 当前是操作摄像机还是角色运动 public bool isCameraMode { get; private set; } private bool _clickOnPointerUp; public event UnityAction onCameraModeChange; private void Awake() { processInput = GetComponent(); processCamera = new ProcessCamera(); _fingers = new InputPointerData[2]; for (var i = 0; i < _fingers.Length; i++) _fingers[i] = new InputPointerData(); SetCameraModel(true); } #if UNITY_EDITOR || UNITY_STANDALONE private void Update() { var mouseWheel = Input.GetAxis("Mouse ScrollWheel"); if (mouseWheel != 0f) processCamera.ScaleCamera(mouseWheel * 800f); #if UNITY_EDITOR if (Input.GetKeyDown(KeyCode.Space)) SetCameraModel(!isCameraMode); #endif } #endif public void SetCameraModel(bool cameraMode) { if (isCameraMode != cameraMode) { _clickOnPointerUp = false; isCameraMode = cameraMode; if (isCameraMode) processInput.EndTouchPos(); if (onCameraModeChange != null) onCameraModeChange(isCameraMode); } } #region interface private void CleanFingers() { _clickOnPointerUp = false; for (var i = 0; i < _fingers.Length; i++) _fingers[i].pointerId = null; if (isCameraMode) { // 不需要处理 } else processInput.EndTouchPos(); } private void OnApplicationFocus(bool hasFocus) { // App失去焦点时,释放当前输入状态 if (!hasFocus) CleanFingers(); } // 注:任意被追踪的手指抬起,清除全部手指信息而不是回滚到单手指 public void OnPointerUp(PointerEventData eventData) { // 检查是否触发抬起点击 if (isCameraMode && _clickOnPointerUp) { if (_fingers[0].pointerId == eventData.pointerId) processInput.StartOneFrameTouch(eventData.position); } _clickOnPointerUp = false; var remove = false; for (var i = 0; i < _fingers.Length; i++) if (_fingers[i].pointerId == eventData.pointerId) { remove = true; break; } if (remove) CleanFingers(); } public void OnPointerDown(PointerEventData eventData) { if (_fingers[0].pointerId == null) { _fingers[0].pointerId = eventData.pointerId; _fingers[0].lastPos = eventData.position; // 常规Touch开始 if (isCameraMode) _clickOnPointerUp = true; else processInput.StartTouchPos(eventData.position); if (FunctionExLogic.Instance() != null) FunctionExLogic.Instance().ShowDetail(false); } else if (_fingers[1].pointerId == null) { _clickOnPointerUp = false; _fingers[1].pointerId = eventData.pointerId; _fingers[1].lastPos = eventData.position; // 进入摄像机缩放模式 if (isCameraMode) { } else processInput.EndTouchPos(); } } public void OnDrag(PointerEventData eventData) { _clickOnPointerUp = false; // 单手指模式 if (_fingers[1].pointerId == null) { if (_fingers[0].pointerId == eventData.pointerId) { if (isCameraMode) processCamera.MoveCamera(eventData.delta); else processInput.MoveTouchPos(eventData.position); } } // 双手指模式 else { InputPointerData current = null; InputPointerData other = null; if (_fingers[0].pointerId == eventData.pointerId) { current = _fingers[0]; other = _fingers[1]; } else if (_fingers[1].pointerId == eventData.pointerId) { current = _fingers[1]; other = _fingers[0]; } if (current != null) { current.lastPos = eventData.position; var line = eventData.position - other.lastPos; if (line != Vector2.zero) { line = line.normalized; var scale = Vector2.Dot(line, eventData.delta); processCamera.ScaleCamera(scale); } } } } #endregion public class InputPointerData { public int? pointerId; public Vector2 lastPos; } }