Al completar este paso del tutorial Puzzle de luces etiquetadas, aprenderás cómo usar las Etiquetas de juego para encontrar actores marcados con una etiqueta específica mientras el juego se está ejecutando. Las etiquetas de juego te permiten trabajar con múltiples dispositivos sin tener que definir sus referencias en el editor. Esto abre oportunidades de juego interesantes donde, por ejemplo, el código cambia dinámicamente cuáles dispositivos están activos a medida que el jugador avanza en el juego.
Realiza estos pasos para crear una nueva etiqueta de juego y asignarla a todas las luces en el nivel del puzzle:
- Abre el explorador de Verse y haz doble clic en tagged_lights_puzzle.verse para abrir la secuencia de comandos en Visual Studio Code.
- En la parte superior del archivo de código:
- Añade
using { /Verse.org/Simulation/Tags }para hacer referencia a la clasetagy usa la funciónGetCreativeObjectsWithTag(). - Añade
using { /Verse.org/Simulation }para poder crear las propiedades editables.
using { /Fortnite.com/Devices } using { /Verse.org/Native } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Simulation/Tags } using { /Verse.org/Simulation } log_tagged_lights_puzzle := class(log_channel){} - Añade
-
Sobre la clase
log_tagged_lights_puzzle, añade una nueva subclase denominadapuzzle_lightque se herede de la clasetag. El nombre de la clase heredada se convierte en una etiqueta de juego personalizada para que la uses en cualquier dispositivo del modo Creativo.# Deriva de la clase `tag` en el módulo Verse.org/Simulation/Tags para crear una nueva etiqueta de juego. puzzle_light := class(tag){} log_tagged_lights_puzzle := class(log_channel){} - En la barra de herramientas de UEFN, haz clic en Compilar secuencia de comandos de Verse para compilar el código y la nueva etiqueta de juego
puzzle_lighta tu proyecto. - En el esquematizador de UEFN, selecciona Dispositivo de luz personalizable para abrir su panel Detalles.
- En el panel Detalles:
- Haz clic en Añadir nuevo componente y elige Marcado de etiqueta de Verse.
- Selecciona el componente VerseTagMarkup para ver su configuración en el panel de detalles.
- En Etiquetas de juego, edita la propiedad Etiquetas y añade la etiqueta
puzzle_light.

Es posible añadir múltiples etiquetas al mismo dispositivo de manera que cada dispositivo puede pertenecer a múltiples grupos al mismo tiempo. Por ejemplo, un dispositivo con las etiquetas
tag1ytag2se encontrará cuando se llame aGetCreativeObjectsWithTag(tag1{})o aGetCreativeObjectsWithTag(tag2{}). - En la definición de clase
tagged_lights_puzzle, añade dos campos de matriz variable:- Una matriz variable editable
logicdenominadaLightsStateque representa el estado actual de todas las luces (ya estén encendidas o apagadas). También se usa para definir el estado inicial de las luces; por ello, su número de elementos debe coincidir con el número de luces etiquetadas con la etiquetapuzzle_light. En este ejemplo, todas las luces están apagadas de manera predeterminada, por lo que el valor inicial de todas las luces esfalse.@editable var LightsState : []logic = array{false, false, false, false} - Una matriz variable editable
customizable_light_devicedenominadaLightspara almacenar los dispositivos de luz personalizables etiquetados con la Etiqueta de juegopuzzle_light.@editable var Lights : []customizable_light_device = array{}
- Una matriz variable editable
- Cuando comienza el juego, el dispositivo debería configurar las luces para que coincidan con la configuración inicial especificada en el array
LightsStatey guardar las referencias en el arrayLightspara poder actualizarlas cuando el estado de juego cambie. Este trabajo se realizará en un método denominadoSetupPuzzleLights() : voidque se llamará en el métodoOnBegin()para configurar las luces cuando comienza el juego.SetupPuzzleLights() : void = Logger.Print(“Configurando luces del juego”) OnBegin<override>()<suspends> : void = SetupPuzzleLights() - En
SetupPuzzleLights(), llama aGetCreativeObjectsWithTag(puzzle_light{})para encontrar todos los dispositivos con la etiquetapuzzle_lighty guárdalos en un array denominadoTaggedActors. ComoTaggedActorses una matriz constante cuyo ámbito es local al métodoSetupPuzzleLights(), no necesitas especificar explícitamente un tipo para la matriz porque puede inferirse en su contexto.SetupPuzzleLights() : void = Logger.Print("Configurando luces del juego") TaggedActors := GetCreativeObjectsWithTag(puzzle_light{})Las distintas llamadas a la función
GetCreativeObjectsWithTag()pueden colocar los dispositivos en distinto orden en los resultados del array porque no existe un orden garantizado al recuperar actores con las Etiquetas de juego. - Ahora que recopilaste todos los dispositivos con la etiqueta
puzzle_light, asegúrate de que todas las luces coincidan con el estado inicial especificado en la matrizLightsState. Puedes usar un bucleforpara iterar a través de todos los dispositivos etiquetados.for: ActorIndex -> TaggedActor : TaggedActors do: TaggedActor - La función
GetCreativeObjectsWithTag()devuelve un array de tipocreative_object_interface. En este ejemplo, deberías interactuar con cadaTaggedActorcomo uncustomizable_light_devicepara poder encender y apagar la luz.- Puedes convertir una clase en una de sus subclases (esto se denomina proyección de tipo) con la sintaxis
NewDeviceReference := device_type_to_cast_to[DeviceReference], dondedevice_type_to_cast_toes el tipo de dispositivo que deseas, en este ejemplo,customizable_light_device. Esta es una expresión falible porque la conversión de tipo fracasará si no se puede convertir el dispositivo a dicha clase (por ejemplo, si es un tipo distinto de dispositivo).LightDevice := customizable_light_device[TaggedActor]
La función
GetCreativeObjectsWithTag()tiene el tipo de devolución[]creative_object_interfaceporque la función puede devolver distintos tipos de actor; por lo tanto, su tipo de devolución es la interfaz que deben implementar todos los actores que devuelveGetCreativeObjectsWithTag(). Para obtener más información, consulta etiquetas de juego- Con las expresiones
for, puedes usar expresiones falibles como filtro y crear nuevas variables para usarlas en el bloque de códigofor. En este caso, añade la conversión de tipo acustomizable_light_devicedel paso anterior a la expresión de iteración.for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - La última expresión en el bloque de código es el resultado del bloque de código. La expresión
fordevuelve el resultado del bloque de código de cada iteración en el array; por ello, el resultado de esta expresiónfores un array de referencias acustomize_light_deviceetiquetadas conpuzzle_light. Es decir, puedes actualizar directamente el arrayLightscon el resultado de la expresiónfor.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] do: LightDevice - Este bucle
fortambién debería llamar aTurnOn()/TurnOff()en las luces para que coincidan con la configuración inicial deLightsStateen el editor. La expresiónforpuede devolver el índice usado para obtener el dispositivo etiquetado actual (en este ejemplo,ActorIndex), que puede usar el índice al arrayLightsStatepara ver si la luz debería estar encendida o apagada.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn:= LightsState[ActorIndex] do: LightDevice - A continuación, llama a
TurnOn()oTurnOff()en función de siShouldLightBeOnestrueofalse. Puedes usar una expresiónifpara ejecutar distintas expresiones con base en una condición (específicamente, una expresión falible). En este caso, la expresión falible puede usar el operador de consulta?conIsLightOnque tendrá éxito siShouldLightBeOnestrue(en cuyo caso, llama aTurnOn()) y fracasará siShouldLightBeOnesfalse(en cuyo caso, llama aTurnOff()).set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - También es una buena idea imprimir el índice de las luces y su valor inicial para poder verificar si el código funciona como se esperaba y comparar con lo que ves en el nivel.
- Cuando usas
{}en el medio de una cadena, la expresión entre{}se evalúa primero, y su valor se añade a la cadena. Puedes usar la expresiónifen el medio de la cadena para añadir valores condicionalmente.set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[ActorIndex] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Añadiendo luz en índice {ActorIndex} con State:{if (ShouldLightBeOn?) entonces "Encender" else "Apagar"}") LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice
- Puedes convertir una clase en una de sus subclases (esto se denomina proyección de tipo) con la sintaxis
- El método
SetupPuzzleLights()debería verse de la siguiente manera:SetupPuzzleLights() : void = TaggedActors := GetCreativeObjectsWithTag(puzzle_light{}) <# Para cada dispositivo con la etiqueta puzzle_light, comprueba si es un customizable_light_device al intentar proyectarlo a dicho tipo. Si lo es, obtiene su LightState incial para TurnOn() (encender) o TurnOff() (apagar) el LightDevice. Guarda todos los dispositivos customizable_light_device etiquetados en la matriz Lights. #> set Lights = for: ActorIndex -> TaggedActor : TaggedActors LightDevice := customizable_light_device[TaggedActor] ShouldLightBeOn := LightsState[ActorIndex] do: Logger.Print("Añadiendo luz en índice {ActorIndex} con State:{if (ShouldLightBeOn?) entonces "Encender" else "Apagar"}") LightDevice.TurnOn() else LightDevice.TurnOff() LightDevice - Guarda tu secuencia de comandos en Visual Studio Code.
- En la barra de herramientas de UEFN, haz clic en Compilar scripts de Verse para compilar tu código.
- Haz clic en Jugar en la barra de herramientas de UEFN para realizar una prueba de juego del nivel.
Cuando pruebes el nivel, deberías ver todas las luces añadidas al array Lights, junto con su estado inicial, impresas en el registro de salida.
Próximo paso
En el siguiente paso de este tutorial, aprenderás cómo conmutar un conjunto específico de luces cuando el jugador pulsa los botones.