屏蔽UI事件

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
    }
}
时间: 2024-07-28 16:08:17

屏蔽UI事件的相关文章

UI事件监听的击穿

什么是UI事件监听的击穿 在游戏视图中,有两个UI界面叠在一起的时候,单击一个空白处,却触发了被覆盖在下层了UI界面中的单击事件,这就是单击击穿了上层界面. 假设场景中放置了一个箱子,单击箱子会触发一个开箱事件,如果单击一个UI,恰好UI在视觉上将箱子覆盖了,那么它也许就会触发箱子的单击事件. 如何避免和解决UI事件监听的击穿 第一种方法:用一层BoxCollider覆盖,进行遮挡. 在界面底板上Attach一个BoxCollider. 第二种方法:使用EventMask Unity的Camer

winform屏蔽鼠标事件

方法一:禁用鼠标事件 public partial class Form1 : Form,IMessageFilter { public Form1() { InitializeComponent(); } #region IMessageFilter 成员 public bool PreFilterMessage(ref Message m) { if (m.Msg == 522) { return true; } else { return false; } } #endregion pri

unity UI事件

由于工作需要到持续按键,所以了解了一下unity UI事件,本文主要转载于http://www.cnblogs.com/zou90512/p/3995932.html?utm_source=tuicool&utm_medium=referral,并对相关问题进行解释. 我们最常用到的就是unity的button组件,其实button组件所响应的事件为unity众多ui事件中的PointerClick事件,unity的ui事件如下图所示: 实现响应事件有以下三种: (一)在相关UI控件上挂脚本,脚

执行UI事件阻塞射线场景事件

Unity中鼠标点击NGUI UI时,同时会有射线碰撞到场景物件,从而执行其它表现. 那么问题来了怎么规避同时触发呢, 有个原则就是UI执行顺序第一 那么我们就讲讲主线程执行顺序 1.主线程结构 1 public class GameMain : MonoBehaviour 2 { 3 void Update () 4 { 5 NGUIManager.Instance.Update(); 6 GameSceneManager.Instance.Update(); 7 .... 8 } 9 } 2

javaScript事件——UI事件

UI通常有“与用户交互”的含义,但是js的UI事件并非都与用户操作有关. UI事件通常与window有关,常用有以下这些: load:当页面加载完成后(包括所有外部资源:js,css,图像等等),就会触发window上的load事件. unload:页面完全卸载后,触发.完全卸载时,页面的元素资源都已经不存在,因此不能在unload中操作访问页面资源. resize:页面高度或宽度发生变化时触发. scroll:页面滚动事件.

JS 事件(5)——事件类型——UI事件

UI事件 UI(User Interface,用户界面)事件,指的是那些不一定与用户操作有关的事件. UI事件包括load.unload.abort.error.select.resize.scroll. 这些事件在DOM2级事件中都归为HTML事件:要确定浏览器是否支持DOM2级事件中规定的HTML事件,可以使用如下代码: 1 var isSupported = document.implementation.hasFeature("HTMLEvents", "2.0&qu

Android 处理UI事件

一.概述 在Java和android中,通过事件来与各种输入设备进行沟通. 事件是由OS产生的消息,当某个UI元素被用户以特定方式进行操作时,OS就会将事件消息发送给相应的View对象. 二.监听及事件处理 “处理”(Handle)与“处理程序”(Handler) 三.View类处理UI事件 在应用程序中,每一个UI元素都是彼此不同的实例化View对象,每一个对象都包含专属于该View对象的事件. 在布局中,一个View对象是通过公共的回调(Callback)方法来与应用程序的其它部分进行沟通的

Js屏蔽键盘事件

<script>           function KeyDown(){ //屏蔽鼠标右键.Ctrl+n.shift+F10.F5刷新.退格键            //alert("ASCII代码是:"+event.keyCode);            if ( (window.event.altKey)&&            (  (window.event.keyCode==37)|| //屏蔽 Alt+ 方向键 ←            

在手势中屏蔽响应事件继续向父视图传递

没有屏蔽时候的现象: 屏蔽时候的现象: 源码如下(用到了上一篇教程的源码): // // ViewController.m // BackgroundView // // Created by YouXianMing on 14-10-3. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h" #import "UIView+BackgroundView.h