> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-es/escenas-sdk7/interactividad/player-avatar.md).

# Avatar del player

Hay varias formas en las que puedes controlar el avatar del jugador y cambiar la experiencia de juego para tus jugadores.

Para tratar con avatares que no son players, consulta [Avatares NPC](/creator/content-creator-es/escenas-sdk7/interactividad/npc-avatars.md).

## Mover al jugador

{% hint style="info" %}
**💡 Consejo**: La forma más fácil de mover al jugador es usar el [Scene Editor en Creator Hub](/creator/content-creator-es/scene-editor/empezar/about-editor.md). Usa la opción sin código **Mover al jugador** o la **Mover al jugador aquí** Acciones, consulta [Convierte cualquier item en smart](/creator/content-creator-es/scene-editor/interactividad/make-any-item-smart.md).
{% endhint %}

Para cambiar la posición del jugador en la escena, usa la `movePlayerTo()` función. Esta función recibe un objeto con tres propiedades:

* `newRelativePosition`: Dónde posicionar al jugador, expresado como un Vector3.
* `cameraTarget`: (opcional) La dirección hacia la que debe mirar la cámara, expresada como un Vector3 que representa las coordenadas de un punto en el espacio hacia el que mirar. Si no se proporciona un valor, la cámara mantendrá la misma rotación que antes de moverse.
* `avatarTarget`: (opcional) La dirección hacia la que debe mirar el avatar, expresada como un Vector3 que representa las coordenadas de un punto en el espacio hacia el que mirar. Si no se proporciona un valor, el avatar mantendrá la misma rotación que antes de moverse. Si el player está en modo de cámara en primera persona, la rotación de la cámara y del avatar es la misma.
* `duration`: (opcional) Cuánto debe durar la transición, en segundos. Si no se proporciona un valor, la transición ocurrirá al instante. Si se proporciona una duration, el avatar caminará o correrá hasta esta nueva posición.

{% hint style="warning" %}
**📔 Nota**: Durante la transición, el avatar no se ve afectado por los colliders, así que puede atravesar objetos.
{% endhint %}

```ts
import { movePlayerTo } from '~system/RestrictedActions'

// crear entidad
const myEntity = engine.addEntity()
MeshRenderer.setBox(myEntity)
MeshCollider.setBox(myEntity)

Transform.create(myEntity, {
	position: { x: 4, y: 1, z: 4 },
})

// darle comportamiento a la entidad
pointerEventsSystem.onPointerDown(
	{
		entity: myEntity,
		opts: { button: InputAction.IA_POINTER, hoverText: 'Clic' },
	},
	function () {
		// reaparecer al jugador
		movePlayerTo({
			newRelativePosition: Vector3.create(1, 0, 1),
			cameraTarget: Vector3.create(8, 1, 8),
			avatarTarget: Vector3.create(8, 1, 8),
		})
	}
)
```

El movimiento del jugador ocurre al instante, sin pantallas de confirmación ni transiciones de cámara.

{% hint style="warning" %}
**📔 Nota**: Los jugadores solo pueden moverse si ya están dentro de los límites de la escena, y solo pueden moverse a ubicaciones que estén dentro de los límites de la escena. No puedes usar `movePlayerTo()` para transportar a un jugador a otra escena. Para mover a un jugador a otra escena, consulta [Teletransportes](/creator/content-creator-es/escenas-sdk7/interactividad/external-links.md#teleports).
{% endhint %}

La `movePlayerTo()` función es awaitable, así que si el movimiento tiene una duration, puedes usar `await` para esperar a que el jugador llegue a su destino.

```ts
import { movePlayerTo } from '~system/RestrictedActions'

pointerEventsSystem.onPointerDown(
	{
		entity: myEntity,
		opts: { button: InputAction.IA_POINTER, hoverText: 'Clic' },
	},
	async function () {
		await movePlayerTo({
			newRelativePosition: Vector3.create(1, 0, 1),
			cameraTarget: Vector3.create(8, 1, 8),
			avatarTarget: Vector3.create(8, 1, 8),
			duration: 2,
		})
	}
)
```

Si el jugador intenta moverse durante la duración de su transición, la transición se interrumpirá y la `movePlayerTo` función nunca se resolverá. Puedes evitar este comportamiento deshabilitando todas las entradas mientras la transición esté en curso usando el `InputModifier` componente, consulta [Restringir locomoción](#restrict-locomotion).

```ts
import { movePlayerTo } from '~system/RestrictedActions'
import {InputModifier, engine} from '@dcl/sdk/ecs'

pointerEventsSystem.onPointerDown(
	{
		entity: myEntity,
		opts: { button: InputAction.IA_POINTER, hoverText: 'Clic' },
	},
	async function () {

		// deshabilitar todas las entradas
		InputModifier.create(engine.PlayerEntity, {
			mode: InputModifier.Mode.Standard({
				disableAll: true,
			}),
		})

		// mover al jugador
		await movePlayerTo({
			newRelativePosition: Vector3.create(1, 0, 1),
			cameraTarget: Vector3.create(8, 1, 8),
			avatarTarget: Vector3.create(8, 1, 8),
			duration: 2,
		})

		// habilitar todas las entradas
		InputModifier.deleteFrom(engine.PlayerEntity)
	}
)
```

{% hint style="warning" %}
**📔 Nota**: Además, el resultado del await se puede almacenar para evaluar su `éxito` propiedad para saber si el movimiento fue interrumpido (p. ej., por el movimiento mediante input) o completado con éxito.
{% endhint %}

## Reproducir animaciones

Puedes hacer que el jugador realice una animación como parte del código de la escena. Esto puede ayudar a aportar más inmersión, y también puede ayudar a comunicar lo que están haciendo otros jugadores entre sí. Las animaciones del avatar se ven tanto por el jugador (en vista en tercera persona) como por cualquier otro jugador alrededor.

Las animaciones controladas por el jugador son reemplazadas por las animaciones de locomoción predeterminadas, como caminar y saltar. Así que las animaciones reproducidas por la escena solo se reproducen mientras el jugador está quieto. Si el jugador camina o salta, cualquier animación se interrumpe.

{% hint style="warning" %}
**📔 Nota**: Los jugadores solo pueden animarse si ya están dentro de los límites de la escena, no si están en una escena vecina. Los wearables inteligentes pueden reproducir animaciones en cualquier lugar.

Mientras un jugador está realizando una animación, no se ve afectado por las colisiones, y sus movimientos no están limitados por la física de la escena. Además, ten en cuenta que si una animación desplaza al jugador de su posición original (por ejemplo, si la animación implica un salto), el componente Transform del jugador no se verá afectado por este desplazamiento.
{% endhint %}

### Usa el Scene Editor

La forma más fácil de hacer que un jugador realice una animación es usar el Scene Editor. Usa la opción sin código **Reproducir emote** para reproducir una animación predeterminada, o la **Reproducir emote personalizado** para reproducir una animación desde un archivo. Consulta [Convierte cualquier item en smart](/creator/content-creator-es/scene-editor/interactividad/make-any-item-smart.md).

### Animaciones predeterminadas

Usa la `triggerEmote()` función para ejecutar una de las animaciones predeterminadas que los jugadores pueden reproducir en cualquier lugar de Decentraland. Esta función recibe un objeto con las siguientes propiedades como argumento:

* `predefinedEmote`: Un nombre de cadena para un emote existente.
* `mask`: (opcional) Reproduce la animación solo en una parte del cuerpo del avatar, usando un valor de la `AvatarMask` enum. Por ejemplo, `AvatarMask.AM_UPPER_BODY` anima solo la parte superior del cuerpo del avatar.

```ts
import { triggerEmote } from '~system/RestrictedActions'

const emoter = engine.addEntity()
Transform.create(emoter, { position: Vector3.create(8, 0, 8) })
MeshRenderer.setBox(emoter)
MeshCollider.setBox(emoter)
pointerEventsSystem.onPointerDown(
	{
		entity: emoter,
		opts: { button: InputAction.IA_POINTER, hoverText: 'Bailar' },
	},
	() => {
		triggerEmote({ predefinedEmote: 'robot' })
	}
)
```

Los siguientes emotes muestran información sobre las acciones del jugador en tu escena; todos estos son valores válidos para el `predefinedEmote` campo:

* `buttonDown`
* `buttonFront`
* `getHit`
* `knockOut`
* `lever`
* `openChest`
* `openDoor`
* `punch`
* `push`
* `swingWeaponOneHand`
* `swingWeaponTwoHands`
* `throw`
* `sittingChair1`
* `sittingChair2`
* `sittingGround1`
* `sittingGround2`

Estos emotes están disponibles para todos los jugadores en su rueda de emotes predeterminada, y también pueden usarse en cualquier escena.

* `wave`
* `fistpump`
* `robot`
* `raiseHand`
* `clap`
* `money`
* `kiss`
* `tik`
* `hammer`
* `tektonik`
* `dontsee`
* `handsair`
* `shrug`
* `disco`
* `dab`
* `headexplode`

{% hint style="info" %}
**💡 Consejo**: Si un jugador camina o salta mientras reproduce la animación, la interrumpirá. Si no quieres que eso sea posible, puedes congelar el avatar con [Modificadores de entrada](#freeze-the-player) durante la animación del avatar.
{% endhint %}

### Animaciones personalizadas

Usa la `triggerSceneEmote()` para hacer que el jugador realice una animación personalizada, almacenada como un archivo .glb como parte de los assets de la escena.

{% hint style="warning" %}
**📔 Nota**: El nombre del archivo **debe** terminar en `_emote.glb` para funcionar como una animación del avatar.
{% endhint %}

Esta función recibe un objeto con las siguientes propiedades:

* `src`: Una cadena con la ruta al archivo del emote.
* `loop`: Si es true, la animación se repetirá continuamente hasta que el jugador se mueva o la animación se detenga. False por defecto.
* `mask`: (opcional) Reproduce la animación solo en una parte del cuerpo del avatar, usando un valor de la `AvatarMask` enum. Por ejemplo, `AvatarMask.AM_UPPER_BODY` anima solo la parte superior del cuerpo del avatar.

```ts
import { triggerSceneEmote } from '~system/RestrictedActions'
import { AvatarMask } from '@dcl/sdk/ecs'

const emoter = engine.addEntity()
Transform.create(emoter, { position: Vector3.create(8, 0, 8) })
MeshRenderer.setBox(emoter)
MeshCollider.setBox(emoter)
pointerEventsSystem.onPointerDown(
	{
		entity: emoter,
		opts: { button: InputAction.IA_POINTER, hoverText: 'Haz una bola de nieve' },
	},
	() => {
		triggerSceneEmote({ src: 'animations/Snowball_Throw_emote.glb', loop: false, mask: AvatarMask.AM_UPPER_BODY })
	}
)
```

{% hint style="info" %}
**💡 Consejo**: Si un jugador camina o salta mientras reproduce la animación, la interrumpirá. Si no quieres que eso sea posible, puedes congelar el avatar con [Modificadores de entrada](#freeze-the-player) durante la animación del avatar.
{% endhint %}

## Restringir locomoción

Puedes restringir qué acciones puede realizar el jugador en tu escena. Úsalo para congelar al jugador, o para restringir formas específicas de locomoción, por ejemplo para impedir que el jugador salte o corra.

### Congelar al jugador

Puedes congelar al jugador para que ninguna de las teclas de entrada pueda mover el avatar. Esto puede ser útil para muchas mecánicas de juego. También es una buena práctica congelar a un jugador mientras realiza una animación importante que no debería interrumpirse por el movimiento, o mientras una [Virtual Camera](/creator/content-creator-es/escenas-sdk7/conceptos-basicos-de-contenido-3d/camera.md) apunta lejos del avatar y no quieres que el jugador se mueva a ciegas.

Usa la `InputModifier` componente en el `engine.PlayerEntity` para impedir que las entradas del jugador afecten a la locomoción del avatar. El avatar permanecerá quieto, el jugador solo podrá rotar la cámara.

```ts
import {InputModifier, engine} from '@dcl/sdk/ecs'

InputModifier.create(engine.PlayerEntity, {
	mode: InputModifier.Mode.Standard({
		disableAll: true,
	}),
})
```

Ten en cuenta las siguientes consideraciones:

* Mientras las interacciones del jugador están deshabilitadas, su avatar sigue afectado por fuerzas externas, como la gravedad o plataformas en movimiento.
* La `InputModifier` componente solo puede usarse con la `engine.PlayerEntity` entidad. Solo puede afectar al jugador actual, no puede afectar a otros jugadores.
* Este componente solo afecta al jugador mientras el avatar está dentro de los límites de tu escena. Su locomoción deja de estar restringida en cuanto sale de la escena.
* Mientras las interacciones del jugador están deshabilitadas, el jugador no puede realizar emotes libremente, pero la escena puede desencadenar animaciones en el avatar.
* Las entradas del jugador no afectan al avatar, pero los [eventos globales de entrada](/creator/content-creator-es/escenas-sdk7/interactividad/eventos-de-boton/system-based-events.md#global-input-events) todavía pueden ser escuchados por la escena. Podrías usarlos para controlar un vehículo, o usar un [Virtual Camera](/creator/content-creator-es/escenas-sdk7/conceptos-basicos-de-contenido-3d/camera.md) para seguir a otra entidad a medida que se mueve, tratándola como un avatar alternativo.

### Restringir tipos específicos de locomoción

En lugar de congelar por completo al jugador, puedes restringir ciertas formas específicas de locomoción del jugador. Esto podría usarse por razones de jugabilidad, por ejemplo para preservar la dificultad de un juego de plataformas impidiendo el doble salto y el planeo. Incluso se podrían alternar estas habilidades dinámicamente como mecánica de juego, por ejemplo dando al jugador una barra de resistencia e impidiendo que corra cuando se agote. También podría usarse para definir el tono de una escena, por ejemplo impidiendo correr o saltar en un lugar que se pretende ser sereno. El `InputModifier` incluye las siguientes opciones:

* `disableWalk`: El jugador no puede caminar despacio (al pulsar control). Si el jugador intenta caminar, en su lugar trotaría o correría, si está permitido.
* `disableRun`: El jugador no puede correr (al pulsar shift). Si el jugador intenta correr, en su lugar trotaría, si está permitido.
* `disableJog`: El jugador no puede trotar (esta es la velocidad de movimiento predeterminada). Si el jugador intenta trotar, en su lugar correrá o caminará, si está permitido.
* `disableJump`: El jugador no puede saltar.
* `disableEmote`: El jugador no puede realizar emotes voluntariamente. La escena puede desencadenar animaciones en el avatar del jugador.
* `disableDoubleJump`: El jugador no puede realizar un doble salto.
* `disableGliding`: El jugador no puede planear.

```ts
import {InputModifier, engine} from '@dcl/sdk/ecs'

InputModifier.create(engine.PlayerEntity, {
	mode: InputModifier.Mode.Standard({
		disableAll: false,
		disableWalk: false,
		disableRun: true,
		disableJog: true,
		disableJump: true,
		disableEmote: true,
		disableDoubleJump: true,
		disableGliding: true
	}),
})
```

### Sintaxis avanzada

Para usar el componente sin ayudantes, puedes usar la siguiente sintaxis:

```ts
import {InputModifier, engine} from '@dcl/sdk/ecs'

InputModifier.createOrReplace(engine.PlayerEntity, {
	mode: {
		$case: 'standard',
		standard: {
			disableAll: false,
			disableWalk: false,
			disableRun: true,
			disableJog: true,
			disableJump: true,
			disableEmote: true,
		},
	},
})
```

## Configuración de locomoción

Puedes afectar la locomoción del jugador, como su velocidad al correr, la altura del salto y más. Esto se puede alterar dinámicamente, por ejemplo para permitir que un jugador obtenga un aumento temporal de velocidad al interactuar con un item, o para deshabilitar la capacidad del jugador de saltar durante un breve período de tiempo.

Para hacer esto, añade un `AvatarLocomotionSettings` componente a la `engine.PlayerEntity`.

```ts
import {AvatarLocomotionSettings, engine} from '@dcl/sdk/ecs'

AvatarLocomotionSettings.create(engine.PlayerEntity, {
	runSpeed: 10,
	jumpHeight: 2,
})
```

Las siguientes propiedades están disponibles:

* `walkSpeed`: La velocidad a la que camina el jugador, en metros por segundo. En el cliente de escritorio, los jugadores caminan al pulsar la tecla control.
* `jogSpeed`: La velocidad a la que el jugador trota, en metros por segundo. Esta es la forma predeterminada en que se mueve el jugador.
* `runSpeed`: La velocidad a la que el jugador corre, en metros por segundo. En el cliente de escritorio, los jugadores corren al pulsar la tecla shift.
* `jumpHeight`: La altura a la que salta el jugador, en metros.
* `runJumpHeight`: La altura a la que salta el jugador después de correr, en metros.
* `doubleJumpHeight`: La altura del segundo salto al hacer un doble salto, en metros.
* `glidingSpeed`: La velocidad horizontal a la que se mueve el jugador mientras planea, en metros por segundo.
* `glidingFallingSpeed`: La velocidad máxima de caída del jugador mientras planea, en metros por segundo. Esto solo limita el descenso del jugador: el movimiento hacia arriba, como un impulso de la fuerza continua de una escena, no está limitado.
* `hardLandingCooldown`: El tiempo de espera después de un aterrizaje fuerte, en segundos. Es el tiempo que el jugador debe esperar antes de poder volver a moverse después de aterrizar tras una caída alta.

Como referencia, aquí tienes los valores predeterminados de esas propiedades:

* `walkSpeed`: 1.5 m/s
* `jogSpeed`: 8 m/s
* `runSpeed`: 10 m/s
* `glidingSpeed`: 6 m/s
* `glidingFallingSpeed`: 1 m/s
* `jumpHeight`: 1 m
* `runJumpHeight`: 1.5 m
* `doubleJumpHeight`: 2 m
* `hardLandingCooldown`: 0.75 s

{% hint style="info" %}
**💡 Consejo**: Mientras se planea, las fuerzas continuas aplicadas por la escena son 1.5 veces más fuertes, y las fuerzas ascendentes pueden elevar al jugador. Consulta [Fuerzas mientras se planea](/creator/content-creator-es/escenas-sdk7/interactividad/player-physics.md#forces-while-gliding).
{% endhint %}

{% hint style="info" %}
**💡 Consejo**: Ninguna de estas propiedades puede ser inferior a 0. Si estableces una de ellas con un valor negativo, se limitará a 0. Establecer estos valores en cero tendrá el mismo efecto que usar el `InputModifier` para bloquear el uso de ciertas teclas.

Solo puedes afectar la locomoción del jugador si están dentro de los límites de la escena. Para afectar los avatares de otros jugadores, debes ejecutar el código que afecta a su locomoción en su propia instancia.
{% endhint %}

Puedes crear un [wearable inteligente](/creator/content-creator-es/escenas-sdk7/tipos-de-proyectos/smart-wearables.md) que haga que el jugador siempre corra más rápido o salte más alto. Si tanto la escena como un wearable inteligente definen valores diferentes para estos parámetros, siempre se usan los valores de la escena.

Para asegurarte de que nadie tenga ventajas injustas en una escena de parkour, puedes imponer los parámetros predeterminados añadiendo explícitamente sus valores predeterminados en tu escena:

```ts
import {AvatarLocomotionSettings, engine} from '@dcl/sdk/ecs'

AvatarLocomotionSettings.create(engine.PlayerEntity, {
	runSpeed: 10,
	walkSpeed: 1.5,
	jogSpeed: 8 ,
	jumpHeight: 1,
	runJumpHeight: 1.5,
	hardLandingCooldown: 0.75
})
```

## Áreas modificadoras de avatar

Los avatares se comportan y se ven de forma coherente en todo Decentraland a medida que caminan por las escenas. Sin embargo, puedes añadir un `AvatarModifierArea` a una región de tu escena para afectar cómo se comportan los avatares de los jugadores cuando entran en esa área.

{% hint style="danger" %}
**❗Advertencia**\
Por favor limita la cantidad de `AvatarModifierAreas` que uses en tu escena a solo un par. Si usas demasiadas, puede tener un impacto significativo en el rendimiento.
{% endhint %}

### Colocar áreas modificadoras de avatar

Añade una entidad con un `AvatarModifierArea` componente y posiciona esta entidad utilizando un `Transform` componente.

```ts
const entity = engine.addEntity()

AvatarModifierArea.create(entity, {
	area: Vector3.create(4, 3, 4),
	modifiers: [AvatarModifierType.AMT_HIDE_AVATARS],
	excludeIds: []
})

Transform.create(entity, {
	position: Vector3.create(8, 0, 8),
})
```

Al crear un `AvatarModifierArea` componente, debes proporcionar lo siguiente:

* `area`: Tamaño del área modificadora
* `modifiers`: Un arreglo que enumera los modificadores que se implementarán en el área. Esta propiedad usa valores del `AvatarModifierType` enum.

Los modificadores compatibles son:

* `AvatarModifierType.AMT_HIDE_AVATARS`
* `AvatarModifierType.AMT_DISABLE_PASSPORTS`
* `AvatarModifierType.AMT_HIDE_NAMETAGS`

Todos los efectos de un `AvatarModifierArea` solo tienen lugar dentro de la región de su área. Los jugadores vuelven a la normalidad cuando salen del área.

Un `AvatarModifierArea` solo afecta a los jugadores que están dentro del área. Entrar en el área no afecta cómo perciben a otros jugadores fuera del área.

Los efectos de un `AvatarModifierArea` se calculan localmente para cada jugador. Puedes tener un `AvatarModifierArea` que solo está presente en la escena para algunos jugadores y no para otros. Por ejemplo, podrías hacer un juego de "marco polo", donde solo un jugador de la escena tiene un área modificadora que oculta a todos los demás jugadores. Todos los demás jugadores que no tienen esta área modificadora en su versión local de la escena pueden verse entre sí con normalidad.

Si el área oculta avatares, entonces los jugadores que no tengan el área en su versión local de la escena verán todos los avatares con normalidad, incluso aquellos que se perciben a sí mismos como ocultos. Los jugadores que sí tengan el área se percibirán a sí mismos y a todos los demás avatares como afectados por el área cuando entren en ella.

{% hint style="warning" %}
**📔 Nota**: Las áreas modificadoras de avatar se ven afectadas por la *position* y *rotación* del componente Transform de su entidad anfitriona, pero no se ven afectados por la *escala*.
{% endhint %}

{% hint style="warning" %}
**📔 Nota**: El `AvatarModifierArea`componente debe importarse mediante

> `import { AvatarModifierArea } from "@dcl/sdk/ecs"`

Consulta [Imports](/creator/content-creator-es/escenas-sdk7/primeros-pasos/coding-scenes.md#imports) para ver cómo manejarlos fácilmente.
{% endhint %}

### Ocultar avatares

Cuando un jugador entra en un `AvatarModifierArea` que tiene el `AvatarModifierType.AMT_HIDE_AVATARS` modificador, el avatar del jugador deja de renderizarse. Esto se aplica tanto al jugador en vista de tercera persona como cuando otros jugadores entran en el área.

```ts
const entity = engine.addEntity()

AvatarModifierArea.create(entity, {
	area: Vector3.create(4, 3, 4),
	modifiers: [AvatarModifierType.AMT_HIDE_AVATARS],
	excludeIds: []
})

Transform.create(entity, {
	position: Vector3.create(8, 0, 8),
})
```

Esto te permite reemplazar el avatar predeterminado de Decentraland por cualquier avatar personalizado que quieras mostrar en tu escena. Ten en cuenta que, si quieres ver a otros jugadores con avatares personalizados, debes encargarte tú mismo de la sincronización de las posiciones de los jugadores.

### Desactivar popup de Passport

Cuando un jugador entra en un `AvatarModifierArea` que tiene el `AvatarModifierType.AMT_DISABLE_PASSPORTS` modificador, al hacer clic en ellos ya no se abre la UI de Passport que muestra la biografía del jugador, su inventario, etc.

```ts
const entity = engine.addEntity()

AvatarModifierArea.create(entity, {
	area: Vector3.create(4, 3, 4),
	modifiers: [AvatarModifierType.AMT_DISABLE_PASSPORTS],
	excludeIds: []
})

Transform.create(entity, {
	position: Vector3.create(8, 0, 8),
})
```

Esto es especialmente útil en juegos en los que abrir accidentalmente esta UI podría interrumpir el flujo del juego, por ejemplo en un shooter multijugador.

### Ocultar nametags

Cuando un jugador entra en un `AvatarModifierArea` que tiene el `AvatarModifierType.AMT_HIDE_NAMETAGS` modificador, el nametag del jugador se oculta mientras el avatar sigue siendo visible.

```ts
const entity = engine.addEntity()

AvatarModifierArea.create(entity, {
	area: Vector3.create(4, 3, 4),
	modifiers: [AvatarModifierType.AMT_HIDE_NAMETAGS],
	excludeIds: []
})

Transform.create(entity, {
	position: Vector3.create(8, 0, 8),
})
```

Esto es útil para escenarios, presentaciones o escenas con guion en las que quieres suprimir los nametags de los jugadores sin ocultar los avatares. Por ejemplo, podrías querer una experiencia visual limpia durante una actuación, donde los avatares sean visibles pero los nombres flotantes no distraigan a los espectadores.

{% hint style="info" %}
**💡 Consejo**: `AMT_HIDE_AVATARS` ya oculta los nametags junto con el avatar, así que no necesitas añadir `AMT_HIDE_NAMETAGS` al usar `AMT_HIDE_AVATARS`. Usa `AMT_HIDE_NAMETAGS` solo cuando quieras ocultar los nametags mientras mantienes visibles los avatares.
{% endhint %}

Puedes combinar `AMT_HIDE_NAMETAGS` con otros modificadores como `AMT_DISABLE_PASSPORTS` en la misma área:

```ts
const entity = engine.addEntity()

AvatarModifierArea.create(entity, {
	area: Vector3.create(4, 3, 4),
	modifiers: [AvatarModifierType.AMT_HIDE_NAMETAGS, AvatarModifierType.AMT_DISABLE_PASSPORTS],
	excludeIds: []
})

Transform.create(entity, {
	position: Vector3.create(8, 0, 8),
})
```

{% hint style="info" %}
**💡 Consejo**: El nametag solo se oculta mientras la cabeza o el torso del jugador estén dentro del área. Si el área es demasiado baja y el jugador hace doble salto por encima, el nametag reaparecerá brevemente. Haz que el área sea lo suficientemente alta para cubrir el rango de movimiento esperado.
{% endhint %}

### Excluir avatares

Puedes excluir una lista de jugadores de verse afectados por un área de modificador añadiendo sus IDs de jugador a un array en la `excludeIds` propiedad del área del modificador.

Este ejemplo oculta todos los avatares en un área, excepto los de jugadores con IDs específicos. Por ejemplo, podrías usar esto en un evento en vivo para mostrar solo a los anfitriones del evento en el escenario y ocultar a cualquier otro jugador que salte al escenario.

```ts
const entity = engine.addEntity()

AvatarModifierArea.create(entity, {
	area: Vector3.create(4, 3, 4),
	modifiers: [AvatarModifierType.AMT_HIDE_AVATARS],
	excludeIds: ['0xx1...', '0xx2...'],
})

Transform.create(entity, {
	position: Vector3.create(8, 0, 8),
})
```

{% hint style="warning" %}
**📔 Nota**: Asegúrate de que todos los IDs de jugador estén escritos en minúsculas. Usa `.toLowerCase()` si es necesario.
{% endhint %}

Las áreas del modificador se ejecutan localmente en la instancia de cada jugador. La lista de IDs excluidos puede ser diferente para cada jugador. En el ejemplo de abajo, cada jugador excluye su propio ID de un modificador que oculta avatares, de modo que cada uno vea su propio avatar y ningún otro.

```ts
import { getPlayer } from '@dcl/sdk/src/players'

export function main() {
	let userData = getPlayer()
	if (!userData) return

	const entity = engine.addEntity()

	AvatarModifierArea.create(entity, {
		area: Vector3.create(16, 5, 16),
		modifiers: [AvatarModifierType.AMT_HIDE_AVATARS],
		excludeIds: [userData.userId],
	})

	Transform.create(entity, {
		position: Vector3.create(8, 0, 8),
	})
}
```

{% hint style="danger" %}
**❗Advertencia**\
Si la lista de IDs excluidos va a cambiar periódicamente (por ejemplo, según los jugadores entren o salgan de un área), asegúrate de que la lista se mantenga en orden. Haz un `.sort()` en el array, para que la lista siga en el mismo orden cada vez que se pase. De este modo, solo se calculan los cambios en la lista. De lo contrario, esto puede tener un impacto significativo en el rendimiento de la escena.

```ts
AvatarModifierArea.create(entity, {
	area: Vector3.create(16, 5, 16),
	modifiers: [AvatarModifierType.AMT_HIDE_AVATARS],
	excludeIds: myAvatarList.sort(),
})
```

{% endhint %}

### Depurar áreas del modificador

Puede ser difícil saber exactamente qué partes de la escena cubren tus áreas del modificador basándote en el código. La retroalimentación visual ayuda mucho a confirmar que están bien colocadas.

Para verificar la posición de un `AvatarModifierArea` o un `CameraModeArea`, dale a la entidad que lo contiene un `MeshRenderer` component with a `box` shape, y establece la escala con el mismo tamaño que la `area` del área del modificador.

{% hint style="warning" %}
**📔 Nota**: Las áreas del modificador no se ven afectadas por la `escala` propiedad del Transform, su tamaño se basa en su `area` propiedad.
{% endhint %}

```ts
const entity = engine.addEntity()
const areaSize = Vector3.create(8, 3, 8)

AvatarModifierArea.create(entity, {
	area: areaSize,
	modifiers: [AvatarModifierType.AMT_HIDE_AVATARS],
  	excludeIds: []
})

Transform.create(entity, {
	position: Vector3.create(8, 0, 8),
	scale: areaSize,
})

MeshRenderer.setBox(entity)
Material.setPbrMaterial(entity, {
	albedoColor: Color4.create(0.5, 0.5, 0.5, 0.5),
})
```

Para activar los efectos del área del modificador, la cabeza o el torso del jugador deben entrar en el área. No surtirá efecto si solo los pies del jugador están en el área. Asegúrate de que el jugador no pueda evadir fácilmente el área saltando.

{% hint style="warning" %}
**📔 Nota**: El área completa debe caber dentro de los límites de tu escena.
{% endhint %}

## Cambiar la apariencia de un avatar

No puedes cambiar las wearables que lleva puesto el avatar del jugador, pero en su lugar puedes reemplazar el avatar del jugador por un avatar de NPC que puedas personalizar por completo.

Consulta [Avatares NPC](/creator/content-creator-es/escenas-sdk7/interactividad/npc-avatars.md) para más detalles.

{% hint style="warning" %}
**📔 Nota**: Para permitir que el jugador tenga control total sobre ese avatar, debes escuchar eventos de Button para detectar cuándo presionan un botón y luego activar la animación correspondiente en el avatar de NPC. Consulta [Button Events](/creator/content-creator-es/escenas-sdk7/interactividad/eventos-de-boton/system-based-events.md) para más detalles.

La fluidez del control puede no ser perfecta al hacerlo; quizá quieras usar esto solo en casos muy específicos.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-es/escenas-sdk7/interactividad/player-avatar.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
