Unity功能测试3D物体和UI的点击事件

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

我们在功能开发中 当UI和3D物体在一起的时候点击事件通常会有这么几种情况

1、UI和3D物体同时响应事件

unity检测点击物体,unity,3d,ui,游戏引擎,c#

这种情况很常见,如果是故意有次功能需求那将不需要改动.实现代码

3D物体上挂载

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PointObjClick : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }
    private void OnMouseDown()
    {
        Click();
    }
    private void Click()
    {
        transform.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();
    }
}

UI上挂载

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

public class PointUIClick : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Click();

        //实现穿透的事件效果
        // ExecuteAll(eventData);
    }

    private void Click()
    {
        transform.GetComponent<Image>().color = Random.ColorHSV();
    }
    private void ExecuteAll(PointerEventData eventData)
    {
        //UGUI 底层会对射线射到的所有物体进行排序 只触发最前面的物体
        List<RaycastResult> results = new List<RaycastResult>();
        //拿到射线下所有的物体 放到集合里
        EventSystem.current.RaycastAll(eventData, results);
        foreach (var item in results)
        {
            if (item.gameObject != gameObject)
            {
                //触发 1、触发对象 2、触发事件 3、触发方式
                ExecuteEvents.Execute(item.gameObject, eventData, ExecuteEvents.pointerClickHandler);
            }
        }
    }
}

这里面ExecuteAll这个方法也可以处理同理响应事件的问题(已注释)

2、UI和3D物体分别响应事件

unity检测点击物体,unity,3d,ui,游戏引擎,c#

这种情况应该是我们理想中的效果,看代码是如何实现的

首先在主相机上添加Physics RayCaster组件

1. 什么是PhysicsRaycaster组件?

PhysicsRaycaster是Unity UGUI中的一个组件,用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上,并将事件传递给相应的UI元素。

2. PhysicsRaycaster的工作原理

PhysicsRaycaster通过发射一条射线来检测UI元素。当射线与UI元素相交时,PhysicsRaycaster会将事件传递给相应的UI元素。

unity检测点击物体,unity,3d,ui,游戏引擎,c#

利用Physics Raycaster这个特性 我们可以把UI和3D的点击事件分开

3D物体挂载

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

public class PointCubeClick : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Click();
    }
    private void Click()
    {
        transform.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();
    }
}

UI上挂载

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

public class PointUIClick : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Click();

        //实现穿透的事件效果
        // ExecuteAll(eventData);
    }

    private void Click()
    {
        transform.GetComponent<Image>().color = Random.ColorHSV();
    }
    private void ExecuteAll(PointerEventData eventData)
    {
        //UGUI 底层会对射线射到的所有物体进行排序 只触发最前面的物体
        List<RaycastResult> results = new List<RaycastResult>();
        //拿到射线下所有的物体 放到集合里
        EventSystem.current.RaycastAll(eventData, results);
        foreach (var item in results)
        {
            if (item.gameObject != gameObject)
            {
                //触发 1、触发对象 2、触发事件 3、触发方式
                ExecuteEvents.Execute(item.gameObject, eventData, ExecuteEvents.pointerClickHandler);
            }
        }
    }
}

3、检测点击的游戏对象是UII还是3D物体

unity检测点击物体,unity,3d,ui,游戏引擎,c#

来看代码实现

UI上挂载

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

public class PointIsUI : MonoBehaviour
{
    //GraphicRaycaster是专门用于Canvas下UI的射线检测的
    private GraphicRaycaster _raycaster;
    // Start is called before the first frame update
    void Start()
    {
        _raycaster = FindObjectOfType<GraphicRaycaster>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (IsUI())
            {
                Debug.LogError("是UI");
            }
            else
            {
                Debug.LogError("不是UI");
            }
        }
    }
    private bool IsUI()
    {
        //New一个点击事件 传入当前事件
        PointerEventData eventData = new PointerEventData(EventSystem.current);
        eventData.pressPosition = Input.mousePosition;
        //PointerEventData.pressPosition
        //按下的时候的指针位置,同样的一次点击事件只有一个
        eventData.position = Input.mousePosition; 
        //PointerEventData .position当前指针的位置,
        //返回一个vector2向量,这个值是一个屏幕坐标,
        //左下角为原点(0, 0),右上角为(屏幕宽, 屏幕高),
        //这个屏幕是根据当前分辨率来的
        List<RaycastResult> results = new List<RaycastResult>(); //拿到射线点击的物体
        _raycaster.Raycast(eventData, results); //射线赋值 到集合里
        return results.Count > 0; //true是UI false不是UI
    }
}

谢谢观看!文章来源地址https://www.toymoban.com/news/detail-752146.html

到了这里,关于Unity功能测试3D物体和UI的点击事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • unity点击3D物体

    目录 一.OnMouse 二.射线检测(首先物体要有Collider 然后挂载脚本) 三.游戏物体 EventTrigger 物体动态事件监听 3.1 静态添加事件触发  3.2 动态添加事件触发  四.通过事件,实现接口IPointerClickHandler 添加一个脚本组件到你的3D物体上,这个脚本将处理点击事件并返回物体信息。例

    2024年02月07日
    浏览(44)
  • unity 点击3D物体

    1. 在场景中添加事件系统 2. 为主相机添加射线检测 3. 为物体挂载以下脚本,物体必须带碰撞体

    2024年02月06日
    浏览(35)
  • app测试必掌握的核心测试:UI、功能测试!

    UI即User Interface (用户界面)的简称。UI 设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由、充分体现软件的定位和特点。手机APP从启动界面开始, 到运行过程,直至退出, UI测试都

    2024年02月04日
    浏览(52)
  • 【学习】接口测试和UI功能测试有什么区别

    接口测试和UI功能测试是软件测试的两个重要方面,它们各有侧重,但同时又是相互补充的。本文将探讨接口测试和UI功能测试的区别,并分析如何通过二者来保证软件的质量。 一、接口测试、UI功能测试的定义 接口测试主要关注软件组件之间的交互,检查它们是否能够正确

    2024年03月22日
    浏览(50)
  • unity3d---物体加点击事件

    目录 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 4.物体单独响应点击事件 5.控制脚本实现各物体的点击事件 6.点击ui时屏蔽 物体点击事件 1.给需要点击点物体加collider   2.层级面板加EventSystem   3. 相机加Physics Raycaster 2d 3d按需添加   4.物体单独响

    2024年02月09日
    浏览(125)
  • Unity UI点击事件系统

    在Unity 的UGUI开发过程中,我们经常需要对UI图片进行操作响应各种处理比如:点击,长点击,长按,拖拽等多种功能的实现,这时原本的Button组件就不够用了 我们需要自己实现一个简单的点击事件系统来响应用户的各种操作,下面可以分析一下思路。 首先你需要提前了解点

    2024年01月17日
    浏览(42)
  • Unity UI不被3D物体遮挡

    UI Shader: 用该Shader创建一个材质,将该材质挂到不被模型遮挡的UI上。 TextMeshPro 设置: 修改TextMesh Pro/Shaders/TMP_SDF.shader 修改如下:

    2024年02月07日
    浏览(57)
  • unity UI 跟随3D物体移动

     

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

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

    2024年03月17日
    浏览(70)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包