1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 物理系统——范围检测

物理系统——范围检测

时间:2024-04-04 17:47:03

相关推荐

物理系统——范围检测

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

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

碰撞和触发的区别是:

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

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

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);// 另一个返回碰撞器数量的APIif (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....}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。