关于CocosCreator学习中的问题(对碰撞体的sensor进行更改)
从使用cocoscreator以来,我一直都很迷。曾多次遇到这样一类问题——在代码里对某个节点的组件中某些值进行更改,在console中打印出来的数值是改变了,但实际呈现出来的效果却没有改变。简言之,就是数值变了结果没变。
有一些这类问题总是默默地就解决了(没错,我也不知道问题在哪,有时候重启能解决,更离谱的是有一次的解决居然就仅仅只是加了一句console.log(),然后将这句删除后,也在没出过问题)。
进入正题,对于碰撞体中的sensor的修改也有一定问题,最开始进行测试的时候,在代码中直接设置,如:‘this.collider.sensor = true’,这样就能直接将碰撞器改为触发器,如果值为false则改为碰撞器。
理论如上,下面说说我想要的效果:
当游戏中人物出狱特定环境下时,需要取消碰撞,但是修改地图很不现实,于是我就把主意打到人物身上。理论是,当人物满足特定条件是,将人物身上的碰撞器改为触发器,一定时间后,再将触发器还原为碰撞器。
理论代码如下:
PlayerDown(time:number){
if(this.playerCollider){
this.playerAnimation?.PLayerJump();//这里是调用的播放动画的方法,不用管(下同)
this.playerCollider.sensor = true;//修改collider的sensor值(下同)
this.scheduleOnce(()=>{
if(this.playerCollider){
this.playerCollider.sensor = false;
}
},time)//计时器(规定时间内还原人物碰撞器)(下同)
}
}
刚开始测试时,这样使用并没有出现问题,也能达到我想要的效果。但是因为当时我的功能没做完,就又加了些东西在人物控制的脚本里(射线检测)。好家伙,不加不要紧,加了之后上面的代码就直接失效了(也不能说完全失效,至少在console中打印出来的this.playerCollider.sensor的值是变了的,但是运行中是失效了的)。
到这里,自然是先检查我的逻辑,至少我是觉得我的逻辑没什么问题(手动滑稽)。然后这个问题就卡住我了,然后今天莫名突然想到collider有一个apply()的方法,我就想不会改变了值还要应用一下才行吧。试试咯,还能怎样,路都走到这了,结果一试人都给我整傻了,好嘛,解决了。
代码如下(其实没啥变化,就加了两条语句):
PlayerDown(time:number){
if(this.playerCollider){
this.playerAnimation?.PLayerJump();
this.playerCollider.sensor = true;
this.playerCollider.apply();//collider的apply()方法,个人理解为应用修改
this.scheduleOnce(()=>{
if(this.playerCollider){
this.playerCollider.sensor = false;
this.playerCollider.apply();
}
},time)
}
}
总结:只修改collider里的sensor的值,或许可以实现效果,但是保险起见还是加一个apply()的方法,个人理解中apply()大概是一个保存修改,并应用修改的方法。但是在其他地方使用apply()过程中也出现过报错,当时没注意,不过大概是有些东西没获取到吧,检查检查说不定能找出来呢。