Raycast используется для предотвращения прохождения камеры через потолок и пол, что приводит к зависанию игрока Unity

У меня есть проект, в котором пользователь управляет камерой, как вы можете управлять камерой в редакторе сцены в Unity. Я использую raycast, чтобы камера не проходила сквозь стены, пол и потолок. Это работает следующим образом: я отправляю raycast в определенном диапазоне, и если попадания нет, преобразование будет происходить нормально, но не произойдет, если обнаружено попадание. Я использую этот метод для панорамирования влево и вправо, и он отлично работает, чтобы не дать игроку пройти сквозь стены. Я также использую тот же метод для масштабирования колеса мыши, и он также отлично работает. Проблема возникает, когда я использую этот метод для предотвращения прохода пользователя через потолок или пол, когда пользователь использует вертикальное перемещение. Иногда пользователь застревает на потолке или полу, и я не знаю почему. Я пробовал кучу разных вещей, чтобы исправить эту проблему, но безуспешно. Если у кого-то есть идеи, почему это происходит, и возможную работу, я был бы признателен. Вот мой код для вертикального перевода с 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);
                }
            }
    }

person Aunger1205    schedule 13.04.2020    source источник
comment
Я просто думаю, заинтересует ли вас случай translateY == 0.   -  person Gintas    schedule 14.04.2020
comment
Это на самом деле очень хороший момент, и я очень рад, что вы подняли это   -  person Aunger1205    schedule 16.04.2020


Ответы (1)


Если у кого-то еще есть подобная проблема, Гинтас сделал отличное замечание, и я последовал его совету, поставив аргумент для 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);
            }
    }
person Aunger1205    schedule 16.04.2020