Áreas de Trigger
Aprende cómo usar áreas de Trigger en tu escena
Las áreas de activación te permiten reaccionar al evento de que un jugador entre o salga de un área, o de que cualquier otra entidad entre o salga de un área. Esta es una herramienta fundamental para crear escenas interactivas. Úsalas para cosas como abrir una puerta cuando el jugador se acerca, o para anotar un punto cuando una pelota entra en una portería.
Usar áreas de activación
Para usar áreas de activación necesitas agregar un TriggerArea component a una entity, luego usar un triggerAreaEventsSystem para reaccionar a los eventos.
import { engine, Transform, TriggerArea, triggerAreaEventsSystem } from '@dcl/sdk/ecs'
// crear entity
const triggerEntity = engine.addEntity()
// establecer Transform
Transform.create(triggerEntity, {
position: Vector3.create(8, 0, 8)
})
// Área de activación
TriggerArea.setBox(triggerEntity)
// Evento cuando se activa el área de activación
triggerAreaEventsSystem.onTriggerEnter(triggerEntity, function(result) {
if (result.trigger?.entity !== engine.PlayerEntity) return;
console.log('¡El jugador entró en el área de activación!')
})Por defecto, el TriggerArea component reacciona al evento de cualquier jugador que entra en el área. El código anterior añade if (result.trigger?.entity !== engine.PlayerEntity) return para comprobar que la entity que causó el evento es el jugador actual, y no el avatar de otra persona
Formas del área de activación
Las áreas de activación pueden ser un cubo o una esfera.
Para alterar el tamaño del área de activación, puedes usar el scale propiedad del Transform component en la entity que contiene el TriggerArea.
Depuración
Para depurar tu escena y ver el área cubierta por el área de activación, puedes agregar un MeshRenderer component a la entity con el área de activación, y establecer la forma que quieras depurar. Las dimensiones del mesh predeterminado coincidirán con las dimensiones del área de activación.
Eventos del área de activación
Puedes usar el triggerAreaEventsSystem para reaccionar a los distintos eventos de un área de activación:
onTriggerEnter: Se activa cuando una entity entra en el área de activación.onTriggerExit: Se activa cuando una entity sale del área de activación.onTriggerStay: Se activa mientras una entity está en el área de activación, en cada frame.
Respuestas a eventos de activación
Cuando se activa un evento de área de activación, puedes usar el result parámetro para obtener información tanto sobre la entity que se activó como sobre la entity que activó el evento.
Las siguientes propiedades están disponibles en el result parámetro:
triggeredEntity: El ID de la entity que se activó (esta es la entity que posee el área de activación)triggeredEntityPosition: La posición de la entity que se activótriggeredEntityRotation: La rotación de la entity que se activóeventType: El tipo de evento de activación (ENTER, EXIT, STAY)timestamp: La marca de tiempo del evento de activacióntrigger: Un objeto con los siguientes campos:entity: El ID de la entity que activó el trigger (la entity que entró en el área de activación)layers: Las capas de colisión de la entity que activó el triggerposition: La posición de la entity que activó el triggerrotation: La rotación de la entity que activó el triggerscale: El scale de la entity que activó el trigger
Confusión común: a pesar de su nombre, result.triggeredEntity no se refiere a la entity que activó el evento. Estos dos campos se confunden fácilmente:
result.trigger?.entity: la entity que entró en el área de activación. Esto suele ser lo que quieres comprobar, por ejemplo para identificar qué jugador u objeto entró.result.triggeredEntity: la entity que posee elTriggerAreacomponent (la propia zona de activación, no la entity que entró en ella).
Usa result.trigger?.entity cuando necesites identificar la entity que entra.
Detectar jugadores que entran en un área
El uso más común de las áreas de activación es reaccionar a los jugadores que entran o salen. Dos capas de colisión detectan avatars, y cuál usar depende de a quién debe reaccionar la escena:
ColliderLayer.CL_MAIN_PLAYER: Detecta solo al jugador que usa la máquina local. Úsalo cuando la respuesta esté pensada solo para ese jugador, por ejemplo para teleportarlo, reproducirle un sonido o hacer seguimiento de su progreso en una quest. Esta también es la opción más barata en términos de rendimiento.ColliderLayer.CL_PLAYER: Detecta todos los avatars, tanto al jugador local como a cualquier otro jugador que se esté renderizando en la escena. Úsalo cuando importe que entre cualquiera, por ejemplo una puerta que se abre cuando cualquiera se acerca, o contar cuántas personas hay en una room. Esta es la capa predeterminada si no se especifica ninguna.
El siguiente ejemplo reacciona solo al jugador local:
Al usar CL_PLAYER, todos los avatars activan el área de activación. Para saber si el avatar que lo activó es el jugador local, compara la entity del resultado con engine.PlayerEntity:
En la mayoría de los casos, en lugar de intentar detectar a todos los jugadores, el enfoque ideal es detectar solo al jugador actual (mediante CL_MAIN_PLAYER) y luego sincronizar los efectos de este trigger entre todos los jugadores. Por ejemplo, una puerta corrediza se abre solo para tu avatar, pero luego el estado abierto de esa puerta se comparte con todos los demás jugadores.
Capas del área de activación
Usa el segundo argumento opcional del TriggerArea component para establecer las capas que activarán el área de activación. Por defecto, el área de activación se activa solo por la layer ColliderLayer.CL_PLAYER, consulta Detectar jugadores que entran en un área.
Puedes cambiar la capa de colisión para detectar cualquier otra entity pasándola como el segundo argumento del TriggerArea component.
Los valores permitidos son los mismos que los del MeshCollider component. Consulta Capas de colisión para más detalles.
ColliderLayer.CL_PLAYER: cualquier avatar (local + remoto)ColliderLayer.CL_MAIN_PLAYER: solo el jugador localColliderLayer.CL_PHYSICSColliderLayer.CL_POINTERColliderLayer.CL_CUSTOM1hastaCL_CUSTOM8ColliderLayer.CL_NONE
También puedes configurar un área de activación para detectar varias capas a la vez.
Esto activará el área de activación cuando cualquier entity con las capas CL_CUSTOM1 o CL_CUSTOM2 entre en el área de activación.
Última actualización