У меня есть проект, в котором пользователь управляет камерой, например, как вы можете управлять камерой в редакторе сцен в 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);
}
}
}