Unity3d Physics2D.OverlapPoint()返回始终为null

Unity3d Physics2D.OverlapPoint()返回始终为null,unity3d,Unity3d,我试图在3D场景中检测鼠标点击2D精灵 我所有的精灵都有一个盒子碰撞器2D(位置合适)和一个脚本,但命中总是为空。我还尝试将Update()函数放在GameEngine GameObject的脚本上,但得到了相同的结果 void Update () { if (Input.GetMouseButtonDown(0)) { Vector2 mouse_position = Camera.main.ScreenToWorldPoint (Input.mousePos

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

我所有的精灵都有一个盒子碰撞器2D(位置合适)和一个脚本,但命中总是为空。我还尝试将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);
 }

我很确定问题的根本原因是您的“构建”对象是UI对象,位于画布下。这可能会导致很多事情,但我认为是世界和屏幕空间的问题导致了你的问题

当您的“建筑”对象位于似乎未使用世界空间作为其位置的画布下时,您正在将鼠标位置从屏幕点转换为世界空间。为了确认这一点,我建议您对原始鼠标位置、转换后的鼠标位置以及“Building”对象的实际位置执行
Debug.Log
。如果您发现未转换的鼠标位置与对象位置更接近,我建议删除转换


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

我很确定,您的问题的根本原因是您的“Building”对象是UI对象,位于画布下。这可能会导致很多事情,但我认为造成问题的是世界和屏幕空间的问题

您正在将鼠标位置从屏幕点转换为世界空间,而您的“建筑”对象位于似乎没有使用世界空间作为其位置的画布下。为了确认这一点,我建议您对原始鼠标位置、转换后的鼠标位置和鼠标的实际位置执行
Debug.Log
构建“对象”。如果您发现未转换的鼠标位置与对象位置更接近,我建议删除转换


您可能需要做额外的工作(即在鼠标或对象位置上做一些数学运算和/或更改对象的定位点)要使其完美工作,但这应该允许您的鼠标位置和对象在位置上使用相同的单位。

无需执行您正在执行的操作。新的Canvas UI系统内置了复杂的事件系统

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

您可以使用
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);
    }
}
你可以实现很多接口,我建议你检查一下手册


    • 无需执行您正在执行的操作。新的Canvas UI系统内置了复杂的事件系统

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

      您可以使用
      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);
          }
      }
      
      你可以实现很多接口,我建议你检查一下手册


      我建议使用UnityEngine.EventSystems并实现以下这些接口IPointerClickHandler IPointerDownHandler IPointerEnterHandler IPointerExitHandler IPointerUpHandler或最基本的EventTriggers Arthur-您所做的是完全错误的,呵呵:)这要容易得多。除此之外e、 请务必阅读以下内容:的确,Rob已经在下面为您详细解释了这一点。我建议您使用UnityEngine.EventSystems并实现以下这些接口IPointerClickHandler IPointerDownHandler IPointerEnterHandler IPointerExitHandler IPointerUpHandler或在最基本的级别上使用EventTriggers Arthur-您正在做什么g完全错了,呵呵:)这要简单得多。除了别的以外,请务必阅读以下内容:的确,Rob已经在下面为您详细解释了它,因为如果我将
      Input.mousePosition
      作为
      Physics2D.OverlapPoint的属性,它工作得很好。如果我使用屏幕鼠标位置,它可以吗?或者如果我对它做些什么,它会更好在世界上处理这个问题?(如何处理?)改变它的方式是将画布从屏幕空间更改为世界空间或类似的东西。但是我不建议这样做。如果你想让你的按钮保持在同一个空间,不管你的相机在游戏中移动到哪里,你需要它们在屏幕空间,而不是世界空间。此外,UI通常基于n屏幕空间,独立于世界空间,因此从设计角度来看,最好使用屏幕坐标来处理UI。如果我将
      Input.mousePosition
      作为
      Physics2D.OverlapPoint的属性,它工作得很好。如果我使用屏幕鼠标位置可以吗?或者如果我在世界上做些事情来处理它会更好?(怎么做?)改变它的方式是将画布从屏幕空间更改为世界空间或类似的东西。但是我不建议这样做。如果你想让你的按钮保持在同一个空间,不管你的相机在游戏中移动到哪里,你需要它们在屏幕空间,而不是世界空间。此外,UI通常基于n屏幕空间和i