- Incluso sin un motor de juego comercial, es totalmente posible desarrollar juegos de forma fácil y divertida
- La mayoría de las funciones de los motores grandes no son necesarias, y crear herramientas propias aumenta la flexibilidad y la eficiencia de desarrollo
- Aprovechando C# moderno y bibliotecas de código abierto, es posible contar con un entorno de desarrollo suficiente sin importar el tamaño del equipo
- Combinando bibliotecas como FMOD, SDL3, Dear ImGui con herramientas propias, se puede armar un pipeline ajustado a las necesidades
- En términos de desarrollo multiplataforma, mantenimiento y portabilidad, un framework ligero construido por cuenta propia ofrece muchas ventajas
Prólogo: reflexiones de un desarrollador de juegos con 20 años de experiencia
- En 2025, sigo desarrollando videojuegos sin motores de juego comerciales
- A menudo a la gente de mi alrededor le sorprende que no use un motor comercial
- Las funciones básicas de motores grandes como Unity o Unreal resultan menos satisfactorias que implementarlas directamente, y al final terminas rehaciendo muchas partes
- Al usar motores comerciales, se está expuesto a problemas causados por cambios frecuentes en las políticas de negocio o por actualizaciones
- Crear directamente herramientas pequeñas ajustadas a cada proyecto es más eficiente y, a largo plazo, también más fácil de mantener
Elección del lenguaje de programación necesario para desarrollar juegos
- Durante mucho tiempo he usado C# como lenguaje principal
- El C# moderno ha mejorado mucho en rendimiento, sintaxis y experiencia de desarrollo en comparación con el pasado
- Cuenta con funciones de hot reload como dotnet watch, lo que resulta muy conveniente para modificar y probar código en tiempo real
- Incluso personas no desarrolladoras pueden acercarse con facilidad, lo que mejora la distribución de roles y la eficiencia de la colaboración dentro del equipo
- La función integrada de reflection ofrece ventajas al crear editores o herramientas
Bibliotecas multiplataforma e implementación de renderizado y entrada
- Uso SDL3 para implementar todas las funciones básicas: ventanas, renderizado, controladores y soporte multiplataforma
- La abstracción de GPU de SDL3 facilita el soporte para distintos entornos como DirectX, Vulkan, Metal
- Encima de SDL, utilizo una capa en C# escrita por mí (por ejemplo, Foster) como utilidad compartida
- Uso FMOD como la última herramienta de audio comercial que me queda; fuera de eso, construyo un pipeline basado en código abierto
- Antes también tuve experiencia implementando directamente OpenGL/DirectX, pero la estabilidad de SDL es una ventaja considerable
Cómo manejar los assets
- Cuando se usa un motor propio, simplemente se cargan los archivos que el juego necesita
- En el caso de assets pequeños, como en un juego de pixel art, todos los archivos se cargan de una vez durante la inicialización
- En proyectos grandes, solo se cargan los assets cuando se solicitan, y se libera memoria al cambiar de escena
- Si se necesita conversión, basta con escribir scripts que la procesen automáticamente durante la compilación
Editor de niveles y herramientas de UI
- Es fácil vincular datos con editores de niveles de código abierto como LDtk, Tiled, Trenchbroom
- Por lo general, implemento directamente editores personalizados para cada proyecto
- No escribo la UI base desde cero, sino que aprovecho activamente la GUI de modo inmediato de Dear ImGui
- La combinación de reflection de C# con ImGui permite visualizar en tiempo real el estado de los objetos del juego
- Cuando hace falta, mezclo herramientas externas adecuadas para el propósito con herramientas propias
Multiplataforma y portabilidad a consolas
- Antes, por los problemas al portar a consolas, había una gran necesidad de elegir C++, pero eso se resolvió con la llegada de C# Native-AOT
- Frameworks de código abierto como FNA están ampliando activamente el soporte para consolas
- Si se aprovecha la capa de abstracción general que ofrece SDL3, es posible operar con la misma base de código en la mayoría de los sistemas
Entorno de desarrollo: ecosistema abierto centrado en Linux
- Cambié mi plataforma principal de desarrollo a Linux, y encaja muy bien con el toolchain de código abierto
- Aún quedan vínculos con cierto software comercial (por ejemplo, vscode, github), pero mientras más se expande el ecosistema de código abierto, más crece también el soporte
- En lo personal, estoy configurando el mismo entorno de trabajo en diversas plataformas basadas en Linux, como Steam Deck
Q&A adicional y casos
- Consulta sobre usar Godot: si se busca desarrollar con un motor de código abierto, recomiendo Godot; fuera de eso, prefiero herramientas personalizadas
- Trabajo en 3D: los motores grandes tienen ventajas, pero para proyectos pequeños y especializados, un framework a medida es suficiente
- Requisitos técnicos de alto rendimiento: según el nivel de exigencia, usar motores grandes como Unreal también es perfectamente válido
- Cambio de motor a nivel de equipo: es adecuado para desarrollo individual o de equipos pequeños, y también están aumentando los casos de estudios medianos y grandes que migran a motores personalizados para evitar riesgos a largo plazo
- Flujo de trabajo de assets: los archivos de Aseprite pueden convertirse automáticamente en animaciones aprovechando etiquetas y tiempos integrados
Conclusión
- Hacer juegos sin un motor de juego comercial es una elección que depende del gusto personal y la forma de trabajar
- Basta con priorizar las necesidades y la diversión, y elegir el método que mejor se adapte a uno mismo
5 comentarios
Es una buena actividad.
Yo fui un desarrollador de juegos de primera generación.
Antes de que saliera Unreal, por supuesto las desarrolladoras
tenían como algo natural desarrollar su propio motor,
y eso era precisamente su competitividad.
En el desarrollo de motores, la mayor parte del trabajo era crear herramientas
basadas en el core, el kernel, el renderizado y otras entradas y salidas.
En ese entonces yo estaba a cargo de las herramientas de partículas, sonido, capas y objetos,
y aunque el equipo era de 7 personas, si juntabas todo creo que fácilmente
superábamos las 20 herramientas.
Desde cierto día, cuando apareció Unreal y empezaron a salir en masa juegos hechos en serie,
ya no siguieron invirtiendo en desarrollar motores.
Creo que en ese momento muchos se independizaron y fundaron sus propias empresas.
Ya es una historia de hace 27 años.
Yo también, con el paso del tiempo, envejecí y ahora trabajo en algo que no es videojuegos.
Recuerdo con nostalgia aquella época en la que hacía trabajo de core
según la tarjeta gráfica y los modos de DirectX y OpenGL.
Ánimo...
Últimamente he estado buscando durante mucho tiempo un motor para hacer un juego de estrategia, así que pensé que quizá sería mejor hacer uno yo mismo, pero ver un caso exitoso de alguien que realmente lo hizo me llena de valor.
Opiniones de Hacker News
Tras pasar 5 años desarrollando en solitario un motor 2D y haciendo trabajo remunerado relacionado, quiero explicar un punto importante que mucha gente no conoce
el motor es la parte fácil
lo realmente importante es el tooling alrededor del motor, el contenido y el pipeline de assets
importar texturas, audio y archivos de modelos (
gltf,fbx, animaciones, etc.) desde distintas fuentes y formatos de datosfunciones básicas de edición en la app del editor, como recortar, copiar, pegar, deshacer, rehacer, guardar y borrar
visualización y funciones que permitan a los desarrolladores crear y manipular datos reales desde el editor (entidades, animaciones, escenas, grafos de audio, soporte de scripting, etc.)
empaquetado y preprocesamiento de datos, como baking de geometría estática, compilación de shaders, resampling y empaquetado de texturas/audio, y creación de asset packs de contenido del juego
cuando todo eso está terminado, la parte de runtime en sí (es decir, el loop principal del juego y sus subsistemas) es una parte pequeña del sistema completo
por eso en los estudios de videojuegos hay poca gente encargada del motor y la mayoría de los programadores hacen herramientas
motor detonator: https://github.com/ensisoft/detonator
Es importante enfocarse en hacer un motor que se ajuste a tu juego, más que en la generalidad
la UI, la compresión, etc. se pueden resolver con librerías y frameworks
el uso que hace OP de una librería pequeña como imGUI es un buen ejemplo
como no estás haciendo un motor para todos los juegos, en la práctica hay mucho trabajo que ni siquiera hace falta hacer
El motor es como un pequeño runtime pegado a un pipeline de assets
hoy en día, incluso los compiladores de shaders se están volviendo más importantes que las APIs 3D
la parte interesante se concentra en el compilador de shaders, y la API 3D se limita a ejecutar shaders y pasar datos
Cuando la gente habla de motor, muchas veces tiende a incluir también el pipeline de assets y el editor
los motores actuales no son solo un loop principal + funciones de API 3D
aun si usas un motor como Unity, son muy pocos los desarrolladores que solo escriben código de renderizado
claro, eso no significa que al usar Unity/Unreal nunca vayas a tocar herramientas de assets por tu cuenta
Estoy muy de acuerdo con esto después de rehacer el motor para una secuela reciente
como escribí en el postmortem, la mayoría piensa en el motor como el código incluido en el ejecutable del juego, pero en la práctica creo que pesa más el código que no se distribuye con el juego, como el editor de niveles, el pipeline de contenido, el debugging/profiling y el workflow de desarrollo
desarrollar herramientas es más aburrido y más desgastante que desarrollar el motor
por eso tantos desarrollos de juegos con motor personalizado se quedan a mitad del camino
postmortem: https://ruoyusun.com/2025/04/18/game-sequel-lessons.html
Hacer un editor desde cero es bastante trabajo
si se puede, conviene aprovechar editores ya existentes
por ejemplo, la combinación TrenchBroom (editor de Quake) + func_godot, o Tiled para 2D
para gestionar datos del juego también estaba CastleDB, aunque ahora está integrado con Hide (un editor 3D más serio)
después de crear las herramientas, diseñar el juego y producir contenido vuelve a ser otra etapa principal
Hace unos años hice una clase simple de "sprite" con SDL2 y un poco de C++, y le fui agregando funciones sencillas como colisiones
si insistiera en llamarle motor a lo que hice, era más bien como la asistencia de una bicicleta eléctrica
el problema es que el "motor" muchas veces termina guiando todo el proyecto/juego
a menudo acabas adaptando el juego al motor, por eso siempre evito usar motores grandes como Unity
al final esos motores tienden a producir la misma estructura de juego, solo cambian los assets
personalmente, en vez de perder tiempo aprendiendo un motor, prefiero empezar con SDL, que tiene una curva de aprendizaje corta y además sirve para otros proyectos multiplataforma fuera de juegos
mi juego: https://store.steampowered.com/app/2318420/Glypha_Vintage/
Aunque se diga que hacer tu propio motor toma mucho tiempo, pregunto cuánto tiempo hace falta para aprender Unreal o Unity de verdad, hasta el punto de poder convertir una idea en juego de inmediato
al final, cuando termino mi propio motor, ya tengo precisamente ese nivel de especialización, así que a largo plazo ahorro tiempo
cuanta más experiencia acumulas como ingeniero, más te conviene hacerlo tú mismo en términos de tiempo
cuanto más único o de nicho sea el juego, más sentido tiene hacerlo por tu cuenta
pasar meses perdido en la UI compleja de Unreal y descubrir que lo que querías era casi imposible en un motor generalista es ineficiente
en cambio, si vas a hacer un RPG de mundo abierto hiperrealista, construirlo tú mismo no es una buena opción
las limitaciones de un motor personalizado incluso pueden fomentar la creatividad, y aunque no salga algo de primer nivel, sí puede salir un juego más original
Yo sí hice mi propio motor
al principio me tomó alrededor de un año, atravesando muchísimos intentos fallidos y callejones sin salida
implementé casi todos los subsistemas que uno puede ver en un juego: renderizado 3D, UI adaptativa, animación esquelética, archivos de guardado, smart objects, pathfinding, scripting, audio, física, etc.
en particular, implementé por mi cuenta una función de rebobinado (como el sistema de Braid)
ese tipo de función requiere soporte de todos los subsistemas del motor (scripts, física, etc.)
como conozco cada parte del motor que hice, tengo una libertad enorme para desarrollar funciones adicionales
pero después de un año de desarrollo me fui quemando poco a poco y perdí la motivación
No conozco Unreal, pero con Unity se puede desarrollar más de 10 veces más rápido que programando todo directamente
agregar física puede tomar 1 minuto, mientras que en un motor propio solo integrar una librería externa puede tomar uno o dos días
las funciones de visualización interna que muestra Noel en Unreal también vienen integradas en Unity
ediciones como manipular bounding boxes ya vienen incluidas por defecto
si el comportamiento base del motor no te alcanza, se puede extender fácilmente con ImGui o un motor CSS basado en Yoga
ofrece muchísimas funciones, como un editor avanzado de partículas, shaders con complejidad abstraída y streaming modular de datos
en teoría uno querría hacerlo todo por su cuenta, pero al final manda el tiempo y la prioridad es terminar
El tiempo que toma aprender Unreal o Unity hasta poder implementar una idea de juego de inmediato, y el tiempo que toma hacer tu propio motor, son preguntas distintas
si me das una idea sencilla, puedo hacer un prototipo jugable en unas horas
en Unity al principio basta con programar, y en Unreal puedes llegar casi hasta el lanzamiento de un juego usando solo Blueprints
como referencia, aquí hay un video donde hacen un prototipo estilo Super Hexagon en 10 minutos: https://www.youtube.com/watch?app=desktop&v=p8MzsDBI5EI
lo único realmente específico de Unity sería algo como los prefabs; el resto son conceptos generales del desarrollo de juegos
si vienes de Unreal, también podrías hacer un prototipo parecido en Unity en menos de una hora
La suposición de “después de terminar el motor” quizá ya es irrealista
incluso una acción simple como
GameObject.Instantiateexige una cantidad enorme de recursos si tienes que implementarla tú mismo en el motorsi consideras la complejidad de física 2D/3D, shaders y soporte de plataformas
si tu objetivo es el motor, haz el motor; si tu objetivo es el juego, haz el juego
Si ya tienes suficiente conocimiento de desarrollo de juegos como para crear un motor de juego
un día basta para aprender Unreal o Unity al nivel de hacer un prototipo
llegar a la perfección toma mucho más, pero el tiempo para terminar el prototipo del juego que quieres no tiene comparación
Hacer juegos sin un gran motor "que lo hace todo" es más fácil, más divertido y a veces más eficiente
pero cuando te metes a fondo en funciones específicas del motor (por ejemplo, la cinemática inversa de Unreal o el animation blending), terminas pensando “menos mal que no tuve que sufrir 2 o 3 semanas haciéndolo yo mismo”
el minimalismo o evitar la hinchazón también importan, pero estos motores son populares porque cargan con el trabajo pesado
Antes yo también trabajaba así
cuando hice mi primer juego 3D, implementé entrada, gestión de objetos, culling, carga de modelos, librería matemática, gráficos, normal maps, SSAA y todo lo demás, y al final el porcentaje de juego terminado fue 0%
aun así, en mis proyectos 2D de hobby sigo desarrollando sin dependencias, solo con el canvas del navegador
en la práctica, el navegador hace el papel de motor
Sobre la idea de “menos mal que no lo hice yo mismo”
si piensas en una carrera de desarrollador indie a largo plazo, aunque te lleve unas semanas, entender el tema en profundidad + tener el 100% del código fuente + el valor de poder reutilizarlo pesa más
Mi tesis de grado trató de portar un motor de partículas basado en NeXTSTEP/Objective-C a Windows 95/Visual C++ (basado en OpenGL, con un ejemplo de marching cubes)
hoy ese tipo de tema en los motores actuales no pasa de ser una pequeña función de una línea
Usar un motor acelera muchísimo el avance del proyecto y evita gastar tiempo en desarrollar infraestructura
volver a inventar la rueda no suele ser algo especialmente divertido para la mayoría
Funciones como la cinemática inversa o el animation blending
si son el núcleo del juego, vale la pena implementarlas; si no, son una trampa técnica innecesaria
Hago juegos a mi manera usando Lua y Love2D
parte de la diversión está justamente en autoimponerse restricciones
si desarrollar deja de ser divertido, es señal de que algo anda mal y toca buscar un mejor método
mi juego YOYOZO pesa 39 KB, pero apareció junto a producciones grandes en la lista de mejores juegos de 2023 de Ars Technica
https://news.ycombinator.com/item?id=38372936
después de años de haber comprado una Playdate, recién empecé a jugar con el SDK, y también estoy aprendiendo Lua por primera vez
aunque a veces extraño los tipos fuertes y más seguridad del lenguaje, para este caso es suficientemente bueno
lo único que hice fue una pequeña demo técnica donde texto gira en un espacio 3D falso según el crank
https://bsky.app/profile/haydenblai.se/post/3lpgnya4cqk2a
haciendo este proyecto me di cuenta de que, tras tantos años de experiencia en CRUD/webapps, casi había olvidado toda la trigonometría
la mayor ventaja del desarrollo para Playdate es la liberación que da tener un canvas fijo: defines la posición de los píxeles y funciona igual en todos los dispositivos
después de tantos años haciendo solo UI responsiva, esa experiencia se siente muy nueva
Cada vez que intento hacer algo con un motor de juego (Godot, Unity, Unreal, etc.), termino peleándome con el motor
al final se siente como poner assets encima de un formato de juego ya definido, y se vuelve difícil hacer el juego que realmente quiero
si lo comparas con desarrollo web, se parece a usar un producto terminado como WordPress
cuando la configuración base no coincide con tu intención, hace falta una cantidad enorme de hacks y rodeos
Los "game templates" echan más leña al fuego aquí
puedes comprar plantillas que hacen que parezca un juego terminado con solo cambiar la pantalla de título y los modelos
casi la mitad de los lanzamientos nuevos en Steam son poco más que juegos hechos con templates de Unity/Unreal y un cambio superficial de skin
algunos ejemplos:
https://assetstore.unity.com/packages/templates/…
https://store.steampowered.com/app/2488370/Cash_Cleaner_Simulator/
https://store.steampowered.com/app/2073910/A_Webbing_Journey/
https://store.steampowered.com/app/3498270/Better_Mart/
https://store.steampowered.com/app/2625420/Drive_Beyond_Horizons/
https://store.steampowered.com/app/3163790/Toy_Shop_Simulator/
https://store.steampowered.com/app/3023600/Horse_Farm_Simulator/
https://store.steampowered.com/app/3124550/Liquor_Store_Simulator/
En Google Play todos los juegos se ven iguales, y aparecen problemas típicos de Unity como tiempos de carga largos, fallas de renderizado, texto roto y bugs de audio
quizá eso se tolere en juegos "idle RPG" hechos para anuncios móviles, pero en VR de verdad me costaba entender que alguien usara Unity
para cumplir con el rendimiento del Meta Quest Store, hay que destripar buena parte del motor Unity
es difícil alcanzar el rendimiento y además su forma de trabajar ya se siente anticuada
si quieres hacer software de alta calidad, no puedes partir de un motor en el que no confías
El autor (Noel) hizo el juego Celeste y vendió más de 3 millones de copias
https://en.wikipedia.org/wiki/Celeste_(video_game)
Yo también coincido bastante y estoy creando un framework de juego en C# centrado en código (un sucesor espiritual de XNA/Monogame, usando Sokol en vez de SDL)
https://zinc.graphics/
fortalezas del C# moderno: multiplataforma, compilación NativeAOT, hot reloading nativo, reflection, etc.
personalmente también le agregué source generators
aunque todavía arrastra una imagen negativa del pasado, lo que han avanzado CoreCLR y el lenguaje en los últimos 5 años ha sido impresionante
lo único que realmente me gustaría tener son Union Types, y como ya hay una propuesta, espero que se agreguen el próximo año
https://github.com/dotnet/csharplang/blob/main/proposals/TypeUnions.md
solo he usado C# en Win32 o Unity, y aunque tengo conocimientos de motores de bajo nivel en C/C++, pensaba que C# no era viable para multiplataforma como consolas
ahora me doy cuenta de que estaba equivocado
Para cualquier software, prefiero empezar desde cero
a quien tiene experiencia en proyectos grandes eso puede parecerle lento, pero en etapa startup en realidad es más rápido
implementas solo lo mínimo, y una vez que aparecen abstracciones, agregar nuevas funciones se vuelve más rápido
la productividad del software empresarial grande y la de un mini motor que escribí yo mismo son completamente distintas
el código que escribí yo mismo se puede cortar y refactorizar enseguida, así que voy mucho más rápido
por eso prefiero microservicios y equipos pequeños
cuando haces algo tú mismo, inevitablemente atraviesas ensayo y error y un campo minado de cosas que se rompen, y además hacen falta años para entender de verdad las características reales del lenguaje o la plataforma
pero todo ese proceso termina convirtiéndose en experiencia real del desarrollador
Más que un motor, me pregunto qué tal sería usar algo al nivel de un framework como MonoGame~
"Ese proceso en sí mismo al final se queda como experiencia acumulada del desarrollador". Estoy totalmente de acuerdo.