[LayaAirIDE 2.0]两个物体 ,如果在update里修改其中一个物体的rotationEuler,会触发另一个物体的onTriggerEnter回调
我把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和相关资源.麻烦大佬们帮忙看看,谢谢
没有找到相关结果
已邀请:
要回复问题请先登录
1 个回复
不懂要去问谁
赞同来自: