Andrew_STOP_RU_AGRESSION_IN_UA Asked:2020-01-29 01:58:57 +0000 UTC2020-01-29 01:58:57 +0000 UTC 2020-01-29 01:58:57 +0000 UTC 如何在 Unity 中捕捉滑动/滑动事件? 772 在许多游戏中,您需要捕捉手势,包括手势。滑动手势。 c# 1 个回答 Voted Best Answer Andrew_STOP_RU_AGRESSION_IN_UA 2020-01-29T01:58:57Z2020-01-29T01:58:57Z 如果需要一个简单的实现而不使用外部资产 要使用下面的课程,只需订阅即可 SwipeDetector.OnSwipe += SomeMethodCalledBySwipe; 和一个示例方法: private void SomeMethodCalledBySwipe(SwipeData data){ if (data.direction == .Left) Debug.Log("swipe Left"); } 班级代码: using System; using UnityEngine; public class SwipeDetector : MonoBehaviour { private Vector2 _fingerDownPosition; private Vector2 _fingerUpPosition; [SerializeField] private bool _detectSwipeOnlyAfterRelease = false; [SerializeField] private float _minDistanceForSwipe = 20f; public static event Action<SwipeData> OnSwipe = delegate { }; private void Update() { SwipeDetectLogic(); } private void SwipeDetectLogic() { foreach (Touch touch in Input.touches) { if (touch.phase == TouchPhase.Began) { _fingerUpPosition = touch.position; _fingerDownPosition = touch.position; } if (!_detectSwipeOnlyAfterRelease && touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Ended) { _fingerDownPosition = touch.position; DetectSwipe(); } } } private void DetectSwipe() { if (SwipeDistanceCheckMet()) { if (IsVerticalSwipe()) { var direction = _fingerDownPosition.y - _fingerUpPosition.y > 0 ? SwipeDirection.Up : SwipeDirection.Down; SendSwipe(direction); } else { var direction = _fingerDownPosition.x - _fingerUpPosition.x > 0 ? SwipeDirection.Right : SwipeDirection.Left; SendSwipe(direction); } _fingerUpPosition = _fingerDownPosition; } } private bool IsVerticalSwipe() { return VerticalMovementDistance() > HorizontalMovementDistance(); } private bool SwipeDistanceCheckMet() { return VerticalMovementDistance() > _minDistanceForSwipe || HorizontalMovementDistance() > _minDistanceForSwipe; } private float VerticalMovementDistance() { return Mathf.Abs(_fingerDownPosition.y - _fingerUpPosition.y); } private float HorizontalMovementDistance() { return Mathf.Abs(_fingerDownPosition.x - _fingerUpPosition.x); } private void SendSwipe(SwipeDirection direction) { SwipeData swipeData = new SwipeData() { Direction = direction, StartPosition = _fingerDownPosition, EndPosition = _fingerUpPosition }; OnSwipe(swipeData); } } public struct SwipeData { public Vector2 StartPosition; public Vector2 EndPosition; public SwipeDirection Direction; } public enum SwipeDirection { Up, Down, Left, Right } 可视化器/记录器代码(可选): using UnityEngine; [RequireComponent(typeof(LineRenderer))] public class SwipeDebugger : MonoBehaviour { [SerializeField] public bool _logging; [SerializeField] public bool _drawSwipe; private LineRenderer _lineRenderer; private float _zOffset = 10; private void Awake() { _lineRenderer = GetComponent<LineRenderer>(); SwipeDetector.OnSwipe += DrawSwipe; SwipeDetector.OnSwipe += LogSwipee; } private void DrawSwipe(SwipeData data) { if (_drawSwipe) { Vector3[] positions = new Vector3[2]; positions[0] = Camera.main.ScreenToWorldPoint(new Vector3(data.StartPosition.x, data.StartPosition.y, _zOffset)); positions[1] = Camera.main.ScreenToWorldPoint(new Vector3(data.EndPosition.x, data.EndPosition.y, _zOffset)); _lineRenderer.positionCount = 2; _lineRenderer.SetPositions(positions); } } private void LogSwipee(SwipeData data) { if (_logging) Debug.Log("Swipe in Direction: " + data.Direction); } } 如果您需要更灵活的解决方案: 还有一个Lean Touch资产:https ://assetstore.unity.com/packages/tools/input-management/lean-touch-30111 在那里,滑动更加灵活(这远非总是必要的,也远非总是加分)并支持许多功能,如录音、对角滑动、触摸路径等等,您不必自己编写。
如果需要一个简单的实现而不使用外部资产
要使用下面的课程,只需订阅即可
和一个示例方法:
班级代码:
可视化器/记录器代码(可选):
如果您需要更灵活的解决方案:
还有一个Lean Touch资产:https ://assetstore.unity.com/packages/tools/input-management/lean-touch-30111
在那里,滑动更加灵活(这远非总是必要的,也远非总是加分)并支持许多功能,如录音、对角滑动、触摸路径等等,您不必自己编写。