es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transición entre dos posiciones de cámara

En mi juego, tengo dos modos, caminar y volar. Cada uno tiene un comportamiento de cámara separado (usando la misma cámara). Cuando cambio el modo, quiero una transición suave entre las posiciones de la cámara.

Cámara voladora:

Vector3 moverCamA = transform.position - transform.forward * 10.0f + Vector3.up * 5.0f;
float sesgo = 0.96f;
Camera.main.transform.position = Camera.main.transform.position * sesgo + moverCamA * (1.0f - sesgo);
Camera.main.transform.LookAt(transform.position + transform.forward * 30.0f);

Cámara de caminar:

float factorSuavidad = 0.5f;
float velocidadRotacion = 13.0f;
Quaternion anguloGiroCam = Quaternion.AngleAxis(Input.GetAxis("Mouse X") * velocidadRotacion, Vector3.up);
_cameraOffset = anguloGiroCam * _cameraOffset;
Vector3 nuevaPos = transform.position + _cameraOffset;
Camera.main.transform.position = Vector3.Slerp(Camera.main.transform.position, nuevaPos, factorSuavidad);
Camera.main.transform.LookAt(transform.position);

Realmente estoy luchando para entenderlo. He intentado llamar a un método (como el siguiente) cuando cambia el modo, y creo que esto probablemente va por el camino correcto… pero no funciona realmente, no hay transición en absoluto debido a que en el siguiente fotograma (en FixedUpdate), se ve cuál es el modo y simplemente usa esa posición de cámara.

void transicionCamara(Vector3 nuevaPos) {
  float duracionTransicion = 2.5f;
  float t = 0.0f;
  Vector3 posicionInicial = Camera.main.transform.position;
  while (t < 1.0f) {
    t += Time.deltaTime * (Time.timeScale/duracionTransicion);
    Camera.main.transform.position = Vector3.Lerp(posicionInicial, nuevaPos, t);
  }
}

¡Realmente agradecería cualquier consejo / información!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr una transición suave entre los dos comportamientos de cámara al cambiar de modos, puedes usar una corrutina que actualice gradualmente la posición de la cámara con el tiempo. Aquí tienes un ejemplo:

    IEnumerator TransitionCamera(Vector3 newPos, float duration)
    {
        Vector3 startingPos = Camera.main.transform.position;
        float t = 0.0f;
        while (t < 1.0f)
        {
            t += Time.deltaTime / duration;
            Camera.main.transform.position = Vector3.Lerp(startingPos, newPos, t);
            yield return null;
        }
    }
    
    void ChangeMode()
    {
        // Comprobamos a qué modo cambiamos
        if (isFlyingMode)
        {
            // Transición a la posición de la cámara en modo de vuelo
            Vector3 moveCamTo = transform.position - transform.forward * 10.0f + Vector3.up * 5.0f;
            Camera.main.transform.LookAt(transform.position + transform.forward * 30.0f);
            StartCoroutine(TransitionCamera(moveCamTo, 2.5f));
        }
        else
        {
            // Transición a la posición de la cámara en modo de caminar
            Quaternion camTurnAngle = Quaternion.AngleAxis(Input.GetAxis("Mouse X") * rotationSpeed, Vector3.up);
            _cameraOffset = camTurnAngle * _cameraOffset;
            Vector3 newPos = transform.position + _cameraOffset;
            Camera.main.transform.LookAt(transform.position);
            StartCoroutine(TransitionCamera(newPos, 0.5f));
        }
    }
    

    Aquí, TransitionCamera es una corrutina que actualiza gradualmente la posición de la cámara desde su posición inicial hasta la posición objetivo newPos. El parámetro duration controla cuánto tiempo dura la transición.

    ChangeMode se llama cuando el modo cambia, y comprueba a qué modo estamos cambiando. Si estamos cambiando al modo de vuelo, usamos la posición de la cámara en vuelo y comenzamos la corrutina TransitionCamera con una duración de 2.5 segundos. Si estamos cambiando al modo de caminar, usamos la posición de la cámara al caminar y comenzamos la corrutina TransitionCamera con una duración más corta de 0.5 segundos.

    Nota que también actualizamos la rotación de la cámara en los respectivos modos de cámara antes de llamar a TransitionCamera. Esto asegura que la cámara esté mirando en la dirección correcta después de la transición.

Comments are closed.