Выравнивать по наклону и скорости плоской поверхности в Unity - PullRequest
0 голосов
/ 15 мая 2019

Я написал похожий вопрос, но это не совсем та же проблема, так что я иду.

Я не использую физику в своем проекте, поэтому я рассчитываю и применяю каждую силу. Дело в том, что персонаж покрывает одну и ту же область в одно и то же время, независимо от того, на какой поверхности он движется.

При применении того же движения в функцию CharacterController.Move () скорость контроллера увеличивается экспоненциально, пытаясь перемещаться по той же поверхности, что и в плоской области.

Например. Если распечатывается вычисленный элемент движения, который будет применен в функции «Move ()», он является нормализованным, с (0,0,1) по перпендикуляру и (0,7,0,0,7) по диагонали. Однако, если я получу скорость через CharacterController.velocity.magnitude, я получу другую скорость: 8 на плоской поверхности и 11,47 на склоне 45º.

Я создал формулу для вычисления значения, которое следует получить с помощью этой функции «speed.magnitude».

groundAngle = Mathf.Abs(Mathf.Round(Vector3.Angle(hit.normal, transform.forward)) - 90);

groundMovementMagnitude = characterController.velocity.magnitude;

slopeMovementIdeal = ((((groundAngle/2) - groundAngle) + 100) * (groundMovementMagnitude / 100));

С помощью этой формулы я получаю значение «8» на плоской поверхности, а вместо «11,47» значение скорости, полученное на наклоне под углом 45º, равно «6,4»

Тем не менее, это значение является просто информативным, поскольку скорость контроллера персонажа не может быть установлена. Вместо этого мне нужен способ изменить движение Vector3, которое будет использоваться для запуска движения, поэтому вместо перемещения (0,0,1) по склону или (0,7,0,0,7) по диагонали на Наклон, примените редуктор, чтобы вычесть этот Vector3 в зависимости от угла наклона.

1 Ответ

0 голосов
/ 16 мая 2019

Что я наконец-то сделал, это использовал величину скорости, чтобы вычислить разницу между плоскостным движением и уклоном. Затем я просто преобразовал это значение в нормализованный вектор и вычел его в движение символов.

        float minMovement = 0.01f;
        float difference = 0.0f;
        float x = 0.0f;
        float z = 0.0f;

        if (OnSlope() && characterController.velocity.magnitude - moveSpeed > minMovement) {
            difference = characterController.velocity.magnitude - moveSpeed;
            //Diagonal
            if ((movement.x > minMovement || movement.x < -minMovement) && (movement.z > minMovement || movement.z < -minMovement)) {
                x = z = (difference / 2) / characterController.velocity.magnitude;

                if (movement.x < 0)
                    x *= -1;
                if (movement.z < 0)
                    z *= -1;
            }
            //Perpendicular
            else {
                if (movement.x > minMovement || movement.x < -minMovement) {
                    x = difference / moveSpeed;
                    if (movement.x < 0)
                        x *= -1;
                }
                if (movement.z > minMovement || movement.z < -minMovement) {
                    z = difference / moveSpeed;
                    if (movement.x < 0)
                        z *= -1;
                }
            }
            movement.x -= x;
            movement.z -= z;
        }

Работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...