首页 > 解决方案 > Unity - Vuforia - Raycast Hits 在 Unity 编辑器上运行良好,但在 Android 设备构建上存在错误

问题描述

对于我的学士论文,我正在增加物理纸质地图。因此,如标题中所写,我使用 unity 与 vuforia 结合来进行图像目标检测和其他功能。

到目前为止,一切都很好。

现在的问题:

我使用在地图旁边增加的立方体元素作为交互元素来过滤投影内容。那些立方体上有盒子对撞机。我将以下“buttonController”脚本附加到我的 AR 相机上,它应该处理这些立方体上的 Raycast 命中并触发更多功能。

using UnityEngine;

using UnityEngine.Events;

using UnityEngine.EventSystems;

public class ButtonController : MonoBehaviour
{
public AudioClip[] audioClips;
public AudioSource myAudioSource;

private string btnName;
private GameObject[] stations;

private void Start()
{
    myAudioSource = GetComponent<AudioSource>();
}

private void Update()
{

    if (Input.GetMouseButtonDown(0))
    {

        //Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        Vector3 tapPositionFar = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.farClipPlane);
        Vector3 tapPositionNear = new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane);

        Vector3 tapPosF = Camera.main.ScreenToWorldPoint(tapPositionFar);
        Vector3 tapPosN = Camera.main.ScreenToWorldPoint(tapPositionNear);

        int layerMask = LayerMask.GetMask("Button", "Pin");
        RaycastHit hit;

        if (Physics.Raycast(tapPosN, tapPosF - tapPosN, out hit, Mathf.Infinity, layerMask))
        {

            btnName = hit.transform.name;
            Debug.Log("NAME OF HIT TARGET: " + hit.transform.name);

            myAudioSource.clip = audioClips[0];
            myAudioSource.Play();

            switch (btnName)
            {
                case "buttonRoute1":
                    Debug.Log("In: CASE 1");

                    playAnimation(btnName);
                    stations = GameObject.FindGameObjectsWithTag("Route1");

                    Debug.Log(stations);

                    LineRenderer lineRenderer = GetComponent<LineRenderer>();

                    foreach (GameObject station in stations)
                    {
                        MeshRenderer mRenderer = station.GetComponent<MeshRenderer>();
                        if (mRenderer.enabled == true)
                        {
                            mRenderer.enabled = false;
                        }
                        else
                        {
                            mRenderer.enabled = true;
                        }
                    }
                    return;

                case "buttonRoute2":
                    Debug.Log("In: CASE 2");
                    playAnimation(btnName);
                    return;

                case "buttonRoute3":
                    Debug.Log("In: CASE 3");
                    playAnimation(btnName);
                    return;

                case "buttonRoute4":
                    Debug.Log("In: CASE 4");
                    playAnimation(btnName);
                    return;

                case "buttonRoute5":
                    Debug.Log("In: CASE 5");
                    playAnimation(btnName);
                    return;

                case "buttonRoute6":
                    Debug.Log("In: CASE 6");
                    playAnimation(btnName);
                    return;
            }
        }
        else
        {
            //Debug.DrawRay(ray.origin, ray.direction * 1000, Color.white);
            Debug.Log("NOTHING HAPPENED WITH MOUSE");
        }
    }
}

void playAnimation(string btnName)
{
    GameObject currentGameObject = GameObject.Find(btnName);
    Animation anim = currentGameObject.GetComponent<Animation>();
    anim.Play();
}

}

这个立方体在统一场景中设置为特殊的 XZ 坐标,并且在运行时不会在另一个脚本中以编程方式移动。

我还增加了放置在图像目标的 0/0/0 上的引脚,并在运行时重新定位到由其 LatLong 坐标计算的新 XZ 坐标。上面的脚本也检测到他们的 Raycast 命中。

当我在编辑器中运行我的应用程序时,一切正常。每个元素,立方体和大头针,都会像它们应该的那样被光线投射击中。

到目前为止,一切都很好。

当我构建 android 版本并将其安装到我的 xiaomi android 手机时,raycast 不会像他们应该的那样命中。当我在地图旁边的原始位置触摸立方体时,我根本没有受到任何打击。但是我在下图中看到的蓝色标记区域被击中。

我的统一场景显示立方体按钮

看起来侧面立方体的 boxcolliders 在运行时都移动到我的 imagetarget 的 0/0/0 位置,尽管模型保持其原始位置。

尽管引脚上有活动的网格碰撞器并且在编辑器中也被击中,但它们根本没有受到任何命中。

我现在非常绝望,因为我已经尝试过我在数千个威胁中找到的每一个建议。

我尝试设置一个新的 AR 相机元素,将脚本移动到另一个对象,更改层次结构,更改碰撞器,重置碰撞器,从鼠标点击到触摸的不同光线投射脚本,使用不同的设备,......等等。

如果你们中的任何人可能暗示问题可能是什么,我将非常感激。

如果需要更多信息,请告诉我!

感谢到目前为止。问候

编辑:

@Philipp Lenssen 和其他人

就像我已经说过的那样,我认为对撞机在运行时会移动。我调试了 buttonRoute 1 和 buttonRoute 2 的碰撞器,同时击中了屏幕截图 1 中的蓝色标记区域。

我被击中并且对撞机的位置完全不同。

标记为绿色和黄色的立方体是用于可视化 Route 1 和 Route 2 的 boxcolliders 的立方体 Button cube 在地图旁边

他们甚至不在同一个错误的位置。一个在 Y 轴的 0 上方,一个在下方。它们的 X 和 Z 坐标非常奇怪。他们应该保持地图旁边显示的绿色路线 2 和黄色路线 1 按钮 3d 元素的位置!

我不知道为什么会发生这种情况......

编辑:

我已经将整个项目重建为一个新的干净的项目。我还将我的 Android SDK 更新到了最新版本。现在该应用程序可以正常工作了!

标签: c#androidunity3dvuforiaraycasting

解决方案


推荐阅读