Ir al contenido principal

Cámara isométrica en Unity3d

Tengo el mal hábito de que lo primero que intento hacer en un motor de juegos es una vista isométrica. Si resulta fácil, entonces el motor se puede considerar como fácil de usar. Los juegos isométricos han caído en el olvido y no es de extrañar que los motores intenten facilitar otros modos de cámara más populares como primera y tercera persona.
Pensé que lo había conseguido en Unity en unos pocos minutos (gracias a Google), pero el efecto no era exactamente el deseado. Al final, logré darme cuenta de lo que estaba mal, pero eso lo veremos más adelante.
Para empezar, crea un GameObject vacío, que servirá como padre de la cámara. En aras de simplificar, digamos que estará ubicado en (0, 0, 0). Crea una cámara y hazla hija del susodicho GameObject. Las coordenadas de la cámara serán (15, 15, 0), también en aras de simplificar. Podría ser (0, 15, 15), pero en ese caso, tendrías que calcular las rotaciones a mano. Cambia la cámara a modo ortográfico, para conseguir el efecto más aproximado al isométrico antiguo.
Agrega este script C# a la cámara:

using UnityEngine;
using System.Collections;

// Camera Controller
// Revision 2
// Allows the camera to move left, right, up and down along a fixed axis.
// Attach to a camera GameObject (e.g MainCamera) for functionality.

public class CameraController : MonoBehaviour {

    //float Xmax, Ymax;
    int UP = 1;
    int DOWN = 2;
    int LEFT = 3;
    int RIGHT = 4;
    int dir = 0;
    int rot = 0;
    int RLEFT = 1;
    int RRIGHT = 2;
    // Use this for initialization
    void Start () {
            }
   
    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown(KeyCode.W)) {
            dir = UP;
           
        } else if (Input.GetKeyDown(KeyCode.S)) {
            dir = DOWN;
        } else if (Input.GetKeyDown(KeyCode.A)) {
            dir = LEFT;
           
        } else if (Input.GetKeyDown(KeyCode.D)) {
            dir = RIGHT;
        } else if (Input.GetKeyUp(KeyCode.W) | Input.GetKeyUp(KeyCode.S) | Input.GetKeyUp(KeyCode.A) | Input.GetKeyUp(KeyCode.D)) {
            dir = 0;
        }
       
        if (Input.GetKeyDown(KeyCode.Q)) {
            rot = RLEFT;
        } else if (Input.GetKeyDown(KeyCode.E)) {
            rot = RRIGHT;
        } else if (Input.GetKeyUp(KeyCode.Q) | Input.GetKeyUp(KeyCode.E)) {
            rot    = 0;
        }       
       
        //camera scroll
        if (dir==UP) {
            transform.Translate(0,0,5*Time.deltaTime);
        } else if (dir==DOWN) {
            transform.Translate(0,0,-5*Time.deltaTime);
        } else if (dir==LEFT) {
            transform.Translate(-5*Time.deltaTime,0,0);               
        } else if (dir==RIGHT) {       
            transform.Translate(5*Time.deltaTime,0,0);       
        }
        //camera rotation
        if (rot == RLEFT ) {
            transform.Rotate(0,25*Time.deltaTime,0);
            transform.LookAt(transform.position);
        } else if (rot == RRIGHT ) {
            transform.Rotate(0,-25*Time.deltaTime,0);
            transform.LookAt(transform.position);
        }            

             
    }
}

El gran problema de mi primera versión era que la vista no rotaba alrededor de un punto, o mejor dicho, sí lo hacía, pero no mirando al centro. Y es que crear la cámara como hija del GameObject objetivo no garantiza que la cámara se mantenga enfocada en el mismo, de ahí que a cada rotación haya que agregarle un transform.LookAt(transform.position); para mantenerla mirando al centro. Como siempre, esto ha sido resultado de mucho ensayo y error, así que ni es la mejor solución y hay cosas que no sé por qué o cómo funcionan. De todas formas espero que les sirva de ayuda si se deciden a programar un reboot de Fallout 2.

Comentarios

Entradas populares de este blog

Un poco de nostalgia: juegos retro

El Laberinto del Saber es un juego desarrollaod en Cuba a finales de los 80 o algo así, para MS-DOS. Aquí pueden verlo en acción:

Desde hace un buen tiempo que quiero hacer un remake moderno orientado principalmente a plataformas móviles, al principio lo intenté con SDL 2, pero luego decidí usar un motor decente. Entre Godot y Unity3d me decanté por el último, para no invertir tiempo en aprender una herramienta que no me serviría para hacer más juegos.
Sin embargo, el proyecto ya acumula unos seis meses de atraso por diversas razones, y ni siquiera tengo una imagen para mostrar. Así queni hablar de fecha de lanzamiento.

Unity 5.4 está aquí

Y no trae la herramienta de edición de cinemáticas, como esperaba. Al menos, no se hace referencia a ella en las notas de lanzamiento.
Justamente acabo de lograr descargar la 5.3.5, la cual ha sido bastante decepcionante. El MonoDevelop que incluye ha dejado de sugerir el autocompletado para los miembros de algunas clases (me queda por definir cuándo lo hace y cuándo no) y además el precalculado de la iluminación global me suelta una docena de advertencias, aparte de que me ha obligado a recalcular las luces dos veces. Y eso toma bastante tiempo.
Aún no sé si podré echarle el guante a la 5.4, y tampoco es que tenga mucho interés. Aunque supongo que peor no va a ponerse, y quizás hasta se arreglen las cosas.
Por suerte, no estoy programando mucho. Las últimas páginas de la cuarta novela me tienen  bastante ocupado, y también le estoy echando un vistazo a la historia del juego. Sin embargo, eso no será para siempre, en algún momento de esta semana tengo que seguir puliendo el sistema …

Leyendo a Sapkowsky

Este es uno de mis escritores favoritos y es lamentable que haya tan poco de él en español. Aunque hay que reconocer que Andrzej Sapkowsky no ha sido tan prolífico.
A Sapkowsky le basta con su saga de Geralt de Rivia para ser una figura de renombre en la literatura fantástica. La fama de los juegos basados en el personaje del brujo Geralt, me parece, no le han acarreado una fama enorme, porque muchos olvidan (o simplemente no se interesan en averiguar) que el Wiedźmin no fue creado por CD Projekt RED.Por suerte, como les decía, entre los lectores ya Sapkowsky era un referente aún antes de que salieran los juegos.
Tenía entendido que estaba trabajando otra serie de libros, basados en las Guerras Husitas, así que hace poco decidí buscar si ya estaban disponibles en español. Y resulta, que además de los dos libros de dicha saga, me encontré Víbora, un tercero completamente distinto, ambientado en Afganistán durante la invasión soviética.
No obstante, no es de eso que quiero hablarles, sin…