Unity的碰撞检测(一)

news2024/9/25 17:13:23

(一)测试前准备工作

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

图 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所示:

图 2 BoxCollider2D默认属性
图 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的碰撞检测(二)”继续探讨吧。

如果这篇文章对你有帮助,请给作者点个赞吧!  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合肥中科深谷嵌入式项目实战——人工智能与机械臂(二)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

理性推广 | C1N短网址帮您节省运营成本!

今天所讲便是利用短链接“低成本推广”帮你节省隐性成本。 什么是短链接 1.短链接起源 说起短链接起源不得不提到微博,在微博推出后因为有字数限制,一般字数不超过140字,所以微博内容如果发布很长的链接就会占用很多内容,根据这…

OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

1. 介绍 感知哈希算法(Perceptual Hash Algorithm,简称pHash) 是哈希算法的一种,主要用来做相似图片的搜索工作。 2. 原理 感知哈希算法(pHash)首先将原图像缩小成一个固定大小的像素图像,然后…

嵌入式算法——傅里叶变换算法

文章引注 https://mp.weixin.qq.com/s/5VIpNWci9YLY3m4gcYd6-w 摘要 傅里叶变换的核心在于,“任何连续周期信号可以由一组适当的正弦曲线组合而成”,在这个基础上对信号的中特定频率的正弦波进行分解或者重组,基于频率方面分析波形。 1、傅…

java _JDBC 开发

目录 一.封装JDBCUtiles 二.事务 三.批处理 四.数据库连接池 C3P0 Druidf(德鲁伊)阿里 五.Apache-DBUtiles 六.Apache-DBUtils 七.DAO 和增删改查 通用方法 - BasicDao 一.封装JDBCUtiles 说明:在jdbc操作中,获取连接和释放资源&#…

民宿如何经营与管理?【民宿小程序】

随着旅游业的快速发展,越来越多的人选择经营民宿,将自己的房屋开放给旅客入住。然而,要成功经营一家民宿,并保持良好的运营状态,需要有效的管理和营销策略。在这个过程中,民宿小程序能够发挥重要作用。 民宿…

Python---练习:for循环 求1-100的和/所有偶数的和

案例: 使用for循环,求1 ~ 100的和 之前用while循环,做过算出1--100的和。 相关链接: Python--练习:使用while循环求1..100的和-CSDN博客 结合着看看for循环怎么实现。 思考: 先把for循环的基本语法写…

使用udevil自动挂载U盘或者USB移动硬盘

最近在折腾用树莓派(实际上是平替香橙派orangepi zero3)搭建共享文件服务器,有一个问题很重要,如何在系统启动时自动挂载USB移动硬盘。 1 使用/etc/fstab 最开始尝试了用/etc/fstab文件下增加:"/dev/sda1 /home/orangepi/s…

Unity 中忽略图片透明度的 Image 组件的修改版本

只需将此组件添加到画布中的空对象即可。请注意,仅支持简单 图像类型。 using System.Collections.Generic; using UnityEngine; using UnityEngine.Sprites; using UnityEngine.UI; #if UNITY_2017_4 || UNITY_2018_2_OR_NEWER using UnityEngine.U2D; #endif#if U…

分类预测 | MATLAB实现SSA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-BiGRU-Attention数据分类预测(SE注意力机制) 目录 分类预测 | MATLAB实现SSA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLA…

微信小程序如何跳转页面

1.wx.navigateTo:用于跳转到其他页面,并保留当前页面。通过该 API 跳转后,可以通过返回按钮回到原页面。 wx.navigateTo({url: /pages/otherPage/otherPage })2.wx.redirectTo:用于跳转到其他页面,并关闭当前页面。通…

上初三的小伙子做了个windows12网页版

某天逛GitHub突然刷到这个仓库,好奇的点了进去,读完md我懵了,作者才初三?wtf,现在内卷到这个程度了吗!而且start还不低有5.2k。 效果展示 新的版本有很多变化,仅供参考,请以实物为准…

SpringBoot 自动配置@EnableAutoConfiguration

自动配置vs自动装配 Spring有两个名字听起来相似的概念:一个是自动装配,一个是自动配置。他们两个只是听起来相似,实际根本不同。自动装配是autowire,自动配置是autoconfiguration,他们之间没有任何关系,概…

ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南

作者:运维有术 前言 知识点 定级:入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ks-master-1172.16.33.1661650200KubeSp…

翻页电子相册如何制作?看到就是赚到

在日常生活中,我们拿起手机随手一拍,即可记录美丽瞬间。但随着手机里的照片越来越多,这时该怎么办呢?相信很多小伙伴会选择把照片装订成相册,不过,时间一长也都成了压箱底,无人翻看。但除了这一…

sheng的学习笔记-【中】【吴恩达课后测验】Course 3 - 结构化机器学习项目 - 第一周测验

课程3_第1周_测验题 目录:目录 要解决的问题 ① 这个例子来源于实际项目,但是为了保护机密性,我们会对细节进行保护。 ② 现在你是和平之城的著名研究员,和平之城的人有一个共同的特点:他们害怕鸟类。 ③ 为了保护…

MyBatis-Plus 通过updateById更新日期null

date类型的字段为 一、需求: 有时候需要将页面日期重新赋值空,但是Mybatis Plus 默认情况下,baseMapper.updateById方法,当doman中字段值为null,后端并会不更新这个字段 解决方法: 对应的实体类的属性加…

浅谈智能制造

智能制造 如今,同一版本同一型号的手机,几乎是一模一样的。当我们说去选购商品,其实是在有限的型号中选择我们需要的那一款。可是,人的需求千变万化,为什么偏偏要归结到几个固定的型号上去呢?每个人不应该…

2023/10/25MySQL学习

外键约束 在子表添加外键后,不能在主表删除或更新记录,因为存在外键关联 删除外键,注意外键名称时我们添加外键时起的名称 使用cascade操作后,可以操作主表数据,并且子表的外键也会对应改变 set null的话,删除主表对应主键信息后,子表对应外键信息变为空 多表关系 创建中间表 可…

JavaScript进阶 第四天笔记——深浅拷贝、this绑定、防抖节流

JavaScript 进阶 - 第4天 深浅拷贝 浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝:拷贝的是地址 常见方法: 拷贝对象:Object.assgin() / 展开运算符 {…obj} 拷贝对象拷贝数组:Array.prototype.concat() 或者 […arr] 如…