Unity - Vuforia - Raycast Hits отлично работают в Unity Editor, но содержат ошибки Android Сборка устройства - PullRequest
0 голосов
/ 26 января 2020

за мою дипломную работу по расширению физической бумажной карты. Для этого, как написано в заголовке, я использую 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 цели изображения и меняются во время выполнения к новым координатам XZ, рассчитанным по их координатам LatLong. Их хиты Raycast также обнаруживаются с помощью приведенного выше сценария.

Когда я запускаю свое приложение в редакторе, все работает отлично. Каждый из элементов, кубы и булавки, получает raycast точно так же, как и должен.

Пока все хорошо.

Когда я собираю версию android и устанавливаю ее в мой xiaomi android телефон, радиопередачи не бьют, как они должны. Я не получаю никакого удара вообще, когда я касаюсь кубов в их исходном положении рядом с картой. НО я получаю попадания в отмеченную синим цветом область, показанную на рисунке ниже.

Моя сцена единства, показывающая кнопки куба

Это похоже на бокс-коллайдеры кубов сбоку все перемещаются в положение 0/0/0 моей цели изображения во время выполнения, хотя модели сохраняют свое исходное положение.

Булавки вообще не получают никаких ударов, хотя они активны. sh коллайдеры на них и попадание в редактор тоже.

Я сейчас крайне отчаянный, так как я уже испробовал каждый совет, который нашел в тысячах угроз.

Я попытался настроить новый элемент AR-камеры, переместите сценарий на другой объект, измените иерархию, измените коллайдеры, сбросьте коллайдеры, разные сценарии raycast от щелчка мышью до касания, используйте другое устройство и т. д.

Я бы Я очень признателен, если у кого-то из вас есть подсказка, в чем может быть проблема.

Если потребуется дополнительная информация, просто дайте мне знать!

Пока спасибо. Привет

РЕДАКТИРОВАТЬ:

@ Филипп Ленсен и другие

Как я уже сказал, я думаю, что коллайдеры движутся во время выполнения. Я отлаживал коллайдеры buttonRoute 1 и buttonRoute 2, пока попал в отмеченную синим цветом зону из скриншота 1.

Я получаю попадания, и положение коллайдеров совершенно другое.

Кубы, помеченные зеленым и желтым, представляют собой кубы, предназначенные для визуализации бокслайдеров Куба маршрута 1 и Маршрута 2 рядом с картой.

Они даже не находятся в одной и той же позиции. Один находится выше 0 оси Y, а другой внизу. Их координаты X и Z совершенно странные. Они должны сохранять положение элементов 3d Зеленого маршрута 2 и Желтого маршрута 1, показанных рядом с картой!

Я понятия не имею, почему это происходит ....

РЕДАКТИРОВАТЬ:

Я перестроил весь проект на новый чистый. Я также обновил свой Android SDK до последней версии. Теперь приложение работает без ошибок!

...