如题,假设有如下场景:
- 有 A B 两个物体,都有Collider组件(isTrigger 为true)
- 第01帧,A组件update方法,修改A位置,使 A B 碰撞
- 第02帧,A组件update方法,修改A位置,使 A B 不碰撞
期望的事件执行顺序
- 01帧 A.update
- 01帧 A.lateUpdate
- A B onTriggerEnter 事件触发
- 02帧 A/B update & lateUpdate
- A B onTriggerExit事件触发
实际的事件执行顺序
- 01帧 A.update
- 01帧 A.lateUpdate
- 02帧 A/B update & lateUpdate
- A B onTriggerEnter 事件触发
- 03帧 A/B update & lateUpdate
- A B onTriggerExit触发
经查看源码,问题可能位于 physic-system.ts 第 224行:
this.physicsWorld.emitEvents(); // 此处先emitEvents (使用的是上一帧的状态,没有考虑本帧update和lateUpdate可能的修改)
director.emit(Director.EVENT_BEFORE_PHYSICS);
this.physicsWorld.syncSceneToPhysics(); // emitEvents之后才执行此方法,导致物理系统更新慢了一帧
可能应该修改为:
director.emit(Director.EVENT_BEFORE_PHYSICS);
this.physicsWorld.syncSceneToPhysics();
this.physicsWorld.emitEvents();
即:先应用本帧 update 和 lateUpdate 的修改 到物理世界,再emitEvents
,分析很棒,当时改成延迟是因为想减少一次数据同步