我正在制作一款 2D 平台游戏,其玩家机制取决于玩家所着陆的图块类型。我有白色和黑色两种类型的图块 - 如果玩家落在白色图块上,他具有能力 A,当他落在黑色图块上时,他具有能力 B。白色和黑色图块各有自己的碰撞层。我正在做一个“OnCollisionEnter2D”,然后为玩家提供能力。您可以激活或停用(使它们可见或不可见)白色和黑色平铺对象。当您落在白色或黑色图块上时,事情会很顺利,但在某些地方两个图块对象会重叠。在层次结构中,黑色位于白色下方,当我运行游戏时,我首先与黑色发生碰撞,然后与白色发生碰撞(覆盖黑色)。这是我的初衷,因为我希望白色瓷砖覆盖黑色瓷砖,但是每次玩家停用然后重新激活白色瓷砖对象时,碰撞顺序都会发生变化 - 我首先与白色瓷砖发生碰撞,然后与黑色瓷砖对象发生碰撞,所以即使白色瓷砖对象位于顶部,玩家也可以获得黑色瓷砖的能力。我需要保持两个图块对象处于活动状态。我的问题是 Unity 中的碰撞顺序是如何决定的?我可以控制它吗?如果与两个重叠对象发生“同时”(我知道它们实际上是连续的)碰撞,我需要能够告诉我的游戏更喜欢哪种碰撞。
我尝试更改碰撞层内碰撞对象的顺序,但无济于事。尝试更改检查器中对象的层次结构 - 再次无济于事。
当它们重叠时,它们会在玩家击中任何一个之前触发彼此的 onCollisionEnter2D 函数,对吧?那么你可以使用这个方法:
public class CollisionManager : MonoBehaviour
{
enum TileType
{
Black, White
}
[SerializeField] TileType tileType;
//Don't forget to make this variable "false" after overlapped white tile leave or destroy or disable or idk anything like that
bool IsThereWhiteTileOverlappedAndThisGameObjectIsABlackTile = false;
private void OnCollisionEnter2D(Collision2D collision)
{
IsThereWhiteTileOverlappedAndThisGameObjectIsABlackTile = collision.gameObject.tag == "White Tile" && tileType == TileType.Black;
if (collision.gameObject.tag == "Player")
{
if(tileType == TileType.White)
{
// Player collided with white tile
// Do what you want here
}
else if(tileType == TileType.Black)
{
if (IsThereWhiteTileOverlappedAndThisGameObjectIsABlackTile)
return;
// Player collided with black tile and there is no overlapped object
// Do what you want here
}
}
}
}