> 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-ko/sdk7/interactivity/deprecated-functions.md).

# 더 이상 사용되지 않는 함수

레거시 함수

다음 함수들은 모두 레거시이므로 사용을 피해야 합니다. 아직은 동작하지만, 앞으로는 지원이 중단될 수도 있습니다. 이 모든 예제에는 동일한 정보를 얻거나 같은 결과를 달성하는 대체 방법에 대한 링크가 포함되어 있습니다.

## 플레이어가 씬에 들어오거나 나갑니다

{% hint style="warning" %}
**📔 참고**: `onEnterSceneObservable` 과 `onLeaveSceneObservable` 이벤트는 SDK 7.x에서 더 이상 사용되지 않습니다. 대신 `onEnterScene` 를 사용하세요. 자세한 내용은 [플레이어가 씬에 들어오거나 나갑니다](/creator/content-creator-ko/sdk7/interactivity/event-listeners.md#player-enters-or-leaves-scene).
{% endhint %}

아바타가 장면을 구성하는 토지 구획 안으로 들어오거나 나갈 때, 또는 텔레포트로 들어오거나 나갈 때, 이를 감지할 수 있는 이벤트가 생성됩니다. 이 이벤트는 플레이어를 포함한 모든 아바타에 의해 트리거됩니다.

```ts
import {
	onEnterSceneObservable,
	onLeaveSceneObservable,
} from '@dcl/sdk/observables'

onEnterSceneObservable.add((player) => {
	console.log('플레이어가 장면에 들어옴: ', player.userId)
})

onLeaveSceneObservable.add((player) => {
	console.log('플레이어가 장면을 떠남: ', player.userId)
})
```

{% hint style="warning" %}
**📔 참고**: 이 이벤트는 현재 로컬에서 렌더링 중인 플레이어에만 반응합니다. 장면 크기가 시야 범위를 초과하는 큰 장면에서는 반대편 모서리로 들어오는 플레이어가 등록되지 않을 수 있습니다. 해당 지역의 플레이어 수가 Decentraland 서버의 섬이 감당할 수 있는 수준을 초과하면, 같은 섬을 공유하지 않는 플레이어는 보이지 않으며 이 이벤트로도 추적되지 않습니다.
{% endhint %}

다음 observables는 `onEnterScene` 과 `onLeaveScene` 에서 가져온 `'@dcl/sdk/observables'` 역시 더 이상 사용되지 않습니다. 올바른 함수들은 이름은 같지만 `'@dcl/sdk/src/players'` 에서 가져와야 합니다. 아래 예제에서는 더 이상 사용되지 않는 버전과 올바른 버전을 모두 볼 수 있습니다.

```ts
// 더 이상 사용되지 않음 - observables에서 가져옴
import { onEnterScene, onLeaveScene } from '@dcl/sdk/observables'

onEnterScene.add((player) => {
	console.log('플레이어가 장면에 들어옴: ', player.userId)
})

onLeaveScene.add((player) => {
	console.log('플레이어가 장면을 떠남: ', player.userId)
})

// 현재 - 플레이어 함수로 가져옴
import { onEnterScene, onLeaveScene } from '@dcl/sdk/src/players'

export function main() {
	onEnterScene((player) => {
		if (!player) return
		console.log('씬에 들어옴', player)
	})

	onLeaveScene((userId) => {
		if (!userId) return
		console.log('씬을 나감', userId)
	})
}
```

## 플레이어가 연결되거나 연결이 끊어짐

{% hint style="warning" %}
**📔 참고**: `getConnectedPlayers` 함수와 `onPlayerConnectedObservable` 과 `onPlayerDisconnectedObservable` 이벤트는 SDK 7.x에서 더 이상 사용되지 않습니다. 대신 `onEnterScene` 를 사용하세요. 자세한 내용은 [플레이어가 씬에 들어오거나 나갑니다](/creator/content-creator-ko/sdk7/interactivity/event-listeners.md#player-enters-or-leaves-scene)를 사용하세요. 이제 각 장면은 별도의 통신 섬이 되어, 연결된 상태와 같은 장면에 있는 상태가 동일하게 취급됩니다.
{% endhint %}

현재 연결된 플레이어의 전체 목록을 가져오려면 `getConnectedPlayers`.

```ts
import { getConnectedPlayers } from '~system/Players'

executeTask(async () => {
	let connectedPlayers = await getConnectedPlayers({})
	connectedPlayers.players.forEach((player) => {
		console.log('플레이어가 이미 여기에 있었음: ', player.userId)
	})
})
```

다른 플레이어가 로컬 엔진에 의해 렌더링되기 시작하거나 중단될 때마다, 이를 감지할 수 있는 이벤트가 생성됩니다. 플레이어는 반드시 여러분과 같은 장면에 서 있을 필요는 없지만 시야 범위 내에 있어야 합니다(반드시 시야에 보여야 하는 것은 아님). `onPlayerConnectedObservable` 플레이어가 근처에 새로 연결되거나 시야 범위 안으로 충분히 가까워졌을 때를 모두 감지하며, `onPlayerDisconnectedObservable` 는 플레이어가 세션을 종료하거나 멀리 걸어가 버릴 때를 감지합니다.

```ts
import {
	onPlayerConnectedObservable,
	onPlayerDisconnectedObservable,
} from '@dcl/sdk/observables'

onPlayerConnectedObservable.add((player) => {
	console.log('플레이어가 들어옴: ', player.userId)
})

onPlayerDisconnectedObservable.add((player) => {
	console.log('플레이어가 나감: ', player.userId)
})
```

다른 플레이어들이 플레이어가 여러분의 장면을 불러오기 전에 이미 주변에서 렌더링되고 있었다면, 이 이벤트는 새로 로드된 장면에 이미 존재하던 플레이어를 알리지 않습니다. 현재 모든 플레이어를 추적해야 한다면, 장면 로드 시 기존 플레이어를 조회한 다음, 업데이트를 위해 이 이벤트를 구독하면 됩니다.

## 씬의 모든 플레이어 조회

{% hint style="warning" %}
**📔 참고**: `getPlayersInScene` 함수는 SDK 7.x에서 더 이상 사용되지 않습니다. 대신 `PlayerIdentityData` 컴포넌트가 붙은 모든 플레이어를 순회하세요. 자세한 내용은 [모든 플레이어 가져오기](/creator/content-creator-ko/sdk7/interactivity/user-data.md#fetch-all-players).
{% endhint %}

또한 현재 여러분의 장면에 있고 렌더링 중인 플레이어의 전체 목록은 `getPlayersInScene()`.

```ts
import { getPlayersInScene } from '~system/Players'

executeTask(async () => {
	let connectedPlayers = await getPlayersInScene({})
	connectedPlayers.players.forEach((player) => {
		console.log('플레이어가 이미 여기에 있었음: ', player.userId)
	})
})
```

## 플레이어가 애니메이션을 재생합니다

{% hint style="warning" %}
**📔 참고**: `onPlayerExpressionObservable` 이벤트는 SDK 7.x에서 더 이상 사용되지 않습니다. 대신 `AvatarEmoteCommand` 컴포넌트를 사용하세요. 자세한 내용은 [플레이어가 애니메이션을 재생합니다](/creator/content-creator-ko/sdk7/interactivity/event-listeners.md#player-plays-animation).
{% endhint %}

플레이어가 감정 표현(댄스, 박수, 손 흔들기 등)을 할 때마다 이 이벤트를 감지할 수 있습니다.

```ts
import { onPlayerExpressionObservable } from '@dcl/sdk/observables'

onPlayerExpressionObservable.add(({ expressionId }) => {
	console.log('표현: ', expressionId)
})
```

이 이벤트에는 다음 정보가 포함됩니다:

* expressionId: 수행된 감정 표현의 이름(예: *wave*, *clap*, *kiss*)

{% hint style="warning" %}
**📔 참고**: 이 이벤트는 플레이어가 감정 표현을 할 때마다 그리고 장면이 로드되어 있을 때 트리거됩니다. 이 일이 발생할 때 플레이어가 근처 장면에 서 있을 수도 있습니다.
{% endhint %}

## 플레이어가 프로필을 변경합니다

{% hint style="warning" %}
**📔 참고**: `onProfileChanged` 이벤트는 SDK 7.x에서 더 이상 사용되지 않습니다. 대신 `AvatarEquippedData` 컴포넌트를 사용하세요. 자세한 내용은 [플레이어가 프로필을 변경합니다](/creator/content-creator-ko/sdk7/interactivity/event-listeners.md#player-changes-profile).
{% endhint %}

플레이어가 자신의 프로필을 변경할 때마다 `onProfileChanged` 이벤트가 호출됩니다. 이러한 변경에는 다른 웨어러블 착용, 이름 변경, 설명 변경, 휴대형 경험 활성화 등이 포함될 수 있습니다.

```ts
import { onProfileChanged } from '@dcl/sdk/observables'

onProfileChanged.add((profileData) => {
	console.log('내 프로필 데이터: ', profileData)
})
```

이벤트 데이터에는 catalyst 서버에 따라 플레이어 ID와 해당 아바타 프로필의 버전 번호만 포함됩니다. 변경 사항이 전파될 때마다 버전 번호는 1씩 증가합니다.

이 이벤트가 트리거되면 [getUserData()](/creator/content-creator-ko/sdk7/interactivity/user-data.md#get-player-data) 함수를 사용해 플레이어가 착용 중인 웨어러블 목록을 포함한 이 정보의 최신 버전을 가져올 수 있습니다. 호출하기 전에 약간의 지연을 추가해야 할 수도 있습니다. `getUserData()` 함수가 반환하는 버전이 최신인지 확인하기 위해

{% hint style="info" %}
**💡 팁**: 레거시 웹 익스플로러로 미리보기 테스트를 할 때 임의의 아바타를 사용하지 않으려면, Metamask 지갑에 연결된 브라우저에서 장면을 실행하세요.
{% endhint %}

{% hint style="warning" %}
**📔 참고**: 이 이벤트는 현재 플레이어의 변경에 의해서만 트리거되며, 주변의 다른 플레이어 프로필 변경에는 트리거되지 않습니다.
{% endhint %}

## 장면 로드 완료

{% hint style="warning" %}
**📔 참고**: `onSceneReadyObservable` 이벤트는 SDK v7.x에서 더 이상 사용되지 않습니다. 이 함수는 더 이상 관련이 없습니다. 장면 로드가 끝난 후 어떤 작업이 실행되도록 하려면 `Main()` 함수 안에서 실행하면 됩니다. 자세한 내용은 [장면 수명 주기](/creator/content-creator-ko/sdk7/getting-started/coding-scenes.md#scene-lifecycle)
{% endhint %}

장면 로드가 끝나면 `onSceneReadyObservable` 가 호출됩니다. 이는 플레이어가 장면으로 바로 진입하든, 다른 곳에서 걸어와 장면에 들어오든 모두 적용됩니다. 무거운 모델 등을 포함한 장면의 모든 콘텐츠의 초기 로드가 완료되면 이 이벤트가 호출됩니다.

```ts
import { onSceneReadyObservable } from '@dcl/sdk/observables'

onSceneReadyObservable.add(() => {
	console.log('장면 로드됨')
})
```

## 더 이상 사용되지 않는 플레이어 데이터 메서드

{% hint style="warning" %}
**📔 참고**: `getUserData()` 과 `getPlayerData()` 함수들은 SDK v7.4.x부터 더 이상 사용되지 않습니다. 대신 `getPlayer()` 를 사용하세요. 자세한 내용은 [사용자 데이터](/creator/content-creator-ko/sdk7/interactivity/user-data.md#get-user-data).
{% endhint %}

장면을 실행 중인 현재 플레이어의 정보를 얻으려면 `getUserData()`.

다음 예제는 `~system/UserIdentity` 네임스페이스를 가져와 실행합니다 `getUserData()`.

```ts
import { getUserData } from '~system/UserIdentity'

executeTask(async () => {
	let userData = await getUserData({})
	console.log(userData.data)
})
```

주변에 있는 다른 플레이어의 데이터는 `getPlayerData()`를 호출하고 Decentraland 계정의 ID를 전달하여 얻을 수 있습니다.

```ts
import { getPlayerData } from '~system/Players'

executeTask(async () => {
	let userData = await getPlayerData({ userId: '0x….' })
	console.log(userData)
})
```

둘 다 `getUserData()` 과 `getPlayerData()` 콘텐츠 API를 통해 제공되는 것과 동일한 데이터 구조를 반환합니다. 자세한 내용은 [모든 플레이어의 데이터](/creator/content-creator-ko/sdk7/interactivity/user-data.md#data-from-any-player)

`getPlayerData()` 현재 근처에 있는 플레이어의 데이터만 가져올 수 있습니다. 반드시 같은 장면에 서 있을 필요는 없지만 시야 범위 내에 있어야 합니다. 이는 이 정보가 이러한 아바타를 렌더링하는 로컬 엔진에서 가져오기 때문입니다. 미리보기에서 이를 시험해 보려면 두 번째 탭을 열고 다른 계정으로 로그인하세요.

{% hint style="warning" %}
**📔 참고**: 사용자 ID는 항상 소문자여야 합니다. 지갑 주소를 복사하는 경우 모든 문자가 소문자인지 확인하세요.
{% endhint %}

이 `getUserPublicKey()` 과 `getUserAccount()` 함수들도 역시 더 이상 사용되지 않습니다. 대신 `getPlayer()` 를 사용하세요. 자세한 내용은 [사용자 데이터](/creator/content-creator-ko/sdk7/interactivity/user-data.md#get-user-data).

## 스카이박스 시간 가져오기

{% hint style="warning" %}
**📔 참고**: `getDecentralandTime()` 함수는 SDK v7.x.x에서 더 이상 사용되지 않습니다. 대신 `getWorldTime()` 를 사용하세요. 자세한 내용은 [Decentraland 시간 가져오기](/creator/content-creator-ko/sdk7/interactivity/runtime-data.md#get-decentraland-time).
{% endhint %}

```ts
import { getDecentralandTime } from '~system/EnvironmentApi'

executeTask(async () => {
	let time = await getDecentralandTime({})
	console.log(time)
})
```

## 영역 가져오기

{% hint style="warning" %}
**📔 참고**: `getCurrentRealm()` 함수는 SDK v7.x.x에서 더 이상 사용되지 않습니다. 대신 `getRealm()` 를 사용하세요. 자세한 내용은 [영역 데이터 가져오기](/creator/content-creator-ko/sdk7/interactivity/runtime-data.md#get-realm-data).
{% endhint %}

```ts
import { getCurrentRealm } from '~system/EnvironmentApi'

async function fetchPlayerData() {
	const playerRealm = await getCurrentRealm({})

	console.log(playerRealm.currentRealm?.domain)
}

fetchPlayerData()
```

## 미리보기 모드인지 여부

{% hint style="warning" %}
**📔 참고**: `isPreviewMode()` 함수는 SDK v7.x.x에서 더 이상 사용되지 않습니다. 대신 `getRealm()` 대신 다음을 포함하는 `preview` 속성이 있습니다. 자세한 내용은 [영역 데이터 가져오기](/creator/content-creator-ko/sdk7/interactivity/runtime-data.md#get-realm-data).
{% endhint %}

```ts
import { isPreviewMode } from '~system/EnvironmentApi'

executeTask(async () => {
	const { isPreview } = await isPreviewMode({})

	if (isPreview) {
		console.log('미리보기에서 실행 중')
	}
})
```

## 플레이어가 다른 플레이어를 클릭함

플레이어가 다른 플레이어를 클릭할 때마다 이벤트를 감지할 수 있습니다.

```ts
import { onPlayerClickedObservable } from '@dcl/sdk/observables'

onPlayerClickedObservable.add((clickEvent) => {
	console.log('클릭됨 ', clickEvent.userId, ' 세부 정보: ', clickEvent.ray)
})
```

{% hint style="warning" %}
**📔 참고**: `onPlayerClickedObservable` 이벤트는 SDK v7.x에서 더 이상 사용되지 않습니다. 향후 버전에서는 보다 [데이터 지향적인 접근](/creator/content-creator-ko/sdk7/architecture/data-oriented-programming.md)을 지원할 예정이며, 이는 이벤트 대신 데이터를 정기적으로 조회하는 방식에 기반합니다.

대안으로 플레이어에 보이지 않는 콜라이더를 붙여 이에 대한 클릭을 감지할 수 있습니다.
{% endhint %}

{% hint style="warning" %}
**📔 참고**: 클릭하는 플레이어와 클릭당하는 플레이어 모두 장면의 구획 안에 서 있어야 합니다. 이 리스너는 다른 플레이어가 수행한 클릭은 감지하지 않고, 현재 플레이어가 다른 플레이어를 클릭한 이벤트만 감지합니다.
{% endhint %}

이 이벤트에는 다음 데이터가 포함됩니다:

* `userId`: 클릭된 플레이어의 ID
* `ray`: 클릭에 의해 추적된 레이에 대한 데이터
  * `방향`: *Vector3* 클릭의 원점에서 히트 지점까지의 방향을 나타내는 정규화된 Vector3입니다.
  * `distance`: *number* 원점에서 히트 지점까지의 거리(미터)입니다.
  * `origin`: *Vector3* 장면을 기준으로 한, 클릭의 원점, 즉 클릭한 플레이어의 위치입니다.

{% hint style="info" %}
**💡 팁**: 다른 플레이어를 클릭하면 기본적으로 플레이어 여권이 열리며, 여기서 해당 플레이어에 대한 추가 정보를 보거나 친구로 추가할 수 있습니다. 추가한 [아바타 수정 영역](/creator/content-creator-ko/sdk7/interactivity/avatars/modifier-areas.md).
{% endhint %}

## 플레이어가 커서 잠금/잠금 해제함

{% hint style="warning" %}
**📔 참고**: `onPointerLockedStateChange` 이벤트는 SDK v7.x에서 제거되어 더 이상 사용할 수 없습니다. 자세한 내용은 [이벤트 리스너](/creator/content-creator-ko/sdk7/interactivity/event-listeners.md#player-locks-or-unlocks-cursor) 에서 현재 대안을 확인하세요.
{% endhint %}

플레이어는 두 가지 커서 모드 간에 전환할 수 있습니다: *잠긴 커서* 모드는 카메라를 제어하는 데 사용되고 *잠금 해제된 커서* 모드는 UI 위에서 커서를 자유롭게 이동하는 데 사용됩니다.

플레이어는 *마우스 오른쪽 버튼* 를 클릭하거나 *Esc* 키를 눌러 커서를 잠금 해제하고, 화면의 아무 곳이나 클릭하여 다시 잠급니다.

플레이어가 이 두 모드 사이를 전환할 때마다 반응하려면 `onChange` 다음의 함수 `PointerLock` 구성 요소를 사용하세요. 다음을 참조: [이벤트 리스너](/creator/content-creator-ko/sdk7/interactivity/event-listeners.md#player-locks-or-unlocks-cursor).

## 플레이어가 영역 또는 섬을 변경함

Decentraland의 플레이어는 서로 분리된 *영역*과 서로 분리된 *섬* 안에 존재합니다. 서로 다른 영역이나 섬의 플레이어는 같은 구획에 서 있어도 서로를 볼 수 없고, 상호작용하거나 채팅할 수 없습니다.

플레이어가 영역이나 섬을 변경할 때마다 `onRealmChangedObservable` 이벤트가 호출됩니다.

```ts
import { onRealmChangedObservable } from '@dcl/sdk/observables'

onRealmChangedObservable.add((realmChange) => {
	console.log('플레이어가 다음 섬으로 변경됨: ', realmChange.room)
})
```

{% hint style="warning" %}
**📔 참고**: `onRealmChangedObservable` 이벤트는 SDK v7.x에서 더 이상 사용되지 않습니다. 향후 버전에서는 보다 [데이터 지향적인 접근](/creator/content-creator-ko/sdk7/architecture/data-oriented-programming.md)을 지원할 예정이며, 이는 이벤트 대신 데이터를 정기적으로 조회하는 방식에 기반합니다.
{% endhint %}

이 이벤트에는 다음 필드가 포함됩니다:

* **serverName**: *문자열*; catalyst 서버 이름입니다.
* **room**: *문자열*; 섬 이름입니다.
* **displayName**: *문자열*; catalyst 서버 이름 뒤에 *-* 와 섬 이름이 붙습니다. 예: `unicorn-x011`.
* **domain**: *문자열*; 사용 중인 catalyst 서버의 URL입니다.

플레이어가 지도를 이동하면서, 자신에게 가장 가까운 플레이어들과 묶이기 위해 섬을 바꿀 수 있습니다. 각 섬이 관리 가능한 규모의 인원을 수용하도록 경계도 동적으로 조정됩니다. 따라서 플레이어가 가만히 서 있어도 주변 장면에 다른 플레이어들이 들어오고 나가면서 섬이 바뀔 수 있습니다.

여러분의 장면이 [제3자 서버](/creator/content-creator-ko/sdk7/networking/third-party-servers.md) 에 의존하여 플레이어 간 변경 사항을 실시간으로 동기화한다면, 같은 realm+island에 속한 플레이어끼리만 데이터를 공유하고, 플레이어가 섬을 바꿀 때마다 제3자 서버에서 방을 바꾸는 것이 좋습니다.

## 크립토 함수

{% hint style="warning" %}
**📔 참고**: 함수 `requirePayment()`, `signMessage()`, `convertMessageToObject()` 는 더 이상 사용되지 않습니다. 대신 `sendAsync()` 함수를 사용하세요. 자세한 내용은 [장면 블록체인 작업](/creator/content-creator-ko/sdk7/blockchain/scene-blockchain-operations.md)을 참조하세요. 이러한 함수의 일반적인 사용 사례를 단순화하는 데 도움이 되는 라이브러리도 있습니다.
{% endhint %}

## 비디오 이벤트

{% hint style="warning" %}
**📔 참고**: `onVideoEvent` 이벤트는 SDK v7.x에서 더 이상 사용되지 않습니다. 자세한 내용은 [이벤트 리스너](/creator/content-creator-ko/sdk7/media/video-playing.md#video-events) 에서 사용 중단되지 않은 대안을 확인하세요.
{% endhint %}

비디오의 재생 상태가 바뀔 때 `onVideoEvent` observable이 이벤트를 수신합니다.

```ts
onVideoEvent.add((data) => {
	console.log('새 비디오 이벤트 ', data)
})
```

비디오 이벤트의 입력에는 다음 속성이 포함됩니다:

* `videoClipId` ( *문자열*): 상태가 변경된 엔티티의 ID입니다.
* `componentId` (*문자열*): 상태가 변경된 엔티티의 ID입니다.
* `currentOffset` (*number*): 비디오의 `seek` 속성의 현재 값입니다. 이 값은 비디오의 원래 시작 시점 이후의 초를 보여줍니다. *-1* 내보냅니다.
* `totalVideoLength` (*number* ): 전체 비디오의 길이(초)입니다. *-1* 길이를 알 수 없는 경우.
* `videoStatus`: `VideoTexture`의 새 비디오 상태 값을 `VideoStatus` enum 값으로 나타낸 것입니다. 이 enum에는 다음과 같은 가능한 값이 있습니다:
* `VideoStatus.NONE` = 0,
* `VideoStatus.ERROR` = 1,
* `VideoStatus.LOADING` = 2,
* `VideoStatus.READY` = 3,
* `VideoStatus.PLAYING` = 4,
* `VideoStatus.BUFFERING` = 5


---

# 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-ko/sdk7/interactivity/deprecated-functions.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.
