[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 个回复
不懂要去问谁
赞同来自: