Рэйкаст раньше не давал игроку проходить через стену, работая только половину времени - PullRequest
0 голосов
/ 08 апреля 2020

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

1 Ответ

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

Я нашел способ лучше, который делает эту работу. Я немного изменил свой метод. Вместо того, чтобы использовать переменную для сохранения предыдущей позиции, я настроил ее так, что если в raycast зарегистрировано попадание, преобразование не произойдет, но если попадание не будет обнаружено, преобразование произойдет. Я также изменил этот код из этого оригинального источника http://wiki.unity3d.com/index.php/MouseCameraControl

    if (horizontalTranslation.isActivated())
    {
        //sets translate to be used for transformation
        float translateX = Input.GetAxis(mouseHorizontalAxisName) * horizontalTranslation.sensitivity;
        //variables for raycasting
        origin = transform.position;
        Vector3 eLeft = -GetComponent<Camera>().transform.right;
        Vector3 eRight = GetComponent<Camera>().transform.right;
        RaycastHit hitLeft;
        RaycastHit hitRight;
        //raycast sent to right
        if (translateX > 0)
        {
            if (Physics.SphereCast(origin, sphereRadius, eRight, out hitRight, maxDistance, layerMask, QueryTriggerInteraction.UseGlobal))
            {
                //do nothing if hit is detected
            }
            else
            {
                //transform position if no hit detected
                transform.Translate(translateX, 0, 0);
            }
        }
        //raycast sent to left
        if (translateX < 0)
        {
            if (Physics.SphereCast(origin, sphereRadius, eLeft, out hitLeft, maxDistance, layerMask, QueryTriggerInteraction.UseGlobal))
            {
                //transform.Translate(translateX, 0, 0);
            }
            else
            {
                transform.Translate(translateX, 0, 0);
            }
        }    
    }
...