在我的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
的整个系统设计很差,我应该做些什么来控制它?看起来似乎是一个非常简洁的解决方案。
答案 0 :(得分:1)
你已经找到了一个黑客,这不是最好的方法。所以我决定回答这个问题:
您不需要使用碰撞器来定义玩家的交互区域以及npcManager.currentlyInteractable
的整个实现。
如果不使用对撞机,有不同的方法可以做到这一点:
可以在交互之前检查玩家和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();
}
}
}
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;
}
}
}
}
希望这会有所帮助:)