> 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 User

Obtenha dados dos players à medida que interagem com sua scene.

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

Use o `PlayerEntity` e o `CameraEntity` para saber a posição e a rotação do jogador, verificando seus `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('posição do jogador: ', playerPos)
	console.log('rotação do jogador: ', playerRot)
	console.log('posição da câmera: ', CameraPos)
	console.log('rotação da câmera: ', CameraRot)
}

engine.addSystem(getPlayerPosition)
```

* **Posição do PlayerEntity**: A posição do avatar, na altura do peito. Aproximadamente 0,88 metros acima do solo.
* **Rotação do PlayerEntity**: A direção para a qual o avatar está virado, expressa como um quaternion.
* **Posição do CameraEntity**:
  * Em 1ª pessoa: Igual à posição do avatar, mas ao nível dos olhos. Aproximadamente 1,75 metros acima do solo.
  * Em 3ª pessoa: Pode variar dependendo dos movimentos da câmera.
* **Rotação do 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" %}
**📔 Nota**: Evite fazer referência ao `engine.PlayerEntity` ou ao `engine.CameraEntity` no carregamento inicial da Scene, pois isso pode resultar em erros se as entities ainda não tiverem sido inicializadas. Para evitar esse problema, use estas dentro do `main()` function, ou em uma function chamada indiretamente por `main()`. Você também pode encapsular o comportamento em um async [`executeTask` bloco](/creator/content-creator-pt/scenes-sdk7/padroes-de-programacao/async-functions.md#the-executetask-function).

Outra opção é fazer referência a essas entities dentro de um System. Elas estarão sempre disponíveis, porque a primeira execução do System é chamada quando a Scene já está devidamente inicializada.
{% endhint %}

## Buscar todos os jogadores

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

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

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

O código acima itera sobre todas as entities com um `Transform` e um `PlayerIdentityData` Component, e registra seus dados. Você pode usar este mesmo método para obter qualquer dado disponível de todos os players.

Veja [Listeners de eventos](/creator/content-creator-pt/scenes-sdk7/interatividade/event-listeners.md#player-locks-or-unlocks-cursor) para aprender a detectar e reagir quando novos jogadores entrarem na Scene.

## Obter dados do player

Use `getPlayer()` para obter dados do player atual, ou de qualquer outro player na Scene.

```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('ID de usuário : ', myPlayer.userId)
	}
}
```

`getPlayer()` retorna o seguinte:

* `name`: *(string)* O nome de usuário do player, como os outros veem in-world
* `userId`: *(string)* Uma string que identifica o player. Para players conectados com uma Wallet, este é o endereço da Wallet, escrito em minúsculas. Para contas de guest, é um identificador gerado localmente.
* `isGuest`: *(boolean)* Indica se o player tem uma public key. *Verdadeiro* se o player for uma conta guest sem uma public key.
* `posição`: *(Vector3)* A posição do avatar na Scene.
* `avatar`: Um objeto aninhado com dados sobre o avatar base e a aparência do player.
* `wearables`: Um array de identificadores para cada um dos wearables que o player está vestindo atualmente. 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 para cada um dos emotes que o player tem equipado atualmente na quick access wheel.
* `entity`: Uma referência à entity do player. Isso pode ser útil para passar para outras functions ou para adicionar Components 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 female ou `urn:decentraland:off-chain:base-avatars:BaseMale` para male.
* `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" %}
**📔 Nota**: Os dados do player podem não estar disponíveis no primeiro frame da Scene, 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('É guest: ', myPlayer.isGuest)
		console.log('Nome : ', myPlayer.name)
		console.log('ID de usuário : ', 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 em uso : ', myPlayer.wearables)
		console.log('Emotes disponíveis : ', myPlayer.emotes)
	}
}
```

Para obter os dados de um player específico na Scene, diferente do player atual, execute `getPlayer()` com um objeto com uma `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('PLAYER : ', player?.name)
}
```

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

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

{% hint style="warning" %}
**📔 Nota**: Os User IDs devem sempre estar 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 player

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

Essas informações são expostas na seguinte URL, anexando o user id do player ao parâmetro da URL.

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

{% hint style="info" %}
**💡 Dica**: Tente abrir a URL em um navegador para ver como a response está estruturada.
{% endhint %}

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

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

{% hint style="warning" %}
**📔 Nota**: Para quaisquer transações de Ethereum com o player, 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 para cada um dos wearables que o player está vestindo atualmente. 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 female ou `urn:decentraland:off-chain:base-avatars:BaseMale` para male.
* `skin`: Um objeto com um `color` campo, contendo a cor da pele do player como `{ r, g, b, a }` números de 0 a 1.
* `hair`: Um objeto com um `color` campo, contendo a cor do cabelo do player como `{ r, g, b, a }` números de 0 a 1.
* `eyes`: Um objeto com um `color` campo, contendo a cor dos olhos do player como `{ r, g, b, a }` números de 0 a 1.
* `snapshots`: Um objeto aninhado com representações base64 de imagens .jpg do player em várias resoluções.
  * `face256`: *string* O rosto do player como uma imagem de 256x256 pixels.
  * `body`: *string* A imagem em resolução total do player em pé, com 512x1024 pixels.

{% hint style="danger" %}
**❗Aviso** As snapshots do avatar serão descontinuadas no futuro e deixarão de ser retornadas como parte dos dados de um avatar. A abordagem recomendada é usar `AvatarTexture` em vez disso, veja [Avatar Portraits](/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 é limitada apenas aos players que estão atualmente na mesma Scene, ou mesmo no mesmo server. Com essa abordagem, você pode obter dados de qualquer player que tenha feito login nos servers no passado.

Se você souber a qual server o player que deseja consultar está conectado, você pode obter dados mais atualizados enviando suas requests para esse server específico. Por exemplo, se o player trocar de roupa, essa informação estará disponível instantaneamente no server do player, mas provavelmente levará 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 player atual chamando `getRealm()` e lendo o `realmInfo.baseUrl` campo da response.
{% endhint %}

Este exemplo combina `myProfile.userId` e `getRealm()` para obter os dados do player diretamente do server em que o player 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('response completa: ', json)
		console.log('o player está vestindo :', json.avatars[0].avatar.wearables)
	} catch {
		console.log('ocorreu um erro ao buscar dados do player')
	}
}

fetchPlayerData()
```

## Components de dados do player

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 player. Os seguintes Components existem:

* `PlayerIdentityData`: Armazena o endereço do player e uma `isGuest` propriedade para sinalizar contas guest.
* `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 atualmente equipados.
  * `emoteUrns`: A lista de emotes que o jogador tem atualmente equipados na roda de acesso rápido.
* `AvatarEmoteCommand`: Informações sobre os emotes que o player está executando atualmente. Inclui:
  * `emoteUrn`: O URN do último emote reproduzido pelo player, desde que entrou na Scene
  * `loop`: Verdadeiro se o emote estiver em loop
  * `timestamp`: O momento em que este emote foi acionado

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

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

## Obter Portable Experiences

Portable experiences são essencialmente scenes que não estão restritas a parcels de land. Players podem levá-las consigo para qualquer lugar em que vão em Decentraland, adicionando uma nova camada de conteúdo sobre o mundo. Smart Wearables são exemplos de portable experiences. Você pode querer saber se um player está usando uma delas, já que um smart wearable pode permitir que players tenham abilities que poderiam ser consideradas cheating em um jogo competitivo. Por exemplo, em um jogo de plataforma, um player que usa um jetpack tem uma vantagem muito injusta sobre os outros.

Como criador de uma Scene, talvez você queira limitar o que players usando experiências portáteis podem fazer na sua Scene. Use `getPortableExperiencesLoaded()` para verificar se o player tem alguma experiência portátil atualmente ativada.

```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 player

O `getPlayer()` function retorna apenas uma lista de ids de wearables, sem informações sobre cada wearable. Talvez você queira verificar qualquer wearable de uma categoria específica (ex.: hats) ou qualquer wearable de uma raridade específica (ex.: Mythic); para isso, você precisará obter informações mais detalhadas sobre os wearables do player.

Faça uma [chamada de REST API](/creator/content-creator-pt/scenes-sdk7/networking/network-connections.md#call-a-rest-api) para a seguinte URL, para obter uma lista completa e atualizada de todos os wearables que estão atualmente utilizáveis, com detalhes sobre cada um.

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

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

Este recurso pode ser usado em conjunto com a obtenção de informações sobre o player, por exemplo, para permitir que players entrem em um lugar somente se estiverem usando qualquer wearable da coleção de halloween, ou qualquer wearable de *legendary* raridade.

{% hint style="info" %}
**💡 Dica**: Tente abrir a URL em um navegador para ver como a response está 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('response completa: ', json)
	} catch {
		console.log('ocorreu um erro ao buscar dados dos wearables')
	}
}

executeTask(fetchWearablesData)
```

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

## Verifique o modo de câmera do player

Players podem estar usando uma câmera de 1ª ou 3ª pessoa ao explorar Decentraland. Verifique qual delas o player 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 jogador está usando a câmera em 3ª pessoa')
	} else {
		console.log('O jogador está usando a câmera em 1ª pessoa')
	}
}

engine.addSystem(checkCameraMode)
```

{% hint style="warning" %}
**📔 Nota**: As informações da câmera só estão disponíveis para o player atual que está executando a Scene. Você não pode consultar os dados da câmera de nenhum outro player.
{% 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` CameraMode

{% hint style="info" %}
**💡 Dica**: Para mudar o modo de câmera do player, use um [Camera modifier area](/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 melhor a mecânica da sua Scene, de modo a se adaptar melhor ao que é mais confortável ao usar esse modo. Por exemplo, pequenos alvos são mais difíceis de clicar em 3ª pessoa.

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

Outra opção é fazer referência a esta entity dentro de um System. Ela estará sempre disponível, porque a primeira execução do System é chamada quando a Scene já está devidamente inicializada.
{% endhint %}

## Verifique se o player tem o cursor locked

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

Os jogadores desbloqueiam o cursor ao clicar no *Botão direito do rato* ou ao pressionar a tecla *Esc* , e bloqueiam o cursor novamente ao clicar em qualquer ponto do ecrã.

Verifique o `PointerLock` component 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 [Listeners de eventos](/creator/content-creator-pt/scenes-sdk7/interatividade/event-listeners.md#player-locks-or-unlocks-cursor) para ver como reagir facilmente às mudanças no estado do cursor.

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

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

Outra opção é fazer referência à entity dentro de um System. Ela estará sempre disponível, porque a primeira execução do System é chamada quando a Scene já está devidamente inicializada.
{% endhint %}

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

Use o `PrimaryPointerInfo` componente na `engine.RootEntity` para obter a posição do cursor do player. Isso pode ser usado para mecânicas como interações de drag and drop, gestos de swipe 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" %}
**📔 Nota**: Evite fazer referência ao `engine.RootEntity` no carregamento inicial da Scene, pois isso pode resultar em erros se as entities ainda não estiverem inicializadas. Para evitar esse problema, referencie sempre a entity dentro de um System. Ela estará sempre disponível, porque a primeira execução do System é chamada quando a Scene já está devidamente inicializada.
{% endhint %}

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

* `screenCoordinates`: *(Vector2)* A posição do cursor na Scene, expressa em pixels. A origem é o canto inferior esquerdo da tela. Quando o cursor está locked, isso informa o centro da tela.
* `screenDelta`: *(Vector2)* A variação na posição do cursor desde o último frame, expressa em pixels. Veja [Mouse Movement](/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 `nenhum`, 1 para `mouse`

{% hint style="info" %}
**💡 Dica**: Ao contrário das outras properties, `screenDelta` continua reportando o movimento do mouse mesmo enquanto o cursor está [locked](/creator/content-creator-pt/scenes-sdk7/interatividade/button-events/click-events.md#lock-or-unlock-the-cursor). Isso o torna ideal para interações em tempo real, como gestos de drag e controles de câmera personalizados, veja [Mouse Movement](/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, talvez seja mais fácil usar os `onMouseEnter` e `onMouseLeave` eventos, veja [UI Button Events](/creator/content-creator-pt/scenes-sdk7/ui-2d/ui_button_events.md#hover-feedback).
{% endhint %}

O `PrimaryPointerInfo` component é somente leitura, você não pode forçar o player a mudar 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) }}
  />
)
```

***Ficheiro 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)
```

Pode usar o `worldRayDirection` para definir a `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 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-pt/scenes-sdk7/interatividade/user-data.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.
