我有一个简单的游戏,当用户触摸屏幕时,玩家会跳跃。我已经使用 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()
}
}
使用此代码,如果您点击按钮,主面板将保持活动状态,如果您触摸任何空白点,主面板将处于非活动状态,并执行运行功能。
您可以在变量上使用参数,而不是检查面板是否处于活动状态。