clmingxx 2020-02-28 15:02 采纳率: 0%
浏览 926

求助:Unity VR的UI问题

开发VR场景过程中
在**电脑调试**时效果如下:图片说明

图1

UI显示正常

射线检测会将FallBack小球放置于击中点

通过碰撞盒检测加载进度条并依照进度触发按钮或勾选框效果

而在**USB调试或真机测试**时效果如下:

图片说明

图2

UI显示没有遮挡效果

射线检测会将FallBack小球放置于击中点但不能加载进度条(图中为测试进度条设置最低进度10%)

代码:

if (Physics.Raycast(ray, out hitInfo, 100F))
        {
            sp.transform.position = hitInfo.point;
            //Debug.Log("UI层:"+ results.Count);
            if (hitInfo.transform.tag.Equals("货物"))
            {
                P_ring.GetComponent<Image>().color = Color.green;
                if (loading() >= 1)
                {
                    hitInfo.transform.position = cao_p.transform.position;
                    P_ring.GetComponent<Image>().fillAmount = 0;

                }
            }
            else if (hitInfo.transform.tag.Equals("地面"))
            {
                //P_ring.GetComponent<Image>().color = Color.grey;
                if (loading() >= 1)
                {
                    head.transform.position = new Vector3(hitInfo.point.x, head.transform.position.y, hitInfo.point.z);
                    P_ring.GetComponent<Image>().fillAmount = 0;

                }
            }
            else if (hitInfo.transform.tag.Equals("标签"))
            {
                P_ring.GetComponent<Image>().color = Color.yellow;
                //Debug.Log("标签");
                if (loading() >= 1)
                {
                    hitInfo.transform.parent.parent.gameObject.GetComponent<货架>().setoff();
                    P_ring.GetComponent<Image>().fillAmount = 0;

                }
            }
            else if (hitInfo.transform.tag.Equals("可触发"))
            {
                P_ring.GetComponent<Image>().color = Color.white;
                //Debug.Log("可触发");
                if (loading() >= 1)
                {
                    //hitInfo.transform.parent.parent.gameObject.GetComponent<货架>().setoff();
                    if (hitInfo.transform.name.Equals("Checkmark"))
                    {
                        hitInfo.transform.parent.parent.GetComponent<Toggle>().isOn = !hitInfo.transform.parent.parent.GetComponent<Toggle>().isOn;
                    }
                    else if (hitInfo.transform.name.EndsWith("按钮"))
                    {
                        hitInfo.transform.GetComponent<Button>().onClick.Invoke();
                    }
                    P_ring.GetComponent<Image>().fillAmount = 0;

                }
            }
            else
            {
                P_ring.GetComponent<Image>().fillAmount = 0.1f;
            }
            //Debug.Log("Shoot:" + hitInfo.transform.name);//loading();
        }

得出信息如下:
1. 射线在两种情况下都能检测到附加在UI组件上的盒型碰撞盒
2. 在USB调试或真机测试时不能检测碰撞盒所属gameobject的tag
3.在USB调试或真机测试时UI显示出现如图2所示问题
附(可能有用的其他信息):
相关UI组件碰撞盒略大以保证其被检测
相关UI组件的layer由UI改为default

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 Java领域优质创作者 2024-07-25 19:37
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据描述,问题出现在USB调试或真机测试时,无法检测碰撞盒所属gameobject的tag,导致UI显示不正常。可能是由于在USB调试或真机测试时,UI组件的layer由UI改为default,导致碰撞检测失败。 解决方法:
    1. 确保UI组件的layer设置正确,应该是UI,而不是default。
    2. 修改代码中的碰撞检测条件,不仅仅依赖于tag,可以通过其他方式来判断碰撞到的gameobject类型。 在代码中可以修改如下:
    else if (hitInfo.collider.CompareTag("货物"))
    {
        // 处理货物的逻辑
    }
    else if (hitInfo.collider.CompareTag("地面"))
    {
        // 处理地面的逻辑
    }
    // 其他碰撞检测逻辑
    

    通过以上修改,可以在USB调试或真机测试时正确判断碰撞到的gameobject类型,从而正确处理UI显示的逻辑。

    评论

报告相同问题?