raycast используется для предотвращения прохождения камеры через потолок и пол, что приводит к зависанию плеера Unity - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть проект, в котором пользователь управляет камерой, например, как вы можете управлять камерой в редакторе сцен в Unity. Я использую лучевые трансляции, чтобы камера не проходила через стены, полы и потолки. Это работает так: я посылаю лучевую трансляцию с определенного диапазона, и если попадания нет, преобразование будет происходить нормально, но не будет, когда обнаружен попадание. Я использую этот метод для панорамирования влево и вправо, и он идеально подходит для предотвращения прохождения игроком сквозь стены. Я также использую этот же метод для масштабирования колесика мыши, и он также отлично работает. Проблема возникает, когда я использую этот метод для предотвращения прохождения пользователем потолка или пола, когда пользователь использует вертикальный перевод. Пользователь иногда застревает на потолке или полу, и я не уверен, почему. Я пробовал кучу разных вещей, чтобы решить эту проблему без удачи. Если у кого-то есть идея, почему это происходит, и возможный обходной путь, я был бы признателен. Вот мой код для вертикального перевода с помощью raycasting.

   //if the user moves the camera veritcally
   if (verticalTranslation.isActivated())
   {
            float translateY = Input.GetAxis(mouseVerticalAxisName) * verticalTranslation.sensitivity;
            RaycastHit hit;
            //sends raycast up veritcally
            if (translateY > 0)
            {
                //if raycast hit detected do nothing, else transform position 
                if (Physics.Raycast(transform.position, Vector3.up, out hit, maxDistance))
                {
                    Debug.LogWarning("stop movement");
                    Debug.LogWarning(hit.distance);
                }
                else
                {
                    transform.Translate(0, translateY, 0);
                }
            }
            //sends raycast down veritcally
            if (translateY < 0)
            {
                if (Physics.Raycast(transform.position, -Vector3.up, out hit, maxDistance))
                {
                    Debug.LogWarning("stop movement");
                    Debug.LogWarning(hit.distance);
                }
                else
                {
                    transform.Translate(0, translateY, 0);
                }
            }
    }

1 Ответ

0 голосов
/ 16 апреля 2020

Если у кого-то еще есть подобная проблема, Гинтас сделал отличное замечание, и я последовал его совету, изложив аргумент для translateY == 0. Это решило проблему. Вот новый код.

   if (verticalTranslation.isActivated())
   {
            position = transform.position;
            float translateY = Input.GetAxis(mouseVerticalAxisName) * verticalTranslation.sensitivity;

            if (position.y < 12284)
            {
                position.y = 12284;
                transform.position = position;
            }

            RaycastHit hit;
            if (translateY > 0)
            {

            if (Physics.SphereCast(origin, sphereRadius, Vector3.up, out hit, maxDistance, layerMask, QueryTriggerInteraction.UseGlobal))
            {
                Debug.LogWarning("stop movement");
                Debug.LogWarning(hit.distance);
                }
                else
                {
                    transform.Translate(0, translateY, 0);
                }
            }
            if (translateY < 0)
            {
            if (Physics.SphereCast(origin, sphereRadius, -Vector3.up, out hit, maxDistance, layerMask, QueryTriggerInteraction.UseGlobal))
            {
                Debug.LogWarning("stop movement");
                    Debug.LogWarning(hit.distance);
                }
                else
                {
                    transform.Translate(0, translateY, 0);
                }
            }
            if(translateY == 0)
            {
                transform.Translate(0, translateY, 0);
            }
    }
...