> 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-pt/scenes-sdk7/interatividade/user-data.md).

# Dados do utilizador

Obtenha dados dos jogadores à medida que interagem com a sua cena.

## Posição e rotação do jogador

Use o `PlayerEntity` quanto a `CameraEntity` para saber a posição e rotação do jogador, verificando sua `Transform` components.

```ts
function getPlayerPosition() {
	if (!Transform.has(engine.PlayerEntity)) return
	if (!Transform.has(engine.CameraEntity)) return

	//posição do jogador
	const playerPos = Transform.get(engine.PlayerEntity).position

	//rotação do jogador
	const playerRot = Transform.get(engine.PlayerEntity).rotation

	//posição da câmera
	const CameraPos = Transform.get(engine.CameraEntity).position

	//rotação da câmera
	const CameraRot = Transform.get(engine.CameraEntity).rotation

	console.log('playerPos: ', playerPos)
	console.log('playerRot: ', playerRot)
	console.log('cameraPos: ', CameraPos)
	console.log('cameraRot: ', CameraRot)
}

engine.addSystem(getPlayerPosition)
```

* **posição de PlayerEntity**: A posição do avatar, na altura do peito. Aproximadamente a 0,88 metros acima do chão.
* **rotação de PlayerEntity**: A direção para a qual o avatar está virado, expressa como um Quaternion.
* **posição de CameraEntity**:
  * Em 1ª pessoa: Igual à posição do avatar, mas na altura dos olhos. Aproximadamente a 1,75 metros acima do chão.
  * Em 3ª pessoa: Pode variar dependendo dos movimentos da câmera.
* **rotação de PlayerEntity**:
  * Em 1ª pessoa: Semelhante à direção para a qual o avatar está virado, expressa como um Quaternion. Pode ser arredondada de forma ligeiramente diferente da rotação do jogador.
  * Em 3ª pessoa: Pode variar dependendo dos movimentos da câmera.

{% hint style="warning" %}
**📔 Observação**: Evite referir-se ao `engine.PlayerEntity` ou no `engine.CameraEntity` no carregamento inicial da cena, porque isso pode resultar em erros se as Entities ainda não estiverem inicializadas. Para evitar esse problema, use isso dentro da `main()` função, ou em uma função chamada indiretamente por `main()`. Você também pode encapsular o comportamento em um [`executeTask` bloco async](/creator/content-creator-pt/scenes-sdk7/padroes-de-programacao/async-functions.md#the-executetask-function).

Outra opção é referir-se a essas Entities dentro de um System. Lá elas estarão sempre disponíveis, porque a primeira execução do System acontece assim que a cena já estiver devidamente inicializada.
{% endhint %}

## Obter todos os jogadores

Todos os jogadores na cena têm um `Transform` componente. Este componente é somente leitura em avatars. Para obter as posições de todos os jogadores, [itere por todas as entities com](/creator/content-creator-pt/scenes-sdk7/interatividade/user-data.md) um `PlayerIdentityData` component.

```ts
import { PlayerIdentityData } from '@dcl/sdk/ecs'

for (const [entity, data, transform] of engine.getEntitiesWith(
	PlayerIdentityData,
	Transform
)) {
	console.log('Dados do jogador: ', { entity, data, transform })
}
```

O código acima itera por todas as entities com um `Transform` e uma `PlayerIdentityData` componente e registra seus dados. Você pode usar esse mesmo método para obter qualquer um dos dados disponíveis de todos os jogadores.

Veja [Event listeners](/creator/content-creator-pt/scenes-sdk7/interatividade/event-listeners.md#player-locks-or-unlocks-cursor) para aprender como detectar e reagir quando novos jogadores entram na cena.

## Obter dados do jogador

Use `getPlayer()` para obter dados sobre o jogador atual, ou qualquer outro jogador na cena.

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

export function main() {
	createCube(5, 1, 5)

	let myPlayer = getPlayer()

	if (myPlayer) {
		console.log('Nome: ', myPlayer.name)
		console.log('UserId: ', myPlayer.userId)
	}
}
```

`getPlayer()` retorna o seguinte:

* `name`: *(string)* O nome de usuário do jogador, como os outros o veem no mundo
* `userId`: *(string)* Uma string que identifica o jogador. Para jogadores conectados com uma Wallet, este é o endereço da Wallet, escrito em minúsculas. Para contas de convidado, é um identificador gerado localmente.
* `isGuest`: *(boolean)* Indica se o jogador tem uma chave pública. *Verdadeiro* se o jogador for uma conta de convidado sem uma chave pública.
* `position`: *(Vector3)* A posição do avatar na cena.
* `avatar`: Um objeto aninhado com dados sobre o avatar base e a aparência do jogador.
* `wearables`: Um array de identificadores de cada um dos wearables que o jogador está usando no momento. Por exemplo `urn:decentraland:off-chain:base-avatars:green_hoodie`. Todos os wearables têm um identificador semelhante, mesmo que sejam NFTs.
* `emotes`: Um array de identificadores de cada um dos emotes que o jogador tem equipado atualmente na roda de acesso rápido.
* `entity`: Uma referência à entity do jogador. Isso pode ser útil para passar para outras funções, ou para adicionar componentes personalizados a ela.

O `avatar` o objeto tem as seguintes informações aninhadas:

* `bodyShapeUrn`: Um identificador para a forma corporal geral do avatar. Seja `urn:decentraland:off-chain:base-avatars:BaseFemale` para feminino ou `urn:decentraland:off-chain:base-avatars:BaseMale` para masculino.
* `skinColor`: Cor da pele do jogador como um `Color3`
* `eyesColor`: Cor dos olhos do jogador como um `Color3`
* `hairColor`: Cor do cabelo do jogador como um `Color3`
* `name`: O nome do jogador.

{% hint style="warning" %}
**📔 Observação**: Os dados do jogador podem não estar disponíveis no primeiro frame da cena, dependendo dos tempos de carregamento. Você deve verificar se os dados foram retornados e, caso contrário, tentar novamente alguns milissegundos depois.
{% endhint %}

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

export function main() {
	createCube(5, 1, 5)

	let myPlayer = getPlayer()

	if (myPlayer) {
		console.log('É convidado: ', myPlayer.isGuest)
		console.log('Nome: ', myPlayer.name)
		console.log('UserId: ', myPlayer.userId)
		console.log('Forma do avatar: ', myPlayer.position)
		console.log('Forma do avatar: ', myPlayer.avatar?.bodyShapeUrn)
		console.log('Cor dos olhos do avatar: ', myPlayer.avatar?.eyesColor)
		console.log('Cor do cabelo do avatar: ', myPlayer.avatar?.hairColor)
		console.log('Wearables equipados: ', myPlayer.wearables)
		console.log('Emotes disponíveis: ', myPlayer.emotes)
	}
}
```

Para obter os dados de um jogador específico na cena, diferente do jogador atual, execute `getPlayer()` com um objeto com um `userId` propriedade.

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

for (const [entity, data, transform] of engine.getEntitiesWith(
	PlayerIdentityData,
	Transform
)) {
	let player = getPlayer({ userId: data.address })
	console.log('JOGADOR: ', player?.name)
}
```

O trecho acima itera por todas as entities com um `PlayerIdentityData` componente, ou seja, todas as entities de avatar na cena. Em seguida, ele executa o `getPlayer()` para essa entity.

`getPlayer()` só consegue obter dados de jogadores que estejam atualmente na mesma cena. Eles não precisam necessariamente estar no alcance visual, mas devem estar conectados à mesma comms island. Para testar isso em preview, abra uma segunda aba e faça login com uma conta diferente, e faça com que ambos os jogadores estejam dentro da cena.

{% hint style="warning" %}
**📔 Observação**: Os IDs de usuário devem estar sempre em minúsculas. Se copiar um endereço de Wallet, certifique-se de que todos os caracteres estejam em minúsculas.
{% endhint %}

## Dados de qualquer jogador

Para obter informações de qualquer jogador, faça uma [chamada de REST API](/creator/content-creator-pt/scenes-sdk7/rede/network-connections.md#call-a-rest-api) para os servidores de conteúdo.

Essas informações são expostas na seguinte URL, adicionando o ID de usuário do jogador ao parâmetro da URL.

`https://peer.decentraland.org/lambdas/profile/<player user id>`

{% hint style="info" %}
**💡 Dica**: Teste a URL em um navegador para ver como a resposta é estruturada.
{% endhint %}

As seguintes informações estão disponíveis nesta API:

* `displayName`: *(string)* O nome de usuário do jogador, como os outros o veem no mundo
* `userId`: *(string)* Uma string UUID que identifica o jogador. Se o jogador tiver uma chave pública, este campo terá o mesmo valor da chave pública.
* `hasConnectedWeb3`: *(boolean)* Indica se o jogador tem uma chave pública. *Verdadeiro* se o jogador tiver uma.
* `publicKey`: *(string)* A chave pública da Wallet Ethereum do jogador. Se o jogador entrar como convidado, sem uma Wallet vinculada, este campo será `null`.
* `avatar`: Um objeto aninhado com dados sobre a aparência do jogador.
* `version`: *(number)* Um número de versão que aumenta em um toda vez que o jogador altera qualquer uma das suas configurações. Use isso se encontrar dados conflitantes, para saber qual versão é mais recente.

{% hint style="warning" %}
**📔 Observação**: Para qualquer transação Ethereum com o jogador, use sempre o `publicKey` campo, em vez do `userId`, para evitar lidar com Wallets inexistentes.
{% endhint %}

O `avatar` o objeto tem as seguintes informações aninhadas:

* `wearables`: `WearableId[]` Um array de identificadores de cada um dos wearables que o jogador está usando no momento. Por exemplo `urn:decentraland:off-chain:base-avatars:green_hoodie`. Todos os wearables têm um identificador semelhante, mesmo que sejam NFTs.
* `bodyShape`: Um identificador para a forma corporal geral do avatar. Seja `urn:decentraland:off-chain:base-avatars:BaseFemale` para feminino ou `urn:decentraland:off-chain:base-avatars:BaseMale` para masculino.
* `skin`: Um objeto com um `color` campo, contendo a cor da pele do jogador como `{ r, g, b, a }` números de 0 a 1.
* `hair`: Um objeto com um `color` campo, contendo a cor do cabelo do jogador como `{ r, g, b, a }` números de 0 a 1.
* `eyes`: Um objeto com um `color` campo, contendo a cor dos olhos do jogador como `{ r, g, b, a }` números de 0 a 1.
* `snapshots`: Um objeto aninhado com representações em base64 de imagens .jpg do jogador em várias resoluções.
  * `face256`: *string* O rosto do jogador como uma imagem de 256x256 pixels.
  * `body`: *string* A imagem em resolução total do jogador em pé, com 512x1024 pixels.

{% hint style="danger" %}
**❗Aviso** Os snapshots do avatar serão descontinuados no futuro e não serão mais retornados como parte dos dados de um avatar. A abordagem recomendada é usar `AvatarTexture` em vez disso, veja [Retratos de Avatar](/creator/content-creator-pt/scenes-sdk7/fundamentos-de-conteudo-3d/materials.md#avatar-portraits).
{% endhint %}

Ao contrário de `getPlayer()`, esta opção não se limita apenas aos jogadores que estão atualmente na mesma cena, ou mesmo no mesmo server. Com essa abordagem, você pode obter dados de qualquer jogador que tenha feito login nos servers no passado.

Se você souber a qual server o jogador que deseja consultar está conectado, você pode obter dados mais atualizados enviando suas requisições para esse server específico. Por exemplo, se o jogador trocar de roupa, essas informações estarão disponíveis instantaneamente no server do jogador, mas provavelmente levarão alguns minutos para se propagar para o `peer.decentraland.org` server.

`https://<player server>/lambdas/profile/<player user id>`

{% hint style="info" %}
**💡 Dica**: Você pode obter o server do jogador atual chamando `getRealm()` e lendo o `realmInfo.baseUrl` campo da resposta.
{% endhint %}

Este exemplo combina `myProfile.userId` e `getRealm()` para obter os dados do jogador diretamente do server em que o jogador está:

```ts
import { getRealm } from '~system/Runtime'
import { myProfile } from '@dcl/sdk/network'

async function fetchPlayerData() {
	const { realmInfo } = await getRealm({})
	if (!realmInfo) return

	const url = `${realmInfo.baseUrl}/lambdas/profile/${myProfile.userId}`
	console.log('usando URL: ', url)

	try {
		const response = await fetch(url)
		const json = await response.json()

		console.log('resposta completa: ', json)
		console.log('o jogador está usando: ', json.avatars[0].avatar.wearables)
	} catch {
		console.log('ocorreu um erro ao acessar os dados do jogador')
	}
}

fetchPlayerData()
```

## Componentes de dados do jogador

Em vez de usar `getPlayer()`, você pode ler os dados diretamente de uma série de components que armazenam os dados em cada entity de jogador. Os seguintes components existem:

* `PlayerIdentityData`: Armazena o endereço do jogador e uma `isGuest` propriedade para marcar contas de convidado.
* `AvatarBase`: Armazena dados sobre o avatar base, incluindo:
  * `name`: O nome do jogador.
  * `bodyShapeUrn`: Os IDs correspondentes ao tipo de corpo masculino ou feminino.
  * `skinColor`: Cor da pele do jogador como um `Color3`
  * `eyesColor`: Cor dos olhos do jogador como um `Color3`
  * `hairColor`: Cor do cabelo do jogador como um `Color3`
* `AvatarEquippedData`: A lista de wearables e emotes equipados.
  * `wearableUrns`: A lista de wearables que o jogador tem equipado no momento.
  * `emoteUrns`: A lista de emotes que o jogador tem equipado atualmente na roda de acesso rápido.
* `AvatarEmoteCommand`: Informações sobre os emotes que o jogador está executando no momento. Inclui:
  * `emoteUrn`: O URN do último emote executado pelo jogador, desde que entrou na cena
  * `loop`: Verdadeiro se o emote estiver em loop
  * `timestamp`: O momento em que esse emote foi acionado

```ts
for (const [entity, data, base, attach, transform] of engine.getEntitiesWith(
	PlayerIdentityData,
	AvatarBase,
	AvatarEquippedData,
	Transform
)) {
	console.log('DADOS DO JOGADOR: ', { entity, data, transform, base, attach })
}
```

{% hint style="warning" %}
**📔 Observação**: Todos esses components são somente leitura. Você não pode alterar seus valores a partir da cena.
{% endhint %}

## Obter experiências portáteis

Experiências portáteis são, essencialmente, cenas que não ficam restritas a parcelas de terra. Os jogadores podem levá-las para qualquer lugar que vão em Decentraland, adicionando uma nova camada de conteúdo sobre o mundo. Smart Wearables são exemplos de experiências portáteis. Você pode querer saber se um jogador está usando uma delas, já que um smart wearable pode permitir que os jogadores tenham habilidades que poderiam ser consideradas trapaça em um jogo competitivo. Por exemplo, em um jogo de plataforma, um jogador que usa um jetpack tem uma vantagem muito injusta sobre os outros.

Como criador de cena, você pode querer limitar o que jogadores usando experiências portáteis podem fazer na sua cena. Use `getPortableExperiencesLoaded()` para verificar se o jogador tem alguma experiência portátil ativada no momento.

```ts
import { getPortableExperiencesLoaded } from '~system/PortableExperiences'

executeTask(async () => {
	let portableExperiences = await getPortableExperiencesLoaded({})
	console.log(portableExperiences.loaded)
})
```

`getPortableExperiencesLoaded()` retorna um array de objetos, e cada um desses objetos inclui um `id` atributo. No caso dos wearables, o id é o URN do wearable.

## Obter informações detalhadas sobre os wearables de um jogador

O `getPlayer()` a função retorna apenas uma lista de IDs de wearable, sem informações sobre cada wearable. Talvez você queira verificar qualquer wearable de uma categoria específica (por exemplo: chapéus), ou qualquer wearable de uma raridade específica (por exemplo: Mythic); para isso, você precisará obter informações mais detalhadas sobre os wearables do jogador.

Faça uma [chamada de REST API](/creator/content-creator-pt/scenes-sdk7/rede/network-connections.md#call-a-rest-api) para a seguinte URL, para obter uma lista completa e atualizada de todos os wearables que podem ser usados no momento, com detalhes sobre cada um.

`${playerRealm.realmInfo.baseUrl}/lambdas/collections/wearables-by-owner/${userData.userId}?includeDefinitions`

{% hint style="warning" %}
**📔 Observação**: Para construir esta URL, você deve obter o realm (provavelmente com `getRealm()`) e o ID do jogador (provavelmente com `getPlayer()`)
{% endhint %}

Esse recurso pode ser usado em conjunto com a obtenção de informações sobre o jogador, por exemplo para permitir que os jogadores entrem em um lugar apenas se estiverem usando qualquer wearable da coleção de halloween, ou qualquer wearable de *lendária* raridade.

{% hint style="info" %}
**💡 Dica**: Teste a URL em um navegador para ver como a resposta é estruturada.
{% endhint %}

```ts
import { getPlayer } from '@dcl/sdk/src/players'
import { getRealm } from '~system/Runtime'

async function fetchWearablesData() {
	try {
		let userData = getPlayer()
		const realm = await getRealm({})
		if (!userData || !realm.realmInfo) return

		const url =
			`${realm.realmInfo?.baseUrl}/lambdas/collections/wearables-by-owner/${userData.userId}?includeDefinitions`.toString()
		console.log('usando URL: ', url)

		let response = await fetch(url)
		let json = await response.json()

		console.log('resposta completa: ', json)
	} catch {
		console.log('ocorreu um erro ao acessar os dados de wearables')
	}
}

executeTask(fetchWearablesData)
```

{% hint style="info" %}
**💡 Dica**: Você pode obter ainda mais informações sobre wearables específicos a partir da [API a seguir](https://decentraland.github.io/catalyst-api-specs/#tag/Lambdas/operation/searchWearables).
{% endhint %}

## Verifique o modo de câmera do jogador

Os jogadores podem estar usando uma câmera em 1ª ou 3ª pessoa ao explorar Decentraland. Verifique qual delas o jogador está usando conferindo o valor `CameraMode` component do `engine.CameraEntity` entity.

```ts
function checkCameraMode() {
	if (!CameraMode.has(engine.CameraEntity)) return

	let cameraEntity = CameraMode.get(engine.CameraEntity)

	if (cameraEntity.mode == CameraType.CT_THIRD_PERSON) {
		console.log('O player está usando a câmera em 3ª pessoa')
	} else {
		console.log('O player está usando a câmera em 1ª pessoa')
	}
}

engine.addSystem(checkCameraMode)
```

{% hint style="warning" %}
**📔 Observação**: As informações da câmera estão disponíveis apenas para o jogador atual executando a cena. Você não pode consultar os dados de câmera de nenhum outro jogador.
{% endhint %}

O modo de câmera usa um valor do `CameraType` enum. Os seguintes valores são possíveis:

* `CameraType.CT_FIRST_PERSON`
* `CameraType.CT_THIRD_PERSON`

O `CameraMode` component do `engine.CameraEntity` é somente leitura; você não pode forçar o jogador a mudar o modo de câmera por meio disso.

{% hint style="info" %}
**💡 Dica**: Para alterar o modo de câmera do jogador, use uma [área de modificação de câmera](/creator/content-creator-pt/scenes-sdk7/fundamentos-de-conteudo-3d/camera.md#1st-and-3rd-person-camera-modes).
{% endhint %}

Saber o modo de câmera pode ser muito útil para ajustar os mecanismos da sua cena de forma mais precisa para o que é mais confortável usando esse modo. Por exemplo, alvos pequenos são mais difíceis de clicar em 3ª pessoa.

{% hint style="warning" %}
**📔 Observação**: Evite referir-se ao `engine.CameraEntity` no carregamento inicial da cena, porque isso pode resultar em erros se as Entities ainda não estiverem inicializadas. Para evitar esse problema, use isso dentro da `main()` função, ou em uma função chamada indiretamente por `main()`. Você também pode encapsular o comportamento em um [`executeTask` bloco async](/creator/content-creator-pt/scenes-sdk7/padroes-de-programacao/async-functions.md#the-executetask-function).

Outra opção é referir-se a essa entity dentro de um System. Ela estará sempre disponível, porque a primeira execução do System acontece assim que a cena já estiver devidamente inicializada.
{% endhint %}

## Verifique se o jogador tem o cursor travado

Os jogadores podem alternar entre dois modos de cursor: *cursor travado* modo para controlar a câmera ou *cursor destravado* modo para mover o cursor livremente pela UI.

Os jogadores destravam o cursor clicando com o *botão direito do mouse* ou pressionando a *Esc* tecla, e travam o cursor novamente ao clicar em qualquer lugar da tela.

Confira a `PointerLock` componente da [camera entity](/creator/content-creator-pt/scenes-sdk7/arquitetura/entities-components.md#reserved-entities) para descobrir qual é o modo atual do cursor.

```ts
export function main() {
	const isLocked = PointerLock.get(engine.CameraEntity).isPointerLocked
	console.log(isLocked)
}
```

Veja [Event listeners](/creator/content-creator-pt/scenes-sdk7/interatividade/event-listeners.md#player-locks-or-unlocks-cursor) para ver como reagir facilmente a mudanças no estado do cursor.

Você também pode forçar o estado do cursor do jogador escrevendo no `isPointerLocked` campo do `PointerLock` componente em `engine.CameraEntity`. Veja [Bloquear ou desbloquear o cursor](/creator/content-creator-pt/scenes-sdk7/interatividade/eventos-de-botao/click-events.md#lock-or-unlock-the-cursor) para exemplos.

{% hint style="warning" %}
**📔 Observação**: Evite referir-se ao `engine.CameraEntity` no carregamento inicial da cena, porque isso pode resultar em erros se as Entities ainda não estiverem inicializadas. Para evitar esse problema, use isso dentro da `main()` função, ou em uma função chamada indiretamente por `main()`. Você também pode encapsular o comportamento em um [`executeTask` bloco async](/creator/content-creator-pt/scenes-sdk7/padroes-de-programacao/async-functions.md#the-executetask-function).

Outra opção é referir-se à entity dentro de um System. Ela estará sempre disponível, porque a primeira execução do System acontece assim que a cena já estiver devidamente inicializada.
{% endhint %}

## Verifique a posição do cursor do jogador

Use o `PrimaryPointerInfo` component na `engine.RootEntity` para obter a posição do cursor do jogador. Isso pode ser usado para mecânicas como interações de arrastar e soltar, gestos de deslizar, etc.

```ts
import { PrimaryPointerInfo } from '@dcl/sdk/ecs'

function CursorSystem() {
	const pointerInfo = PrimaryPointerInfo.get(engine.RootEntity)
	console.log(pointerInfo)
}

engine.addSystem(CursorSystem)
```

{% hint style="warning" %}
**📔 Observação**: Evite referir-se ao `engine.RootEntity` no carregamento inicial da cena, porque isso pode resultar em erros se as Entities ainda não estiverem inicializadas. Para evitar esse problema, refira-se sempre à entity dentro de um System. Ela estará sempre disponível, porque a primeira execução do System acontece assim que a cena já estiver devidamente inicializada.
{% endhint %}

O `PrimaryPointerInfo` componente retorna um objeto com as seguintes propriedades:

* `screenCoordinates`: *(Vector2)* A posição do cursor na cena, expressa em pixels. A origem é o canto superior esquerdo da tela, com `y` crescendo para baixo — o mesmo espaço de coordenadas de `UiTransform` e `UiCanvasInformation`. Quando o cursor está travado, isso informa o centro da tela.
* `screenDelta`: *(Vector2)* A mudança na posição do cursor desde o último frame, expressa em pixels. Veja [Movimento do mouse](/creator/content-creator-pt/scenes-sdk7/interatividade/mouse-movement.md) para detalhes e exemplos.
* `worldRayDirection`: *(Vector3)* Um vetor que representa a direção do ray da câmera até o cursor. A origem é a posição da câmera. Use isso para calcular a posição do cursor no mundo.
* `pointerType`: 0 para `none`, 1 para `mouse`

{% hint style="info" %}
**💡 Dica**: Ao contrário das outras propriedades, `screenDelta` continua registrando o movimento do mouse mesmo enquanto o cursor está [travado](/creator/content-creator-pt/scenes-sdk7/interatividade/eventos-de-botao/click-events.md#lock-or-unlock-the-cursor). Isso o torna ideal para interações em tempo real, como gestos de arrastar e controles personalizados de câmera; veja [Movimento do mouse](/creator/content-creator-pt/scenes-sdk7/interatividade/mouse-movement.md).
{% endhint %}

{% hint style="info" %}
**Dica:** Para reagir a eventos simples de hover em elementos de UI, você pode achar mais fácil usar os `onMouseEnter` e `onMouseLeave` eventos, veja [Eventos do botão da UI](/creator/content-creator-pt/scenes-sdk7/ui-2d/ui_button_events.md#hover-feedback).
{% endhint %}

O `PrimaryPointerInfo` componente é somente leitura; você não pode forçar o jogador a alterar a posição do cursor.

O exemplo a seguir mostra como exibir a posição do cursor em um elemento de UI.

***arquivo ui.tsx:***

```tsx
import { UiEntity, ReactEcs } from '@dcl/sdk/react-ecs'
import { Color4 } from '@dcl/sdk/math'
import {cursorXpos, cursorYpos} from './index'

export const uiMenu = () => (
  <UiEntity
    uiTransform={{
			width: '100%',
			height: '100px',
			justifyContent: 'center',
			alignItems: 'center',
    }}
    uiText={{ value: `Posição do cursor: `+  cursorXpos + `,` + cursorYpos, fontSize: 40 }}
    uiBackground={{ color: Color4.create(0.5, 0.8, 0.1, 0.6) }}
  />
)
```

***arquivo index.ts:***

```ts
import { engine, PrimaryPointerInfo } from '@dcl/sdk/ecs'
import { ReactEcsRenderer } from '@dcl/sdk/react-ecs'
import { uiMenu } from './ui'

export function main() {
  ReactEcsRenderer.setUiRenderer(uiMenu)
}

export let cursorXpos: number | undefined = undefined
export let cursorYpos: number | undefined = undefined

function CursorSystem() {
  const pointerInfo = PrimaryPointerInfo.get(engine.RootEntity)
  console.log(pointerInfo)

  cursorXpos = pointerInfo.screenCoordinates?.x
  cursorYpos = pointerInfo.screenCoordinates?.y
}

engine.addSystem(CursorSystem)
```

Você pode usar o `worldRayDirection` para definir o `direção` campo de um raycast para saber se uma entity está na linha de visão do cursor. Veja [Raycasting](/creator/content-creator-pt/scenes-sdk7/interatividade/raycasting.md) para mais detalhes.


---

# 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/interatividade/user-data.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
