Подергивание автомобиля - PullRequest
1 голос
/ 01 апреля 2019

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

Так что у меня такая проблема. Я пытаюсь заставить трамвай двигаться. Для этого я скачал скрипт из Asset Store «Bezier Path Creator»: https://assetstore.unity.com/packages/tools/utilities/b-zier-path-creator-136082. Работает хорошо. Перед необходимостью создания камеры от третьего лица. После написания короткого сценария я увидел, что машина набирает обороты, набирая скорость. Я сидел пару дней, пытаясь решить эту проблему, и я увидел одну вещь. Если удалить * Time.deltaTime, то больше нет подергивания, но есть зависимость от FPS (что было предсказуемо). Также, если нажать кнопку «Пауза» и посмотреть кадр за кадром, дергаться не приходится. Что я могу с этим поделать?

Есть некоторые фрагменты кода, с которыми у меня проблемы:

  switch (acceleration) {
  case -1:
    acc = -12F;
    break;
  case -2:
    acc = -15F;
    break;
  case -3:
    acc = -18F;
    break;
  case 0:
    acc = 0.000f;
    break;
  case 1:
    acc = 9f;
    break;
  case 2:
    acc = 12f;
    break;
  case 3:
    acc = 17.1f;
    break;
  }

  if (Input.GetKeyDown ("e")) {
        acceleration++;
  }

  if (Input.GetKeyDown ("q")) {
        acceleration--;
  }

  if (acceleration < -3) {
        acceleration = -3;
  }

  if (acceleration > 3) {
        acceleration = 3;
  }

if (speed > 40.0f) {
  speed = 40.0f;
  saveSpeed = speed;
  speed = saveSpeed;
} else if (speed >= 0.0f && speed <= 0.03f && acceleration == 0) {
  speed = 0.0f;
} else if (speed <= 0.0f && speed >= -0.03f && acceleration == 0) {
  speed = 0.0f;
} else if (speed <= 40.0f) {
  speed += ((Time.time - startTime)/1000)*(-acc);
}

// Taking a piece of Asset Store code


transform.rotation = pathCreator.path.GetRotationAtDistance(distanceTravelled);
transform.position = pathCreator.path.GetPointAtDistance(distanceTravelled); // I guess the problem is somewhere there

Итак, есть методы GetRotationAtDistance и GetPointAtDistance из скрипта Asset Store:

    public Vector3 GetPointAtDistance(float dst, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop)
    {
        float t = dst / length;
        return GetPoint(t, endOfPathInstruction);
    }

    public Vector3 GetPoint(float t, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop)
    {
        var data = CalculatePercentOnPathData(t, endOfPathInstruction);
        return Vector3.Lerp(vertices[data.previousIndex], vertices[data.nextIndex], data.percentBetweenIndices);
    }

    public Quaternion GetRotationAtDistance(float dst, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop)
    {
        float t = dst / length;
        return GetRotation(t, endOfPathInstruction);
    }

    public Quaternion GetRotation(float t, EndOfPathInstruction endOfPathInstruction = EndOfPathInstruction.Loop)
    {
        var data = CalculatePercentOnPathData(t, endOfPathInstruction);
        Vector3 direction = Vector3.Lerp(tangents[data.previousIndex], tangents[data.nextIndex], data.percentBetweenIndices);
        Vector3 normal = Vector3.Lerp(normals[data.previousIndex], normals[data.nextIndex], data.percentBetweenIndices);
        return Quaternion.LookRotation(direction, normal);
    }

Сценарий камеры:

using UnityEngine;
using System.Collections;

public class CameraRotateAround : MonoBehaviour {

public GameObject target;
public Vector3 offset;
public float sensitivity = 3; // чувствительность мышки
public float limit = 80; // ограничение вращения по Y
public float zoom = 0.25f; // чувствительность при увеличении, колесиком мышки
public float zoomMax = 10; // макс. увеличение
public float zoomMin = 3; // мин. увеличение
private float X, Y;

void Start ()
{
    limit = Mathf.Abs(limit);
    if(limit > 90) limit = 90;
    offset = new Vector3(offset.x, offset.y, -Mathf.Abs(zoomMax)/2);
    transform.position = target.transform.position + offset;
    offset.z -= zoom + 3;
}

void Update ()
{
    if(Input.GetAxis("Mouse ScrollWheel") > 0) offset.z += zoom;
    else if(Input.GetAxis("Mouse ScrollWheel") < 0) offset.z -= zoom;
    offset.z = Mathf.Clamp(offset.z, -Mathf.Abs(zoomMax), -Mathf.Abs(zoomMin));

    X = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivity;
    Y += Input.GetAxis("Mouse Y") * sensitivity;
    Y = Mathf.Clamp (Y, -limit, 0);
    transform.localEulerAngles = new Vector3(-Y, X, 0);
    transform.localPosition = transform.localRotation * offset + target.transform.position;
}
}

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

1 Ответ

2 голосов
/ 01 апреля 2019

У меня когда-то была похожая проблема, и Эта ссылка Помогла мне тонну.

Проблема, с которой вы столкнулись, связана с тем, что камера является третьим лицом и не связана с объектом, за которым она следует.

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

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

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