Unity的碰撞检测(一)

这篇具有很好参考价值的文章主要介绍了Unity的碰撞检测(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(一)测试前准备工作

        1.创建两个游戏对象,分别取名为”Player”和”Enemy”,并且为名为”Player”的游戏对象设置Tag也为”Player”,二者在场景中如图1所示:

Unity的碰撞检测(一),Unity开发,unity
图 1 绿为Enemy,红为Player

        2.编写脚本组件”TriggerTest”,并挂载到Enemy上,代码如下所示:

using UnityEngine;

public class TriggerTest : MonoBehaviour
{
    /*碰撞器为触发器的碰撞检测方法如下三个*/
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player")) Debug.Log("Trigger Enter");
    }

    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.CompareTag("Player")) Debug.Log("Trigger");
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        if (other.CompareTag("Player")) Debug.Log("Trigger Exit");
    }

    /*碰撞器不为触发器的碰撞检测方法如下三个*/
    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.transform.CompareTag("Player")) Debug.Log("Collider Enter");
    }

    private void OnCollisionStay2D(Collision2D other)
    {
        if (other.transform.CompareTag("Player")) Debug.Log("Collider");
    }

    private void OnCollisionExit2D(Collision2D other)
    {
        if (other.transform.CompareTag("Player")) Debug.Log("Collider Exit");
    }
}

        3.Trigger输出:输出”Trigger Enter”或”Trigger”或”Trigger Exit”;

       4.Collider输出:输出”Collider Enter”或” Collider”或” Collider Exit”。

(二)测试用例

        (1)测试约定:

       碰撞器统一使用BoxCollider2D组件,刚体统一使用Rigidbody2D组件,测试涉及更改的属性有且仅有碰撞器的激活或禁用IsTrigger两个属性,刚体的挂载或卸载,且二者默认属性分别如图2和图3所示:

Unity的碰撞检测(一),Unity开发,unity
图 2 BoxCollider2D默认属性
Unity的碰撞检测(一),Unity开发,unity
图 3 Rigidbody2D默认属性

        (2)非法测试用例:

       A2、A3、A6、A7、A11、A12、A14、A15与(一)中预设冲突,故舍弃。

       B1、B4、B5、B8、B9、B10、B13、B16与(一)中预设冲突,故舍弃。

       A9、A10、A13、A16未挂载碰撞器是一定不可能发生碰撞的测试用例,故舍弃。

       B11、B12、B14、B15未挂载碰撞器是一定不可能发生碰撞的测试用例,故舍弃。

表 1 测试用例

游戏对象

用例序号

是否激活碰撞器

是否挂载刚体

是否挂载TriggerTest

碰撞器是否为触发器

Player

A1

×

×

×

A2

x

×

A3

x

A4

×

×

A5

×

×

A6

×

A7

A8

×

A9

×

×

×

×

A10

×

×

×

A11

×

×

A12

×

A13

×

×

A14

×

×

×

A15

×

×

A16

×

×

×

Enemy

B1

×

×

×

B2

x

×

B3

x

B4

×

×

B5

×

×

B6

×

B7

B8

×

B9

×

×

×

×

B10

×

×

×

B11

×

×

B12

×

B13

×

×

B14

×

×

×

B15

×

×

B16

×

×

×

表 2 测试用例组合

组合序号

测试用例组合

控制台输出

G1

A1、B2

G2

A1、B3

G3

A1、B6

G4

A1、B7

Trigger输出

G5

A4、B2

G6

A4、B3

G7

A4、B6

Trigger输出

G8

A4、B7

Trigger输出

G9

A5、B2

G10

A5、B3

Trigger输出

G11

A5、B6

G12

A5、B7

Trigger输出

G13

A8、B2

Trigger输出

G14

A8、B3

Trigger输出

G15

A8、B6

Trigger输出

G16

A8、B7

Trigger输出

(三)测试总结   

        分析1:对比G4、G8、G12、G16可知,当Enemy具备触发器+刚体时,无论Player的碰撞器是否为触发器或者是否具备刚体,都执行触发器的检测。

       分析2:对比G7和G8可知,当Player仅具备触发器且Enemy具备刚体时,无论Enemy的碰撞器是否为触发器均执行触发器的检测。

       分析3:对比G10和G12可知,当Player具备碰撞器+刚体且Enemy具备触发器时,无论Enemy是否具备刚体均执行触发器的检测。

       分析4:对比G13-G16可知,当Player具备触发器+刚体时,无论Enemy的碰撞器是否为触发器或者是否具备刚体,都执行触发器的检测。

       由分析1-4可知,有效触发的必要条件如下:

       结论1:两个游戏对象必须有至少一个触发器。

       结论2:两个游戏对象至少有一个具备刚体。

(四)碰撞检测相关的API

       (1)OnCollisionEnter()和OnCollisionEnter2D();

       (2)OnCollisionStay()和OnCollisionStay2D();

       (3)OnCollisionExit()和OnCollisionExit2D();

       (4)OnTriggerEnter()和OnTriggerEnter2D();

       (5)OnTriggerStay()和OnTriggerStay2D();

       (6)OnTriggerExit()和OnTriggerExit2D();

        具体看官方关于Monobehaviour类的说明。

(五)问题

       在上面的测试中我们并没有得到Collider输出,所有的输出都是Trigger输出,这个问题的原因是啥?我们在下一篇“Unity的碰撞检测(二)”继续探讨吧。

如果这篇文章对你有帮助,请给作者点个赞吧!  文章来源地址https://www.toymoban.com/news/detail-714781.html

到了这里,关于Unity的碰撞检测(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • unity中的射线碰撞检测

    在Unity中,射线碰撞检测是一种常用的技术,通常用于确定射线与场景中的物体是否相交,并获取相交点的信息。 1.创建射线: 使用 Ray 类或 RaycastHit 结构体创建射线。 Ray 表示射线的起点和方向,而 RaycastHit 用于存储射线与物体相交的信息,如相交点、法线等。 2.发射射线:

    2024年03月17日
    浏览(42)
  • Unity碰撞检测(3D和2D)

    碰撞检测可以说时学习Unity中最重要的一个部分,以为在游戏中,想要游戏进行交互,碰撞时非常重要的,而我在网上查了很多教程,但是都没有成功,后来经过我的仔细检查代码与修改,终于成功了 简单Unity跑酷游戏 简单跑酷游戏 在 zhong_dot 和 Player 两个实体都加上 碰撞体

    2024年02月10日
    浏览(47)
  • Unity中实现碰撞检测的方式

    Unity内置了物理引擎,如Unity Physics和Unity Physics 2D,可以通过给物体添加刚体组件和碰撞体组件来实现碰撞检测。 物理引擎使用物理模拟和碰撞检测算法,可以处理物体之间的物理交互、碰撞响应和力学效果。 物理引擎适用于需要真实物理模拟和动态交互的场景,但对性能要

    2024年02月16日
    浏览(34)
  • Unity中解决碰撞无法检测问题

    Unity版本2021.3.21 提示:这里描述项目中遇到的问题: Unity中两物体碰撞后,没有执行碰撞检测内的代码 两个物体的组件都是齐全的 代码也没有问题 最后看了一下Project Setting界面中的Physics,发现里面碰撞的层级没有勾选 将红框内的勾选上,就正常了

    2024年02月11日
    浏览(58)
  • Unity常用方法-- Collision碰撞检测

    LayerMask 描述 指定要在 Physics.Raycast 中使用的层。 代码 Physics2D.Raycast 函数结构 public static RaycastHit2D Raycast  (Vector2 origin,  Vector2 direction, float distance= Mathf.Infinity, int layerMask= DefaultRaycastLayers, float minDepth= -Mathf.Infinity, float maxDepth= Mathf.Infinity); 参数 origin 射线在 2D 空间中的

    2024年02月03日
    浏览(44)
  • Unity碰撞检测/触发器触发问题

    在制作2D平板冒险游戏的攻击模块时,遇到攻击敌人后无法产生触发器事件的问题。 在玩家游戏对象下有一攻击子对象。子对象碰撞器默认处于禁用状态,当按下攻击键时,通过代码: 来对碰撞器进行激活,敌人有刚体,且并非Static状态。两个物体均有碰撞体,但此时并未触

    2024年02月11日
    浏览(49)
  • unity碰撞检测的几种函数

    OnCollisionEnter(Collision collision):这个函数用于检测两个物体之间的碰撞事件,当两个物体发生碰撞时被调用。其中,参数collision包含了碰撞的详细信息,例如碰撞点、碰撞法线等等。 OnCollisionStay(Collision collision):这个函数用于检测两个物体之间的持续碰撞事件,当两个物体持

    2024年02月04日
    浏览(39)
  • Unity入门7——物理系统之碰撞检测

    一、刚体 Rigid Body ​ 刚体利用体积(碰撞器 Collider)进行碰撞计算,模拟真实的碰撞效果,产生力的作用 ​ 碰撞产生的必要条件: 两个物体都有碰撞器 Collider 至少一个物体有刚体 Mass:质量 默认为千克,质量越大惯性越大 Drag:空气阻力 根据力移动对象时影响空气阻力大

    2024年02月09日
    浏览(49)
  • 【Unity 2D AABB碰撞检测】铸梦之路

    视屏教程地址:https://www.taikr.com/user/192182 AABB 代表的是轴对齐碰撞盒 (Axis-aligned Bounding Box) AABB碰撞盒是指与场景基础坐标轴(2D中的是x和y轴)对齐的长方形的碰撞外形。与坐标轴对齐意味着这个长方形 没有经过旋转 并且它的边线和场景中基础坐标轴平行(例如,左右边线和

    2024年02月16日
    浏览(44)
  • Unity 射线与碰撞范围检测【踩坑记录】

    射线检测在2D和3D的区别比较大 一定要加上对应的Collider组件 对应的函数只检测对应的Collider, Physics.Raycast 是不会检测到Collider 2D的(这个让我有一次debug了好久才发现) 对应API如下 可以使用 Debug.DrawLine(Vector3 origin,Vector3 destination,Color color) 和 Debug.DrawRay(Vector3 origin,Vector3 dir

    2023年04月08日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包