我有一个GameObject,它实现了UnityEngine.EventSystems的IDragHandler和IDropHandler。
在OnDrop中,我想检查,是否已将此对象放在另一个对象的前面。我使用的是Physics.Raycast,但在某些情况下它只返回true。我使用屏幕点光线作为我的光线的方向,并将此变换作为光线投射光线的原点。
我的代码:
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成功找到了背后的物体。
调试光线看起来很好,它是从我丢弃的对象中绘制出来的,向后移动到它应该击中的对象。
答案 0 :(得分:1)
暂时放置在IgnoreRaycast图层中删除的对象解决了我的问题。这也意味着我可以跳过将光线的原点设置为transform.position。
public void OnDrop(PointerEventData eventData)
{
// Save the current layer the dropped object is in,
// and then temporarily place the object in the IgnoreRaycast layer to avoid hitting self with Raycast.
int oldLayer = gameObject.layer;
gameObject.layer = 2;
var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
RaycastHit hit;
if (Physics.Raycast(screenRay, out hit))
{
Debug.LogFormat("Dropped in front of {0}!", hit.transform);
}
// Reset the object's layer to the layer it was in before the drop.
gameObject.layer = oldLayer;
}
编辑:由于性能原因,从代码段中删除了try / finally块。