Обратное движение сделано с помощью transform.RotateAround () - PullRequest
0 голосов
/ 05 октября 2018

Я делаю мобильную игру от третьего лица с помощью джойстиков.Я установил, где joystick.vertical перемещает персонажа вперед или назад в зависимости от того, куда он смотрит, а joystick.horizontal поворачивает персонажа.Поскольку камера связана с персонажем, камера всегда остается позади персонажа.

При перемещении по экрану камера поворачивается вокруг плеера с сенсорной панелью с использованием функции Camera.main.transform.RotateAround(), а transform.LookAt() гарантирует, что я смотрюу моего персонажа всегда.

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

Мое решение 1 : сделать пустой символ gameObject, связанный с персонажем, и поместить его в положение, в которое я хочу, чтобы камера вернулась назад, и вызвать это положение, когда мышь находитсяотпустить.

float spanCamera = -Joystick.Horizontal;

Camera.main.transform.LookAt(rb.transform.position);
if (spanCamera != 0)
    Camera.main.transform.RotateAround(rb.position, Vector3.up, spanCamera * Time.fixedDeltaTime * spanSpeed);

else if (Input.touchCount <= 1)
{
    float var6 = var5 * Time.deltaTime;

    Camera.main.transform.position = camPos.transform.position;

    Camera.main.transform.LookAt(camLookAt.transform.position);
}

Этот фрагмент кода немедленно перемещает камеру в исходное положение без сглаживания.

Решение 2 : вместо этого используйте Vector3.MoveTowards()

// Camera.main.transform.position = camPos.transform.position;

Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, camPos.transform.position, var6);

Этот код позволяет мне плавно перейти в начальную позицию по прямой .Я хочу, чтобы он обошел плеер.

Поэтому я попробовал другой метод, в котором я назначаю значение с плавающей запятой 1, если камера поворачивается вправо и проверяет, отпущена ли кнопка поворота, и если значение равно 1 в пределах блока if.

public float axisDir;

...

else if (spanCamera == 0 && axisDir == 1)
{
    Camera.main.transform.RotateAround(rb.position, Vector3.up, -1 * Time.fixedDeltaTime * spanSpeed);
}

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

Я надеюсь, что кто-томожет помочь.Это довольно длинный пост.(

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

попробуйте этого приятеля:

// Maximum turn rate in degrees per second.
 public float turningRate = 30f; 
 // Rotation we should blend towards.
 private Quaternion _targetRotation = Quaternion.identity;
 // Call this when you want to turn the object smoothly.
 public void SetBlendedEulerAngles(Vector3 angles)
 {
   _targetRotation = Quaternion.Euler(angles);
 }

 private void Update()
 {
    // Turn towards our target rotation.
    transform.rotation = Quaternion.RotateTowards(transform.rotation, _targetRotation, turningRate * Time.deltaTime);
 }

я нашел его здесь

из моего собственного опыта использования LERP работает довольно хорошо, вы ищете плавный переход, илимежду двумя точками, известными как интерполяция, в данном случае линейная интерполяция.

0 голосов
/ 05 октября 2018

У вас может быть манекен gameObject в качестве дочернего элемента игрока, а камера - в качестве дочернего элемента манекена.

Таким образом, камера смотрит в центр gameObject:где игрок.Камера также будет вращаться вместе с плеером, поэтому она всегда будет позади игрока.

Теперь вы знаете, что когда Mathf.Approximately(dummy.transform.localEulerAngles.y, 0.0f), камера находится позади игрока.[ 1 ] [ 2 ]

Зная это, вы можете проверить, когда игрок прекратил проводить, и начать медленно вращать его назад.

// If the player let go and camera is not behind the player
if (!playerIsSwiping && !Mathf.Approximately(dummy.transform.localEulerAngles.y, 0.0f))
{
    // Slowly rotate until the camera is behind the player
    dummy.transform.RotateAround(Vector3.zero, Vector3.up, rotationSpeed * Time.deltaTime);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...