我有一个游戏物体实现了UnityEngine.EventSystems中的IDragHandler和IDropHandler接口。
在OnDrop事件中,我想检查这个物体是否在另一个物体的前面被放下。我使用Physics.Raycast进行检测,但只有在某些情况下返回true。我使用屏幕坐标作为射线方向,使用此变换作为Raycast的起点。
我的代码如下:
public void OnDrop(PointerEventData eventData)
{
var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
var thisToObjectBehind = new Ray(transform.position, screenRay.direction);
Debug.DrawRay(thisToObjectBehind.origin, thisToObjectBehind.direction, Color.yellow, 20.0f, false);
RaycastHit hit;
if (Physics.Raycast(thisToObjectBehind, out hit))
{
Debug.LogFormat("Dropped in front of {0}!", hit.transform);
}
}
我正在使用透视相机。当物体被放置在屏幕/相机正前方的物体之前时,Physics.Raycast有时会返回true,但“hit”包含的是此物体而不是后面的物体。有时它会返回false。这两种结果都不是预期的,因为在此背后应该存在可以进行Raycast的对象。
当物体被放置在相机视野边缘的物体之前时,Physics.Raycast成功地找到了其后面的对象。
Debug射线看起来很好,它从我放置的物体向后画出,直到它应该命中的物体。