Tema 5
Desarrollo de Videojuegos II
Tema 5. Colisiones
Índice
Esquema
Ideas clave
5.1. Introducción y objetivos
5.2. Detección de superposición entre elementos
5.3. Eliminación de elementos de nivel
5.4. Regeneración de nivel
A fondo
Documentación Transform
Evento Hit (golpear)
Test
Esquema
Desarrollo de Videojuegos II 3
Tema 5. Esquema
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
5.1. Introducción y objetivos
En este tema se continúa introduciendo algunos de los aspectos básicos de la
herramienta Unreal Engine relacionados con las colisiones entre actores que pueden
darse en el juego. Revisa todas explicaciones y ve replicando paso a paso sobre el
programa todas las instrucciones dadas en el siguiente tema.
Desarrollo de Videojuegos II 4
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
5.2. Detección de superposición entre elementos
Condición para eliminar enemigos
Para poder reducir la vida de los enemigos y eliminarlos necesitamos detectar
cuando el Disparo colisiona con un Enemigo y dañarlo.
Comenzamos implementado el Enemigo. Les vamos a dar una Vida inicial y cada
disparo reducirá esa vida hasta que llegue a cero, en ese momento se destruirá el
Enemigo.
Abrimos el Event Graph de enemigo. Buscamos el evento BeginPlay y desde ese
evento realizamos un Set Vida y le damos el valor 100.
Figura 1. Set Vida: 100.
Nos situamos a una zona vacía del Blueprint y creamos un nuevo Custom Event, lo
llamamos Impactado.
Figura 2. Impactado.
Desarrollo de Videojuegos II 5
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Desde las propiedades del nodo Inputs, pulsamos en New y añadimos un nuevo
parámetro de entrada (inputs) Daño, de tipo Integer.
Figura 3. Creamos Daño.
Enviamos el daño al evento Reducir Vida (que está en la clase Padre) y después,
comprobamos si la Vida <= 0.
Sí la condición se cumple significa que el personaje debe ser eliminado y llamamos
al nodo DestroyActor.
Figura 4. DestroyActor.
Y como siempre, nos acordamos de compilar y guardar los cambios.
ActorBeginOverlap
Abrimos la clase Disparo y nos dirigimos al Event Graph y buscamos el evento
ActorBeginOverlap, este evento se ejecuta cuando los elementos colisionan.
Desarrollo de Videojuegos II 6
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Hacemos un Cast To Enemigo del objeto contra el que colisiona el disparo y si es
un enemigo llamamos al evento Impactado.
Figura 5. Nombramos al evento: impactado.
Sí ejecutamos el juego podemos ver como el enemigo es eliminado después de
recibir varios disparos.
Figura 6. Ejecutamos el juego.
Desarrollo de Videojuegos II 7
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
5.3. Eliminación de elementos de nivel
Vamos a hacer también que el Disparo se destruya al impactar contra un Enemigo,
para ello debemos agregar la función DestroyActor.
Figura 7. Destruir Disparo.
Eliminar al Jugador Controlable
Ahora, vamos a hacer que los enemigos puedan dañar al Jugador cuando están
cerca de él. Para esto, abrimos la clase Jugador y vamos a un área vacía del Event
Graph.
En primer lugar, nos dirigimos al evento BeginPlay y agregamos un nuevo nodo al
Sequence, pulsando en Add pin +.
Figura 8. Nuevo nodo.
Desde el nuevo Then 2, agregamos una llamada a Set Vida y colocamos el valor
100.
Desarrollo de Videojuegos II 8
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 9. Set Vida: 100.
Buscamos una parte vacía y creamos un Custom Event de la misma forma que
hicimos en el Enemigo (se puede copiar y pegar).
Figura 10. Custom Event.
Luego veremos que no es muy adecuado hacer un DestroyActor del Jugador
principal del Nivel.
Colisiones con el Jugador
Abrimos a la clase Enemigo y añadimos un nuevo componente de tipo Box
Collision. Este componente será el área de ataque del enemigo.
Figura 11. Área de ataque.
Desarrollo de Videojuegos II 9
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Renombramos la Box Collision a: AreaAtaque, además de si tocamos al enemigo si
el AreaAtaque colisiona con el jugador, el jugador perderá vida.
Figura 12. Renombramos Box Collision.
Abrimos la vista de Viewport y reducimos el alto de la caja y la colocamos delante
del enemigo.
Figura 13. Viewport.
Abrimos el Event Graph del enemigo y vamos a hacer que cada N segundos el
enemigo pueda causar daño al jugador (si el jugador se solapa con cualquier parte
del enemigo).
Después, buscamos el evento ActorBeginOverlap.
Desarrollo de Videojuegos II 10
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 14. Evento ActorBeginOverlap.
Llamará a un nodo Cast To Jugador y hacemos un Promote To Variable del
resultado. Lo guardamos en una variable JugadorImpactado.
Figura 15. Promote to variable.
Figura 16. Guardamos.
Desarrollo de Videojuegos II 11
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 17. Tal y como quedaría.
Como el enemigo está tocando al jugador, lanzamos un Timer (Set Timer By Event)
que reduzca la vida del jugador cada segundo y se ejecuta cada segundo, y en forma
de loop.
Figura 18. Timer.
El evento a ejecutar será un nuevo Custom Event.
Figura 19. Custom Event.
Podemos renombrarlo «Atacar». Sacamos de la variable JugadorImpactado una
referencia al evento Impactado.
Desarrollo de Videojuegos II 12
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 20. Renombramos el custom event y sacamos una referencia.
Después, colocamos un Daño de 10 y agregamos el flujo desde el evento «Atacar»
a Impactado.
Figura 21. Queda así.
Con este evento hemos lanzado el Timer que reduce la vida del jugador.
Cuando el jugador y el enemigo dejan de colisionar debemos parar el Timer.
Vamos a una superficie vacía del Blueprints y agregamos un evento Event
ActorEndOverlap.
Desarrollo de Videojuegos II 13
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 22. Evento.
Comprobamos que el Actor con el que ha finalizado la colisión es el Jugador,
utilizamos el nodo Equal (Object). Solo detectamos cuando se inicia el solapamiento
y cuando finaliza.
Figura 23. Comprobamos.
Y utilizamos un Branch para ver si la condición se cumple.
Figura 24. Branch.
Si la condición es True llamamos al Clear and Invalidate Timer By handle.
Desarrollo de Videojuegos II 14
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 25. Clear and Invalidate Timer By handle.
Le tememos que asignar la variable Hadle (el Return del Timer).
Figura 26.
En este punto, nos aseguramos de que el flujo este unido correctamente.
Figura 27. Comprobamos que el flujo está unido.
Después de realizar estos pasos, compilamos y guardamos.
Desarrollo de Videojuegos II 15
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Si ejecutamos el juego podemos comprobar que el enemigo puede destruir al
jugador y cuando el jugador es destruido ya no podemos interaccionar con el juego.
Figura 28. Ejecutamos el juego.
Desarrollo de Videojuegos II 16
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
5.4. Regeneración de nivel
Generación del jugador
En este punto, vamos a hacer que el jugador se vuelva a generar una vez ha sido
destruido y para esto necesitamos especificar esto en el GameMode
(ModoSupervivencia).
Figura 29. Modo supervivencia.
Primero, abrimos editor completo de Blueprint.
Figura 30. Editor Blueprint.
Después, buscamos un área vacía del Event Graph y creamos un Add Custom
Event. Lo renombramos a «GenerarJugador».
Figura 31. Custom Event.
Desarrollo de Videojuegos II 17
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Desde el evento llamamos a un nodo de tipo Spawn Actor from class (generar
actor) y configuramos el nodo indicando: Class-Jugador.
Figura 32. El evento llama a un nodo y configuramos.
Después, creamos una variable a través de la propiedad Spawn Transform
seleccionando Promote to Variable desde el botón derecho.
Figura 33. Creamos variable.
Renombramos la variable a «Punto De Generación».
Figura 34. Renombramos variable.
Desarrollo de Videojuegos II 18
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Cuando llamemos al evento Generar Jugador, se volverá a colocar en el punto de
generación
El problema es que, por el momento, la variable Player Spawn
Transform está sin inicializar. La inicializaremos más tarde desde el
Jugador.
Después, creamos un nodo Possess para colocar al jugador en el mapa. Y
desactivamos el Context Senstivie para encontrar el nodo.
Figura 35. Nodo Posses.
Creamos un nodo Get Player Controller (index 0 solo hay un jugador), para darle el
control.
Figura 36. Nodo para darle el control.
Una vez en este punto, asociamos el return del Get Player Controller al nodo
Desarrollo de Videojuegos II 19
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Possess y nos aseguramos de que tanto Target como In Pawn están conectados.
Figura 37. Nodos conectados.
Y por último, compilamos y guardamos los cambios.
Jugador. Punto de generación
Abrimos la clase Jugador, vamos a hacer que según se cree el jugador se obtenga
su localización actual y se asigne a Punto De Generación.
Desarrollo de Videojuegos II 20
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Desde la inicialización del jugador (Event BeginPlay) vamos a llamar al evento
«Generar Jugador». Si nos quedamos sin pins para continuar agregando flujos
pulsamos en Add pin +.
Figura 38. Llamamos al evento Generar jugador.
Para obtener el GameMode actual llamamos al nodo Get Game Mode.
Figura 39. Get Game Mode.
Tenemos que hacer un Cast a nuestro Game Mode (modosupervivencia).
Figura 40. Cast.
Desarrollo de Videojuegos II 21
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Y hacemos un Promote to variable para guardar el resultado d e l cast en una
variable.
Figura 41. Promote to Variable.
Renombramos la variable a «ModoDeJuego» y a partir del ModoDeJuego hacemos
un SET Punto de Generación.
Desarrollo de Videojuegos II 22
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 42. SET Punto de Generación.
Asignamos como valor la posición del actor, obtenida con el nodo Get Actor
Transform.
Figura 43. Get Actor Transform.
Completamos el flujo:
▸ Unimos la Sequence con el Cast:
Figura 44. Unimos.
▸ Unimos la SET con el SET:
Desarrollo de Videojuegos II 23
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 45. Unimos.
Y ahora localizamos el evento Impactado del Jugador:
Figura 46. Localizamos.
Antes de llamar a DestroyActor, vamos a llamar al evento (GenerarJugador del
ModoDeJuego) y generamos un jugador nuevo y destruimos el viejo.
Después, arrastramos la variable ModoDeJuego a la superficie de Blueprint.
Figura 47. Arrastramos la variable a Blueprint.
Creamos una referencia al evento Generar Jugador de ModoDeJuego.
Desarrollo de Videojuegos II 24
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 48. Referencia a Generar Jugador.
Modificamos el flujo para hacer que se llame antes a Generar Jugador y luego a
DestroyActor.
Figura 49. Modificamos flujo.
Y por último, compilamos y salvamos los cambios y ejecutamos el juego. Pero surge
un problema, el jugador se destruye, pero su arma queda en el aire.
Figura 50. Problema al ejecutar el juego.
Desarrollo de Videojuegos II 25
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Para solucionarlo, debemos destruir también el arma del jugador, por lo que
debemos localizar el evento Impactado.
Figura 51. Localizamos Impactado.
En la última función DestroyActor, además del Jugador (self) le enviamos el
ArmaJugador.
Figura 52. Envíamos ArmaJugador.
Y agregamos la referencia a Self ya que ha desaparecido.
Desarrollo de Videojuegos II 26
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
Ideas clave
Figura 53. Referencia Self.
Desarrollo de Videojuegos II 27
Tema 5. Ideas clave
© Universidad Internacional de La Rioja (UNIR)
A fondo
Documentación Transform
Unreal Engine (n.d.). Transform. Unreal Engine [Documentación]. Recuperado de
https://docs.unrealengine.com/en-US/BlueprintAPI/Math/Transform/index.html
Documentación completa del elemento Transform.
Desarrollo de Videojuegos II 28
Tema 5. A fondo
© Universidad Internacional de La Rioja (UNIR)
A fondo
Evento Hit (golpear)
Unreal Engine (n.d.). Using the OnHit Event. Unreal Engine [Documentación].
Recuperado de https://docs.unrealengine.com/en-
US/InteractiveExperiences/HowTo/UseOnHit/index.html
Ejemplo de uso del evento Hit que puede ser utilizado para la detección de «Golpes»
similares en muchos casos a los superposicionamientos.
Desarrollo de Videojuegos II 29
Tema 5. A fondo
© Universidad Internacional de La Rioja (UNIR)
Test
1. ¿Cuántas veces se ejecuta el evento BeginOverlap cuando se produce una
superposición?
A. Al inicio de la misma.
B. Cuando se inicia y cuando finaliza.
C. Dependiendo de lo que dure la superposición, 1 en cada iteración del
juego.
D. Ninguna de las anteriores.
2. ¿Cómo podemos saber con qué tipo de Actor (other Actor) se ha producido la
colisión?
A. Las colisiones siempre se producen con el actor principal (controlable).
B. Haciendo un Cast a otro tipo de actor concreto y concreto el resultado.
C. Obteniendo el atributo Type del actor.
D. No es posible.
3. ¿Qué elemento es el que retorna la función ActorBeginOverlap en la variable
Other Actor?
A. Cualquier actor contra el que personaje se superponga.
B. El jugador controlable.
C. Los actores de tipo enemigo.
D. Los actores de tipo disparo.
Desarrollo de Videojuegos II 30
Tema 5. Test
© Universidad Internacional de La Rioja (UNIR)
Test
4. ¿Cómo se puede detener un Timer activo?
A. Con el nodo: Set Timer By Event.
B. Con el nodo DestroyActor.
C. Con el nodo Clear and Invalidate Timer By Handle.
D. Con el nodo Get Player Controller.
5. ¿Qué está haciendo el siguiente Script de Blueprints implementado en el
jugador?
A. Si detecta que se inicia superposición con un actor comprueba si es un
enemigo, si es así llama al evento Impactado del jugador.
B. Si detecta que se inicia superposición con un actor un actor llama a la
función Impactado del actor.
C. Si detecta que finaliza la superposición con un actor comprueba si es un
enemigo, si es así llama al evento Impactado del enemigo.
D. Si detecta que se inicia superposición con un actor comprueba si es un
enemigo, si es así llama al evento Impactado del enemigo.
6. ¿Se puede acceder al Game Mode desde cualquier elemento del juego?
A. No es posible.
B. Sí, pero solo desde el jugador controlable.
C. Sí utilizando el Get ModoSupervivencia.
D. Sí utilizando el Get Game Mode y «casteándolo» luego al modo concreto.
Desarrollo de Videojuegos II 31
Tema 5. Test
© Universidad Internacional de La Rioja (UNIR)
Test
7. ¿Cuál de los siguientes nodos permite generar más de una línea de flujo de
salida y asegura la ejecución de todos ellos?
A. Branch.
B. Sequence.
C. Cast to…
D. Set.
8. ¿Cuál de los siguientes componentes permite definir un área de collision?
A. Box Collision.
B. Sphere Collision.
C. Capsule Component.
D. Todos los anteriores.
9. ¿Cuántos componentes que determinen el área de colisión puede tener un
Actor?
A. Ninguno.
B. Uno.
C. Dos.
D. Entre ninguno e infinitos.
Desarrollo de Videojuegos II 32
Tema 5. Test
© Universidad Internacional de La Rioja (UNIR)
Test
10. ¿Qué está haciendo el siguiente Script de blueprints implementado en el
Enemigo?
A. Si detecta que finaliza una superposición con un actor comprueba si es un
Jugador, si es así guarda el Jugador en la variable Jugador Impactado.
B. Si detecta que se inicia superposición con un Jugador comprueba si es un
actor, si es así lo castea a la variable Jugador Impactado.
C. Si detecta que se inicia superposición con un actor comprueba si es un
Jugador, si es así guarda el Jugador en la variable Jugador Impactado.
D. Si detecta que se inicia superposición con un actor comprueba si es un
Jugador y comprueba si tiene el mismo valor que la variable Jugador
Impactado.
Desarrollo de Videojuegos II 33
Tema 5. Test
© Universidad Internacional de La Rioja (UNIR)