Cocos Creator 主动检测碰撞(3.8.8适用)
Cocos Creator 主动检测碰撞(3.8.8适用)
一、两种碰撞检测模式区分
1. 被动检测(默认):绑定碰撞组件+碰撞回调,物体接触自动触发onCollisionEnter
2. 主动检测(你要的):代码手动调用接口,任意时刻主动查询:有没有碰到、碰到哪些物体
二、2D主动碰撞检测(刚体/碰撞盒通用)
- 检测当前节点周围所有碰撞体(重叠查询)
typescript
import { _decorator, Component, Node, Collider2D, Physics2DManager, Rect } from 'cc';
const { ccclass, property } = _decorator;
@ccclass
export class Test extends Component {
start() {
this.checkOverlap();
}
checkOverlap() {
// 获取自身2D碰撞盒
const collider = this.node.getComponent(Collider2D);
if (!collider) return;
// 主动查询所有和自己重叠的碰撞物体
const resultArr = Physics2DManager.instance.queryColliders(collider.worldAABB);
for (const coll of resultArr) {
// 排除自己
if (coll.node === this.node) continue;
console.log("主动检测到碰撞目标:", coll.node.name);
}
}}
- 射线检测(主动发射射线探路)
适合:判断前方有没有障碍物、点击选中物体
typescript
// 从自身位置向右发射一条长射线
const origin = this.node.worldPosition;
const end = origin.add3f(200, 0, 0);
const hits = Physics2DManager.instance.raycast(origin, end);
if (hits.length > 0) {
console.log("射线碰到物体", hits[0].collider.node.name);}
三、3D主动碰撞检测(软体、3D物体适用)
- 包围盒重叠检测
typescript
import { PhysicsSystem, Collider } from 'cc';
// 获取自身碰撞包围盒
const selfCollider = this.node.getComponent(Collider);
const box = selfCollider.worldBounds;
// 查询所有和盒子重叠的3D碰撞体
const hits = PhysicsSystem.instance.queryColliders(box);
for (const hit of hits) {
if (hit.node !== this.node) {
console.log("主动检测碰撞3D物体:", hit.node.name);
}}
- 3D射线检测
typescript
const start = this.node.worldPosition;
const dir = new Vec3(0, -1, 0); // 向下检测(落地判断)
const rayHit = PhysicsSystem.instance.raycastClosest(start, dir, 100);
if (rayHit) {
console.log("下方碰到地面/物体");}
四、适用场景(对应你之前软体肉块需求)
1. 软体肉块掉落,主动向下射线检测:判断什么时候碰到桌子、凹凸物体
2. 肉块滑动时每帧主动查询周围碰撞体,贴合物体边缘
3. 不依赖自动碰撞回调,完全自己控制检测时机(每帧/间隔几秒检测一次)
五、关键注意点
1. 必须开启物理引擎:2D勾选 项目设置-物理2D;3D勾选物理系统
2. 所有需要被检测的物体,必须挂载对应 Collider2D / Collider 碰撞组件
3. 性能优化:
- 不要每帧大规模查询全部碰撞体,能用射线就不用包围盒查询
- 软体粒子多的话,隔2帧检测一次,降低消耗
4. 区分: - queryColliders:检测重叠(两个物体贴在一起)
- raycast:线段探测(预判前方物体)
六、简易落地检测示例(肉块掉桌面)
每帧向下射线,主动判断是否接触台面,接触后开启滑动软体动画:
typescript
update() {
const pos = this.node.worldPosition;
// 向下发射射线,长度50
const isHit = PhysicsSystem.instance.raycastClosest(pos, new Vec3(0,-1,0), 50);
if (isHit) {
// 碰到物体,执行贴边滑动逻辑
}}
版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1498.html
转载时须注明出处及本声明