2016-08-05 298 views
0

我试图检测鼠标在3D场景上的2D精灵上单击。Physics2D.OverlapPoint()返回总是为空

我的所有Sprite都有一个Box Collider 2D(放置良好)和一个脚本,但是一直是null。我也尝试将Update()函数放在GameEngine GameObject上的脚本上,但我得到了相同的结果。

 void Update() { 
    if (Input.GetMouseButtonDown(0)) { 
     Vector2 mouse_position = Camera.main.ScreenToWorldPoint (Input.mousePosition); 
     Collider2D hit = Physics2D.OverlapPoint (mouse_position); 

     if (hit) { 
      Debug.Log ("Hit" + hit.transform.name); 
     } else { 
      Debug.Log (hit); 
     } 
    } 
} 

void OnMouseDown() { 
    Debug.Log ("Hit " + this.name); 
} 

enter image description here

+1

我建议是使用UnityEngine.EventSystems和实施以下这些接口 IPointerClickHandler IPointerDownHandler IPointerEnterHandler IPointerExitHandler IPointerUpHandler 或在它的最基本的层面EventTriggers https://unity3d.com/学习/教程/主题/用户界面 - 用户界面 - 用户界面 - 用户界面 - 事件 - 触发器 – Rob

+0

亚瑟 - 你在做什么**是完全错误的**,嘿:)它更容易。除了其他任何东西,**一定要阅读这个**:http://stackoverflow.com/a/38311402/294884 – Fattie

+0

确实罗布已经完全解释它给你很好 – Fattie

回答

2

不需要做你在做什么。新的Canvas UI系统内置了一个复杂的事件系统。

如果你看看你的“Image”组件,它有一个“Raycast Target”基本打开或关闭该组件的事件系统处理程序。

您可以使用UnityEngine.EventSystems命名空间来侦听画布元素上的点击/拖动和其他事件。

下面是一个例子给你:

using UnityEngine; 
using UnityEngine.EventSystems; 
class BuildingUI : Monobehaviour, IPointerDownHandler, IPointerUpHandler { 

    void OnPointerDown(PointerEventData eventData) 
    { 
     Debug.Log("Pointer Down " + eventData.selectedObject.name); 
    } 

    void OnPointerUp(PointerEventData eventData) 
    { 
     Debug.Log("Pointer Up " + eventData.selectedObject.name); 
    } 
} 

有,你可以实现接口的负载,我建议你签的手册。

+1

非常正确。 (PS罗布,你只是有一个错字“内置”。) – Fattie

+2

OP,如果你想要做拖放。这是一个***疯狂有用的***复制和粘贴脚本。 http://stackoverflow.com/a/37473953/294884就在几年前,制片公司可能会收取20,000美元来实现拖放。现在你只需粘贴该脚本呃。罗布如果你还没有看到它是非常方便的 – Fattie

+0

看起来像一个体面的资源。我已经实现了几次指针和拖动界面。与Web的PointerEvents API非常相似。 – Rob

0

我敢肯定,你的问题的根本原因是你的“大厦”的对象是UI对象,是一个帆布下。这可能会导致很多事情,但是我认为导致您的问题的是世界和屏幕空间的问题。

当您的“建筑”对象位于未使用世界空间作为位置的画布下时,您正在将鼠标位置从屏幕点转换为世界空间。为了证实这一点,我建议你为原始鼠标位置,转换后的鼠标位置以及“建筑”对象的实际位置做一个Debug.Log。如果您发现未转换的鼠标位置与您的物体位置更逼真,我建议您除去转换。

您可能需要做额外的工作(即对鼠标或对象位置进行一些数学计算和/或更改对象的锚点)以使其完美运行,但这应该允许您的鼠标位置和对象成为在职位上与同一单位合作。

+0

下使用它的工作正常,如果我把'输入。 mousePosition'作为“Physics2D.OverlapPoint”的属性。如果我使用屏幕鼠标位置可以吗?或者,如果我做了一些处理世界上的事情,这会更好吗? (以及如何?) – Arthur

+1

你会改变它的方式将改变你的画布从屏幕空间到世界空间或类似的东西。尽管如此,我不会推荐。如果你希望你的按钮保持在同一个空间,无论你的相机在游戏中移动的位置如何,你都需要它们进入屏幕空间,而不是在世界空间。另外,UI通常基于屏幕空间并且独立于世界空间,所以在设计方面优选使用屏幕坐标来处理UI。 – Brien