[CocosCreator]射线检测

本文详细解析Cocos Creator中射线检测的正确使用方法,包括物理系统初始化、射线检测坐标转换及物理组件配置技巧,避免常见错误,提升游戏开发效率。
部署运行你感兴趣的模型镜像

射线检测属于物理系统大类中的小类,Cocos的物理系统使用的是Box2D
射线检测建议大家先扫一下CocosCreator的官方文档
同时,@wangwenbo有个文章写的很细,算是对官方文档的补充。

以下为笔者在使用过程中遇到的坑,希望能帮到你。
1,物理系统需要在onLoad()中开启。

    onLoad() {
        cc.director.getPhysicsManager().enabled = true;
    }

若不开启,使用射线检测的函数时会报Init()错误。只能在onLoad()方法中开启,若在start()方法中开启,虽然不报错了,但是检测不到射线碰撞。

2,射线检测的坐标都需要统一转换为世界坐标。

3,物理组件、碰撞组件,傻傻不不清楚。
笔者曾经患个错误,为一个Sprite加了碰撞组件->Box Collider,也加了RigidBody。但是搞死检测不到射线。
后来才发现,组件加错了。应该是物理组件->Collider->Box。添加了该Box组件后,还会自动添加其依赖的RigidBody组件。刚体自带重力,为防止下落可以设置Gravity Scale为0。
Cocos论坛上这个兄弟我估计就是这个原因导致的。

您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

CocosCreator实现的 解救人质 游戏,学会碰撞检测rescue.7z // Bullet.js cc.Class({ extends: cc.Component, properties: { mSpeed: 300, }, // LIFE-CYCLE CALLBACKS: // onLoad () {}, start() { var manager = cc.director.getCollisionManager(); // 获取碰撞检测系统 manager.enabled = true; }, update(dt) { // 设置子弹移动,当超出屏幕范围未发生碰撞时自动销毁 this.node.y += this.mSpeed * dt; if (this.node.y > 580) { console.log('超出屏幕范围,子弹销毁!'); this.node.destroy(); } }, /** * 当碰撞产生的时候调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionEnter: function (other, self) { console.log('on collision enter'); if (other.tag == 1) { // 子弹碰到人质时,解救失败! console.log('解救人质失败!'); var failLabel = this.node.parent.getChildByName('failLabel'); failLabel.active = true; this.node.destroy(); } else if (other.tag == 2) { // 子弹碰到敌人时,解救成功! console.log('解救人质成功!'); var successLabel = this.node.parent.getChildByName('successLabel'); successLabel.active = true; this.node.destroy(); } }, /** * 当碰撞产生后,碰撞结束前的情况下,每次计算碰撞结果后调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionStay: function (other, self) { console.log('on collision stay'); }, /** * 当碰撞结束后调用 * @param {Collider} other 产生碰撞的另一个碰撞组件 * @param {Collider} self 产生碰撞的自身的碰撞组件 */ onCollisionExit: function (other, self) { console.log('on collision exit'); } });
虽然给定引用未提及Cocos Creator 3.8版本中射线相关内容,但一般在Cocos Creator中使用射线的基本步骤和示例如下: ### 射线的基本使用步骤 射线通常用于检测场景中的碰撞,比如检测鼠标点击位置是否与场景中的物体相交。以下是基本步骤: 1. **创建射线**:射线需要一个起点和一个方向。在Cocos Creator中,可以根据需要的场景信息来确定这两个参数。 2. **进行射线检测**:使用射线与场景中的碰撞体进行检测,判断是否相交。 3. **处理检测结果**:如果射线与碰撞体相交,可以获取相交的信息,如相交的物体、相交点等。 ### 示例代码 ```typescript import { _decorator, Component, Vec3, PhysicsSystem, Ray, Collider } from 'cc'; const { ccclass, property } = _decorator; @ccclass('RaycastExample') export class RaycastExample extends Component { start () { // 射线起点 const origin = new Vec3(0, 0, 0); // 射线方向 const direction = new Vec3(0, 0, 1); // 创建射线 const ray = new Ray(origin, direction); // 进行射线检测 const results: Collider[] = []; const isHit = PhysicsSystem.instance.raycastClosest(ray, results, 100); if (isHit) { // 处理检测结果 const collider = results[0]; console.log('射线击中了物体: ', collider.node.name); } else { console.log('射线未击中任何物体'); } } } ``` 在这个示例中,首先创建了一个射线,起点是 `(0, 0, 0)`,方向是 `Z` 轴正方向。然后使用 `PhysicsSystem.instance.raycastClosest` 方法进行射线检测检测距离为100。如果射线击中了物体,会输出被击中物体的名称;如果未击中,则输出相应信息。
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iningwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值