DrakkenRidge: Building an open-world adventure for mobile VR

Sep 8, 2026|7 Min
Simeon Acker and Cyril Guichard
Simeon Acker and Cyril Guichard - Garage Collective
GUEST BLOG
Key art for DrakkenRidge VR by Garage Collective, Made with Unity. Composite image featuring a logo overlaid on a mountain landscape background. The lower thirds blend into a parchment texture. Within the circular logo is a blonde haired elf, a red-bearded dwarf, and a wizard with a white beard.

Made with Unity, DrakkenRidge Es un RPG de acción de mundo abierto de Garage Collective, diseñado y optimizado para realidad virtual móvil. En esta entrada de blog invitada, el equipo comparte cómo aprovechan diversas técnicas de diseño y rendimiento al usar el Sistema de Componentes de Entidades de Unity como base del renderizado.

Tráiler de Draken Ridge

Presentamos DrakkenRidge VR

Somos Garage Collective, el equipo detrás de DrakkenRidge , un RPG de acción de mundo abierto diseñado para realidad virtual donde puedes visitar cualquier punto que veas en el horizonte. Ponte en la piel de un poderoso cazador de magos y explora seis islas bellamente diseñadas a mano, cada una totalmente única, con sus propios personajes, misiones, mazmorras y secretos.

Este viaje te llevará desde cálidas y confortables playas hasta impresionantes picos nevados; desde frondosos y místicos bosques hasta peligrosos abismos en las profundidades de la tierra. Crea nuevos objetos, lucha contra decenas de criaturas y enemigos diseñados con maestría y desbloquea nuevas escuelas de magia que pueden convertir cada encuentro en una experiencia única.

Crear un juego de esta envergadura con un equipo de dos personas probablemente no sería posible sin el Sistema de Componentes de Entidades . En esta publicación, explicaremos cómo utilizamos estas herramientas para crear nuestro extenso juego de aventuras.

Técnicas de mezcla para un desarrollo de juegos más fluido

Existen varias ventajas importantes al usar ECS para crear un juego, pero como pequeño estudio independiente, también tuvimos que sopesar otros factores a la hora de decidir cómo diseñar y desarrollar DrakkenRidge para realidad virtual móvil.

Existen dos desafíos principales al utilizar ECS:

  • La pronunciada curva de aprendizaje: El desarrollo con ECS requiere un cambio de paradigma completo que se aleje de la lógica típica orientada a objetos.
  • La separación de los sistemas de entidades de los sistemas de objetos de juego tradicionales puede dificultar sus interacciones entre sí.

Así pues, la pregunta para nosotros se convirtió en:

¿Qué objetos e interacciones deberían aprovechar el poder de ECS, y qué objetos deberían seguir siendo GameObjects y MonoBehaviours tradicionales?

Entities en DrakkenRidge

DrakkenRidge se compone de enormes entornos abiertos, con decenas de miles de objetos en un espacio determinado, de los cuales miles pueden ser visibles para el jugador en cualquier momento.

Renderizar estos objetos como GameObjects tradicionales requiere un gran consumo de memoria, ya que el motor necesita evaluar toda la jerarquía de la escena y calcular los componentes de transformación para cada objeto. Al renderizar miles de objetos, especialmente en un dispositivo móvil, la GPU sufrirá notablemente.

¿Y si tomamos estos objetos y los representamos como Entities ?

DrakkenRidge VR

Como Entities, evitan gran parte de la sobrecarga de renderizado y memoria asociada con los GameObjects y, en su lugar, se agrupan en bloques de memoria utilizando los Entities Graphics.sistema.

Además, el flujo de trabajo artístico de DrakkenRidge utiliza ampliamente la técnica de atlas de texturas, lo que permite que los entornos masivos utilicen menos materiales en general (consulte nuestra publicación de blog sobre atlas de texturas aquí ).

Entities Graphics puede agrupar y gestionar todos los objetos que comparten una malla y un material comunes, y luego el motor puede crear llamadas de dibujo muy compactas y renderizar muchos objetos a la vez.

El resultado de esto puede ahorrar cientos de lotes y llamadas a SetPass.

Captura de pantalla de DrakkenRidge de Garage Collective, Made with Unity. Representación en 3D de un paisaje montañoso rocoso. Una ventana en la esquina muestra el pequeño número de llamadas a SetPass (8) sobre miles de objetos.

Renderizar miles de objetos con tan solo ocho llamadas a SetPass.

Sistemas de entidades personalizadas

DrakkenRidge utiliza ECS para renderizar miles de objetos a la vez. Pero incluso con las enormes mejoras de rendimiento que esto supone, todavía podemos hacer más para mejorar la experiencia en las plataformas de realidad virtual móviles.

Sistema de autoría a distancia

La primera característica que creamos para nuestras Entities DrakkenRidge es el sistema de creación de contenido a distancia. Tiene en cuenta diversas variables para determinar cuándo un objeto debe estar oculto o visible para el jugador.

Debido a que el campo de visión del jugador se extiende muy lejos en el mundo abierto, miles de objetos distantes pueden estar a la vista simultáneamente. Este sistema prioriza cuáles de estos elementos deben permanecer en un lugar destacado y cuáles deben pasar a un segundo plano. Los efectos ambientales, como la niebla de distancia, se utilizan para disimular la transición a medida que los objetos distantes desaparecen de la vista.

Captura de pantalla del juego de DrakkenRidge VR de Garage Collective. Made with Unity. Superpuesta se muestra una ventana que muestra el componente de autoría de distancia con valores personalizados para la eliminación de entidades en tiempo de ejecución.

Componente de creación de contenido a distancia con valores personalizados para la eliminación de entidades en tiempo de ejecución.

En el editor, se generan valores de eliminación únicos para cada entidad en función de diversos parámetros. Estos datos se transmiten posteriormente, en el momento de la creación de la entidad , a los sistemas.que utilizan esos datos precalculados para tomar decisiones en tiempo de ejecución sobre cuándo se deben renderizar o descartar las Entities .

Grupos de entidades personalizadas

Mediante el sistema de autoría de distancia DrakkenRidge , las Entities pueden asignarse a grupos con gestión de decisiones compartida, lo que permite, por ejemplo, que una sección de la ciudad se renderice o se elimine rápidamente en función de varios factores del juego, en lugar de que cada entidad de la ciudad decida individualmente.

Captura de pantalla del editor de DrakkenRidge VR, creada con Unity. Un paisaje urbano con cajas azules de colisionadores alrededor de una posada. A la izquierda se muestra una ventana de inspección con entidades agrupadas que comparten la gestión de decisiones.

Entities agrupadas con toma de decisiones compartida

Niveles de detalle de entidad

La tercera característica del sistema de creación de objetos a distancia DrakkenRidge permite intercambiar entidades sobre la marcha por otra entidad que resultaría aún más económica de renderizar. Esta técnica se escribió originalmente para abordar el problema de los sombreadores y materiales más costosos.

Si bien los modelos de entorno en DrakkenRidge ya están altamente optimizados, algunos sombreadores añaden un coste notable. Este sistema LOD (Nivel de Detalle) de Entidades permite renderizar "versiones de entidades con sombreadores de mayor coste" solo cuando sea necesario.

/// If using a simplified LOD object, see if we are in its range
if (inDistanceReturn.useLOD)
{
    if (inDistanceReturn.isInDistanceLOD)
    {
        ecbParallel.SetEnabled(unfilteredChunkIndex, inDistanceReturn.lodEntity, true);

        if (ChildLookup.TryGetBuffer(inDistanceReturn.lodEntity, out lodChildBufferData))
        {
            var newParent = inDistanceReturn.lodEntity;

            SetEnableChildren(
                entityCanBeReEnabledComponentLookup: entityCanBeReEnabledComponentLookup,
                  unfilteredChunkIndex: unfilteredChunkIndex,
                  parentEntity: newParent,
                  enabled: true,
                  childBufferData: lodChildBufferData,
                  ChildLookup: ChildLookup,
                  ecbParallel: ecbParallel);
                                    }

Cuando se cumplan las condiciones, utilice un LOD simplificado para la entidad.

optimizaciones de CPU

Los cálculos de estimación de distancia de DrakkenRidge se ejecutan mediante trabajos compilados en ráfaga para obtener el máximo rendimiento de la CPU.

Unity Jobs son funciones que se pueden programar como tareas asíncronas para ejecutarse en segundo plano, y el compilador BurstAcelera las tareas que requieren mucha potencia de procesamiento al traducirlas a código máquina nativo altamente optimizado.

[BurstCompile]
public partial struct ProcessBufferJob : IJobChunk
{
     internal EntityCommandBuffer.ParallelWriter ecbParallel;

     public EntityTypeHandle entityTypeHandle;
     [ReadOnly] public BufferTypeHandle<Child> childTypeHandle;
     [ReadOnly] public ComponentTypeHandle<DistanceCompData> distanceCompDataTypeHandle;

     // A BufferLookup for random access to Child buffers.
     [ReadOnly] public BufferLookup<Child> childLookup;
     [ReadOnly] public ComponentLookup<Disabled> disabledComponentLookup;

     public PlayerDesignatorCompData targetDesignator;
     public HelperStructToUpdateEnabledEntities addToBufferStruct;
     public Entity playerEnt;

     public void Execute(in ArchetypeChunk chunk, int unfilteredChunkIndex, bool useEnabledMask, in v128 chunkEnabledMask)
     {
         var entities = chunk.GetNativeArray(entityTypeHandle);
         var childAccessor = chunk.GetBufferAccessor(ref childTypeHandle);
         var distanceCompData = chunk.GetNativeArray(ref distanceCompDataTypeHandle);

         bool hasChildBuffer = chunk.Has(ref childTypeHandle);
                DynamicBuffer<Child> lodChildBufferData;

         for (int i = 0; i < chunk.Count; i++)
         {
              Entity currentEntity = entities[i];

Consejo: Una optimización para DynamicBuffer es convertirlo a un NativeArray antes de la iteración: “var lodChildNativeArray = lodChildBufferData.AsNativeArray();”

GameObjects y física en DrakkenRidge

En DrakkenRidge , el 90% del mundo se renderiza utilizando ECS, que ejecuta sus propias tareas en segundo plano para mantener el entorno visible en un estado óptimo y con un aspecto impecable.

Pero para nuestro pequeño equipo de desarrollo, compuesto por un programador y un artista, decidimos crear muchas de nuestras interacciones de realidad virtual en primer plano utilizando GameObjects y MonoBehaviors tradicionales. Esto permitió reducir el tiempo de iteración en un entorno de pruebas rápidas y ciclos de diseño frecuentes.

Interacciones físicas y combate

Las interacciones de realidad virtual en DrakkenRidge se basan en gran medida en simulaciones físicas. Esto incluye desde agarrar y manipular objetos, hasta escalar y practicar parkour, pasando por lanzar hechizos y el combate cuerpo a cuerpo.

Los jugadores pueden interactuar con desafíos de escalada basados ​​en la física.

Ejecutar simulaciones físicas en el mundo abierto

El combate en DrakkenRidge se basa en un sistema que combina animaciones únicas con comportamientos físicos específicos para cada articulación. Cada IA ​​decide cómo hacer que su muerte se sienta reactiva y gratificante en función de la situación.

Combinando la física por articulación con animaciones programadas para crear reacciones únicas.

Muchos objetos y hechizos en DrakkenRidge permiten al jugador infligir daño a varios enemigos a la vez, lo que a menudo resulta en la ejecución simultánea de simulaciones físicas en muchos modelos de personajes.

Aplicación de la física de explosivos a grupos de IA

Optimizaciones físicas

Las simulaciones físicas en tiempo real pueden resultar costosas, especialmente en plataformas móviles. Para ayudar a mitigar esto, cada objeto físico del mundo realiza un seguimiento de la ubicación del jugador y de si este se encuentra o no en posición de interactuar con la simulación.

Por ejemplo, el jugador puede escalar largas cadenas construidas a partir de eslabones regidos por la física que interactúan entre sí y con el mundo que les rodea. Estos colisionadores físicos, articulaciones y cuerpos rígidos se activan o desactivan dinámicamente en función de si el jugador está manipulando directamente la cadena o si la está observando.

Por regla general, representamos los objetos que se encuentran a grandes distancias, pero solo permitimos interacciones físicas con objetos que están cerca. En un juego de realidad virtual, donde la acción se desarrolla de cerca, esto coincide con las expectativas del jugador.

Optimizaciones adicionales

A la hora de decidir cómo optimizar la renderización para la realidad virtual móvil, tuvimos en cuenta cómo se había construido cada entorno y elegimos la solución que mejor se adaptaba a nuestras necesidades.

Además de ECS, consideramos diversas técnicas, incluidos LOD e impostores .

Niveles de detalle (LOD) de los objetos de juego

La representación de GameObjects con niveles de detalle (LOD) consiste en tener múltiples versiones de un objeto determinado que se renderizan a diferentes distancias del jugador. Por ejemplo, un modelo de casa con gran nivel de detalle se sustituye por una versión muy simplificada de baja poligonalidad, lo que ahorra tiempo de renderizado cuando el jugador está lejos del objeto.

En DrakkenRidge , cada objeto ya está modelado con un estilo artístico retro de baja poligonalidad altamente optimizado, y la gran mayoría del mundo se gestiona mediante ECS, por lo que los LOD 3D tradicionales no ofrecerían ninguna ventaja real.

Sin embargo, la autoría a distanciaEl sistema que creamos fue diseñado para gestionar la representación de niveles de detalle (LOD) para Entities distantes, cuando sea necesario.

Impostores

Un sistema de impostores toma GameObjects 3D y los convierte en vallas publicitarias 2D cuando el jugador se encuentra a cierta distancia de ellos. Esto funciona mejor para objetos de fondo densos y distantes, como los bosques. DrakkenRidge utiliza impostores en algunas situaciones.

Captura de pantalla del juego DrakkenRidge VR de Garage Collective, Made with Unity. Representación en 3D de un paisaje montañoso con colinas, donde se aprecia claramente un impostor indistinguible en el fondo.

Los impostores implementados correctamente son indistinguibles de sus contrapartes en 3D .

En DrakkenRidge probamos diversas técnicas de optimización, eligiendo cuidadosamente cuáles implementar. Unity ECS proporcionó, con diferencia, las mayores mejoras de rendimiento, renderizando todo nuestro mundo a una fracción del coste de utilizar el pipeline tradicional de GameObject.

Reflexiones finales

Para DrakkenRidge , nuestra combinación de técnicas de diseño y optimización demostró ser la receta perfecta, lo que nos permitió crear una aventura de realidad virtual única. El mundo abierto funciona con ECS para Unity, y nuestras interacciones de cerca están diseñadas con el flujo de trabajo familiar de GameObject y física, lo que permite al equipo diseñar, probar e iterar rápidamente.

Los juegos de rol de mundo abierto para realidad virtual móvil no tienen por qué ser inalcanzables, ¡y esperamos ver a más desarrolladores embarcarse en esta aventura!

DrakkenRidge VR: El martillo de Maruk

DrakkenRidge VR ya está disponible . Descubre más juegos Made with Unity en nuestra página de Steam Curator y consulta más historias de desarrolladores de Unity en el Unity y el centro de recursos de Unity.