Unity 从零开始的2D游戏开发 —— 碰撞检测 和 用射线实现地面检测

Unity 专栏收录该内容
7 篇文章 2 订阅

本文一部分为半年前所写,时间间隔较大,若有逻辑上的错误敬请见谅。

碰撞检测是2D游戏开发里经常要用到的东西,当我们做个游戏demo的时候,碰撞检测基本上无处不在,利用碰撞检测可以实现一些比较基础功能,比如碰撞,跳跃的地面检测,和NPC交互的检测,拾取物品的检测等等。

 


 

碰撞检测必不可少的是碰撞体组件和刚体组件,在2D游戏里面也就是xxcollider2D和Rigicbody2D,同时也可以将碰撞体设置为触发器,来选择是否要计算碰撞的反馈,可以在碰撞体界面勾选is trigger选择为触发器。可以简单的理解为触发器是没有碰撞体积的碰撞体。

碰撞体和触发器使用到的方法不同:

触发器为:

void OnTriggerEnter2D(Collider2D collider); //当触碰到触发器时

void OnTriggerStay2D(Collider2D collider); //当和触发器保持接触时

void OnTriggerExit2D(Collider2D collider); //当和触发器结束碰撞时

3个方法对应不同的碰撞情况,碰撞体也是基本上一样:
 

void OnCollisionEnter2D(collision collision);

void OnCollisionStay2D(collision collision);

void OnCollisionExit2D(collision collision);

这几种方法里传入的参数都是与自身碰撞的碰撞体或者碰撞信息,可以通过查看参数的信息来知道是谁与自己碰撞,在方法里写点判断,就可以实现基本的碰撞检测,地面检测,将碰撞体设置为触发器挂在NPC和物体上,就可以实现基本的交互和拾取。


射线检测可以用来干很多事情,如射击游戏里面模拟子弹,以及接下来要说到的用来地面检测。

地面检测几乎是每个游戏里必不可少的一个运算,有很多方法可以实现地面检测,而射线是其中常用的一种,语法也很简单。

RaycastHit2D rayhit = Physics2D.Raycast(rayStartPosition, Vector2.down, dis, groundLayer);

2D里面的射线是RaycastHit2D来声明,4个参数分别是射线起点,射线方向,射线的距离以及作用的层级

射线起点是一个vector2类型的向量

射线方向是一个vector2类型的向量,可以用vector里面的默认类型vector2.down来输入一个向下的单位向量

射线的距离是一个float类型,用从射线起点到脚下的距离,这个得自己测量一下常量输入

作用的层级是一个Layermask类型,也就是一个32位的int类型,假如地面层是第n层,可以用1<<n来表示。若有另一层m,可以用1<<n+1<<m来表示,这是比较暴力的方法。

知道了基本的语法之后,可以通过判断rayhit.colloder是否为空来检测是否碰撞到了物体

if (rayhit.collider != null)
{
    return true;
}

设置好地面对应的层之后,就可以通过collider判断是否碰撞到地面了。

 

这就是2D游戏里面常用的地面检测以及碰撞检测的方法。

 

 

 

 

  • 6
    点赞
  • 1
    评论
  • 19
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Zhidai_

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值