UGUI - 判断是否点击在UI 上 Bug,IsPointerOverGameObject()在移动端检测失败

69 篇文章 1 订阅

UGUI - 判断是否点击在UI 上 Bug,IsPointerOverGameObject()在移动端检测失败

原文链接:这里写链接内容

UGUI 提供了一个检测是否点击在UI上的方法 
EventSystem.current.IsPointerOverGameObject(); 
但是该方法在PC上检测正常,结果拿到Android真机测试上,永远检测不到。

在网上找了一些大神的解决方案

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class ClickIsOverUI {

    public static ClickIsOverUI Instance = new ClickIsOverUI();

    public ClickIsOverUI()
    { }

    //方法一, 使用该方法的另一个重载方法,使用时给该方法传递一个整形参数
    // 该参数即使触摸手势的 id
    // int id = Input.GetTouch(0).fingerId;
    public bool IsPointerOverUIObject(int fingerID)
    {
        return EventSystem.current.IsPointerOverGameObject(fingerID);
    }

    //方法二 通过UI事件发射射线
    //是 2D UI 的位置,非 3D 位置
    public bool IsPointerOverUIObject(Vector2 screenPosition)
    {
        //实例化点击事件
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        //将点击位置的屏幕坐标赋值给点击事件
        eventDataCurrentPosition.position = new Vector2(screenPosition.x, screenPosition.y);

        List<RaycastResult> results = new List<RaycastResult>();
        //向点击处发射射线
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);

        return results.Count > 0;
    }

    //方法三 通过画布上的 GraphicRaycaster 组件发射射线
    public bool IsPointerOverUIObject(Canvas canvas, Vector2 screenPosition)
    {
        //实例化点击事件
        PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
        //将点击位置的屏幕坐标赋值给点击事件
        eventDataCurrentPosition.position = screenPosition;
        //获取画布上的 GraphicRaycaster 组件
        GraphicRaycaster uiRaycaster = canvas.gameObject.GetComponent<GraphicRaycaster>();

        List<RaycastResult> results = new List<RaycastResult>();
        // GraphicRaycaster 发射射线
        uiRaycaster.Raycast(eventDataCurrentPosition, results);

        return results.Count > 0;
    }
}

使用

using UnityEngine;
using System.Collections;

public class RayCastUI : MonoBehaviour {

    public Transform target;

    // Update is called once per frame
    void Update () {

#if true  //UNITY_ANDROID || UNITY_IPHONE
        if (Input.touchCount > 0)
        {
            //使用方法一:传递触摸手势 ID
            if (ClickIsOverUI.Instance.IsPointerOverUIObject(Input.GetTouch(0).fingerId))
            {
                Debug.Log("方法一: 点击在UI上");
                if (target != null)
                {
                    target.transform.rotation = Quaternion.Euler(new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, 0));
                }
            }

            //使用方法二:传递触摸手势坐标
            if (ClickIsOverUI.Instance.IsPointerOverUIObject(Input.GetTouch(0).position))
            {             
                Debug.Log("方法二: 点击在UI 上");
            }

            //使用方法三:传递画布组件,传递触摸手势坐标
            if (ClickIsOverUI.Instance.IsPointerOverUIObject(GetComponent<Canvas>(), Input.GetTouch(0).position))
            {
                Debug.Log("方法三: 点击在UI 上");
            }
        }
#endif
    }
}

 

UGUI(Unity User Interface)是Unity引擎中用于创建用户界面的系统。在触摸屏应用中,如果你想让按钮检测用户的触控并判断手指是否停留在按钮区域内,你可以通过以下步骤实现: 1. **添加组件**:首先在按钮上添加`TouchableOpacity`或`Button`组件,这两个都是针对触摸事件的基础组件。 2. **设置事件处理**:在`OnTouchEnter`、`OnTouchStay`和`OnTouchExit`这三个事件处理器中,你可以分别获取触点信息。当手指进入按钮范围(OnTouchEnter),表示手指已经接触到按钮;当手指继续在按钮范围内移动(OnTouchStay),则认为手指停留;当手指离开按钮范围(OnTouchExit),则是离开按钮。 3. **检查位置**:在`OnTouchStay`方法中,检查当前触点的位置是否仍在按钮的边界内,如果在,则认为手指确实停留。通常会比较触点的中心位置和按钮组件的大小或边缘坐标。 4. **响应动作**:在确定手指停留后,可以执行相应的动画、显示提示文字或执行其他你需要的逻辑操作。 ```csharp public class ButtonScript : MonoBehaviour { void OnTouchStay(Touch touch) { if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { // 检查触点是否在按钮内 if (IsPointInsidetouchPosition(touch.position)) { Debug.Log("手指停留"); // 执行停留时的操作... } } } private bool IsPointInside(float x, float y) { // 判断触点位置是否在按钮范围内... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值