> For the complete documentation index, see [llms.txt](https://docs.sandbox.game/the-game-maker-academy_kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sandbox.game/the-game-maker-academy_kr/tutorials-1/advanced-tutorials/advanced-key-and-door-tricks.md).

# 열쇠와 문 시스템 (고급)

플랫폼으로 알을 가져가 문을 여는 열쇠를 생성합니다.

먼저 문을 설정하고 커스텀 메시지를 부여합니다.

* '**L'** 키를 눌러 애셋 리스트 중 문을 선택하고 '**Door**' 비헤이비어를 부여합니다.
* '**Message Required**'의 기본 메시지를 삭제합니다 (있을 경우).
* '**Message Required**'에 '**OpenDoor**'와 '**CloseDoor**'를 추가합니다.

하나의 메시지로도 작업을 수행할 수 있지만 쉬운 설명을 위해 별도의 메시지를 사용했습니다.

![](https://4143380045-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MO_j99BJEXK4zHqxgqS%2F-MQZzRB1yfl94rFBa04_%2F-MQ_VEI1VhWgzLtSIDDZ%2FDoor-and-keys-1.png?alt=media\&token=a7d99273-90be-4216-9b9e-3cc571ef68a7)

다음으로 열쇠를 만들어야 합니다. 수집되면 문을 엽니다.

* 열쇠 애셋을 놓고 '**Pickable**' 컴포넌트를 추가합니다.
* '**Collect action required**'를 '**Collision**'으로 설정합니다.
* '**Collect Message**'를 '**OpenDoor**'로 설정합니다.

![](https://4143380045-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MO_j99BJEXK4zHqxgqS%2F-MQZzRB1yfl94rFBa04_%2F-MQ_WlfIDlNrnmPSl21C%2FDoor-and-keys-2.png?alt=media\&token=0644c5be-b5ef-4581-90a4-470f451b6eb9)

이제 열쇠를 모으면 문이 열립니다. 이 예시에서는 플랫폼으로 알을 가져가면 문을 열 수 있는 열쇠가 주어지게 만들고자 합니다. 그럼 이제 그 부분을 만들어 보죠.

열쇠를 '**Preset**'으로 만들어야 합니다.

* 금열쇠를 선택하고 왼쪽 바의 '**Preset'** 버튼을 클릭합니다.
* '**Create New Preset**'을 클릭합니다.
* '**Finish**' 버튼을 클릭합니다.

![](https://4143380045-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MO_j99BJEXK4zHqxgqS%2F-MQ_XxmjmhQFcX7sFAtW%2F-MQ_YHm2qGH9dez6gNK0%2FDoor-and-keys-3.png?alt=media\&token=b0bff135-9a99-4358-a08d-23575291b646)

이제 금열쇠가 프리셋이 되었으므로 '**Asset Spawner**' 행동이나 '**Drop**' 컴포넌트에서 메시지와 함께 호출될 수 있습니다. 이제 세팅을 시작해 봅시다!

* '**L'** 키를 눌러 애셋 라이브러리에서 알을 선택합니다.
* '**Pickable**' 컴포넌트를 적용합니다.
* '**Tags**'에 '**Egg**'를 추가합니다.

![](https://4143380045-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MO_j99BJEXK4zHqxgqS%2F-MQ_XxmjmhQFcX7sFAtW%2F-MQ_ZGf-S1BikKk45Byj%2FDoor-and-keys-4.png?alt=media\&token=686119f1-2f74-472f-831a-29735256f3bf)

* '**L'** 키를 눌러 애셋 라이브러리에서 플랫폼을 선택합니다.
* '**Asset Spawner**' 비헤이비어를 부여합니다.
* '**Use Preset**'을 '**True**'로 설정하고 '**Gold Key**' '**Preset**'을 선택합니다.
* '**Message Required**'를 '**DetectEgg**'로 설정합니다.

![](https://4143380045-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MO_j99BJEXK4zHqxgqS%2F-MQ_XxmjmhQFcX7sFAtW%2F-MQ_bZIzhwHZnNAlzTOO%2FDoor-and-keys-5.png?alt=media\&token=06d313c4-f012-4da4-9e13-4084e2447e3c)

동일한 오브젝트를 이용하여 동시에 메시지를 주고받을 수 없기 때문에 이 절차를 분리해야 합니다. 플랫폼이 '**DetectEgg**'라는 메시지를 받으면 '**Gold Key**'가 생성되게 설정했습니다.\
이제 애셋이 '**Egg**' 태그를 감지하여 플랫폼에 메시지를 전송하도록 합니다.

* '**L'** 키를 눌러 애셋 라이브러리에서 작은 애셋 하나를 선택합니다. 이 예시에서는 '**NumPad Switch**'를 사용했습니다.
* 추가된 비헤이비어가 있다면 삭제하고 '**Speaker**' 컴포넌트를 추가합니다.
* '**Display condition**'을 '**DetectEntity**'로 설정합니다.
* '**Target Tags**'를 '**Egg**'로 설정합니다.
* **'Message When Spoken**'을 **'DetectEgg**'로 설정합니다.

![](https://4143380045-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MO_j99BJEXK4zHqxgqS%2F-MQ_XxmjmhQFcX7sFAtW%2F-MQ_ixBEQLOhr87Q7M_Y%2FDoor-and-keys-6.png?alt=media\&token=c76d3a51-bf2f-4942-a2cc-0de85471fdd4)

* 애셋을 '투명'하게 만들고 Physics를 '**No collision'**&#xB85C; 설정합니&#xB2E4;**.**
* 알을 감지하게 만들 플랫폼 아래로 애셋을 이동합니다.

![](https://4143380045-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MO_j99BJEXK4zHqxgqS%2F-MQ_XxmjmhQFcX7sFAtW%2F-MQ_jbyA1iNbqF-PAkgN%2FDoor-and-keys-7.png?alt=media\&token=103950f2-2328-4a22-a72a-1813088b719f)

이제 플랫폼으로 알을 가져가면 투명한 오브젝트가 알 애셋에 추가된 'Egg' 태그를 감지하여 플랫폼으로 'Asset Spawner' 메시지를 보내 프리셋 'Gold Key'를 생성합니다. 플레이어는 금열쇠를 모아 문을 열 수 있습니다.

보너스로 한 가지 더 알아보죠! 다른 메시지를 보내지 않으면 다시 열 수 없게 플레이어가 지나가면 문을 닫도록 탐지기를 설치할 수 있습니다.

* '**L'** 키를 눌러 애셋 라이브러리에서 작은 애셋 하나를 선택합니다. 이 예시에서는 '**NumPad Switch**'를 사용했습니다.
* 애셋을 '투명'하게 만들고 Physics를 '**No collision'**&#xB85C; 설정합니&#xB2E4;**.**
* 추가된 비헤이비어가 있다면 삭제하고 '**Speaker**' 컴포넌트를 추가합니다.
* '**Display condition**'을 '**DetectEntity**'로, '**Detection Range**'를 '**4**'로 설정합니다.
* '**Target Tags**'를 '**Avatar**'로 남겨 둡니다.
* '**Message When Spoken**'을 '**CloseDoor**'로 설정합니다.

![](https://4143380045-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MO_j99BJEXK4zHqxgqS%2F-MQ_XxmjmhQFcX7sFAtW%2F-MQ_kanpHTir2oBD5Ffz%2FDoor-and-keys-8.png?alt=media\&token=58fd9bbf-7a99-45a6-a8e6-e9d21a0d1c89)

이제 플레이어가 문을 통과할 때 투명한 오브젝트가 아바타를 감지하고 문을 닫는 '**CloseDoor**' 메시지를 전송합니다. 정말 멋지죠!
