【Unity300个技巧】检测物体在地面的三种方式

这篇具有很好参考价值的文章主要介绍了【Unity300个技巧】检测物体在地面的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在游戏中,角色跳跃是普通且常见的能力。但就这么看似简单的功能,在实现过程中也会遇到很多问题。
在本篇文章,我将分享地面检测的三种方式。

项目地址

GitHub
B站视频

为什么要地面检测?

在游戏中。用户对在空中的角色和地面的角色可操作方式是不同的。
比如,空中和地面不同的攻击方式、地面上可以下蹲、空中二段跳、触地失败等等。
所以,要实现这种差异,我们首先要知道角色当前的空间位置,所以地面检测就是必须的。

射线检测

核心思路:
在角色底部向下发出一条射线,当触碰到地面时,则认为角色在地面上。
【Unity300个技巧】检测物体在地面的三种方式
【Unity300个技巧】检测物体在地面的三种方式

代码如下:

        void Update()
        { 
  	        // TODO 避免检测太频繁影响性能,可以增大检测间隔时间
            var raycastAll = Physics2D.RaycastAll(transform.position, Vector2.down, 0.1f, layerMask);
            if (raycastAll.Length > 0)
            {
      	         // 在地面
                 isGrounded = true;
            }
            else
            {
                   // 离地
                 isGrounded = false;
            }
        }

但是,这种现实会有问题。
当角色在地面边缘或者斜坡时,单条射线会检测不到地面从而导致判断错误。
【Unity300个技巧】检测物体在地面的三种方式
【Unity300个技巧】检测物体在地面的三种方式
要解决这个问题也很简单,我们可以增加多几条射线,既可以了。
【Unity300个技巧】检测物体在地面的三种方式

但是这样实现起来有点繁琐,有没有更方便的方法呢?

碰撞体

核心思路:
利用 Unity 引擎提供的碰撞体,我们可以监听碰撞函数来完成地面检测逻辑。
【Unity300个技巧】检测物体在地面的三种方式
代码如下:

  void OnTriggerStay2D(Collider2D other)
        {
            if (other.CompareTag("Ground"))
            {
                    // 在地面
                    isGrounded = true;
            }
        }

        void OnTriggerExit2D(Collider2D other)
        {
           // 离地
           isGrounded = false;
     
        }

通过调整碰撞器的大小,已经可以满足我们日常开发需求了。
如果你不想添加多个碰撞器,那可以试试下面的射线盒子。

射线盒子

核心思路:
也是利用射线检测,只是从多条射线换成射线盒子。由线变成面。
代码如下:

 void Update()
        { 
            var raycastAll = Physics2D.OverlapBoxAll(transform.position,  new Vector2(0.4f,0.4f), 0,layerMask);
            if (raycastAll.Length > 0)
            {
                // 在地面
                isGrounded = true;
            }
            else
            {
                // 离地
                isGrounded = false;
            }
        }

【Unity300个技巧】检测物体在地面的三种方式

以上就是本篇的内容。如果你觉得还不错,可以点个赞和关注噢~文章来源地址https://www.toymoban.com/news/detail-405005.html

到了这里,关于【Unity300个技巧】检测物体在地面的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity在物体内部发射射线检测不到物体的解决方式

    在Unity2018.1.18上不大好用。

    2024年02月15日
    浏览(36)
  • Unity物体往下掉 如何站在地面上

    为了实现人物能站在平面上,给人物添加刚体并勾选use gravity后,人物一直往下掉 1.给人物添加collider组件,默认不勾选is Trigger 2.collider要把人物包围(最好要把人物的脚包围) 在box collider组件的center与size选项可以调整包围盒大小 3.运行后就可以站在地面了 4.如果发现人物会

    2023年04月08日
    浏览(38)
  • unity-2D游戏地面检测 三射线检测

        2D游戏中跳跃是不可或缺的功能,要实现跳跃功能,就必须进行地面检测!常规方法是使用一根往角色下方延伸的射线检测,但是这种方法在一些复杂不规则的地面效果通常不尽人意。通过增加射线数量,即可完善这种方法的不足,达到在复杂地面也能正确检测角色是否

    2024年02月15日
    浏览(39)
  • 基于YOLOv8深度学习的无人机视角地面物体检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴们点赞、关注! 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】

    2024年03月21日
    浏览(72)
  • Unity三种物体溶解方法

    Dissolve1-3 该方法的效果好坏在于噪声纹理的分布。本例利用SD的Blend节点,将Noise贴图和渐变贴图进行正片叠底操作,并简单调整边缘边缘大小,得到如下所示的噪声贴图。 制作的遮罩为四周较暗,且对角线轴向向内亮度递增,使得最终的溶解效果从四周向内部溶解。 shader要

    2023年04月09日
    浏览(35)
  • selenium的三种等待方式

    设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。 缺点:不智能,使用太多的sleep会影响脚本运行速度。 使用方法:time.sleep(delay) 使用举例:打开百度,强制等待5秒 (无条件等待,在一个时间段内等待) 一次设置,全局生效。 不要当作固定等待

    2023年04月13日
    浏览(48)
  • Servlet的三种映射方式

    Servlet支持三种映射方式,以达到灵活配置的目的。 首先先创建Servlet(创建方式略),然后再web.xml中就行配置。 配置方式:         (1)、 指名道姓的方式         注:此种方式,只有和映射配置一模一样时,Servlet才会接收和响应来自客户端的请求。 示例:         (

    2024年02月06日
    浏览(45)
  • redis的三种集群方式

    redis有三种集群方式:主从复制,哨兵模式和集群。     1.主从复制   主从复制原理:   从服务器连接主服务器,发送SYNC命令;  主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;  主服务器BGSAVE执行完后,向所有从服务器

    2024年02月13日
    浏览(49)
  • 单点登录的三种方式

    因为一个项目种有多个服务组成,每个服务都是独立的,如果登录的时候在一个服务种,那么其他的服务是显示不了的,所以就有了单点登录。 所谓单点登录就是一处登录,处处登录。 第一种方式:session广播机制实现 第一种当时的的原理是session的复制,就是在多个服务中

    2024年02月15日
    浏览(50)
  • 生成DLL的三种方式

    生成DLL的三种方式 1. 用命令行完成dll的新建与调用 2. 在VS中生成dll文件 首先需要cl编译器以及link连接器来完成后续操作。 新建一个dll_demo.cpp文件 ,此文件中的函数是我们想要封装成dll的函数。用写字板创建一个新的文件,文件名可自己选择(这里创建一个dll_demo),文件后

    2024年02月04日
    浏览(75)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包