Unity防止UI点击穿透

这篇具有很好参考价值的文章主要介绍了Unity防止UI点击穿透。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主要涉及API:

EventSystem.current.IsPointerOverGameObject()

EventSystem.current.IsPointerOverGameObject(Touch.fingerId)

//鼠标点击
if (EventSystem.current.IsPointerOverGameObject()) 
{
    //TODO:点击在了UI上
}

//手机上触屏模式需要传入手指ID
//经测试,始终返回false,未知原因
if (EventSystem.current.IsPointerOverGameObject(touch.fingerId)) 
{
    //TODO:点击在了UI上
}

同时再加上射线检测辅助判断

//放回值list.Count > 0 表示点击到了UI
bool CheckGuiRaycastObjects()
{
    PointerEventData eventData = new PointerEventData(es);
    eventData.pressPosition = Input.mousePosition;//touch.position
    eventData.position = Input.mousePosition;//touch.position

    var results= new List<RaycastResult>();
    curCanvas.GetComponent<GraphicRaycaster>().Raycast(eventData, results);
    //EventSystem.current.RaycastAll(eventData, results);   //使用此方式也可
    return list.Count > 0;
}

完整代码:

    void CheckClickUI()
    {
#if ((UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR)
            //Touch
            int touchCount = Input.touchCount;
            if (touchCount == 1)
            {            
                Touch t = Input.GetTouch(0);
                if(t.phase == TouchPhase.Began)
                {
                    //手机返回值异常,采用||
                    if (EventSystem.current.IsPointerOverGameObject (t.fingerId) || CheckGuiRaycastObjects(t.position))
                    {
                         //点击到UI
                    }
                }          
            }
 
#else
        //Mouse
        if (Input.GetMouseButton(0))
        {
            //PC返回值正常,双重判定
            if (EventSystem.current.IsPointerOverGameObject() && CheckGuiRaycastObjects(Input.mousePosition))
            {
                //点击到UI
            }
        }
#endif
    }
    
    bool CheckGuiRaycastObjects(Vector3 position)
    {
        PointerEventData eventData = new PointerEventData(EventSystem.current);
        eventData.pressPosition = new Vector2(position.x, position.y);
        eventData.position = new Vector2(position.x, position.y);

        var results= new List<RaycastResult>();
        //curCanvas.GetComponent<GraphicRaycaster>().Raycast(eventData, results);//使用canvas进行检测也可
        EventSystem.current.RaycastAll(eventData, results);   
        return results.Count > 0;
    }

遇到的问题:

个人测试在手机上 EventSystem.current.IsPointerOverGameObject(Touch.GetTouch(0).fingerId) 始终返回的是false,不知是什么原因,希望有知道的朋友可以留言告知一下,再次感谢!

暂时做法是,手机上当EventSystem.current.IsPointerOverGameObject返回false时,再执行射线再次检测是否点击到UI文章来源地址https://www.toymoban.com/news/detail-737646.html

到了这里,关于Unity防止UI点击穿透的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity实现点击显示不同UI

    在开发过程中经常遇到切换显示不同UI的需求,实现方案有2套: 1.创建两个场景A/B,在A中点击某个button后触发切换事件后加载B场景现在新的场景信息。优点 是逻辑简单,在不同的场景中创建对应的UI即可,缺点是当两个场景中有重复显示的模型时会有资源重复加载,且模型

    2024年02月12日
    浏览(54)
  • [Unity]UI事件(鼠标进入、离开、点击)

    1、首先继承IPointerEnterHandler、IPointerExitHandler等接口 2、实现其方法 如:OnPointerEnter、OnPointerExit 注意:这些只对UI有效,而OnMouseEnter只对加Collider的非UI有效

    2024年03月17日
    浏览(38)
  • unity的ui怎么显示在鼠标点击位置

    第一种方法: 其实很简单,Input.mousePosition本身就是屏幕坐标(二维),不能直接使用是因为,屏幕空间以像素定义。屏幕的左下为(0,0);右上是(pixelWidth,pixelHeight),nn或者说以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height)而屏幕的基准点在屏幕中心(Scre

    2023年04月17日
    浏览(28)
  • Unity UGUI事件输入,点击UI无反应

    之前被一个特别低级的UI点击问题卡了好久,记录一下,避免之后再犯同样的错误。 UI事件输入未接受到的原因无非就几个,一一排查总能找到原因。 1、若是直接使用的unity组件中的按钮,但是点击按钮没有反应。         1)查找是否被其他UI遮挡         2)查找是否接收

    2024年04月13日
    浏览(36)
  • Unity之手游UI的点击和方向移动

    一 Button的点击 1.1 新建UI - Button 1.2  在Button上面右击添加空物体 1.3  创建脚本挂载到空物体上面  脚本内容添加点击方法,来控制物体的显示隐藏 1.4 按钮上On Click的位置关联空物体,并选择空物体的脚本方法OnMyClick() 1.5 运行后就可能控制物体显示隐藏了 二 方向键控制移 动

    2024年01月21日
    浏览(42)
  • Unity零基础到进阶 | Unity中 屏蔽指定UI点击事件 的多种方法整理

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年03月09日
    浏览(29)
  • Unity功能测试3D物体和UI的点击事件

    我们在功能开发中 当UI和3D物体在一起的时候点击事件通常会有这么几种情况 1、UI和3D物体同时响应事件 这种情况很常见,如果是故意有次功能需求那将不需要改动.实现代码 3D物体上挂载 UI上挂载 这里面ExecuteAll这个方法也可以处理同理响应事件的问题(已注释) 2、UI和3D物体

    2024年02月05日
    浏览(47)
  • unity 模型显示在UI上 并交互(点击、旋转、缩放)

    项目工程:unity模型显示在UI上并交互(点击、旋转、缩放)资源-CSDN文库 1.在Assets创建 Render Texture(下面会用到),根据需要设置Size 2.创建UIRawImage,并把Render Texture赋上  3.创建相机,如下图: 4.基本UI的准备工作完成,剩下的就是代码了,值得一提:相机我不喜欢单独拿出

    2024年02月11日
    浏览(35)
  • 【Unity3D小功能】Unity3D中实现点击‘文字’出现‘UI面板’

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 QQ群:398291828 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 宠粉博主又来了,今天有粉丝问我如何实现点击一段文字然后出现的面板在那段文字附近显示: 深入了

    2024年04月13日
    浏览(42)
  • Unity使用SteamVR2.0实现基本功能(瞬移,抓取物品,射线点击,UI交互等)

     把SteamVR的Player预制件拖到一个空场景,删掉场景内原本的相机 新建一个Plane,当做地板 找到SteamVR的人物瞬移控制器  Teleporting ,把它拖到场景里  我们需要在可以移动的区域,也就是碰撞器上,挂 TeleportArea 脚本 这个脚本会自动修改你的材质球 locked 该区域是否可以移动 markerAc

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包