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

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

因为障碍物需要有碰撞,也会有受到力的反馈,所以给abs添加一个RigidBody,因为障碍物会重一些,给他的质量设置为3(Player的3倍),然后添加一个碰撞体
保存运行预览
看起来不那么顺滑,这是因为地面有摩擦力。
新建一个地面的物理材质,把材质的摩擦力属性都设置为0

然后拖拽到地板的物理材质引用。
运行预览,发现顺滑了很多。
这里需要让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碰到障碍物后速度慢慢停下来
浙公网安备 33010602011771号