让另一个 node 跟随当前 node 一起移动

大家好,请教大家一个问题。
我的场景是这样,有一个笼子型的物体会和玩家的角色产生2D碰撞。这个笼子有前后两张贴图,一张是在角色背后,一张是在角色前面,所以无法放在同一个父节点之内。

我的节点顺序如下:

  • root
    • 笼子后贴图(只有 Sprite)
    • 角色
    • 笼子前贴图(包含 Sprite,刚体,碰撞体,代码)

我在笼子前部的代码中更新笼子后部的位置,可是运行起来总是慢一步,产生错位,请问有什么好办法解决呢?
update(deltaTime: number) {
this.node.getPosition(this.currentPosition);
this.node.getWorldRotation(this.currentRotation);
this.backNode.setPosition(this.currentPosition);
this.backNode.setWorldRotation(this.currentRotation);
}

问题主要是update并不及时,你监听节点的Tansformchang事件更新看看

不是不及时的问题,是他的逻辑写错了。

你的逻辑错了吧,你把this.node的坐标赋值给this.backNode,backNode的坐标当然会不对。应该在update中求出this.node与上一帧位置的差值,然后让this.backNode加上这个差值。

如果你一开始就知道this.node和backNode坐标要保持的距离和角度差值,那就每帧用this.node的坐标去加或者减这个差值,得到的就是backNode的坐标

很显然,你的目标是使得两个贴图位置一致。你放在 update 中去取值,因为物理刚体变化后才去同步 this.node 位置的原因可能,导致 backNode 被赋值位置后下一帧才会渲染到新位置。

提供一个解决方案,删掉this.node 上的 Sprite 贴图,保留刚体,另起一个节点,与 this.backNode
一样:这样this.node 是不可见的刚体:

update(deltaTime: number) {
this.node.getPosition(this.currentPosition);
this.node.getWorldRotation(this.currentRotation);
this.frontNode.setPosition(this.currentPosition);
this.frontNode.setWorldRotation(this.currentRotation);
this.backNode.setPosition(this.currentPosition);
this.backNode.setWorldRotation(this.currentRotation);
}

:sweat_smile: 啊,我也想到了你说的这种可能,但是自己手动计算物理碰撞也太麻烦了

:rofl: 确实是一种办法,干脆两张图都慢一拍,至少不会裂

我试了在onTransformChanged里面更新 front 的位置,但是运行起来没有生效,位置没变化,暂时还没搞清楚是什么原因。。。

不用自己计算碰撞啊

lateUpdate

那我应该怎么在 update 里面知道下一帧的位置呀?它的移动方向是不确定的,‘上一帧与当前帧的差值’不一定等于‘当前帧与下一帧的差值’吧

这个也试过了,把获取位置和设置位置挪到 lateUpdate里面,运行起来效果一样,还是慢一帧

为什么要设置下一帧的位置,只需要设置当前帧的位置啊 :smirk:为什么开始纠结起这个了,需求不是同步移动吗。

会不会你设置移动的节点的位置更新在这个update的逻辑之后。

啊,我没理解到你的意思,能详细说说你认为在 update 里面应该怎么操作吗?

我也没太搞清楚这个执行顺序是怎样的,所以物理效果是发生在 update 之后,render 之前吗?我试过把逻辑换到前面的Node(背面图)上面,让它来更新后一个Node(前面图),然而也还是慢一帧。

解决了吗? update还是会比刚体慢。。。 位置总是差一点。。