Introducción
En este artículo muestro cómo se puede hacer un menú de selección de personajes, explicando el funcionamiento de un prototipo que implementa este sistema y que se pueden descargar e importar.
Descargar el prototipo de selección de personajes para Unity
Dos vídeos que explican el funcionamiento de este sistema de selección de personajes
A continuación tienes dos vídeos en los que se explica cómo funciona el sistema de selección de personajes para Unity que te puedes descargar en el enlace de arriba. El vídeo de la izquierda es la parte 1 en la que se habla en general de cómo está compuesta la escena y un poco sobre el funcionamiento del sistema al pulsar los botones de la interfaz gráfica. En el vídeo de la derecha vemos el funcionamiento interno de los scripts que controlan este sistema de selección de personajes para Unity.
En la figura 1 se ven los Assets que contiene el paquete, hay dos escenas, una para el menú de selección de personaje y otra para la escena del juego en la que aparece el personaje elegido en el menú.
Hay tres Scripts, CharacterSelectionMenu se encarga de la lógica del menú de selección, GameControl se encarga de la lógica de la escena del juego, es decir colocar el personaje elegido en la escena y el Script PlayerController permite controlar al personaje en la escena del juego.
En la carpeta Assets están los Sprite sheets de los personajes y las animaciones y en la carpeta Prefab los GameObject de los personajes que aparecen en el menú y en la escena del juego.
Importante – Prueba de funcionamiento del prototipo
Al importar los Assets es necesario añadir las escenas del menú de selección y el juego a la compilación, de otra forma no va a funcionar el botón que pasa a la escena del juego. Para eso abrimos la escena del menú, vamos a File > Build Settings y hacemos clic en el botón «Add Open Scene», luego hacemos lo mismo para la otra escena. Si ambas escenas están añadidas deberían ver algo como lo que se observa en la figura 2 en la ventana Build Settings.
Escena del menú de selección de personajes
La escena del menú de selección se ilustra en la figura 3, consiste en un personaje situado al centro de la pantalla, dos botones para pasar al siguiente personaje o volver al personaje anterior y un botón para empezar a jugar.
En la jerarquía tenemos un objeto que tiene asignado el script con la lógica de control del menú de selección de personajes, es el objeto resaltado en la figura 4.
En el inspector podemos ver el Script con sus campos, tenemos un array llamado «Player Objects» que se utiliza para almacenar los distintos personajes que el jugador puede elegir. Se le puede indicar el tamaño modificando el valor «Size» y luego arrastrar los objetos de los personajes a los campos que aparecen.
Este prototipo funciona de la siguiente manera, en la escena colocamos todos los personajes disponibles, luego le damos el tamaño al array para que pueda almacenar esos objetos y luego arrastramos los objetos de los personajes desde la jerarquía hasta los espacios del array.
En la figura 6 vemos los objetos de los jugadores que están asignados en los espacios del array en la figura 5.
Escena del juego
Cuando se pulsa el botón verde que se ve en la figura 3 se va a cargar la escena del juego en la que aparecerá el personaje elegido en el menú, como se ve en la figura 7.
Se puede controlar al personaje con las teclas WASD y para volver al menú principal se puede pulsar Escape o el botón azul del Canvas.
En la jerarquía de la escena del juego tenemos un objeto llamado GameControl que tiene asignado el Script «GameControl» con la lógica para hacer aparecer en la escena el personaje que se ha elegido.
En el inspector podemos ver los parámetros de este Script, nuevamente tenemos un array de objetos para los personajes.
En este caso vamos a colocar los prefabricados de los objetos de los personajes, es decir GameObjects que debemos colocar en la carpeta Assets, el Script se encargará de instanciar el personaje elegido en el menú. Es importante que este array tenga el mismo tamaño que el array del menú y que los personajes estén añadidos en el mismo orden.
El personaje elegido será colocado en la posición del GameObject que asignemos en el campo «Player Start Position» de la figura 9, en este caso he creado un objeto vacío llamado «StartPosition», lo vemos en la figura 10.
Script de control del menú de selección de personajes
Vamos a analizar el script que se encarga de la lógica de la selección de personajes.
Campos
Comenzamos analizando los campos definidos en el Script, en la línea 9 de la figura 11 se define un array de GameObjects llamado «playerObjects», al estar definido como público aparece en el inspector. Luego tenemos una variable entera que funciona como índice para el personaje elegido, con esa variable accedemos al GameObject del array.
El string «gameScene» indica el nombre de la escena que hay que cargar cuando se pulsa el botón verde, es importante que el nombre coincida exactamente y se respeten mayúsculas, además la escena a cargar tiene que estar añadida en la ventana Build Settings.
El string «selectedCharacterDataName» es el nombre que se le dá a un dato que se guardará en memoria para saber cuál es el personaje elegido y poder colocarlo correctamente en las siguiente escena.
Funciones
Ahora vamos a ver los métodos que están definidos en el Script de control del menú de selección.
Tenemos un método llamado «HideAllCharacters» que se va a encargar de ocultar todos los personajes de la escena, en el interior de esta función se recorren todos los elementos del array y se ejecuta la función SetActive con parámetro false para cada uno de sus elementos. En el artículo sobre cómo activar o desactivar GameObjects en Unity se explica el funcionamiento de este método, también puedes ver el vídeo aquí.
Luego tenemos dos funciones públicas, una llamada «NextCharacter» y la otra «PreviousCharacter», estas funciones permiten seleccionar el personaje, lo primero que se hace es desactivar el GameObject actualmente seleccionado y luego se incrementa o decrementa el índice del personaje, reseteándolo si excede la cantidad total de elementos o haciéndolo igual a la cantidad de elementos menos uno si al decrementarlo resulta negativo. Finalmente se activa el personaje de acuerdo al valor del índice.
Estas funciones tienen que ser públicas porque se van a llamar desde los botones de la interfaz gráfica, aquí tienes un artículo sobre cómo configurar botones en Unity y un vídeo en el que muestro cómo salir del juego en Unity al pulsar un botón del Canvas, en el vídeo se configura un botón para que ejecute una función dentro de un script.
Luego tenemos una función pública llamada «StartGame» que será llamada por el botón «Play» del menú, esta función guarda en memoria el valor del índice utilizando PlayerPrefs, esta es una forma de pasar datos entre escenas en Unity, al tener el índice del personaje elegido en memoria, en la siguiente escena se lee ese valor y eso permite colocar el personaje correcto. Luego se ejecuta la función LoadScene de SceneManager para cargar la siguiente escena, para hacer esto se necesita implementar el namespace UnityEngine.SceneManagement (línea 4 de la figura 11).
La función Start se ejecuta al iniciar el juego, en ella lo primero que hacemos es ocultar todos los personajes usando la función «HideAllCharacters», línea 19 de la figura 15. Luego recuperamos el valor del índice almacenado en memoria, nos permite mostrar el último personaje elegido, en caso de no haber ningún valor en memoria se inicializará con el valor 0.
Finalmente se hace visible el GameObject del personaje elegido con el índice, ejecutando sobre éste la función SetActive con parámetro «true», línea 23 de la figura 15.
Scripts de la escena del juego para instanciar el personaje elegido
Ahora vamos a analizar el Script de Control que se encuentra en la escena del juego, este Script identifica el personaje que fue elegido en la escena del menú de selección y lo coloca en una determinada posición.
Campos
Comenzamos analizando los campos definidos, en la figura 16 vemos un fragmento del Script GameControl, en la línea 9 tenemos un array público de GameObjects, este campo aparece en el inspector y ahí colocamos los prefabs de los personajes, es importante respetar la misma cantidad y el orden de los personajes como fueron definidos en el menú de selección.
En la línea 10 tenemos un componente Transform público, aquí colocaremos el objeto que indicará la posición donde aparece el personaje. Luego tenemos dos Strings, uno con el nombre de la escena del menú de selección y otro con el nombre del dato en memoria en el que está almacenado el índice del personaje. En la línea 13 se define una variable entera para almacenar el valor del índice y por último, en la línea 14 definimos una referencia para un GameObject donde almacenaremos la referencia del personaje que colocaremos en la escena, en caso de necesitarla más adelante.
Funciones
En la figura 16 vemos la función Start que es donde se hace la lectura del valor almacenado en memoria usando la clase PlayerPrefs y luego se realiza la instanciación del personaje, es decir lo creamos y lo colocamos en la escena.
Luego tenemos una función pública llamada «ReturnToMainMenu» que cuando se ejecuta carga la escena del menú de selección de personajes, podemos verla en la figura 17. Esta función la llamará el botón azul que se encuentra en la escena del juego, se puede ver en la figura 7. Además esta función se ejecuta al pulsar la tecla «Escape», como vemos en la línea 27 de la figura 17.