两个物体 ,如果在update里修改其中一个物体的rotationEuler,会触发另一个物体的onTriggerEnter回调

微信图片_20200720140953.png


A2@Z9~MP1S1IPOJ(WE[1ZP5.png


QK_MS8I[91ZFA[1R{J91{`U.png


我把Laya版本更新到 2.7 后发现 onTriggerEnter的回调 可能有些问题,
如图中,首先给黑色小牛里的一个添加了Collider的节点添加onTriggerEnter的脚本监听, 当我不更改 红色小人的 transform.rotationEuler 值时,图中黑色小牛要靠近红色小人才会触发onTriggerEnter的回调,一切运行正常.

  但是当我在update里 更改红色小人的 transform.rotationEuler 值后,黑色小牛并不需要靠近红色小人,只需要移动黑色小牛也可能会触发onTriggerEnter的回调.Laya 2.5版本是没有这个问题的.(试过更新到 2.6.1好像也会有这个问题)
 
源码如下
import { ui } from "./../ui/layaMaxUI";
import Util3d from "./Util3d";
import CollisionListener from "./CollisionListener";
/**
* 本示例采用非脚本的方式实现,而使用继承页面基类,实现页面逻辑。在IDE里面设置场景的Runtime属性即可和场景进行关联
* 相比脚本方式,继承式页面类,可以直接使用页面定义的属性(通过IDE内var属性定义),比如this.tipLbll,this.scoreLbl,具有代码提示效果
* 建议:如果是页面级的逻辑,需要频繁访问页面内多个元素,使用继承式写法,如果是独立小模块,功能单一,建议用脚本方式实现,比如子弹脚本。
*/
export default class GameUI extends ui.test.TestSceneUI {
private mat1: Laya.BlinnPhongMaterial;
private newScene: Laya.Scene3D;

private sMapRes = "remote/model/res/Conventional/map1.ls"
private sBullRes = "remote/model/res/Conventional/bull.lh"
private sEnemyRes = "remote/model/res/Conventional/man_1.lh"
constructor() {
super();

let self = this;
Util3d.loadRes(
[
this.sMapRes,
this.sBullRes,
this.sEnemyRes
],
function (bIsFinish) {
if (bIsFinish) {
self.onResFinish();
}
}
)
}


onResFinish() {
let pNewScene = <Laya.Scene3D>Util3d.getRes(this.sMapRes, false)
Laya.stage.addChild(pNewScene);


Util3d.getChildByPath(pNewScene, "Main Camera").active = false;

let pBull = <Laya.Sprite3D>Util3d.getRes(this.sBullRes)
let pEnemy = <Laya.Sprite3D>Util3d.getRes(this.sEnemyRes)

pNewScene.addChild(pBull);
pNewScene.addChild(pEnemy);

let tPosBull = Util3d.getSprite3D(pNewScene, "bullBeginPos")
pBull.transform.position = tPosBull.transform.position;

let pBullObj = Util3d.getSprite3D(pBull, "bull");
let pBullRigidBody = <Laya.Rigidbody3D>pBullObj.getComponent(Laya.Rigidbody3D)
pBullRigidBody.isKinematic = true;

let pEnemyObj = Util3d.getSprite3D(pEnemy, "man_1");
let pEnemyRigidBody = <Laya.Rigidbody3D>pEnemyObj.getComponent(Laya.Rigidbody3D)
pEnemyRigidBody.isKinematic = true;


let pBullHitArea = Util3d.getSprite3D(pBull, "bull/areas/attack_rush/1")
let pListener = pBullHitArea.addComponent(CollisionListener);
//添加监听 onTriggerEnter 的逻辑
pListener.init(this, CollisionListener.func_onTriggerEnter, "onTriggerEnter");

let tPosEnemy = new Laya.Vector3();
Util3d.v3Copy(tPosEnemy, tPosBull.transform.position);
tPosEnemy.x -= 10;
pEnemyObj.transform.position = tPosEnemy;


// 调用这个方法会触发 onTriggerEnter BUG,看下面Laya.timer.loop里的注释
let pTriggerBug = function () {
let vRE = pEnemyObj.transform.rotationEuler;
// 这个值估计改成多少都会触发这个BUG
vRE.y = -166;
pEnemyObj.transform.rotationEuler = vRE;
}

setTimeout(() => {
Laya.timer.loop(1000 / 60.0, this, function () {
//↓↓↓ 调用 pTriggerBug 后, 黑色小牛 就算没有碰到 红色小人,也会触发 onTriggerEnter 的回调
// 如果不调用 pTriggerBug ,当黑色小牛没有碰到红色小人时,不会触发onTriggerEnter 一切正常
pTriggerBug();

//这一段移动逻辑并没有向红色小人方向移动
let v3Pos = pBullObj.transform.position;
if (v3Pos.z < -55) {
v3Pos.z += 0.1;
pBullObj.transform.position = v3Pos;
}

//开启这段可以让牛向 红色小人方向移动
// v3Pos.x += -0.1;
// pBullObj.transform.position = v3Pos;

})
}, 2000);
}

onTriggerEnter(other: Laya.PhysicsComponent) {
console.error("onTriggerEnter " + other.owner.name);
}


}

 
已上传demo和相关资源.麻烦大佬们帮忙看看,谢谢
已邀请:

小少年

赞同来自:

引擎BUG吧,我也遇到过,当场景中存在两个刚体后,改变转向就会触发或者碰撞。

要回复问题请先

商务合作
商务合作