CocosCrator物理系统注意事项
cocosCreator 物理系统知识梳理(部分)
如有独特见解,欢迎留言。
前言
使用物理系统基本注意事项
相信很多对于物理系统不熟悉的同学,肯定都很苦恼,为什么代码写上去了,却没有想要的效果,看看下面文章,希望对你有所帮助!
提示:以下是本篇文章正文内容,下面案例可供参考
常见问题一:为什么我用了物理碰撞组件,却没有反应?
检查脚本是否开启了物理系统(脚本要挂载到场景任意节点下,否则脚本都没有执行,怎么会有效?)
onLoad() {
// 开启物理系统(必须写在onLoad方法内,否则会无效)
cc.director.getPhysicsManager().enabled = true;
}
常见为题二:碰撞回调不知道如何调用?没反应?处理细节?
首先要去实现如下碰撞回调方法:
代码如下(示例):
const { ccclass, property } = cc._decorator;
@ccclass
export default class Example extends cc.Component {
// 只在两个碰撞体开始接触时被调用一次
onBeginContact (contact, selfCollider, otherCollider) {
}
// 只在两个碰撞体结束接触时被调用一次
onEndContact (contact, selfCollider, otherCollider) {
}
// 每次将要处理碰撞体接触逻辑时被调用
onPreSolve(contact, selfCollider, otherCollider) {
}
// 每次处理完碰撞体接触逻辑时被调用
onPostSolve (contact, selfCollider, otherCollider) {
}
// selfCollider:指的是回调脚本的节点上的碰撞体
// otherCollider:指的是发生碰撞的另一个碰撞体
// concat:指的是最主要的碰撞信息
// 如果需要查看这三个参数具体包含什么,可以在代码里面打印,这里就不细说了。
}
注意:这个脚本一定要挂载到刚体节点上,否则会无效!
友情链接:官方文档(看完就会)
常见问题三:修改碰撞体参数无效?卡死?
修改碰撞体参数时,一定要调用碰撞体的apply(),否则就会出现修改无效。
代码如下(以圆形碰撞体为示例):
/**
* 修改信息
*/
modifyInformation() {
/* 偏移量 */
this.node.getComponent(cc.PhysicsCircleCollider).offset = cc.v2(10, 10);
/* 密度 */
this.node.getComponent(cc.PhysicsCircleCollider).density = 100;
/* 摩擦系数 */
this.node.getComponent(cc.PhysicsCircleCollider).friction = 0.5;
/* 是否取消碰撞效果 */
this.node.getComponent(cc.PhysicsCircleCollider).sensor = true;
/* 弹性系数 */
this.node.getComponent(cc.PhysicsCircleCollider).restitution = 10;
/* 半径 */
this.node.getComponent(cc.PhysicsCircleCollider).radius = 100;
/* 最重要的一步,一定要应用!!! */
this.node.getComponent(cc.PhysicsCircleCollider).apply();
}
对于卡死的情况,不要在碰撞回调里面修改、应用参数,否则会卡死。
常见问题四:刚体穿透!
相信刚开始解除物理系统的同学都被这个问题折磨,疯狂百度,下面来看看常用的解决办法吧。
1.不要直接操作刚体进行位移(例如直接设置刚体的位置,或者设置x、y,这样很容易造成刚体穿透)。
2.尽量利用刚体自带的设置速度或者扭矩。
3.开启刚体防穿透的bullet属性。
4.代码中自己做控制,防止穿透情况发生。