Unity3d Physics2D.OverlapPoint()返回始终为null
我试图在3D场景中检测鼠标点击2D精灵 我所有的精灵都有一个盒子碰撞器2D(位置合适)和一个脚本,但命中总是为空。我还尝试将Update()函数放在GameEngine GameObject的脚本上,但得到了相同的结果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
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);
}
}
你可以实现很多接口,我建议你检查一下手册
Input.mousePosition
作为Physics2D.OverlapPoint的属性,它工作得很好。如果我使用屏幕鼠标位置,它可以吗?或者如果我对它做些什么,它会更好在世界上处理这个问题?(如何处理?)改变它的方式是将画布从屏幕空间更改为世界空间或类似的东西。但是我不建议这样做。如果你想让你的按钮保持在同一个空间,不管你的相机在游戏中移动到哪里,你需要它们在屏幕空间,而不是世界空间。此外,UI通常基于n屏幕空间,独立于世界空间,因此从设计角度来看,最好使用屏幕坐标来处理UI。如果我将Input.mousePosition
作为Physics2D.OverlapPoint的属性,它工作得很好。如果我使用屏幕鼠标位置可以吗?或者如果我在世界上做些事情来处理它会更好?(怎么做?)改变它的方式是将画布从屏幕空间更改为世界空间或类似的东西。但是我不建议这样做。如果你想让你的按钮保持在同一个空间,不管你的相机在游戏中移动到哪里,你需要它们在屏幕空间,而不是世界空间。此外,UI通常基于n屏幕空间和i