RaycastHit2D 与 OnTriggerEnter2D

RaycastHit2D vs OnTriggerEnter2D

在我的游戏中,您可以使用斧头、镐、锄头等。每一种都可以收集不同类型的material(矿石、木材、农作物等)。

我的旧系统我只是在我的玩家前面的瓷砖上设置了一个小碰撞器,然后在 OnTriggerEnter2D 我的节点、树木、农场瓷砖等上。我检查了我的 Active 类别正在进入的项目(下面是我的采矿节点的例子):

void OnTriggerEnter2D(Collider2D other)
{
    if(other.gameObject.CompareTag("ActiveItem"))
    {
        ItemObject activeItemObj = GameManager.manager.activeItem.GetComponent<InventoryItem>().item;
        if(activeItemObj.category == "pickaxe")
        {
            if (!isHit)
            {
                hit();
            }

        }
    }
}

不过总觉得有点丑,而且"front collider"不管多小,总有机会打到方格交叉点,同时打到4个方格。

所以我想使用 RayCastHit2D,所以我在 PlayerController 脚本中创建了这些方法:

public GameObject GetTileInFront()
{
    Vector2 frontRay = new Vector2(transform.position.x + lastMove.x, transform.position.y + lastMove.y + 0.5f);
    RaycastHit2D hit = Physics2D.Raycast(frontRay, Vector2.zero);

    if (hit.collider != null)
    {
        Debug.Log("Target Position: " + hit.collider.gameObject.name);
        return hit.collider.gameObject;
    }

    return null;
}

public void ActionInFront(string activeItem)
{
    if (activeItem.Equals("pickaxe"))
    {
        if (GetTileInFront().CompareTag("Node"))
        {
            GetTileInFront().GetComponent<NodeManager>().hit();
        }
    }
}

现在我显然需要为每种类型的 tool/tile 创建这样的检查。 这引出了我的问题:

这两种方法中哪一种对性能更好?我完全是自强的所以我总是担心我犯了一些我看不到的明显错误。

我绝对更喜欢 RayCast 的精度(尽管由于检查了前面的 1 个图块,它迫使我所有的碰撞器的尺寸至少为 1x1)。

我觉得你的解决方案不错!

Raycasts 有可能被滥用到非常昂贵的地步。您需要注意的三件事:

  • 光线投射有多长? 将其保持在平铺长度以下对您的情况应该很好。
  • 您的场景中有哪些类型的几何体?:网格碰撞器可能会导致 Raycasts 突然出现,但在 2D 游戏中,我认为一切都是正方形或圆形应该不错
  • 它们发生的频率如何? 每帧调用 Raycast 可能相当昂贵,但仅在玩家执行动作时调用它应该没问题。

您提到您担心您的解决方案会强制您的对撞机至少为 1x1,但有一些方法可以解决这个问题。现在您正在做的只是在玩家面前的 处检查。相反,您可能需要考虑从玩家朝那个方向投射 ray,它可能会击中远处的任何东西,即使它小于 1x1 的图块。您可以通过将 raycast 的第二个参数更改为如下所示来执行此操作: Physics2D.Raycast(transform.position, Vector2.up * .5f);

Raycast 函数将其发射点作为第一个参数,direction/length 作为第二个参数(将长度保留为 0 将只检查第一个参数处的点)。

值得注意的是,如果您尝试使用当前的解决方案执行此操作,将会发生的所有情况是您的角色将尝试自己挖掘,因为这将是射线命中的第一件事!您需要将 LayerMask 添加到您的光线投射以确定光线可以和不能击中什么(或者如果您很懒,只需确保光线从玩家碰撞之外的点开始)。