Cocos Creator 主动检测碰撞(3.8.8适用)

一、两种碰撞检测模式区分

1. 被动检测(默认):绑定碰撞组件+碰撞回调,物体接触自动触发onCollisionEnter
2. 主动检测(你要的):代码手动调用接口,任意时刻主动查询:有没有碰到、碰到哪些物体

二、2D主动碰撞检测(刚体/碰撞盒通用)

  1. 检测当前节点周围所有碰撞体(重叠查询)

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);
    }
}

}
 

  1. 射线检测(主动发射射线探路)

适合:判断前方有没有障碍物、点击选中物体

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物体适用)

  1. 包围盒重叠检测

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);
}

}
 

  1. 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) {
    // 碰到物体,执行贴边滑动逻辑
}

}

标签: none

添加新评论