Unity 触摸计数忽略 UI 输入



我有一个简单的游戏,当用户触摸屏幕时,玩家会跳跃。我已经使用 touchCount 实现了这一点,因为当 touchCount = 1 时,玩家会跳跃。但问题是屏幕上有一个按钮,所以当用户按下按钮时,触摸计数被验证并且玩家跳转。那么如何仅在用户触摸屏幕的非 ui 部分时启用播放器跳转。提前谢谢。

您可以使用EventSystem.current.IsPointerOverGameObject添加检查是否在 UI 上发生触摸

来自 API 的示例用法:

// Check if there is a touch
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
// Check if finger is over a UI element
if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
{
Debug.Log("Touched the UI");
}
}

使用 LinqWhere,您可以将此条件用作过滤器,以便仅考虑那些不在 UI 上的触摸,例如

// Get all touches that are NOT over UI
var validTouches = Input.touches.Where(touch => !EventSystem.current.IsPointerOverGameObject(touch.fingerId)).ToArray();
// This is basically a shortcut for writing something like
//var touchesList = new List<Touch>();
//foreach(var touch in Input.touches)
//{
//    if(!EventSystem.current.IsPointerOverGameObject(touch.fingerId))
//    {
//         touchesList.Add(touch);
//    } 
//}
//var validTouches = touchesList.ToArray();
if(validTouches.Length == 1)
{
// Your jump here
}

这是针对安卓的吧?>

我建议使用 Unity 内置的 ui 按钮来定义活动位置,我认为这应该自动适用于 android。

或者你可以对触摸的位置进行IF语句,因此如果位置低于或高于某个点,它将不会激活。

我有一个函数来运行我的角色。 但我正在处理同样的问题。 有一堆按钮必须被触摸计数忽略。

这是我的代码:

if (Input.touchCount > 0)
{
run()
}

我有一个类来存储主面板,名为游戏控制器。我向包含按钮的主面板添加一个脚本 (btnUI(。借助Unity的UI系统,您可以控制触摸面板上的按钮或空白点。

这是代码。使用IPointerDownHandler可以设计点击情况。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class btnUI : MonoBehaviour, IPointerDownHandler
{
public void OnPointerDown(PointerEventData eventData)
{
GameManager.mainPanel.SetActive(false);
}
}

在您的情况下,此代码可能无法正常工作,您可以像这样添加 IPointerUpHandler:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class btnUI : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public void OnPointerDown(PointerEventData eventData)
{
GameManager.mainPanel.SetActive(false);
}
public void OnPointerUp(PointerEventData eventData)
{
GameManager.mainPanel.SetActive(true);
}
}

我将代码更改为:

if(!GameManager.mainPanel.activeSelf)
{
if (Input.touchCount > 0)
{
run()
}
}

使用此代码,如果您点击按钮,主面板将保持活动状态,如果您触摸任何空白点,主面板将处于非活动状态,并执行运行功能。

您可以在变量上使用参数,而不是检查面板是否处于活动状态。

相关内容

  • 没有找到相关文章

最新更新