如何使用滑动输入选择多个按钮
How to selected multiple buttons with swipe input
我正在制作一个类似于 Wordscapes 的游戏,我一直在尝试找出一种通过滑动来 select 字母的方法。我是移动输入的新手,所以我不确定下一步该做什么。这是我在互联网上找到的输入脚本,并根据自己的喜好进行了一些修改。它按预期工作,但只检测到一次滑动动作。如何在用户滑动按钮时触发 onclick 事件?如果可能的话,我想将该信息发送给 OnSwipe 委托(因为我使用其他脚本中的它来处理滑动事件)
我认为从相机进行光线投射是最好的选择。也许有人可以帮我修改这段代码,因为我不完全了解如何去做。谢谢!
// Class used for detecting touch input (Swipe Exclusive)
public class TouchInput: MonoBehaviour {
public static event Action<SwipeData> OnSwipe = delegate { };
private Vector2 startPosition;
private Vector2 endPosition;
private float moveDistanceY = 0f;
private float moveDistanceX = 0f;
private SwipeDirection sDirection = new SwipeDirection();
/// <summary>
/// Update is called once per frame
/// </summary>
private void Update() {
foreach (Touch touch in Input.touches) {
if (touch.phase == TouchPhase.Began) {
endPosition = touch.position;
startPosition = touch.position;
} else if (touch.phase == TouchPhase.Ended) {
startPosition = touch.position;
DetectSwipe();
}
}
}
/// <summary>
/// Handles the detection of swipes
/// </summary>
private void DetectSwipe() {
moveDistanceY = Mathf.Abs(startPosition.y - endPosition.y);
moveDistanceX = Mathf.Abs(startPosition.x - endPosition.x);
if (moveDistanceX > 20f || moveDistanceY > 20f) {
if (moveDistanceY > moveDistanceX) {
sDirection = startPosition.y - endPosition.y > 0 ? SwipeDirection.Up : SwipeDirection.Down;
SendSwipe(sDirection);
} else {
sDirection = startPosition.x - endPosition.x > 0 ? SwipeDirection.Right : SwipeDirection.Left;
SendSwipe(sDirection);
}
endPosition = startPosition;
}
}
/// <summary>
/// Sends data about the swipe to the "OnSwipe" Delegate
/// </summary>
private void SendSwipe(SwipeDirection dir) {
SwipeData swipeData = new SwipeData() {
Direction = dir,
StartPosition = startPosition,
EndPosition = endPosition
};
OnSwipe(swipeData);
}
使用 EventSystem 和适当的回调。这是在 Unity3D 中为桌面和移动设备进行输入的现代方式。您将使用拖动处理程序。跟踪您拖过的 UI 个元素,如果每帧与前一个元素不同,则只添加一个。
This video has a good tutorial 仍然适用于今天的 EventSystem。
我正在制作一个类似于 Wordscapes 的游戏,我一直在尝试找出一种通过滑动来 select 字母的方法。我是移动输入的新手,所以我不确定下一步该做什么。这是我在互联网上找到的输入脚本,并根据自己的喜好进行了一些修改。它按预期工作,但只检测到一次滑动动作。如何在用户滑动按钮时触发 onclick 事件?如果可能的话,我想将该信息发送给 OnSwipe 委托(因为我使用其他脚本中的它来处理滑动事件)
我认为从相机进行光线投射是最好的选择。也许有人可以帮我修改这段代码,因为我不完全了解如何去做。谢谢!
// Class used for detecting touch input (Swipe Exclusive)
public class TouchInput: MonoBehaviour {
public static event Action<SwipeData> OnSwipe = delegate { };
private Vector2 startPosition;
private Vector2 endPosition;
private float moveDistanceY = 0f;
private float moveDistanceX = 0f;
private SwipeDirection sDirection = new SwipeDirection();
/// <summary>
/// Update is called once per frame
/// </summary>
private void Update() {
foreach (Touch touch in Input.touches) {
if (touch.phase == TouchPhase.Began) {
endPosition = touch.position;
startPosition = touch.position;
} else if (touch.phase == TouchPhase.Ended) {
startPosition = touch.position;
DetectSwipe();
}
}
}
/// <summary>
/// Handles the detection of swipes
/// </summary>
private void DetectSwipe() {
moveDistanceY = Mathf.Abs(startPosition.y - endPosition.y);
moveDistanceX = Mathf.Abs(startPosition.x - endPosition.x);
if (moveDistanceX > 20f || moveDistanceY > 20f) {
if (moveDistanceY > moveDistanceX) {
sDirection = startPosition.y - endPosition.y > 0 ? SwipeDirection.Up : SwipeDirection.Down;
SendSwipe(sDirection);
} else {
sDirection = startPosition.x - endPosition.x > 0 ? SwipeDirection.Right : SwipeDirection.Left;
SendSwipe(sDirection);
}
endPosition = startPosition;
}
}
/// <summary>
/// Sends data about the swipe to the "OnSwipe" Delegate
/// </summary>
private void SendSwipe(SwipeDirection dir) {
SwipeData swipeData = new SwipeData() {
Direction = dir,
StartPosition = startPosition,
EndPosition = endPosition
};
OnSwipe(swipeData);
}
使用 EventSystem 和适当的回调。这是在 Unity3D 中为桌面和移动设备进行输入的现代方式。您将使用拖动处理程序。跟踪您拖过的 UI 个元素,如果每帧与前一个元素不同,则只添加一个。
This video has a good tutorial 仍然适用于今天的 EventSystem。