Apuntes DAM
    Tema 4 de 6PMDM · 2º DAM

    Programación Multimedia y Dispositivos Móviles

    Motores de Juegos

    Qué es un motor y sus subsistemas, el bucle del juego y el delta time, arquitectura de juegos 2D y 3D, física y colisiones, y comparativa y selección de motores (Unity, Godot, Unreal, libGDX…).

    55 min lecturaIntermedio

    1. Qué es un motor de juegos

    Todos los juegos necesitan lo mismo: dibujar en pantalla muchas veces por segundo, leer el mando o la pantalla táctil, mover objetos, detectar choques, reproducir sonidos y cargar niveles. Un motor de juegos es el software que ya resuelve todo eso para que el equipo se centre en el juego en sí. Incluye además un editor para montar escenas y herramientas para exportar a cada plataforma.

    El motor es el escenario de un teatro 🎭

    🏗️
    El teatro (motor)
    Focos, telón, sonido y tramoya: el renderizado, la física, el audio y la entrada.
    🎬
    Las escenas
    Cada nivel o pantalla (menú, nivel 1, créditos) con sus decorados y personajes.
    📜
    El guion (scripts)
    Lo que hacen los personajes: el código del juego que escribes tú.

    Subsistemas de un motor

    SubsistemaSe encarga de
    RenderizadoDibujar sprites, mallas 3D, luces, sombras, partículas y efectos (con la GPU: OpenGL, Vulkan, Metal, DirectX)
    FísicaGravedad, velocidades, colisiones y respuestas (cuerpos rígidos, disparadores)
    EntradaTeclado, ratón, mandos, pantalla táctil, acelerómetro; mapeo de acciones («saltar»)
    AudioMúsica, efectos, sonido posicional 3D, mezcla
    AnimaciónHojas de sprites, animación esquelética, máquinas de estados de animación
    Escenas y recursosCargar y descargar niveles, texturas, modelos y sonidos
    ScriptingLenguaje para la lógica: C# (Unity), GDScript/C# (Godot), C++ y Blueprints (Unreal)
    Interfaz de usuarioMenús, marcadores, botones
    RedPartidas multijugador, sincronización
    ExportaciónCompilar para Android, iOS, PC, consolas y web
    ¿Cómo funcionan por dentro los motores de videojuegos? (Game Engines) — Guinxu

    2. El bucle del juego

    Un juego no espera a que el usuario haga algo: se repite sin parar el bucle del juego (game loop), unas 60 veces por segundo (60 FPS, un fotograma cada 16,7 ms).

    1. Leer la entrada: qué teclas están pulsadas, dónde se ha tocado.
    2. Actualizar el mundo: mover objetos, aplicar la física, comprobar colisiones, lógica y puntuación.
    3. Dibujar el fotograma con el estado actual.

    Delta time: igual de rápido en cualquier equipo

    Si cada fotograma mueves 5 píxeles, en un móvil a 30 FPS el personaje irá la mitad de rápido que en uno a 60 FPS. Por eso los movimientos se multiplican por el delta time (el tiempo transcurrido desde el fotograma anterior): posicion += velocidad * delta, con la velocidad en píxeles por segundo.
    Un bucle de juego real: pelota con gravedad y rebotes (mueve la pala con el ratón o el dedo)
    Consola
    (sin mensajes)
    Sin ESTO los juegos se descontrolan | Delta Time — Guinxu

    3. Arquitectura de un juego 2D y 3D

    Organización: escenas, nodos, entidades y componentes

    Los motores organizan el juego en escenas formadas por objetos. Unity usa GameObjects a los que se añaden componentes (Transform, SpriteRenderer, Rigidbody2D, scripts); Godot usa un árbol de nodos (cada nodo hace una cosa y se combinan: CharacterBody2D + Sprite2D + CollisionShape2D). Muchos motores internos usan ECS (Entity-Component-System): entidades que son solo un identificador, componentes que son datos y sistemas que procesan todos los componentes de un tipo.

    ConceptoJuego 2DJuego 3D
    GráficosSprites (imágenes), hojas de sprites, tilemaps (mapas de baldosas)Mallas (vértices y triángulos), materiales, texturas, shaders
    Coordenadasx, y (y hacia abajo en muchos motores)x, y, z con rotaciones (cuaterniones)
    CámaraOrtográfica que sigue al jugadorPerspectiva: primera o tercera persona
    LuzOpcionalLuces direccionales, puntuales y focales, sombras, iluminación global
    ColisionesRectángulos (AABB), círculos, polígonosCajas, esferas, cápsulas, mallas
    AnimaciónFotograma a fotogramaEsquelética (huesos) y mezclas
    RecursosPNG, hojas de sprites, TiledFBX, glTF, texturas PBR

    Física y colisiones

    • Cuerpos estáticos (suelo, paredes), rígidos (los mueve la física: cajas que caen) y cinemáticos o de personaje (los mueve tu código, con colisiones).
    • Colisionadores (formas simplificadas) frente a disparadores/áreas (detectan que algo entra, sin chocar: recoger una moneda).
    • Capas y máscaras de colisión: qué choca con qué (las balas del jugador no chocan con el jugador).
    • La comprobación más sencilla es AABB: dos rectángulos alineados se solapan si se solapan en x y en y.
    colisiones.js
    1// Rectángulo contra rectángulo (AABB)
    2const chocan = (a, b) =>
    3  a.x < b.x + b.ancho && a.x + a.ancho > b.x &&
    4  a.y < b.y + b.alto  && a.y + a.alto  > b.y;
    5
    6// Círculo contra círculo: la distancia entre centros es menor que la suma de radios
    7const chocanCirculos = (a, b) => Math.hypot(a.x - b.x, a.y - b.y) < a.r + b.r;

    4. Comparativa y selección de motores

    MotorLenguajeLicenciaPuntos fuertesEjemplos
    UnityC#Gratis hasta cierto nivel de ingresos; Pro de pagoEl más usado en móvil, enorme comunidad y tienda de recursos, 2D y 3DHollow Knight, Pokémon GO, Monument Valley
    GodotGDScript (tipo Python), C#Libre (MIT), sin regalíasLigero, editor muy rápido, excelente en 2D, exporta a móvil y webBrotato, Dome Keeper, Cassette Beasts
    Unreal EngineC++ y Blueprints (visual)Gratis; 5 % de regalías a partir de 1 M$Gráficos 3D de máxima calidadFortnite, Hellblade
    GameMakerGMLComercial (gratis para uso no comercial)2D muy rápido de aprenderUndertale, Hotline Miami
    libGDXJava/KotlinLibre (Apache)Framework (sin editor) para Android y escritorio en JavaSlay the Spire
    PhaserJavaScript/TypeScriptLibre (MIT)Juegos 2D para navegadorJuegos web y publicitarios

    Criterios de selección

    1. Tipo de juego: 2D, 3D, realismo gráfico, multijugador.
    2. Plataformas de destino: Android, iOS, web, PC, consolas.
    3. Lenguaje y experiencia del equipo.
    4. Licencia y costes: regalías, suscripciones, código abierto.
    5. Rendimiento y tamaño del ejecutable (importante en móviles de gama baja).
    6. Comunidad, documentación, tutoriales y recursos disponibles.
    7. Herramientas: editor de escenas, animación, depuración y perfilado.

    Probar un motor

    Antes de elegir, se hace un prototipo con la mecánica principal en los motores candidatos y se mide: tiempo de desarrollo, FPS en el móvil más modesto, tamaño del APK, consumo de batería y facilidad para depurar. Los motores incluyen perfiladores (Unity Profiler, el monitor de Godot) que muestran el tiempo de cada fotograma, la memoria y las llamadas de dibujo.

    UNITY vs UNREAL vs GODOT: Qué Motor Gráfico elegir para Desarrollar Videojuegos — DevExpert - IA para Desarrolladores

    5. El mismo comportamiento en Godot y en Unity

    Un personaje que se mueve con las flechas, salta y recoge monedas, escrito en los dos motores más usados:

    jugador.gd (Godot 4, GDScript)
    1extends CharacterBody2D
    2
    3const VELOCIDAD = 220.0
    4const SALTO = -420.0
    5var gravedad = ProjectSettings.get_setting("physics/2d/default_gravity")
    6signal moneda_recogida
    7
    8func _physics_process(delta):            # se llama 60 veces por segundo
    9    if not is_on_floor():
    10        velocity.y += gravedad * delta
    11    if Input.is_action_just_pressed("saltar") and is_on_floor():
    12        velocity.y = SALTO
    13    var direccion = Input.get_axis("izquierda", "derecha")
    14    velocity.x = direccion * VELOCIDAD
    15    $Sprite2D.flip_h = direccion < 0 if direccion != 0 else $Sprite2D.flip_h
    16    move_and_slide()                       # mueve y resuelve las colisiones
    17
    18func _on_area_moneda_body_entered(body):   # señal de un Area2D
    19    emit_signal("moneda_recogida")
    Jugador.cs (Unity)
    1using UnityEngine;
    2
    3[RequireComponent(typeof(Rigidbody2D))]
    4public class Jugador : MonoBehaviour
    5{
    6    [SerializeField] float velocidad = 5f;
    7    [SerializeField] float fuerzaSalto = 8f;
    8    Rigidbody2D rb;
    9    bool enSuelo;
    10    int monedas;
    11
    12    void Awake() => rb = GetComponent<Rigidbody2D>();
    13
    14    void Update()                                       // cada fotograma: leer la entrada
    15    {
    16        float dir = Input.GetAxisRaw("Horizontal");
    17        rb.velocity = new Vector2(dir * velocidad, rb.velocity.y);
    18        if (Input.GetButtonDown("Jump") && enSuelo)
    19            rb.AddForce(Vector2.up * fuerzaSalto, ForceMode2D.Impulse);
    20    }
    21
    22    void OnCollisionEnter2D(Collision2D c) { if (c.gameObject.CompareTag("Suelo")) enSuelo = true; }
    23    void OnCollisionExit2D(Collision2D c)  { if (c.gameObject.CompareTag("Suelo")) enSuelo = false; }
    24
    25    void OnTriggerEnter2D(Collider2D otro)              // disparador: moneda
    26    {
    27        if (!otro.CompareTag("Moneda")) return;
    28        monedas++;
    29        Destroy(otro.gameObject);
    30    }
    31}

    6. Ejercicios

    Ejercicio Práctico
    Fácil

    Elige el motor

    Recomienda un motor para cada proyecto y justifícalo con los criterios de selección: 1. Un juego educativo 2D para el navegador de un colegio. 2. Un plataformas 2D para Android de un equipo de dos estudiantes sin presupuesto. 3. Un juego 3D realista para PC y consolas de un estudio con 40 personas. 4. Un juego de puzles para Android e iOS con monetización por anuncios. 5. Un proyecto de clase en el que solo se sabe Java.

    Ejercicio Práctico
    Medio

    Delta time

    Un enemigo se mueve con posicion.x += 4 en cada fotograma. 1. ¿Qué distancia recorre en un segundo a 30, 60 y 144 FPS? 2. Reescribe el movimiento para que recorra 240 píxeles por segundo en cualquier equipo. 3. ¿Por qué la física suele calcularse en un paso fijo (por ejemplo, 50 o 60 veces por segundo) aunque se dibuje a otra frecuencia?

    Ejercicio Práctico
    Difícil

    Prueba dos motores

    Instala Godot y Unity y crea en ambos el mismo prototipo: una escena con suelo, un personaje que se mueve y salta, y tres monedas que suman puntos. Exporta a Android (o a escritorio si no tienes móvil) y compara en una tabla: tiempo de desarrollo, tamaño del ejecutable, FPS en el dispositivo, facilidad del editor y de la documentación, y licencia. Concluye qué motor elegirías para un juego 2D pequeño.

    ¿Has terminado este tema?

    Crea una cuenta gratis para guardar qué temas has terminado, subir de nivel y ganar medallas.

    Guardar mi progreso