<十>障碍物和碰撞检测

在场景中创建一个Cube做为障碍物,重命名为abs,调整一下障碍物的大小和位置让它位于Player的左前方。
image

为了便于区分,这里改变一下障碍物的外观。
在资源管理器中新建一个材质mat-abs,改变一下材质的颜色并把它拖拽到abs的material引用中。
image

因为障碍物需要有碰撞,也会有受到力的反馈,所以给abs添加一个RigidBody,因为障碍物会重一些,给他的质量设置为3(Player的3倍),然后添加一个碰撞体

保存运行预览

看起来不那么顺滑,这是因为地面有摩擦力。
新建一个地面的物理材质,把材质的摩擦力属性都设置为0
image
然后拖拽到地板的物理材质引用。
运行预览,发现顺滑了很多。

这里需要让Player碰到障碍物后慢慢的停下来。
也就是碰撞后,不再施加力
因为力的作用是写在PlayerMovement组件中的
只需要判断碰撞监听,如果碰到了障碍物,就禁用PlayerMovement,Player不再受力的影响后就会慢慢停下来。

为了监听碰撞,新建一个脚本叫PlayerCollision
因为碰撞监听都是通过碰撞体 | 触发器 来监听的,这里因为有力的反馈,所以使用碰撞体监听。
编辑一下脚本:

import { _decorator, BoxCollider, Component, ICollisionEvent, Node } from 'cc';
import { PlayerMovement } from './PlayerMovement';
const { ccclass, property } = _decorator;

@ccclass('PlayerCollision')
export class PlayerCollision extends Component {
    start() {
        let box_collider = this.node.getComponent(BoxCollider);
        box_collider.on('onCollisionEnter',this.onCollisionEnter,this);
    }
    onCollisionEnter(event: ICollisionEvent) {
        if (event.otherCollider.node.name == 'abs') {
            console.log('撞到敌人');
            let playerMovement = this.node.getComponent(PlayerMovement);
            playerMovement.enabled = false;
        }
    }

    update(deltaTime: number) {
        
    }
}


保存、运行、预览,可以看到Player碰到障碍物后速度慢慢停下来

posted @ 2024-12-17 14:38  EricShx  阅读(53)  评论(0)    收藏  举报