Tengo un problema con mi ViewBobScript, vuelve a la posición de inicio de lerps durante 1 cuadro.
Aquí hay una recreación / video de mi problema: (Debido a que la velocidad de fotogramas del video no coincide con el juego, puede parecer que el lerp no es fluido, mientras que el problema es el chasquido al principio y al final de el video y parece ocurrir a intervalos irregulares)
Y aquí está mi código:
private float aTimer; private int viewBobPath = 1; private float startViewBob; private float viewBobPathTimer; private void ViewBob() { startViewBob = viewBobSpeed / 2; aTimer += Time.deltaTime; viewBobPathTimer += Time.deltaTime; if (aTimer > startViewBob * viewBobPath) { viewBobPath++; } if (viewBobPathTimer > startViewBob) { viewBobPathTimer = 0; } if (aTimer < (viewBobSpeed * 2)) { switch (viewBobPath) { case 1: playerCam.transform.localPosition = Vector3.Lerp(new Vector3(-viewBobHorizontal / 2, 0, 0), new Vector3(0, -viewBobVertical, 0), viewBobPathTimer); break; case 2: playerCam.transform.localPosition = Vector3.Lerp(new Vector3(0, -viewBobVertical, 0), new Vector3(viewBobHorizontal / 2, 0, 0), viewBobPathTimer); break; case 3: playerCam.transform.localPosition = Vector3.Lerp(new Vector3(viewBobHorizontal / 2, 0, 0), new Vector3(0, -viewBobVertical, 0), viewBobPathTimer); break; case 4: playerCam.transform.localPosition = Vector3.Lerp(new Vector3(0, -viewBobVertical, 0), new Vector3(-viewBobHorizontal / 2, 0, 0), viewBobPathTimer); break; } } else { aTimer = 0; viewBobPathTimer = 0; viewBobPath = 1; } }Además, sé que el controlador de personajes de Unity tiene ViewBobbing. pero esta no es una opción para mi aplicación.
¡Muchas gracias por ayudar!
Editar: esto se llama desde la función de actualización, aunque he intentado la actualización fija y tardía, ambas no cambian, resuelven o reducen el problema.
Aunque mi secuencia de comandos funciona y sigo con mi proyecto, si sabe por qué mi código anterior no funcionó/hizo el Snap, le agradecería saberlo para aprender de él.
Adoptaría un enfoque diferente, agregando Time.deltaTime a un campo, luego calculando qué ruta y qué t param corresponde a ese campo. Mathf.Repeat es útil para esto.
[SerializeField] int pathIndex; [SerializeField] float pathT; [SerializeField] float aTimer; [SerializeField] float pathDuration = 1f; // how long each path takes in seconds private void ViewBob() { // update aTimer but wrap around at pathDuration x 4 ( [0, 4pD) ) aTimer = Mathf.Repeat(aTimer + Time.deltaTime, pathDuration * 4f); // How many path durations is aTimer along? ( {0, 1, 2, 3} ) pathIndex = Mathf.FloorToInt(aTimer/pathDuration); // How far into the current path duration is aTimer? ( [0,1) ) pathT = Mathf.Repeat(aTimer, pathDuration) / pathDuration; Vector3 fromVector; Vector3 toVector; // assign to/from vectors based on pathIndex switch (pathIndex) { default: case 0: fromVector = new Vector3(-viewBobHorizontal / 2, 0, 0); toVector = new Vector3(0, -viewBobVertical, 0); break; case 1: fromVector = new Vector3(0, -viewBobVertical, 0); toVector = new Vector3(viewBobHorizontal / 2, 0, 0); break; case 2: fromVector = new Vector3(viewBobHorizontal / 2, 0, 0); toVector = new Vector3(0, -viewBobVertical, 0); break; case 3: fromVector = new Vector3(0, -viewBobVertical, 0); toVector = new Vector3(-viewBobHorizontal / 2, 0, 0); break; } // lerp position based on pathT and the to/from vectors playerCam.transform.localPosition = Vector3.Lerp(fromVector, toVector, pathT); }