top of page

¡Haz una donación y apoya a Vessel!

Feature Flags en Vessel

  • Foto del escritor: Rickperros
    Rickperros
  • 16 ene
  • 4 Min. de lectura

Las feature flags son una práctica bastante estandarizada en el desarrollo de juegos, especialmente dentro del sector de los juegos para móvil. Sin embargo, aún hay estudios y desarrolladores independientes que no las usan. Hoy quiero explicar en qué consiste esta estrategia, porque es útil, y cómo la estamos implementando en Vessel.


¿Qué son las feature flags?


En esencia son una estrategia de desarrollo de software que busca poder modificar las funcionalidades de un programa sin tener que reescribirlo ni recompilarlo. Suelen representarse como una variable de tipo booleana, si eres alguien que no tiene formación técnica esto es cualquier tipo de dato que pueda tener dos estados: true, o false. La idea es muy simple: añadir un “interruptor” para controlar el flujo de ejecución de un programa, si esa variable booleana tiene un valor true ejecutamos el código, en caso contrario la funcionalidad no se activará. 


¿Por qué son útiles?


Hay muchas ventajas asociadas a no tener que escribir de nuevo un programa cada vez que queremos modificar su comportamiento. En mi opinión las más interesantes son:

  1. Mejor respuesta en caso de tener un error localizado. Cuando se trabaja en equipos asíncronos (como es nuestro caso), es vital poder asegurar que la rueda nunca pare de girar. Veamos un ejemplo, imaginemos que un artista está trabajando en la iluminación de un nivel. Este artista solo necesita poder pasearse por el entorno y ver como va quedando, el resto de funcionalidades del juego no le importan. Ahora imaginemos que el minimapa del juego está provocando un crash, y para colmo imaginemos que el programador responsable del mismo estará fuera unos días. En este caso es extremadamente útil poder deshabilitar el minimapa ya que permite a nuestro artista seguir trabajando con normalidad hasta que vuelva el programador en lugar de quedarse inoperativo. Otro ejemplo interesante sería una actualización donde alguna funcionalidad se rompe, imaginemos un juego de lucha o un moba donde después de actualizarlo un personaje se rompe y produce un error catastrófico. En lugar de bloquear a los jugadores hasta que el error se solucione simplemente se desactiva la parte rota y ya está. 

  2. Tests A/B. Las feature flags no solo sirven para deshabilitar funcionalidades, también sirven para versionar las. El caso clásico es hacer tests A/B donde se comparan cómo funcionan dos versiones de algo. 

  3. Configurar la experiencia. Este es bastante similar al anterior solo que en lugar de pensar en que “versión es mejor” el foco está en “que prefiere el usuario”. El razonamiento detrás de esto es el mismo que en el test A/B pero pone el foco en la accesibilidad. Por ejemplo, permitir desactivar los quick time events, activar más o menos información en el minimapa, etc. En definitiva, dar poder al jugador para crear su mejor experiencia.


¿Cómo las estamos implementando?


Para el equipo de Vessel las feature flags deben cumplir dos requisitos:


  1. Tienen que ser globalmente accesibles. Es decir tenemos que poder usarlas desde cualquier parte.

  2. Tienen que ser configurables desde fuera del juego y del editor.


Para conseguir esto estamos apoyándonos en los sistemas de Unreal. Hemos creado un subsistema en el game instance (una parte del código para mis lectores no técnicos) lo que hace que todas las variables declaradas sean automáticamente accesibles globalmente ya que esta clase lo es. Estas variables que declaramos en este subsistema además las marcamos como config, dentro del entorno de Unreal esta marca hace que podamos darles un valor usando un fichero de texto externo. En general esto es deseable para casos donde el fallo crítico o la funcionalidad a examinar se tiene que modificar antes de arrancar la build y para permitir que perfiles sin conocimientos técnicos puedan usarlas.


Todas estas variables de configuración tiene una variable gemela que es transiente (esto quiere decir que su valor no se guarda entre ejecuciones del programa). A nivel interno esta variable es la que usamos ya que nos permite modificar ejecuciones del juego sin perder el valor deseado desde la configuración. 


Llegados a este punto la feature flag está lista para usarse. A partir de aquí lo que hacemos es consultar su valor en el punto de entrada de cada funcionalidad recuperando el subsistema y llamando a una función que nos devuelva el valor almacenado. Por ejemplo, cuando el jugador pulsa el botón de disparar comprobamos que la funcionalidad de disparar está permitida. Esta comprobación la hacemos usando un método en lugar de una lectura directa para construir jerarquías de funcionalidades. Veamos un ejemplo:


  • Imaginemos que tenemos una feature flag llamada PermiteElCombateCuerpoACuerpo  y otra llamada PermiteCombosLigeros. Aunque el combo ligero esté permitido no queremos ejecutarlo si el combate cuerpo a cuerpo no está permitido. 


Usando funciones dedicadas encapsulamos estas comprobaciones quitando asi complejidad al código de la funcionalidad en sí. 


Finalmente, para simplificar su uso dentro de las builds y el editor, extendemos la clase cheat de Unreal y añadimos un par de funciones que nos permiten modificar estos flags desde dentro del juego. La gracia de esta clase es que nos permite llamar las funciones marcadas como exec directamente desde la consola de Unreal. La primera función nos permite modificar la variable transiente lo que es útil para tests rápidos, y la segunda nos permite grabar el valor de la flag deseado.


Conclusiones


Ahora por ahora estamos usando la versión más simple de esta estrategia: definir unas flags booleanas. Sin embargo se pueden crear flags más complejas usando enumerados, enteros, incluso, dentro de Unreal, gameplay tags. Para nosotros son vitales ya que nos permiten usar estrategias de programación defensiva pero ya hablaré de ello en otro post! ¿Qué te parecen estos posts más técnicos? ¡Déjame tu opinión en los comentarios! ¡Suscribete para no perderte nada y comparte este post para ayudarme!


Comentarios

Obtuvo 0 de 5 estrellas.
Aún no hay calificaciones

Agrega una calificación

No te pierdas nada

Thank you for subscribing

Consider donating to help me bring Vessel to life!

La creatividad funciona mejor en comunidad.
¡Contacta!

Thank you for reaching out!

© 2025 Todos los derechos reservados

bottom of page