使用OnPointerDown()时忽略某个图层

时间:2017-12-06 09:02:57

标签: unity3d 2d unity5

在我的2D自上而下的游戏中,我有一个脚本我附加到NPC来控制玩家何时点击它们,开始对话。

然而,我决定设计的方式是我的播放器上有一个名为InteractiveArea的额外对撞机,你只能与该区域内的NPC进行交互。在Start我添加:

 Physics2D.IgnoreLayerCollision(LayerMask.NameToLayer("InteractiveArea"), LayerMask.NameToLayer("Player"));

确保它不会与我的播放器发生冲突。

所以,我面临的问题是我的MousePointer选择了InteractiveArea对手,而不是NPC,所以如果NPC在InteractiveArea我的方法内不会工作:

public void OnPointerDown(PointerEventData eventData)
{
    if (npcManager.currentlyInteractable) //set to true when inside InteractiveArea
    {
        if (eventData.button == PointerEventData.InputButton.Right)
        {
            npcManager.Clicked();
        }
    }
}

我有什么方法可以让InteractiveArea忽略我的MousePointer,就像我在启动时使用我的播放器一样?或者我使用InteractiveArea的整个系统设计很差,我应该做些什么来控制它?看起来似乎是一个非常简洁的解决方案。

1 个答案:

答案 0 :(得分:1)

你已经找到了一个黑客,这不是最好的方法。所以我决定回答这个问题:

您不需要使用碰撞器来定义玩家的交互区域以及npcManager.currentlyInteractable的整个实现。

如果不使用对撞机,有不同的方法可以做到这一点:

1。检查距离

可以在交互之前检查玩家和NPC之间的距离,如下所示:

public void OnPointerDown(PointerEventData eventData)
{
    if (eventData.button == PointerEventData.InputButton.Right)
    {
        float dist = Vector3.Distance(player.transform.position, transform.position)    

        if (distance < 2) // player is close enough
        {
            npcManager.Clicked();
        }
    }
}

2。检查半径中的碰撞物界限

Physics2D.OverlapCircleAll可用于检测玩家对撞机是否与某个半径的圆重叠:

public void OnPointerDown(PointerEventData eventData)
{
    if (eventData.button == PointerEventData.InputButton.Right)
    {
        Vector2 center = new Vector2(transform.position.x, transform.position.z) // use y component depending on how you setup top-down view
        float raduis = 2f;

        Collider2D[] collidersInCircle = Physics2D.OverlapCircleAll(center, raduis);

        foreach (var collider in collidersInCircle)
        {
            if(collider.CompareTag("Player")) // player must have appropriate tag
            {
                npcManager.Clicked();
                break;
            }
        }
    }
}

希望这会有所帮助:)