物理系统——范围检测
首先如果碰撞要产生,那么其必要条件是:
- 至少一个物体有刚体
- 两个物体都必须有碰撞器
碰撞和触发的区别是:
- 碰撞会产生实际的物理效果
- 触发看起来不会产生碰撞但是可以通过函数监听触发
碰撞检测主要用于实体物体之间差生物理效果时使用
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....
}
物理系统——范围检测相关推荐
- 不使用物理系统判断两个矩形是否碰撞
如图所示,不使用物理系统去检测两个物体是否碰撞的效果. 注意:两个物体如果一直相交,在Update中处理的时候会一直输出,在实际使用时需要注意相交时的处理. 直接上代码: 检测碰撞使用的是两个节点,节 ...
- 信息物理系统CPS工业信息物理系统ICPS
CPS系统介绍(Cyber-Physical System)CPS就是一个在环境感知的基础上,深度融合了计算.通信和控制能力的可控.可信.可扩展的网络化物理设备系统,它通过计算进程和物理进程相互影响的 ...
- linux系统检测硬盘物理损坏,linux系统下检测硬盘上的坏道和坏块
linux系统下检测硬盘上的坏道和坏块 发布时间:2020-02-28 22:22:57 来源:51CTO 阅读:1127 作者:赤练挚爱 磁盘坏道检测 当磁盘出现以下情况:io wait 无故增高或 ...
- Cocos 物理系统
官方文档链接:https://docs.cocos.com/creator/2.3/manual/zh/physics/physics/physics-manager.html Cocos 物理系统 ...
- 13 种在 Linux 系统上检测 CPU 信息的工具
13 种在 Linux 系统上检测 CPU 信息的工具 问题: 我想要了解我的电脑关于CPU处理器的详细信息,查看CPU信息比较有效地方法是什么? 根据你的需要,有各种各样的关于你的CPU处理器信息你 ...
- arcade 物理系统_如何使用Python和Arcade库创建2D游戏
arcade 物理系统 对于那些学习编程的人来说, Python是一种出色的语言,它对于想要"完成工作"并且不花很多时间在样板代码上的人来说是完美的语言. Arcade是一个用于创 ...
- 基于逆向工程的内存真值检查来保卫网络物理系统
基于逆向工程的内存真值检查来保卫网络物理系统 原文 Defending Cyber-physical Systems through Reverse Engineering Based Memory ...
- 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 ...
- [浅析]UE4物理系统
虚幻引擎4使用 PhysX 3.3 物理引擎来模拟物理效果.所有物理运动(坠落或受力的物理形体)以及碰撞(物理形体的相互作用)都由 PhysX 管理. 一.Physx 1.1Physx简介 UE4.2 ...
最新文章
- JDK与JRE的关系和path的作用浅谈
- 解决Cesium无法加载出地球的问题
- summary+plan
- java学习(131):hashtable
- bootice 此功能仅在uefi环境下可用_电脑新手必掌握基础知识:BIOS、EFI与UEFI详解!...
- Python之对字符串切片
- 第三章 游戏软件工程基础
- SSRF 服务器端请求伪造
- 感性电路电流计算_如何计算电机的电流?跟转速有关系吗?附案例分析
- 在Exchange server 2007中管理pop3和IMAP4协议访问
- 【Arduino】VC0706(中星微串口摄像头)
- Python 基础起步 (七) 初识字典 Dictionary(绝命毒师前传)
- 利用Python做一个小姐姐词云跳舞视频
- 作数学题应不该用计算机,【中考备考】最新关于初一年级数学题在线解答汇总讲解...
- 电子邮件格式怎么填写,创建一个标准的电子邮箱邮件格式怎么注册
- 【Android Dialog】Dialog
- linux服务器黑客攻防
- 古典风格园林景观织梦cms模板
- 基于matlab的多元线性回归分析
- 2017最新PHP面试题
热门文章
- Linux Slab机制
- 码云git push报错 DeployKey does not support push code 解决办法
- matlab fdt,fsl中fdt操作指导
- PhpStorm 去除右侧白线
- SpringBoot系列(22):Java生成二维码的几种实现方式(基于Spring Boot)
- 日加满网迷专属饮品“劲维”嗨爆新浪游戏ChinaJoy
- 情境猜谜-关于你YES||NO的故事
- Draw Triangel 1. HackerRank SQL Problem
- 干活的累死累活,到头来干不过写PPT的,那就让我们做好PPT
- 百度地图SDK for iOS v2.0.0全新发布