在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));

当按钮对象的矩形变换被锚定为居中位置时,它可以正常工作。但不工作,当它有一些其他设置或如果按钮倾斜一点(在世界空间画布)。我不太熟悉矩形变换是如何工作的,以及如何找到它在世界空间中的确切位置。

有谁知道答案吗?或者还有别的办法吗?

所有的帮助都是非常感谢的。

在Unity3D中为UI项目选择光线投射

我找到问题了,是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;
    }
}