Lerp к целевой позиции, но только в радиусе - PullRequest
0 голосов
/ 13 февраля 2019

Я делаю 3D-игру, но мой игрок может двигаться только по осям X и Y.У меня есть плеер с подключенной камерой, следующий за моей мышью, но я хочу, чтобы он шел только до максимального радиуса от Vector3.zero, даже если моя мышь находится за этими границами.

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

void LateUpdate()
{
    if (Input.GetMouseButtonDown(0)) {
        firstTouchPos = movementCam.ScreenPointToRay(Input.mousePosition);
        playerPos = transform.position;
    }

    if (Input.GetMouseButton(0)) {
        Ray currentTouchPos = movementCam.ScreenPointToRay(Input.mousePosition);
        Vector2 direction = currentTouchPos.origin - firstTouchPos.origin;
        float distance = Vector3.Distance(transform.position, Vector3.zero);

        if (distance >= radius) {
            targetPosition = direction.normalized * radius;
        } else {
            targetPosition = playerPos + direction * touchSensitivity;
        }

    }

    transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * followSpeed);
}

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

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Решением было использование величины зажима.

void LateUpdate()
{
    if (Input.GetMouseButtonDown(0)) {
        firstTouchPos = movementCam.ScreenPointToRay(Input.mousePosition);
        playerPos = transform.position;
    }

    if (Input.GetMouseButton(0)) {
        // targetPosition will follow finger movements
        Ray currentTouchPos = movementCam.ScreenPointToRay(Input.mousePosition);
        Vector2 direction = currentTouchPos.origin - firstTouchPos.origin;
        targetPosition = playerPos + direction * touchSensitivity;
    }

    transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * followSpeed);
    transform.position = Vector3.ClampMagnitude(transform.position, radius);
}
0 голосов
/ 13 февраля 2019

Вы должны попробовать использовать Vector3.ClampMagnitude().

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