【发布时间】:2017-05-31 07:41:31
【问题描述】:
我有一个从 UnityEngine.EventSystems 实现 IDragHandler 和 IDropHandler 的 GameObject。
在 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,但“命中”包含 this,而不是后面的对象。有时它返回假。这两个结果都不是预期的,这背后有一些物体应该可以进行 Raycast。
当物体落在摄像机视野外围的前方物体上时,Physics.Raycast 会成功找到后面的物体。
Debug ray 看起来不错,它是从我放下的对象绘制的,向后到它应该击中的对象。
【问题讨论】:
-
注意:如果我不使用 screenRay 设置 thisToObjectBehind = new Ray(transform.position, transform.forward * -1),Raycast 成功,所以碰撞器应该没有任何问题。但是,我不想将自己限制在必须面对镜头的情况下。
-
成功和失败的eventData值是多少?
-
你不需要LayerMask吗?
-
Fredrik 是绝对正确的,层是问题。
标签: c# unity3d raycasting