Antimundo logo

Antimundo

Cómo centrar la cámara entre varios jugadores en Unity

13 / 01 / 2022

Estoy haciendo un juego multijugador local en Unity, donde aparecen 4 jugadores. Y quiero que la cámara siempre esté centrada entre ellos enfocándolos a la vez.

En este vídeo explico cómo quedaría:

He hecho un script en Unity para centrar la cámara entre varios objetoshttps://t.co/zILUeJ5G6z pic.twitter.com/xlee6HAlk1

— Antimundo (@antimundo21) January 11, 2022

Aclaro también que el código de este tutorial puede descargarse de forma gratuita en GitHub.

Tutorial

Vamos a usar esta bonita fórmula matemática que sirve para calcular el punto medio entre dos puntos.

Recordemos que un punto tiene una posición X y una posición Y.
Lo único que hace esta fórmula es sacar la media entre las posiciones X y la media de las posiciones Y.

Os dejo el script que he usado para hacerlo, he usado un bucle for para que pueda usarse con todos los puntos que quieras, y funcione sean 2, 3, 4, 5 o los jugadores entre los que tengas que centrarlo.

Cuando aplico la posición, lo hago con un Mathf.Lerp para que el movimiento de la cámara sea mas suave, aunque esto es opcional. La variable cameraSpeed controla la «suavidad» de la cámara.

[SerializeField] Camera cam;
[SerializeField] Transform[] points;
[SerializeField] float cameraSpeed = 3;
 
private void setPosition()
{
    Vector3 newPosition = new Vector3(0, 0, -10);
 
    foreach (Transform point in points)
    {
        newPosition.x += point.position.x;
        newPosition.y += point.position.y;
    }
    newPosition.x /= points.Length;
    newPosition.x = Mathf.Lerp(transform.position.x, newPosition.x, Time.deltaTime * cameraSpeed);
 
    newPosition.y /= points.Length;
    newPosition.y = Mathf.Lerp(transform.position.y, newPosition.y, Time.deltaTime * cameraSpeed);
 
    cam.transform.position = newPosition;
}

Otra cosa que hay que tener en cuenta es el hecho de que la cámara debería alejarse si los jugadores se alejan entre ellos, para que no se pueda salir uno de la pantalla. Para ello, aplico este método que busca cual es el jugador mas alejado de la cámara, y cambia la amplitud de la cámara en función a ello.

private void setSize()
{
    Vector2 longestVector = new Vector2();
 
    for(int i = 0; i < points.Length; i++)
    {
        Vector2 thisVector = transform.position - points[i].position;
        if (thisVector.magnitude > longestVector.magnitude)
        {
            longestVector = thisVector;
        }
    }
 
    cam.orthographicSize = Mathf.Lerp(
            cam.orthographicSize,
            longestVector.magnitude,
            Time.deltaTime * cameraSpeed
        );
}

Y eso es básicamente todo. Siéntete libre de copiar, modificarlo, y hacer lo que te de la gana con el código, ERES LIBRE.