Unity 2D中如何控制碰撞顺序?

问题描述 投票:0回答:1

我正在制作一款 2D 平台游戏,其玩家机制取决于玩家所着陆的图块类型。我有白色和黑色两种类型的图块 - 如果玩家落在白色图块上,他具有能力 A,当他落在黑色图块上时,他具有能力 B。白色和黑色图块各有自己的碰撞层。我正在做一个“OnCollisionEnter2D”,然后为玩家提供能力。您可以激活或停用(使它们可见或不可见)白色和黑色平铺对象。当您落在白色或黑色图块上时,事情会很顺利,但在某些地方两个图块对象会重叠。在层次结构中,黑色位于白色下方,当我运行游戏时,我首先与黑色发生碰撞,然后与白色发生碰撞(覆盖黑色)。这是我的初衷,因为我希望白色瓷砖覆盖黑色瓷砖,但是每次玩家停用然后重新激活白色瓷砖对象时,碰撞顺序都会发生变化 - 我首先与白色瓷砖发生碰撞,然后与黑色瓷砖对象发生碰撞,所以即使白色瓷砖对象位于顶部,玩家也可以获得黑色瓷砖的能力。我需要保持两个图块对象处于活动状态。我的问题是 Unity 中的碰撞顺序是如何决定的?我可以控制它吗?如果与两个重叠对象发生“同时”(我知道它们实际上是连续的)碰撞,我需要能够告诉我的游戏更喜欢哪种碰撞。

我尝试更改碰撞层内碰撞对象的顺序,但无济于事。尝试更改检查器中对象的层次结构 - 再次无济于事。

unity-game-engine 2d collision overlapping
1个回答
0
投票

当它们重叠时,它们会在玩家击中任何一个之前触发彼此的 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
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.