jairogarcíarincón

Roll-a-Ball: Coleccionables


328

Creación del coleccionable



El objetivo del juego será recoger una serie de elementos que, al igual que en el caso del jugador, crearemos con formas básicas.

Para comenzar, crea un nuevo Game Object vacío con el nombre Coleccionables, y dentro de él un 3D Object > Cube llamado Coleccionable.

NOTA: Recuerda resetear la posición tanto de Coleccionables como de Coleccionable y, si lo prefieres, desactiva de momento al jugador en la escena para que no nos moleste haciendo clic en el tick superior del Inspector window correspondiente.

Modifica ahora las propiedades Transform del cubo para que sea:

Position 0, 0.5, 0
Scale 0.5, 0.5, 0.5
Rotation 45, 45, 45.

A continuación crea un nuevo material llamado Oro consistente en un color Albedo Amarillo con un efecto Metalic de 0.500. Aplícaselo al Coleccionable.

Nuestro Coleccionable ya es bastante apetecible, pero lo sería aún más si girara. Para ello, vamos a crear un sencillo script llamado Rotador con el siguiente código (recuerda añadirlo al Cube cuando termines):



NOTA: En todo momento puedes consultar las propiedades de los diferentes objetos utilizados en C# en la Script Reference de Unity.

Si ahora ejecutas el juego, verás que rota en varias direcciones.

Prefab



Puesto que nuestro Coleccionable ya tiene todo lo necesario, es el momento de convertirlo en un modelo, plantilla o Prefab, de modo que con todas sus características.

¿Y no puedo hacer directamente un duplicado? Si, pero si más adelante, por ejemplo, quiero modificar el color de todos los coleccionables o la velocidad a la que giran, tendría que hacerlo de uno en uno, mientras que los cambios en un Prefab se aplican a todas las instancias del mismo. Además ese Prefab lo podríamos luego utilizar en otros proyectos, algo que en proyectos más avanzados nos va a ser muy útil.

Crea una carpeta de Prefabs en tu Project window y dentro de ella arrastra nuestro Coleccionable, lo que hará que automáticamente se cree un nuevo Prefab de ese Coleccionable.

Lo siguiente que debemos hacer es colocar el Coleccionable en su ubicación, para después crear más duplicados de ese Prefab en diferentes ubicaciones. Para ello, nos aseguramos de que estamos en vista Global para que al mover el objeto respete el plano y ajustamos el Gizmo para que nos muestre una vista en planta (XZ).

El resultado después de colocar 12 Coleccionables de forma parecida a las horas del reloj debería ser similar al siguiente (vista en planta y vista una vez probado el juego:

Vista en planta


Vista de juego


Recoger los coleccionables



Por defecto, todos los GameObjects que hemos creado presentan una serie de propiedades relacionadas con las colisiones entre objetos. Estas se encuentran en la sección Box Collider del Inspector Window de ese objeto. De hecho, si ahora ejecutamos el juego veremos que el jugador choca con los coleccionables, como hace con las paredes, cuando la idea es que los recoja, bien destruyéndolos al entrar en ellos o desactivándolos.

Para hacer que los objetos sean "traspasables" pero detecten la colisión, debemos marcar la opción IsTrigger de Box Collider. Podemos hacerlo directamente en el Prefab para que lo aplique a todos.

NOTA: Haciendo clic en libro azul a la derecha de Box Collider puedes acceder a toda la información de ese componente: parámetros, opciones, eventos, etc.

Por otro lado, si queremos desactivar el objeto en vez de destruirlo (por ejemplo, para que vuelva a aparecer después de un tiempo), de alguna manera tenemos que identificarlo. Para esto, Unity permite añadir etiquetas o Tags a nuestros GameObjects.

Con el Prefab Coleccionable seleccionado, en la Inspector window haz clic en el desplegable Tag > Add tag y añade una nueva Tag llamada Coleccionable.

Una vez hecho, selecciona de nuevo el Prefab y desde el desplegable Tag asígnale la recién creada etiqueta Coleccionable. Al haberla añadido al Prefab, automáticamente se la añadirá a todas las instancias del mismo. Si, por ejemplo, quisiéramos que cada Coleccionable tuviera un valor distinto, podríamos asignarles diferentes etiquetas.

Etiquetas


Con esto ya estaríamos listos para modificar nuestro script JugadorController de modo que detecte la colisión con un Coleccionable y lo desactive:



Si ahora ejecutas el juego, verás como puedes "recoger" los coleccionables, de modo que al pasar por encima de ellos, estos se desactivan y desaparecen de la escena.

NOTA: En este proyecto no es importante, pero para ver el "esqueleto" de un objeto y ajustar su forma de colisión, en el futuro haremos uso de la sección Mesh Renderer del Inspector Window. Si seleccionas cualquier objeto y desactivas la casilla de la izquierda de Mesh Renderer, podrás ver el esqueleto de dicho objeto, y en el futuro podrás modificarlo para que la detección de la colisión no coincida con el esqueleto.


Objetos estáticos y dinámicos



Antes de continuar, debemos corregir un error importante.

Por defecto, todos los objetos son considerados static o estáticos a no ser que tengan el componente Rigidbody, en cuyo caso se consideran dynamic o dinámicos.

El problema es que Unity "cachea" los movimientos de todos los objetos estáticos para mejorar la respuesta cuando se reproduce el juego, y como nuestros Coleccionables son estáticos pero están moviéndose continuamente, esto obliga a Unity a estar cacheando las posiciones cada frame, lo cual es un consumo de recursos inútil.

Para resolverlo, simplemente selecciona el Prefab Coleccionable y añádele el componente Rigidbody. A continuación, desactiva la opción Use Gravity para que no se caigan, y activa la opción Is Kinematic para que el movimiento esté basado en modificaciones de Transform y no en fuerzas físicas.

De esta forma hemos optimizado de forma significativa el rendimiento de nuestro juego.


Publicado el 21 de Octubre de 2021

unityvideojuegos2d3d