【BUG反馈】018 Online触发器collisionEnable接口阻塞BUG

[复制链接]
411 |0
VErgis 发表于 2022-12-19 11:15:37 | 显示全部楼层 |阅读模式
场景结构
https://sakura-build.233leyuan.com/online/customer/community/1671417303141.png整体为预制体结构,Mesh为表达外观的网格,测试中使用“7669”基础正方体,Trigger表示触发器。
两者及预制体根节点网络状态均为C only并取消静态。

脚本核心逻辑
    private _setActivity(visibility: boolean, collision: boolean): void {        this._collision = collision;        if (collision) {            this._trigger.setCollisionEnabled(true);        }        else {            this._trigger.setCollisionEnabled(false);        }        this._visibility = visibility;        if (visibility) {            this._mesh.setVisibility(Type.PropertyStatus.On);            // this._root.setVisibility(Type.PropertyStatus.On);        }        else {            this._mesh.setVisibility(Type.PropertyStatus.Off);            // this._root.setVisibility(Type.PropertyStatus.Off);        }        console.log(`@@@setActivity: ${visibility} ${collision}`);    }        this._root = await Core.GameObject.asyncSpawnGameObject("719E82CF43F12C52C3566BBA235D9449", false);        this._mesh = this._root.getChildByName("Mesh");        this._trigger = this._root.getChildByName("Trigger");        this._trigger.ready().then(() => {            console.log(`@@@Trigger!!!`);            this._trigger.onEnter.add((other: Core.GameObject) => {                if (other instanceof Gameplay.Character) {                    console.log(`Enter ${(other).player.getPlayerID()}`);                    this._setActivity(false, false);                }            });            this._reset();        });
bug演示&说明
在已知发现单端触发器进入其他客户端玩家会反复触发的情况下,此处使用单客户端通过attach-detach的方法测试,并且能更清晰地发现异常所在。
从视频中可以看到,简而言之,当调用触发器setCollisionEnable接口(btwQ:为何不存在获得触发器激活状态的get接口)设置激活时,若触发器原范围内已存在可发生碰撞的物体,且触发回调中调用了同一接口设置该触发器休眠时,会阻塞相同根节点下其他物体的栈深于该接口的方法。

另:断点调试发现触发器回调方法会在setCollisionEnable方法后先入栈,则其会在第一阶setActivity后续关于mesh的setVisibility前先出栈,就出现了网格先因为触发器回调方法关闭后因为最先进栈的setActivity再打开,产生与预期不符的结果。请问应当归类于bug呢,还是使用上的缺陷?

回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表