在Unity3D中为UI项目选择光线投射
本文关键字:选择 光线投射 项目 UI Unity3D 中为 | 更新日期: 2023-09-27 17:52:44
我正在Unity3D中为一个VR项目实现凝视算法。到目前为止,我在这里发现的是使用Physics.Raycast
并添加BoxCollider2D组件与每个按钮对象来检测用户是否正在查看它。我想避免使用Raycast,因为它是昂贵的,可能会产生性能问题,因为我有非常复杂的UI结构要处理。
我尝试使用光标锁定,但不幸的是它不适合移动平台。
我还尝试使用相机视口的中心来检查按钮对象的rect
是否包含由
Camera.main.ViewportToWorldPoint(new Vector3(0.5f,0.5f,Camera.main.nearClipPlane));
当按钮对象的矩形变换被锚定为居中位置时,它可以正常工作。但不工作,当它有一些其他设置或如果按钮倾斜一点(在世界空间画布)。我不太熟悉矩形变换是如何工作的,以及如何找到它在世界空间中的确切位置。
有谁知道答案吗?或者还有别的办法吗?
所有的帮助都是非常感谢的。我找到问题了,是z轴的不同值导致了问题。以下解决方案在不使用Physics.Raycast
的情况下可以正常工作:
void Update ()
{
pos = Camera.main.ViewportToWorldPoint(new Vector3(0.5f,0.5f,Vector3.Distance(transform.position,Camera.main.transform.position)));
_rect = new Rect(pos.x-size,pos.y-size,size,size);
_rect2 = new Rect(transform.position.x-rt.rect.width/2,transform.position.y-rt.rect.height/2,rt.rect.width,rt.rect.height);
Hit = _rect2.Overlaps(_rect);
if(Hit)
{
if (!isEntered)
{
_button.OnPointerEnter(new PointerEventData(EventSystem.current));
}
isEntered = true;
timeElapsed += Time.deltaTime;
if(timeElapsed >= 3) // autoclick after 3 sec.
{
timeElapsed = 0;
_button.onClick.Invoke();
isEntered = false;
}
}
else
{
timeElapsed = 0;
if (isEntered)
{
_button.OnPointerExit(new PointerEventData(EventSystem.current));
}
isEntered = false;
}
}