我有一个GameObject,它实现了UnityEngine.EventSystems中的IDragHandler和IDropHandler。Unity Physics.Raycast似乎没有正确地检测到它碰到的对象
在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会成功找到背后的对象。
调试光线看起来很好,它从我放下的物体上,倒退到它应该击中的物体上。
注意:如果我不使用screenRay设置thisToObjectBehind = newRay(transform.position,transform.forward * -1),Raycast会成功,所以碰撞器应该没有任何问题。但是,我不想限制自己不得不面对相机。 – Helena
什么是成功和失败时的eventData值? – Bijan
你不需要LayerMask吗? – Maakep