Баг заключается в том, что когда игрок движется, а камера следит за игроком (перемещается за ним), то кажется что окружение перемещается неравномерно (прерывисто).
Возникают задержки перемещения, как будто игрок на долю секунды замедляется, картинка прерывается, "дрожит", нет постоянной скорости перемещения, есть какие то рывки.
То есть либо это игрок дергается, неравномерно перемещается, либо камера за ним, либо что то не успевает обновиться (Update/LateUpdate).
Видео
В билде https://youtu.be/-wLJ2U29n20
В редакторе https://youtu.be/bIZ6Y0nFSIs
Дрожание игрока (это норма?) https://youtu.be/-5pZva_Oc_s
К игроку и камере привязаны скрипты.
Код камеры. Ищет игрока и следит за ним.
Синтаксис:
Используется csharp
using UnityEngine;
public class CameraController : MonoBehaviour
{
private GameObject player;
private Transform playerTransform;
// Скорость смещения камеры.
private float lerpSpeedX = 5f;
private float lerpSpeedY = 1f;
void Awake()
{
transform.SetParent(null); // Если камера внутри какого либо объекта (например Player) перемещаем её вне его, для корректного расчета позиции перемещения.
player = GameObject.Find("Player");
playerTransform = player.GetComponent<Transform>();
}
void LateUpdate()
{
Vector3 targetCamPos = new Vector3(playerTransform.position.x, transform.position.y, transform.position.z);
float newX = targetCamPos.x;
//float newX = Mathf.Lerp(transform.position.x, targetCamPos.x, lerpSpeedX*Time.deltaTime);
float newY = Mathf.Lerp(transform.position.y, targetCamPos.y, lerpSpeedY);
transform.position = new Vector3(newX, newY, transform.position.z);
}
}
public class CameraController : MonoBehaviour
{
private GameObject player;
private Transform playerTransform;
// Скорость смещения камеры.
private float lerpSpeedX = 5f;
private float lerpSpeedY = 1f;
void Awake()
{
transform.SetParent(null); // Если камера внутри какого либо объекта (например Player) перемещаем её вне его, для корректного расчета позиции перемещения.
player = GameObject.Find("Player");
playerTransform = player.GetComponent<Transform>();
}
void LateUpdate()
{
Vector3 targetCamPos = new Vector3(playerTransform.position.x, transform.position.y, transform.position.z);
float newX = targetCamPos.x;
//float newX = Mathf.Lerp(transform.position.x, targetCamPos.x, lerpSpeedX*Time.deltaTime);
float newY = Mathf.Lerp(transform.position.y, targetCamPos.y, lerpSpeedY);
transform.position = new Vector3(newX, newY, transform.position.z);
}
}
Код передвижения игрока.
Синтаксис:
Используется csharp
void FixedUpdate()
{
float horizontalInput = Input.GetAxis("Horizontal");
Vector3 movement = new Vector2(horizontalInput * playerRunSpeed, rb.velocity.y);
rb.velocity = movement;
}
{
float horizontalInput = Input.GetAxis("Horizontal");
Vector3 movement = new Vector2(horizontalInput * playerRunSpeed, rb.velocity.y);
rb.velocity = movement;
}
Для исключения бага скрипта камеры, я удалял эту камеру и использовал синемашин. То есть создавал дефолтную виртуальную камеру синемашин и перетаскивал туда объект для слежения - игрока.
Баг не исчез.
Ставил у rigidbody 2d игрока интерполяцию. Баг стал значительно меньше, но не исчез.
Заметил, что баг появляется на частоте монитора 144 герц, при 60 баг почти не заметен (трудно определить на глаз, может бага и нет).
Как это исправить?