【问题标题】:Alternative of Raycast for UI Items in Unity3DUnity3D 中 UI 项的 Raycast 替代方案
【发布时间】:2016-06-27 13:02:18
【问题描述】:

我正在 Unity3D 中为一个 VR 项目实现凝视算法。到目前为止,我在这里发现的是使用 Physics.Raycast 并在每个按钮对象中添加 BoxCollider2D 组件来检测用户是否正在查看它。我想避免使用 Raycast,因为它很昂贵并且可能会产生性能问题,因为我需要处理非常复杂的 UI 结构。

我尝试使用光标锁定,但不幸的是它不适用于移动平台。

我还尝试使用相机视口中心来检查按钮对象的rect 是否包含由

创建的世界点

Camera.main.ViewportToWorldPoint(new Vector3(0.5f,0.5f,Camera.main.nearClipPlane));

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

有人知道解决办法吗?或者有没有其他方法可以做到这一点?

我们非常感谢所有类型的帮助。

【问题讨论】:

标签: c# unity3d unity5 unity3d-2dtools


【解决方案1】:

我发现了问题,是 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;

    }
}

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多