Unity射线以及相关点击触发事件的归纳

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


前言

例如:最近在做一些Unity的小游戏需要,需要用到射线检测和点击事件等操作,虽然都是一些很基础的东西但是也折腾了一会,主要有些细节没处理好就会导致不触发,写篇博客学习记录一下吧。


一、射线检测

  1、3D射线检测

  这个是最常用的,常用于3D游戏中通过射线检测来获取鼠标点击的位置来控制任务角色的移动、以及在射击游戏中通过射线检测来进行子弹击中检测等。这里我不细说射线检测的API解析了,关于层级以及忽略自身碰撞体等情况直接查看对应的API即可。代码如下:

        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log("射线检测:" + hit.collider.name);
            }
        }

注意:射线检测是跟碰撞体配合使用的,当我们使用3D射线检测API的时候,需要给被检测的对象加上3D碰撞体。

  2、2D射线检测

这个多用于2D游戏之中,其实和本质3D几乎一直但是在发射射线的时候由于是2D,需要忽略Z轴的影响并且在发射的时候需要将屏幕坐标转换成世界坐标。代码如下:

        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, 1000);
            if (hit.collider != null)
            {
                Debug.Log("射线检测:" + hit.collider.name);
            }
        }

注意:2D检测需要添加2D碰撞体,且需要进行屏幕坐标到世界坐标的转换。

二、鼠标按下事件OnMouseDown

当我们需要在点击某个物体(非UGUI)的时候,我们希望对自己本身和相关联的对象进行一系列的操作,这个时候我们就会用到这个函数,并且这个函数是自动触发的。但是必须要挂在在非UGUI的物体上。代码如下:

    private void OnMouseDown()
    {
        //这个函数的触发需要依赖碰撞体,并且这个脚本必须挂在在检测的物体上且只能在点击自己碰撞体的时候才会触发,类似于IPointClickHanlder这些接口事件触发一样
        Debug.Log("鼠标按下");
    }

注意:这个函数是依赖于碰撞体的而且必须要挂载在非UGUI的物体上才会触发,还有对应的鼠标拖拽(OnMouseDrag())、鼠标抬起(OnMouseUp()、鼠标进入(OnMouseEnter)等等类似的函数,几乎都是一样的只是触发条件不一样。

三、UGUI常用检测接口

对于UGUI的物体,我们也经常需要对鼠标在其上面的操作状态来进行对应的操作和事件响应,这就要用到我们UGUI中的事件系统了。我们只需要继承对应的鼠标操作接口,然后在接口实现函数中进行对应的操作即可。包含有:鼠标进入(IPointerEnterHandler)、鼠标点击(IPointerClickHandler)、鼠标按下(IPointerDownHandler)等等。具体部分代码如下:

public class UGUI检测 : MonoBehaviour, IPointerClickHandler,IPointerDownHandler,IPointerEnterHandler
{
    //这些接口的检测都是基于射线检测的,在UGUI中需要勾选UI组件的Raycaset Target,否则无法触发
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("鼠标点击:" + transform.name);
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("鼠标按下");
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
         Debug.Log("鼠标进入");
    }

}

注意:实现接口的脚本必须挂载在需要监听的UGUI物体上,并且挂载的UGUI物体的Raycast Target是需要勾选的,否则无法被检测到。这些事件的触发是基于UGUI的事件系统的,所以在使用的时候务必确保Unity项目的Hierarchy面板必须有一个物体挂载了EventSystem.

四、UGUI射线检测

有时我们也需要在UGUI中进行射线的检测来获取我们当前点击到的UGUI物体,这种方法也是基于UGUI事件系统而来的。具体实现代码如下:

    /// <summary>
    /// 通过射线检测获得点击的UI物体
    /// </summary>
    /// <param name="position">输入的点</param>
    /// <returns></returns>
    public GameObject GetFirstPickGameObject(Vector2 position)
    {
        //创建事件对象
        EventSystem eventSystem = EventSystem.current;
        PointerEventData pointerEventData = new PointerEventData(eventSystem);
        pointerEventData.position = position;

        //射线检测结果列表
        List<RaycastResult> uiRaycastResultCache = new List<RaycastResult>();
        //对UI元素进行射线检测
        eventSystem.RaycastAll(pointerEventData, uiRaycastResultCache);
        //判断结果列表的数量并且输出第一个检测到的物体
        if (uiRaycastResultCache.Count > 0)
        {
            return uiRaycastResultCache[0].gameObject;
        }
        return null;
    }
    private void Update()
    {
        //射线检测UI
        if (Input.GetMouseButtonDown(0))
        {
            GameObject go = GetFirstPickGameObject(Input.mousePosition);
            if (go)
            {
                Debug.Log("检测到点击的物体:" + go.name);
            }
        }
    }

注意:由于这种检测方法也是基于Unity中的UGUI事件系统的所以也需要勾选被检测UGUI物体的Raycast Target允许接受射线,并且在Hierarchy面板中也需要进行EventSystem组件的挂载,这个函数是可以检测到当前面板中的所有接收射线的UI的,无需挂在在特定的物体上。

五、拓展

在游戏过程中我们经常需要判断鼠标是否点击在UI上,假如点击在UI上的话我们就不需要让人物移动到我们点击的目标点了,以及我们在一些情况下需要进行UI穿透等操作,这些都需要我们检测是否点击在UI上。我们可以使用以下代码判断当前是否点击在UI上。如下:

        //检测是否点击到了UGUI物体
        if (Input.GetMouseButtonDown(0))
        {
            if (EventSystem.current.IsPointerOverGameObject())
            {
                Debug.Log("当前点击在物体上了");
            }
        }

注意:这个也是基于UGUI事件系统的,需要开启接收射线(Raycast Target),并且场景中有挂载EventSystem。无需挂在在特定物体上且只检测UGUI对象。

六、总结

对于不同的情况我们可以选择自己需要的以及最方便、高效的检测方法,以上为个人学习记录,如有不对的地方希望大家指正讨论,一起学习进步。文章来源地址https://www.toymoban.com/news/detail-789866.html

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

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

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

相关文章

  • Unity之OpenXR+XR Interaction Toolkit实现 射线和物体交互事件回调

    前面我们介绍了如何抓取物体,今天我们来说一下如何和3D的物体进行交互,得到接触的事件回调。 交互的两种方式: 1.直接抓取或者射线抓取物体,得到接触回调 2.射线或者手部触摸物体后,得到接触回调 我们需要准备好Unity工程和环境配置 有了前文:Unity之OpenXR+XR Inter

    2024年02月13日
    浏览(46)
  • 【Unity功能】鼠标移动触发事件方法

     方法一:方法触发 注意:UGUI不能使用该方法 方法二:Event Trigger 注意:需要场景中包含EventSystem(在添加trigger组件后自动添加);UGUI可以使用 方法三:

    2024年01月25日
    浏览(25)
  • unity 点击事件

    目录 点击按钮,显示图片功能教程 第1步添加ui button,添加ui RawImage 第2步 添加脚本: 第3步,把脚本拖拽到button,点击button,设置脚本的变量, GameObject添加 Component组件 第1步添加ui button,添加ui RawImage 第2步 添加脚本: 第3步,把脚本拖拽到button,点击button,设置脚本的变量

    2024年02月19日
    浏览(24)
  • Unity 2D点击事件、碰撞

    1.事件封装 定义脚本,实现事件相关接口即可 2.点击对象必须要添加BoxCollider2D脚本 3.摄像机上必须添加Physics2DRaycaster脚本 4.GameInputEvent2D 事件必须添加在挂载Physics2DRaycaster的对象及其父类身上。 5.如果要有碰撞或者触发器回调,碰撞其中之一要添加Rigidbody2D脚本,且不能设置

    2024年02月09日
    浏览(28)
  • Unity实现文本点击事件

    写在前面的一些碎碎念: 好久没有来写文章了,主要是这一两年找了一份不错的工作,进入了舒适区,工作上的功能没有什么创新,都是以前做过的功能。这不,最近开发一款类似传奇的手游,需要实现聊天栏文字点击的效果,今天就来分享一下。 直接上代码,组件用的是

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

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

    2024年01月17日
    浏览(31)
  • unity鼠标单击物体与双击物体触发不同的事件

    下面举例在unity里面Canvas下面添加一个image,当鼠标移动到image点击一次触发事件 Debug.Log(“SingleClick!”);当鼠标在image点击两次触发事件 Debug.Log(“DoubleClick!”);鼠标双击和单机出现不同的响应事件 在Canvas或者需要点击的父物体上添加组件EventTrigger,打开 Add New Trigger 的菜单,添

    2024年02月11日
    浏览(34)
  • Unity UGUI实现点击事件穿透

     代码很简单如下 将此代码挂载到上层节点上即可 使用此方案遇到的一些问题以及处理方法 1.下层Button没响应问题 如果只传递一层的情况 Button的Text文本 或者Button下面有遮挡物 并且Raycast Target是true的情况它会传递给Text或者 其他遮挡物 而Button 不会收到点击消息 所以如果想

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

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

    2024年03月17日
    浏览(38)
  • 【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件

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

    2024年01月22日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包