Physics2D.OverlapPoint()返回null

时间:2016-08-05 19:08:46

标签: unity3d

我试图在3D场景上检测鼠标点击2D精灵。

我所有的Sprite都有一个Box Collider 2D(位置很好)和一个脚本,但 hit is 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

2 个答案:

答案 0 :(得分:2)

无需做你正在做的事情。新的Canvas UI系统内置了一个复杂的事件系统。

如果您查看“图像”组件,它有一个“Raycast目标”基本上打开或关闭该组件的事件系统处理程序。

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

以下是您的示例:

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 :(得分:0)

我很确定你的问题的根本原因是你的"建筑"对象是UI对象,位于画布下。这可能导致许多事情发生,但我认为导致问题的是世界和屏幕空间问题。

您正在将鼠标位置从屏幕点转换为世界空间,当您的"建筑物"对象位于画布下,似乎没有使用世界空间作为其位置。为了确认这一点,我建议您对原始鼠标位置,转换后的鼠标位置以及" Building"的实际位置进行from tblEmails [e] join tblPersonEmails [pe] on (e.EmailID = pe.EmailID) right outer join tblUserAccounts [ua] join People [p] on (ua.PersonID = p.Id) join tblChainEmployees [ce] on (ua.PersonID = ce.PersonID) on (pe.PersonID = p.Id) 。对象。如果您发现未转换的鼠标位置与对象位置的关系更加逼真,我建议您删除转换。

您可能需要做额外的工作(即对鼠标或对象位置进行一些数学运算和/或更改对象的锚点)以使其完美地工作,但这应该允许您的鼠标位置和对象正常工作在职位方面具有相同的单位。