首先如果碰撞要产生,那么其必要条件是:

  • 至少一个物体有刚体
  • 两个物体都必须有碰撞器

碰撞和触发的区别是:

  • 碰撞会产生实际的物理效果
  • 触发看起来不会产生碰撞但是可以通过函数监听触发

碰撞检测主要用于实体物体之间差生物理效果时使用


1、什么时范围检测

游戏中瞬时的攻击范围判断一般会使用范围检测,例如:

  • player在前方5m处释放一个地刺魔法,在此处范围内的对象都将受到地刺伤害
  • 玩家攻击,在前方1m圆形范围内对象都受到伤害

类似这种没有实体物体,只想要检测在指定某一个范围内是否让地方收到伤害时,便可以使用范围判断,简而言之,在指定位置进行范围判断,我们可以得到处于指定范围内的对象,目的是对对象进行处理,比如受伤、减血等待

2、如何进行范围检测

必备条件:想要被范围检测到的物体,必须具备碰撞器

注意:

  • 范围检测相关API,只有当执行该句代码时,进行一次范围检测,它是瞬时检测的,后面再有新的碰撞器在范围检测里也不会有任何反应,除非放在Update里
  • 范围检测相关API,并不会真正产生一个碰撞器,只是碰撞判断计算而已

范围检测API

(1)盒状范围检测

// 参数1:立方体中心点(Vector3)
// 参数2:立方体三边大小(Vector3) —— 长宽高的一半
// 参数3:立方体角度(Quaternion)
// 参数4:检测指定层级,不填检测所有层(int ——> 1 << LayerMast.NameToLyaer("UI"))
// 参数5:是否忽略触发器
//        UseGlobal-使用全局设置;Collide-检测触发器,
//        Ignore:忽略触发器,不填使用UseGlobal
// 返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
Collider[] colliders = Physics.OverlapBox(params);

重要知识点:

关于层级,通过名字得到层级编号 LayerMast.NameToLayer,我们需要通过编号左移构建二进制数,这样每一个编号的层级都是对应位为1的2进制数。我们通过位运算可以选择想要检测的层级,好处是,一个int可以表示所有想要检测的层级信息(通过【 或】 运算进行多层的组合),

例如: 1 << LayerMast.NameToLayer("UI") | 1 << LayerMast.NameToLayer("Default")

还有一个方法是可以通过GetMas——>LayerMast.GetMast("UI", "Default");

可以检测UI层和Default层。内部实现是对应位的二进制数进行 【与】 操作,如果为0,那么就不检测该层,例如 10001 与 00010,与操作的结果是0,那么就知道不检测id=1的Layer层了, 如果要排除其中某一层,其他层都要检测,可以用 【异或】操作;

还有一个API可以返回碰撞到的碰撞器数量,参数基本和上面的API一样,除了它需要传入一个collider数组进行存储结果,相当于是一个缓冲区,返回值也是最终coliider中存储的数组长度

Collider[] colliders = new Colloder[];
Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders);// ------------------------------------------
if (Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders) != 0) {// TODO....
}

以当前物体的前一米内的范围为例:

Collider[] colliders = Physics.OverlapBox( this.transform.position + this.transform.forward,Vector3.one * 0.5, this.transform.rotation,1 << LayerMast.NameToLayer("Monster"));

这里一定要加上旋转角度,要不然自己旋转了,范围检测的矩形的方向始终不变,即范围检测的方形没有随着自己的转向进行旋转

(2)球形范围检测

// 参数一:中心点
// 参数二:球半径
// 参数三:检测指定层级(不填检测所有层)
// 参数四:是否忽略触发器
//        UseGlobal-使用全局设置;Collide-检测触发器,
//        Ignore:忽略触发器,不填使用UseGlobal
// 返回值:在该范围内的触发器
Physics.OverlapShere(Vector3.zero, 5f, 1 << LayerMask.NameToLayer("Default"), QueryTriggerInteraction.UseGlobal);// 另一个返回碰撞器数量的API
if (Physics.OverlapShpereNonAlloc(Vector3.zero, 5, colliders) != 0) {// TODO...
}

(3)胶囊范围检测

// 参数一:半圆一中心点(上面的半圆)
// 参数二:半圆二中心点(下面的半圆)
// 参数三:半圆半径
// 参数四:检测指定层级(不填检测所有层)
// 参数五:是否忽略触发器
//        UseGlobal-使用全局设置;Collide-检测触发器,
//        Ignore:忽略触发器,不填使用UseGlobal
// 返回值:在该范围内的触发器colliders = Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << LayerMast.NameTolayer("UI"), QueryTriggerInteraction.UseGlobal);if (Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, colliders) != 0) {// TODO....
}

物理系统——范围检测相关推荐

  1. 不使用物理系统判断两个矩形是否碰撞

    如图所示,不使用物理系统去检测两个物体是否碰撞的效果. 注意:两个物体如果一直相交,在Update中处理的时候会一直输出,在实际使用时需要注意相交时的处理. 直接上代码: 检测碰撞使用的是两个节点,节 ...

  2. 信息物理系统CPS工业信息物理系统ICPS

    CPS系统介绍(Cyber-Physical System)CPS就是一个在环境感知的基础上,深度融合了计算.通信和控制能力的可控.可信.可扩展的网络化物理设备系统,它通过计算进程和物理进程相互影响的 ...

  3. linux系统检测硬盘物理损坏,linux系统下检测硬盘上的坏道和坏块

    linux系统下检测硬盘上的坏道和坏块 发布时间:2020-02-28 22:22:57 来源:51CTO 阅读:1127 作者:赤练挚爱 磁盘坏道检测 当磁盘出现以下情况:io wait 无故增高或 ...

  4. Cocos 物理系统

    官方文档链接:https://docs.cocos.com/creator/2.3/manual/zh/physics/physics/physics-manager.html Cocos 物理系统 ...

  5. 13 种在 Linux 系统上检测 CPU 信息的工具

    13 种在 Linux 系统上检测 CPU 信息的工具 问题: 我想要了解我的电脑关于CPU处理器的详细信息,查看CPU信息比较有效地方法是什么? 根据你的需要,有各种各样的关于你的CPU处理器信息你 ...

  6. arcade 物理系统_如何使用Python和Arcade库创建2D游戏

    arcade 物理系统 对于那些学习编程的人来说, Python是一种出色的语言,它对于想要"完成工作"并且不花很多时间在样板代码上的人来说是完美的语言. Arcade是一个用于创 ...

  7. 基于逆向工程的内存真值检查来保卫网络物理系统

    基于逆向工程的内存真值检查来保卫网络物理系统 原文 Defending Cyber-physical Systems through Reverse Engineering Based Memory ...

  8. arcade 物理系统_RetroPie和X-Arcade Tankstick-完美的Retro Arcade(加上键绑定,配置和操作方法)

    arcade 物理系统 Eight years ago I stumbled on the husk of an old arcade cabinet and along with my buddy ...

  9. [浅析]UE4物理系统

    虚幻引擎4使用 PhysX 3.3 物理引擎来模拟物理效果.所有物理运动(坠落或受力的物理形体)以及碰撞(物理形体的相互作用)都由 PhysX 管理. 一.Physx 1.1Physx简介 UE4.2 ...

最新文章

  1. JDK与JRE的关系和path的作用浅谈
  2. 解决Cesium无法加载出地球的问题
  3. summary+plan
  4. java学习(131):hashtable
  5. bootice 此功能仅在uefi环境下可用_电脑新手必掌握基础知识:BIOS、EFI与UEFI详解!...
  6. Python之对字符串切片
  7. 第三章 游戏软件工程基础
  8. SSRF 服务器端请求伪造
  9. 感性电路电流计算_如何计算电机的电流?跟转速有关系吗?附案例分析
  10. 在Exchange server 2007中管理pop3和IMAP4协议访问
  11. 【Arduino】VC0706(中星微串口摄像头)
  12. Python 基础起步 (七) 初识字典 Dictionary(绝命毒师前传)
  13. 利用Python做一个小姐姐词云跳舞视频
  14. 作数学题应不该用计算机,【中考备考】最新关于初一年级数学题在线解答汇总讲解...
  15. 电子邮件格式怎么填写,创建一个标准的电子邮箱邮件格式怎么注册
  16. 【Android Dialog】Dialog
  17. linux服务器黑客攻防
  18. 古典风格园林景观织梦cms模板
  19. 基于matlab的多元线性回归分析
  20. 2017最新PHP面试题

热门文章

  1. Linux Slab机制
  2. 码云git push报错 DeployKey does not support push code 解决办法
  3. matlab fdt,fsl中fdt操作指导
  4. PhpStorm 去除右侧白线
  5. SpringBoot系列(22):Java生成二维码的几种实现方式(基于Spring Boot)
  6. 日加满网迷专属饮品“劲维”嗨爆新浪游戏ChinaJoy
  7. 情境猜谜-关于你YES||NO的故事
  8. Draw Triangel 1. HackerRank SQL Problem
  9. 干活的累死累活,到头来干不过写PPT的,那就让我们做好PPT
  10. 百度地图SDK for iOS v2.0.0全新发布