Lógica de enemigos con Patch Assets en Spark AR

Resumen

Crear enemigos en Spark AR para un minijuego de realidad aumentada implica más que duplicar formas: requiere lógica de movimiento, aleatoriedad y un sistema reutilizable. Aquí aprendes a construir fantasmas animados usando Patch Assets, nodos de transición y senders, una técnica clave para desarrolladores de filtros AR que quieren escalar su lógica sin duplicar conexiones.

¿Cómo defino el rango de movimiento del enemigo en Spark AR?

Antes de animar, necesitas conocer los límites de la cámara. La pirámide visible que aparece al seleccionar un plano marca el rango donde tu enemigo será visible.

Para el fantasma, el eje vertical se trabaja en Y entre 0.35 y -0.35, valores que mantienen al objeto dentro del campo de cámara sin salir por arriba o por abajo [1:30]. En el eje horizontal X, el rango sugerido va de -0.10 a 0.10, lo suficiente para que el jugador no se quede inmóvil ganando puntos en una sola línea [2:15].

¿Para qué sirve definir un rango antes de animar? Para asegurar que tu objeto sea visible dentro del campo de la cámara y mantenga una jugabilidad justa, evitando que el jugador explote posiciones fijas.

¿Cómo animo al fantasma con Loop Animation y Transition?

El nodo Loop Animation genera una animación cíclica con una duración configurable, que después controlará la velocidad del enemigo [3:10]. Su salida progress entrega un valor entre 0 y 1, una especie de porcentaje del avance.

Para convertir ese progreso en una posición útil, conectas el progress a un nodo Transition. Este nodo transforma ese rango 0 a 1 en otro tipo de dato: vector 3D, posición, rotación, escala o color. En este caso, lo configuras como número que va de 0.35 a -0.35, generando el descenso vertical [3:50].

El resultado se conecta a un nodo Pack, asignándolo al eje Y (el verde, vertical), mientras X y Z quedan en cero por ahora.

¿Cómo agrego aleatoriedad horizontal con Random?

El nodo Random genera un número aleatorio dentro de un rango definido, en este caso -0.1 a 0.1 para el eje X [5:20]. Para probar si funciona, puedes agregar temporalmente un nodo Screen Tap que dispare la randomización al tocar la pantalla.

En Spark AR activas Simulate Touch desde el botón de tres líneas, y al hacer clic verás cómo el fantasma cambia su posición horizontal cada vez. Una vez validado, ese Screen Tap se elimina porque no debe quedarse en producción.

¿Qué es un Patch Asset y por qué es clave para escalar enemigos?

Un Patch Asset es una referencia única a un nodo personalizado que puedes reutilizar múltiples veces. A diferencia de un grupo, donde cada copia es independiente, un Patch Asset comparte lógica: si modificas el original, todas las instancias se actualizan al mismo tiempo [7:00].

¿Cuál es la diferencia entre un grupo y un Patch Asset? Un grupo duplicado debe modificarse uno por uno. Un Patch Asset propaga cualquier cambio a todas sus copias automáticamente, ideal para gestionar decenas o cientos de enemigos.

Para crearlo, das clic derecho sobre el grupo y seleccionas Create Patch Asset. Luego puedes duplicar el plano con Ctrl+D y conectar cada Ghost (Ghost 1, Ghost 2, Ghost 3) al mismo asset. Con esto, controlas tres fantasmas desde una sola fuente de lógica.

¿Cómo agrego un input de velocidad personalizado?

Dando clic derecho en el Patch Asset y editando sus propiedades, puedes añadir un nuevo input llamado Speed, de tipo numérico, con valor por defecto 1 [9:30]. También puedes incluir una descripción para que otros desarrolladores entiendan su función.

Desde fuera, conectas un nodo Value numérico (por ejemplo, con valor 2) al input Speed. Internamente, ese valor afecta la duración del Loop Animation, modificando la velocidad de descenso de los tres fantasmas a la vez.

¿Cómo uso Sender y Receiver para evitar cables enredados?

Cuando una señal necesita viajar a varios lugares dentro del mismo asset, los cables se vuelven un caos. La solución son los nodos Sender y Receiver, que funcionan como una conexión inalámbrica tipo Bluetooth [11:00].

El Loop Animation tiene una salida que avisa cuando el ciclo termina. Esa señal se envía con un Sender renombrado como completed, y desde cualquier punto del proyecto un Receiver la recibe para activar la randomización del eje X. Así, cada vez que un fantasma toca el suelo, su próxima aparición ocurre en una posición horizontal distinta.

¿Cómo asigno color a cada enemigo desde el Patch Asset?

Para identificar visualmente cada fantasma, primero creas tres materiales independientes (material 1, material 2, material 3), todos en modo Flat para que no reciban iluminación de las luces de la escena [13:20]. Luego asignas una textura a cada uno.

En el Patch Asset agregas un nuevo output de tipo color. Internamente, un nodo Value en modo color define el tono, y se conecta a la propiedad color del material. Desde fuera, conectas la salida color del asset al material de cada fantasma.

Los pasos completos para que el color funcione son:

  • Crear tres materiales en modo Flat.
  • Asignar una textura distinta a cada material.
  • Agregar un output de color en el Patch Asset.
  • Conectar el material correspondiente a cada Ghost en la jerarquía.

Si el color no aparece, casi siempre es porque el material no está vinculado al objeto, no por un fallo en la lógica del asset.

¿Qué otros comportamientos te gustaría programar para tus enemigos en realidad aumentada? Cuéntalo en los comentarios.