GitHubB站视频为什么要地面检测?射线盒子核心思路

GitHubB站视频为什么要地面检测?射线盒子核心思路

在游戏中,角色跳跃是普通且常见的能力。但就这么看似简单的功能,在实现过程中也会遇到很多问题。

在本篇文章,我将分享地面检测的三种方式。

项目地址

GitHub

B站视频

为什么要地面检测?

在游戏中。用户对在空中的角色和地面的角色可操作方式是不同的。

比如,空中和地面不同的攻击方式、地面上可以下蹲、空中二段跳、触地失败等等。

所以unity射线检测检测不到物体,要实现这种差异,我们首先要知道角色当前的空间位置3D角色,所以地面检测就是必须的。

射线检测

核心思路:

在角色底部向下发出一条射线地图场景,当触碰到地面时,则认为角色在地面上。

代码如下:

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

但是,这种现实会有问题。

当角色在地面边缘或者斜坡时,单条射线会检测不到地面从而导致判断错误。

要解决这个问题也很简单,我们可以增加多几条射线unity射线检测检测不到物体,既可以了。

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

碰撞体

核心思路:

利用 Unity 引擎提供的碰撞体,我们可以监听碰撞函数来完成地面检测逻辑。

代码如下:

  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;
            }
        }

文章来源:https://blog.csdn.net/GG_and_DD/article/details/127437636