RaycastHit2D vs OnTriggerEnter2D

时间:2017-06-26 19:07:09

标签: unity3d unity5

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

我的旧系统我只是在我的播放器前面的瓷砖上设置了一个小型对撞机,然后在我的节点,树木,农场瓷砖等OnTriggerEnter2D上设置了一个小对撞机。我检查了我的活动项目的哪个类别正在进入(以下是我的挖掘节点上的示例):

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

        }
    }
}

然而,这总是让人觉得难看,加上“前对撞机”的小小,总有机会击中瓷砖交叉点并同时击中多达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();
        }
    }
}

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

这两种方法中的哪一种方法会更好?我完全是自我纠缠所以我总是担心我会犯一些我无法看到的明显错误。

我更确定地喜欢RayCast的精度(即使它强制我的所有碰撞器的尺寸至少为1x1,因为检查前面的1个瓷砖)。

1 个答案:

答案 0 :(得分:2)

您的解决方案对我来说很合适!

Raycasts有可能被滥用到他们非常昂贵的程度。你要注意的三件事:

  • 光线投射有多长时间?在你的情况下,将它保持在瓷砖长度下应该是好的。
  • 场景中有哪些类型的几何体?:网格对撞机会导致Raycasts突然出现,但在2D游戏中我想象一切都是正方形或圆形你应该是好的。 / LI>
  • 它们出现的频率是多少?每一帧调用一次Raycast可能相当昂贵,但只有在你的播放器执行操作时才调用它应该没问题。

你提到你担心你的解决方案会迫使你的对手至少1x1,但是有办法解决这个问题。现在你正在做的只是在玩家面前的处进行检查。相反,您可能需要考虑从该方向向玩家投射光线,即使它比1x1平铺小,也可以长时间击中任何东西。您可以通过将raycast的第二个参数更改为以下内容来执行此操作: Physics2D.Raycast(transform.position, Vector2.up * .5f);

Raycast函数将其作为第一个参数射出的点,以及作为第二个参数的方向/长度(保留长度0,就像在第一个参数中检查点)。

值得注意的是,如果你尝试用你当前的解决方案做到这一点,那么所有会发生的事情就是你的角色会试图挖掘自己,因为这将是射线击中的第一件事!您需要在光线投影中添加LayerMask以确定光线能够和无法击中的光线(或者如果您是懒惰的,请确保光线从外部点开始球员的碰撞)。