[task] | single_turn [pass] | ⏳ 미판정 [title] | UI 제작하기 [question] | UIGroup을 클릭한 뒤 왼쪽 기본 도구에서 이미지를 추가하는 과정과, 기존에 있는 이미지를 삭제하는 과정은 어떤 차이가 있나요? [answer] | 제공된 참고 문서에는 **이미지를 추가하는 과정**만 설명되어 있으며, **기존 이미지를 삭제하는 과정**에 대한 내용은 포함되어 있지 않습니다. 따라서 질문에 포함된 두 과정의 차이를 비교해 드릴 수 없습니다. 문서에 명시된 이미지 추가 과정은 다음과 같습니다. 1. UI 에디터를 연 뒤, **UIGroup**을 클릭합니다. 2. 왼쪽 기본 도구에서 **[이미지]** 버튼을 클릭하여 이미지 UI를 추가합니다. 삭제 과정에 대해서는 참고 문서에 해당 정보가 없으므로 답변할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 텍스트 박스가 조금 더 돋보이도록 메소 이미지를 추가하겠습니다. 1. UI 에디터를 연 뒤, **UIGroup**을 클릭합니다. 2. 왼쪽 기본 도구에서 **[이미지]** 버튼을 클릭하여 이미지 UI를 추가합니다. 3. 추가한 이미지의 프로퍼티 에디터에서 **SpriteGUIRendererComponent**의 **ImageRUID** 오른쪽 버튼을 클릭하여 **Resource Picker** 창을 엽니다. * RUID:fd255d50cb5177545a0e71c4a84 4. 프로퍼티 에디터 - **UITr
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 클라이언트에서 내 캐릭터 정보를 가져오는 LocalPlayer와 서버에서 특정 유저를 찾는 방식의 차이점이 무엇인지 [answer] | `LocalPlayer`와 서버에서 특정 유저를 찾는 방식은 실행 공간(클라이언트/서버)과 접근 대상이 다르기 때문에 명확한 차이가 있습니다. ### 1. LocalPlayer (클라이언트 전용) * **실행 공간:** **클라이언트**에서만 사용 가능합니다. 서버 스크립트에서는 접근할 수 없습니다. * **목적:** 현재 **내 캐릭터**(로그인한 본인)의 엔티티를 직접 가져옵니다. * **접근 방식:** `_UserService.LocalPlayer` 프로퍼티를 통해 접근합니다. * **특징:** "특정 클라이언 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **LocalPlayer**는 클라이언트에서 내 유저 엔티티를 얻을 수 있는 프로퍼티입니다. 특정 클라이언트에서 내 캐릭터라는 개념은 클라이언트에서만 유효합니다. 그러므로 서버에서는 사용할 수 없고 반드시 클라이언트에서만 사용할 수 있습니다. **UserEnterEventType**은 서버에서만 발생하기 때문에, 클라이언트에서 실행할 수 있는 함수를 하나 추가하여 유저가 게임에 들어올 때마다 내 캐릭터의 이름을 출력하는 코드를 작성해 줍니다. ```lua Method: [client] void PrintLocalPlayerNam
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 맵 생성과 관리 [question] | Hierarchy와 Map List 두 가지 방법을 비교하여 맵 생성, 복제, 삭제, 불러오기, 시작 맵 설정, 출시 여부 변경의 절차 차이를 표로 정리하세요. [answer] | 참고 문서에 따르면, 맵 관리 절차는 **Hierarchy - maps** 하위 엔트리의 콘텍스트 메뉴와 **Window - Map List** 창을 통해 수행할 수 있으며, 각 방법의 절차 차이는 다음과 같습니다. | 관리 항목 | Hierarchy - maps | Map List | | :--- | :--- | :--- | | **새 맵 만들기** | `maps`의 콘텍스트 메뉴에서 **Create New Map** 클릭 | 1. 창 하단에서 **[새 맵 만들기]** 버튼 클릭<br>2. 또는 맵의 콘텍스트 메뉴에서 **[추가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 다양한 맵은 월드를 탐험하는 유저들에게 다채로운 재미를 선사합니다. 이번 과정에서는 맵 생성과 관리 방법을 알아봅시다. # 맵 관리 방법 맵 관리 방법에는 2가지가 있습니다. * **Hierarchy - maps** 하위 엔트리의 콘텍스트 메뉴를 통해 관리 * **Window - Map List** 창에서 관리 # 새 맵 만들기 | Hierarchy | Map List | | ----------- | ------- | | **Hierarchy - maps**의 콘텍스트 메뉴에서 **Create New M
[task] | code [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | `HandleUserEnterEvent`에서 `_EntityService:GetEntityByPath("/maps/map01").MapComponent`를 통해 map01의 MapComponent를 얻은 뒤, 이를 `_UserService:GetUsersByMapComponent()`에 전달해 해당 맵 내 유저 배열을 순회하며 로그를 기록하는 스크립트를 작성해줘. [answer] | 요청하신 기능은 `UserService`의 `UserEnterEvent`를 처리하는 이벤트 핸들러에서 구현할 수 있습니다. 1. `_EntityService:GetEntityByPath("/maps/map01")`을 호출하여 map01 엔티티를 가져오고, 해당 엔티티의 `.MapComponent` 프로퍼티를 통해 맵 컴포넌트를 추출합니다. 2. 추출한 `mapComponent`를 매개변수로 `_UserService:GetUsersByMapComponent()` 함수에 전달하여 map01에 현재 위치해 있는 유저 엔티티 배열(` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `GetUsersByMapComponent()` 역시 특정 맵에 있는 유저 엔티티를 얻어오는 함수입니다. 특정 맵의 **mapId**가 아닌 **mapComponent**를 매개 변수로 넘겨줍니다. 다음은 map01에 있는 모든 유저를 `GetUsersByMapComponent()`로 받아오는 코드입니다. **UserEnterEvent**을 다음과 같이 수정합니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) {
[task] | instruction_following [pass] | ⏳ 미판정 [title] | UI 제작하기 [question] | UI 에디터에서 환영 메시지 UI를 만들기 위한 텍스트 박스 추가부터 DefaultShow 활성화까지의 과정을 단계별 번호 목록으로 작성하세요. [answer] | UI 에디터에서 환영 메시지 UI를 만들기 위한 텍스트 박스 추가부터 DefaultShow 활성화까지의 과정은 다음과 같습니다. 1. 오른쪽 하단의 버튼을 눌러 새로운 그룹을 추가합니다. 새로운 그룹이 추가되면 **UIGroup**이 생성되고, 그룹 선택 창에서 **UIGroup**이 선택됩니다. 2. 왼쪽 기본 도구에서 텍스트 박스 추가 버튼을 클릭하여 추가한 **UIGroup**에 텍스트 박스를 추가합니다. 텍스트 박스가 화면 중앙에 배치됩니다. 3. **프로퍼티 에디터 - UITransformComponent**에서 텍스트 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드 메이커에서는 UI를 편집할 수 있는 **UI 에디터**를 제공합니다. UI 에디터를 활용해 캐릭터의 이름이나 스탯 창, 채팅 창 등을 구현할 수 있습니다. 또한 게임의 생동감을 살리는 연출도 만들 수 있습니다. UI 에디터의 기본 기능인 **이미지**와 **텍스트**를 사용해 화면 상단에 환영 메시지 UI를 만들어 봅시다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [기본 UI 컴포넌트](/docs?postId=744) * [UI 엔티티 제어하기](/do
[task] | two_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | `UserService` 이벤트 핸들러에서 전달되는 `event` 객체의 구조와, 이를 통해 유저의 `UserId`를 얻어오는 방식에 대해 설명해 주세요. [answer] | `UserService` 이벤트 핸들러에서 전달되는 `event` 객체는 해당 이벤트에 따라 `UserEnterEvent` 또는 `UserLeaveEvent` 타입으로 선언되며, 이 객체의 `.UserId` 프로퍼티를 통해 현재 입장하거나 퇴장한 유저의 고유 식별자(`UserId`)를 직접 접근할 수 있습니다. 구체적인 구조와 사용 방식은 다음과 같습니다: 1. **이벤트 객체 구조**: - `UserEnterEvent`: 유저가 월드에 **입장**할 때 발생합니다. - `UserLeaveEvent`: 유저가 월드에서 [followup] | 만약 유저가 월드에 여러 명 입장하는 경우 이벤트가 각각 독립적으로 처리되는지, 그리고 `event.UserId` 변수를 로컬 변수로 선언하는 것이 필수적인 이유를 코드 예시를 통해 설명해 주세요. [followup_answer] | 참고 문서에 따르면, `UserService`의 `UserEnterEvent`와 `UserLeaveEvent`는 유저가 월드에 **입장하거나 퇴장할 때마다** 각각 발생하도록 설계되어 있습니다. 따라서 여러 명이 동시에 또는 순차적으로 입장하더라도, 각 유저의 입장/퇴장 시점에 해당 유저에 대한 이벤트가 독립적으로 트리거됩니다. `event.UserId`를 로컬 변수(`local`)로 선언하는 것은 Lua 5.3 문법상 **변수 스코프를 제한**하기 위해 필수적입니다. 1. **독립적 처리**: 각 이벤트 발생 시 `event` [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `UserService`를 통해 상황별로 **UserEntity**를 받는 방법을 알아봅니다. 간단한 스크립트 예제를 통해 `UserService`가 제공하는 기능을 알아보겠습니다. # 들어가기에 앞서 다음 가이드를 먼저 학습하면 본 과정을 이해하는 데 많은 도움이 됩니다. [서버와 클라이언트](/docs?postId=207) [실행 제어](/docs?postId=210) [Event System](/docs?postId=73) [Entity Event System](/docs?postId=176) # 예
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | `ItemDelete` 스크립트에서 `TriggerBodyEntity` 변수가 어떤 컴포넌트 데이터를 참조하는지 3문장 이내로 설명하세요. [answer] | `TriggerBodyEntity`는 트리거 영역에 들어온 캐릭터 엔티티를 참조합니다. 이 변수를 통해 `InventoryComponent`에 접근하여 인벤토리 데이터를 조회합니다. 최종적으로 해당 엔티티의 모든 아이템을 삭제하는 데 사용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Preset List**에서 임의의 엔티티를 배치합니다. 그리고 **ItemDelete**라는 이름의 스크립트 컴포넌트를 추가합니다. **ItemDelete** 스크립트를 열고, **TriggerEnterEvent**를 추가합니다. 그리고 아래와 같이 내용을 작성합니다. ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity
[task] | single_turn [pass] | ⏳ 미판정 [title] | UI 제작하기 [question] | 이미지 UI를 추가했는데 테스트 시 화면에 보이지 않을 때, 가장 먼저 확인해야 할 프로퍼티 설정은 무엇인가요? [answer] | 테스트 시 화면에 이미지 UI가 보이지 않을 때, 가장 먼저 확인해야 할 프로퍼티는 **UITransformComponent**의 **Pos X**와 **Pos Y** 값입니다. 참고 문서의 예시에서는 이미지가 화면에 보이도록 `Pos X = -257`, `Pos Y = 403`으로 설정되어 있습니다. 이 좌표 값이 현재 UI 그룹의 가시 영역 밖을 벗어나거나, 다른 UI 요소 뒤에 가려져 있을 경우 화면에 보이지 않을 수 있습니다. 따라서 먼저 `UITransformComponent`의 위치(Pos X, Pos Y)가 의도한 대 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 텍스트 박스가 조금 더 돋보이도록 메소 이미지를 추가하겠습니다. 1. UI 에디터를 연 뒤, **UIGroup**을 클릭합니다. 2. 왼쪽 기본 도구에서 **[이미지]** 버튼을 클릭하여 이미지 UI를 추가합니다. 3. 추가한 이미지의 프로퍼티 에디터에서 **SpriteGUIRendererComponent**의 **ImageRUID** 오른쪽 버튼을 클릭하여 **Resource Picker** 창을 엽니다. * RUID:fd255d50cb5177545a0e71c4a84 4. 프로퍼티 에디터 - **UITr
[task] | single_turn [pass] | ⏳ 미판정 [title] | UI 제작하기 [question] | 텍스트 박스와 이미지를 함께 배치할 때, 이미지 UI가 텍스트 뒤에 겹치지 않도록 하려면 UIGroup 내에서의 순서나 설정을 어떻게 바꿔야 하나요? [answer] | 제공된 참고 문서에는 이미지 UI와 텍스트 박스의 **레이어 순서(겹침 방지)나 Z-Index, Draw Order와 같은 순서 설정에 대한 정보가 포함되어 있지 않습니다.** 문서에서는 다음과 같은 내용만 설명하고 있습니다: 1. `UIGroup`을 선택합니다. 2. 기본 도구에서 **[이미지]** 버튼을 클릭하여 이미지 UI를 추가합니다. 3. `SpriteGUIRendererComponent`의 `ImageRUID`를 설정합니다. 4. `UITransfromComponent`에서 `Pos X`, `Pos Y`, `Width` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 텍스트 박스가 조금 더 돋보이도록 메소 이미지를 추가하겠습니다. 1. UI 에디터를 연 뒤, **UIGroup**을 클릭합니다. 2. 왼쪽 기본 도구에서 **[이미지]** 버튼을 클릭하여 이미지 UI를 추가합니다. 3. 추가한 이미지의 프로퍼티 에디터에서 **SpriteGUIRendererComponent**의 **ImageRUID** 오른쪽 버튼을 클릭하여 **Resource Picker** 창을 엽니다. * RUID:fd255d50cb5177545a0e71c4a84 4. 프로퍼티 에디터 - **UITr
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | 문서에 제시된 코드에서 캐릭터의 인벤토리 아이템을 모두 삭제하는 로직이 포함된 `HandleTriggerEnterEvent` 함수의 mLua 코드 블록만 출력하세요. [answer] | ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity -------------------------------------------------------- local inventory = TriggerBodyEntity.InventoryComponent local items = inventory:GetItemList() [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Preset List**에서 임의의 엔티티를 배치합니다. 그리고 **ItemDelete**라는 이름의 스크립트 컴포넌트를 추가합니다. **ItemDelete** 스크립트를 열고, **TriggerEnterEvent**를 추가합니다. 그리고 아래와 같이 내용을 작성합니다. ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity
[task] | single_turn [pass] | ⏳ 미판정 [title] | UI 제작하기 [question] | UIGroup에서 이미지 UI를 추가할 때 Resource Picker를 통해 RUID를 설정하는 구체적인 위치와 방법은 무엇인가요? [answer] | UIGroup에서 이미지 UI를 추가하고 Resource Picker를 통해 RUID를 설정하는 구체적인 위치와 방법은 다음과 같습니다. 1. **UI 에디터에서 UIGroup 선택**: UI 에디터를 연 뒤, **UIGroup**을 클릭합니다. 2. **이미지 UI 추가**: 왼쪽 기본 도구에서 **[이미지]** 버튼을 클릭하여 이미지 UI를 추가합니다. 3. **Resource Picker 열기**: 추가한 이미지의 프로퍼티 에디터에서 **SpriteGUIRendererComponent**를 찾습니다. 여기서 **Imag [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 텍스트 박스가 조금 더 돋보이도록 메소 이미지를 추가하겠습니다. 1. UI 에디터를 연 뒤, **UIGroup**을 클릭합니다. 2. 왼쪽 기본 도구에서 **[이미지]** 버튼을 클릭하여 이미지 UI를 추가합니다. 3. 추가한 이미지의 프로퍼티 에디터에서 **SpriteGUIRendererComponent**의 **ImageRUID** 오른쪽 버튼을 클릭하여 **Resource Picker** 창을 엽니다. * RUID:fd255d50cb5177545a0e71c4a84 4. 프로퍼티 에디터 - **UITr
[task] | single_turn [pass] | ⏳ 미판정 [title] | 맵 생성과 관리 [question] | Hierarchy의 maps 하위 엔트리와 Window의 Map List 창을 모두 사용할 수 있는데, 두 곳의 콘텍스트 메뉴에서 '새 맵 만들기'와 '복제' 버튼의 이름이 왜 다르게 표시되는 거야? [answer] | Hierarchy와 Map List 창은 맵을 관리하는 두 가지 다른 인터페이스이며, 각각의 메뉴 구조와 용어 체계가 다르기 때문에 버튼 이름이 다르게 표시됩니다. **Hierarchy - maps 하위 엔트리** * **새 맵 만들기:** `Create New Map` * **복제:** `Duplicate` **Window - Map List 창** * **새 맵 만들기:** `[새 맵 만들기]` 버튼 (또는 맵의 콘텍스트 메뉴에서 `[추가하기]` 버튼) * **복제:** `Duplicate Map` 즉, Hi [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 다양한 맵은 월드를 탐험하는 유저들에게 다채로운 재미를 선사합니다. 이번 과정에서는 맵 생성과 관리 방법을 알아봅시다. # 맵 관리 방법 맵 관리 방법에는 2가지가 있습니다. * **Hierarchy - maps** 하위 엔트리의 콘텍스트 메뉴를 통해 관리 * **Window - Map List** 창에서 관리 # 새 맵 만들기 | Hierarchy | Map List | | ----------- | ------- | | **Hierarchy - maps**의 콘텍스트 메뉴에서 **Create New M
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | MyData라는 이름의 GlobalDataStorage를 생성하는 코드를 출력하고, 각 줄에 대해 설명은 주석으로만 작성하세요. [answer] | ```lua local MyData = _DataStorageService:GetGlobalDataStorage("MyData") -- "MyData"라는 이름의 GlobalDataStorage를 생성하거나 기존 것을 가져옵니다. ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임 중 변경된 데이터 값을 GlobalDataStorage에 저장하고 불러오는 방법에 대해 알아봅니다. # Data 생성 및 불러오기 GlobalDataStorage는 데이터의 저장과 불러오기를 할 수 있는 "보관소"라 할 수 있습니다. 우리는 데이터베이스에서 데이터를 저장하거나 불러올 일이 있을 때 이 "보관소"를 이용하면 됩니다. GlobalDataStorage는 `_DataStorageService:GetGlobalDataStorage`를 통해 생성하거나 불러오기가 가능합니다. GetGlobalDat
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | 아이템 테이블에 IconRUID 값을 입력하기 위해 이미지를 Workspace에 추가하고 RUID를 복사하는 구체적인 절차는 어떻게 되나요? [answer] | 아이템 테이블에 `IconRUID` 값을 입력하기 위한 이미지 추가 및 RUID 복사 절차는 다음과 같습니다. 1. **이미지 추가**: `Workspace`의 `MyDesk`에서 우클릭(컨텍스트 메뉴)을 열고 **Import From - Import Image**를 선택하여 이미지를 추가합니다. 2. **RUID 복사**: 추가한 각 이미지의 컨텍스트 메뉴(우클릭)에서 **Copy RUID**를 클릭하여 RUID 값을 복사합니다. 3. **값 입력**: 복사한 RUID 값을 아이템 테이블(`UserItemDataSet`)의 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 아이템 생성과 삭제 기능을 알아봅니다. 제작할 예제는 다음과 같습니다. * 맵에 놓인 아이템을 먹을 때마다 인벤토리에 랜덤한 아이템이 생성 * 아이템을 먹으면, 5초 뒤 아이템이 놓여있던 자리에 다시 생성 * 맵에 놓인 다른 아이템을 먹을 때마다 인벤토리에 있는 모든 아이템 삭제 # 아이템 테이블 만들기 먼저 개별 아이템을 만들어 봅시다. 개별 아이템은 아이템 테이블에서 정의할 수 있습니다. 아이템 테이블은 **DataSet**으로 만듭니다. **Workspace - MyDesk**에서 콘
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | GlobalDataStorage 생성 시 name 매개 변수의 역할과 중복 시 동작 방식을 3문장 이내로 설명하세요. [answer] | `GetGlobalDataStorage` 함수에 전달되는 name 매개 변수는 각 GlobalDataStorage 인스턴스를 식별하는 고유한 이름 역할을 합니다. 동일한 name 값으로 함수를 호출하면 이전에 생성된 GlobalDataStorage 객체가 반환되어 중복 생성을 방지합니다. 이를 통해 데이터의 속성이나 용도에 따라 여러 개의 GlobalDataStorage를 구분하여 관리할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임 중 변경된 데이터 값을 GlobalDataStorage에 저장하고 불러오는 방법에 대해 알아봅니다. # Data 생성 및 불러오기 GlobalDataStorage는 데이터의 저장과 불러오기를 할 수 있는 "보관소"라 할 수 있습니다. 우리는 데이터베이스에서 데이터를 저장하거나 불러올 일이 있을 때 이 "보관소"를 이용하면 됩니다. GlobalDataStorage는 `_DataStorageService:GetGlobalDataStorage`를 통해 생성하거나 불러오기가 가능합니다. GetGlobalDat
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | 문서에서 안내하는대로 엔티티에 추가해야 하는 컴포넌트와 스크립트 이름, 그리고 테스트 시 기대되는 동작을 3단계 번호 목록으로 정리하세요. [answer] | 1. 엔티티에 추가해야 하는 컴포넌트는 `TriggerComponent`와 `ItemDelete` 스크립트 컴포넌트입니다. 2. 추가할 스크립트 컴포넌트의 이름은 `ItemDelete`입니다. 3. 테스트 시 기대되는 동작은 좌측에 배치된 엔티티에 캐릭터가 닿을 때마다 해당 캐릭터의 인벤토리에 추가된 모든 아이템이 삭제되는 것입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Preset List**에서 임의의 엔티티를 배치합니다. 그리고 **ItemDelete**라는 이름의 스크립트 컴포넌트를 추가합니다. **ItemDelete** 스크립트를 열고, **TriggerEnterEvent**를 추가합니다. 그리고 아래와 같이 내용을 작성합니다. ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | `_DataStorageService:GetGlobalDataStorage` 함수의 실행 공간 제약과 그 이유를 표로 정리해서 출력하세요. [answer] | `_DataStorageService:GetGlobalDataStorage` 함수의 실행 공간 제약과 그 이유는 다음과 같습니다. | 항목 | 내용 | | :--- | :--- | | **실행 공간 제약** | **Server Only** (서버 전용) | | **이유** | 데이터의 불러오기(Loading) 작업은 서버 공간에서 수행하는 것이 권장되기 때문입니다. | 따라서 이 함수를 사용하여 `GlobalDataStorage`를 생성하거나 기존 데이터를 불러올 때는 반드시 서버에서만 실행되어야 하는 `[server only] [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임 중 변경된 데이터 값을 GlobalDataStorage에 저장하고 불러오는 방법에 대해 알아봅니다. # Data 생성 및 불러오기 GlobalDataStorage는 데이터의 저장과 불러오기를 할 수 있는 "보관소"라 할 수 있습니다. 우리는 데이터베이스에서 데이터를 저장하거나 불러올 일이 있을 때 이 "보관소"를 이용하면 됩니다. GlobalDataStorage는 `_DataStorageService:GetGlobalDataStorage`를 통해 생성하거나 불러오기가 가능합니다. GetGlobalDat
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | MaxStackCount나 EffectAmount처럼 숫자 형태의 데이터를 아이템 객체에 저장할 때 tonumber 함수를 사용해야 하는 이유는 무엇인가요? [answer] | `tonumber` 함수를 사용하는 이유는 아이템 테이블(DataSet)에서 데이터를 가져올 때 숫자 값이 문자열(string) 형태로 전달되기 때문입니다. 문서에서 제공된 `OnCreate()` 예제를 보면, `self.ItemTableData:GetItem("MaxStackCount")`와 `self.ItemTableData:GetItem("EffectAmount")`를 호출한 결과가 `tonumber()` 함수의 인자로 전달되고 있습니다. 이는 `GetItem` 메서드가 반환하는 값이 기본적으로 문자열 타입이므로, 실제 숫자 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 아이템 생성과 삭제 기능을 알아봅니다. 제작할 예제는 다음과 같습니다. * 맵에 놓인 아이템을 먹을 때마다 인벤토리에 랜덤한 아이템이 생성 * 아이템을 먹으면, 5초 뒤 아이템이 놓여있던 자리에 다시 생성 * 맵에 놓인 다른 아이템을 먹을 때마다 인벤토리에 있는 모든 아이템 삭제 # 아이템 테이블 만들기 먼저 개별 아이템을 만들어 봅시다. 개별 아이템은 아이템 테이블에서 정의할 수 있습니다. 아이템 테이블은 **DataSet**으로 만듭니다. **Workspace - MyDesk**에서 콘
[task] | two_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 유저 입장/퇴장 이벤트 외에 `UserService`가 제공하는 다른 이벤트(예: 접속 끊김/재접속)나 기능을 활용하고 싶은데, 현재 문서에 명시된 정보 범위 내에서 어떤 추가적인 처리를 할 수 있는지 알려주세요. [answer] | 제시된 문서 내용만을 기준으로 답변드립니다. 문서에 명시된 `UserService`의 기능과 이벤트는 다음과 같습니다. 1. **사용 가능한 이벤트** * `UserEnterEvent`: 유저가 월드에 **입장**할 때 발생합니다. * `UserLeaveEvent`: 유저가 월드에서 **퇴장**할 때 발생합니다. * **참고:** 질문하신 '접속 끊김' 또는 '재접속'에 대한 개별 이벤트(예: `UserDisconnectEvent`, `UserReconnectEvent`)는 현재 문서에 **명시 [followup] | 문서의 마지막 단락에 언급된 '유저 접속 끊김/재접속 이벤트'에 대한 구체적인 코드 구현 방법이나, 현재 문서에 없는 해당 이벤트의 API 명세는 어디에서 확인해야 하는지 가이드해 주세요. [followup_answer] | 제시된 참고 문서에는 **'유저 접속 끊김/재접속 이벤트'**에 대한 구체적인 코드 구현 방법, API 명세, 또는 해당 이벤트의 핸들러 이름이 **포함되어 있지 않습니다.** 문서에서는 해당 단락 제목만 존재할 뿐, 실제 이벤트 이름(예: `UserDisconnectEvent` 등)이나 `_UserService`를 통해 접속 끊김/재접속을 처리하는 구체적인 코드 예시는 제공하지 않습니다. 따라서 현재 문서 범위 내에서 확인할 수 있는 `UserService`의 이벤트는 오직 **`UserEnterEvent`**(입장)와 **` [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `UserService`를 통해 상황별로 **UserEntity**를 받는 방법을 알아봅니다. 간단한 스크립트 예제를 통해 `UserService`가 제공하는 기능을 알아보겠습니다. # 들어가기에 앞서 다음 가이드를 먼저 학습하면 본 과정을 이해하는 데 많은 도움이 됩니다. [서버와 클라이언트](/docs?postId=207) [실행 제어](/docs?postId=210) [Event System](/docs?postId=73) [Entity Event System](/docs?postId=176) # 예
[task] | code [pass] | ⏳ 미판정 [title] | UI 제작하기 [question] | UIGroup에 포함된 SpriteGUIRendererComponent의 ImageRUID를 RUID:fd255d50cb5177545a0e71c4a84로 설정하고, UITransfromComponent의 Pos X를 -257, Pos Y를 403, Width를 70, Height를 70으로 초기화하는 OnBeginPlay 스크립트를 작성해줘. [answer] | UIGroup에 포함된 스프라이트 UI의 `ImageRUID`를 특정 리소스 ID로 설정하고, `UITransformComponent`의 위치와 크기를 초기화하는 `OnBeginPlay` 스크립트입니다. 참고: `UITransformComponent`의 `Position` 속성은 `Vector2` 타입이며, `Width`와 `Height`는 별도의 프로퍼티로 접근할 수 있습니다. 문서 예시에서는 `anchoredPosition`을 사용하기도 하지만, 질문에서 요청한 Pos X, Pos Y, Width, Height 값을 직접 설정 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 텍스트 박스가 조금 더 돋보이도록 메소 이미지를 추가하겠습니다. 1. UI 에디터를 연 뒤, **UIGroup**을 클릭합니다. 2. 왼쪽 기본 도구에서 **[이미지]** 버튼을 클릭하여 이미지 UI를 추가합니다. 3. 추가한 이미지의 프로퍼티 에디터에서 **SpriteGUIRendererComponent**의 **ImageRUID** 오른쪽 버튼을 클릭하여 **Resource Picker** 창을 엽니다. * RUID:fd255d50cb5177545a0e71c4a84 4. 프로퍼티 에디터 - **UITr
[task] | code [pass] | ⏳ 미판정 [title] | 맵 생성과 관리 [question] | _EntityService 로 "/maps/map01/obj" 경로의 엔티티를 조회하여 OnUpdate 메서드에서 매 프레임마다 Position 을 수정해 이동시키는 스크립트를 작성해줘 [answer] | `_EntityService:GetEntityByPath`를 사용하여 지정된 경로에 있는 엔티티를 가져오고, `OnUpdate`에서 매 프레임마다 `TransformComponent.Position`을 수정하여 이동시키는 스크립트는 다음과 같습니다. ```lua Property: [None] Entity TargetEntity = nil number MoveSpeed = 5.0 Method: [server only] void OnBeginPlay() { self.TargetEntity = _EntityService:Get [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 다양한 맵은 월드를 탐험하는 유저들에게 다채로운 재미를 선사합니다. 이번 과정에서는 맵 생성과 관리 방법을 알아봅시다. # 맵 관리 방법 맵 관리 방법에는 2가지가 있습니다. * **Hierarchy - maps** 하위 엔트리의 콘텍스트 메뉴를 통해 관리 * **Window - Map List** 창에서 관리 # 새 맵 만들기 | Hierarchy | Map List | | ----------- | ------- | | **Hierarchy - maps**의 콘텍스트 메뉴에서 **Create New M
[task] | single_turn [pass] | ⏳ 미판정 [title] | 맵 생성과 관리 [question] | 시작 맵과 게임 시작 위치가 서로 다른 개념인데, 테스트 모드와 실제 출시 후 플레이어가 진입하는 위치가 어떻게 달라지는지 설명해줄 수 있어? [answer] | 시작 맵과 게임 시작 위치는 월드 실행 방식에 따라 적용되는 위치가 다른 개념입니다. **1. 시작 맵 (Starting Map)** * **정의:** 출시된 월드를 실제 플레이어가 실행했을 때, 아바타가 처음 진입하는 맵입니다. * **기본값:** `map01`이 기본 시작 맵으로 설정되어 있습니다. * **변경 방법:** Hierarchy의 `maps` 하위 맵의 콘텍스트 메뉴에서 **Set Starting Map**을 클릭하거나, Window - Map List 창에서 해당 맵의 **시작 맵** 버튼을 클릭하여 변 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 다양한 맵은 월드를 탐험하는 유저들에게 다채로운 재미를 선사합니다. 이번 과정에서는 맵 생성과 관리 방법을 알아봅시다. # 맵 관리 방법 맵 관리 방법에는 2가지가 있습니다. * **Hierarchy - maps** 하위 엔트리의 콘텍스트 메뉴를 통해 관리 * **Window - Map List** 창에서 관리 # 새 맵 만들기 | Hierarchy | Map List | | ----------- | ------- | | **Hierarchy - maps**의 콘텍스트 메뉴에서 **Create New M
[task] | two_turn [pass] | ⏳ 미판정 [title] | 맵 생성과 관리 [question] | 새 맵 생성 시 이름의 번호가 오름차순으로 생성되는 특성과, 복제(Duplicate) 및 삭제(Delete) 동작 시 저장 안내 창이 뜨는 조건은 어떻게 되나요? [answer] | 새 맵을 생성할 때 맵 이름에 포함된 번호는 오름차순으로 자동 생성됩니다. 복제(Duplicate) 및 삭제(Delete) 작업과 관련하여 저장 안내 창이 뜨는 조건은 다음과 같습니다. * **복제(Duplicate):** 문서에 복제 작업 시 저장 안내 창이 뜬다는 명시적인 내용이 없습니다. * **삭제(Delete):** 문서에 삭제 작업 시 저장 안내 창이 뜬다는 명시적인 내용이 없습니다. * **변경 사항:** 맵의 이름 변경 등 **변경 사항**이 있을 때 저장 안내 창이 뜹니다. 참고로, 시작 맵과 현재 [followup] | 맵을 복제하거나 삭제할 때 Hierarchy의 콘텍스트 메뉴와 Map List 창의 메뉴명(Duplicate vs Duplicate Map, Delete vs Delete Map)이 다른 이유와, 변경 사항 저장 안내가 뜰 때의 구체적인 시나리오를 알고 싶습니다. [followup_answer] | Hierarchy의 콘텍스트 메뉴와 Map List 창의 메뉴명이 다른 이유에 대해서는 문서에 명시된 내용이 없습니다. 두 창은 각각 다른 위치에서 맵을 관리하기 위한 독립적인 인터페이스로 제공되며, 메뉴 이름은 각 창 자체의 UI 컨벤션에 따라 'Duplicate'와 'Duplicate Map', 'Delete'와 'Delete Map'으로 다르게 표기되어 있습니다. 변경 사항 저장 안내 창이 뜨는 구체적인 시나리오는 다음과 같습니다. * **맵 이름 변경:** 새 맵을 생성하거나 기존 맵의 이름을 변경하는 등 맵 정보에 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 다양한 맵은 월드를 탐험하는 유저들에게 다채로운 재미를 선사합니다. 이번 과정에서는 맵 생성과 관리 방법을 알아봅시다. # 맵 관리 방법 맵 관리 방법에는 2가지가 있습니다. * **Hierarchy - maps** 하위 엔트리의 콘텍스트 메뉴를 통해 관리 * **Window - Map List** 창에서 관리 # 새 맵 만들기 | Hierarchy | Map List | | ----------- | ------- | | **Hierarchy - maps**의 콘텍스트 메뉴에서 **Create New M
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | UIInventory 컴포넌트의 InventoryBtnPath가 비어있을 때 정상적인 경로를 설정하기 위해 햄버거 메뉴에서 실행해야 하는 특정 옵션은 무엇인가요? [answer] | UIInventory 컴포넌트의 InventoryBtnPath가 비어 있을 때 정상적인 경로를 설정하기 위해 햄버거 메뉴에서 실행해야 하는 옵션은 **Reset All Properties**입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이번에는 생성된 아이템을 표시할 인벤토리 UI를 추가합니다. 상단 메뉴에 버튼을 눌러 UI 에디터를 엽니다. **Preset List**에서 **[인벤토리]**, **[버튼모음]** UI를 추가합니다. 만일 **Inventory** 엔티티의 **UIInventory** 컴포넌트에 **InventoryBtnPath**가 비어있으면, 햄버거 메뉴를 열어 **Reset All Properties**를 선택합니다. 그러면 아래와 같이 정상적인 경로가 설정됩니다. # 아이템 엔티티 배치 및 기능 추가 버튼을 눌러 UI 편집모드를
[task] | code [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | ItemType 은 Potion 으로 설정하고, OnCreate() 함수에서 self.ItemTableData:GetItem("EffectAmount") 로 데이터를 읽어와 프로퍼티에 저장하는 스크립트를 작성해줘 [answer] | 요청하신 `Potion` ItemType 스크립트는 다음과 같습니다. `OnCreate()` 함수에서 아이템 테이블의 `EffectAmount` 데이터를 읽어와 프로퍼티에 저장하는 로직을 포함했습니다. ```lua Property: [None] string Name [None] number MaxStackCount [None] number EffectAmount Method: void OnCreate() { self.Name = self.ItemTableData:GetItem("Name") self.MaxStack [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 아이템 생성과 삭제 기능을 알아봅니다. 제작할 예제는 다음과 같습니다. * 맵에 놓인 아이템을 먹을 때마다 인벤토리에 랜덤한 아이템이 생성 * 아이템을 먹으면, 5초 뒤 아이템이 놓여있던 자리에 다시 생성 * 맵에 놓인 다른 아이템을 먹을 때마다 인벤토리에 있는 모든 아이템 삭제 # 아이템 테이블 만들기 먼저 개별 아이템을 만들어 봅시다. 개별 아이템은 아이템 테이블에서 정의할 수 있습니다. 아이템 테이블은 **DataSet**으로 만듭니다. **Workspace - MyDesk**에서 콘
[task] | two_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | Preset List에서 배치한 엔티티에 ItemDelete 스크립트와 TriggerComponent를 연결해 아이템을 삭제하는 기본 로직은 어떻게 구성되나요? [answer] | Preset List에서 배치한 엔티티에 아이템 삭제 로직을 적용하기 위해서는 해당 엔티티에 `TriggerComponent`와 `ItemDelete` 스크립트 컴포넌트를 동시에 부착해야 합니다. `ItemDelete` 스크립트 컴포넌트 내부에는 캐릭터가 트리거 영역에 진입할 때 발생하는 `TriggerEnterEvent`를 처리하는 이벤트 핸들러를 구현합니다. 이 핸들러는 이벤트에서 전달된 `TriggerBodyEntity`(트리거에 닿은 대상 엔티티, 즉 플레이어 캐릭터)의 `InventoryComponent`에 접근하여 인벤 [followup] | HandleTriggerEnterEvent에서 _ItemService:RemoveItem(item)을 호출할 때, 인벤토리에 등록된 모든 아이템을 순회하며 삭제하는 과정이 정상 동작하려면 TriggerBodyEntity.InventoryComponent 접근 시 주의해야 할 점이나 예외 처리는 없나요? [followup_answer] | 제시된 참고 문서에는 `TriggerBodyEntity.InventoryComponent` 접근 시 주의할 점이나 `nil` 체크, 예외 처리에 대한 내용이 포함되어 있지 않습니다. 문서에 명시된 코드는 `TriggerBodyEntity.InventoryComponent`를 직접 접근하고 `GetItemList()`를 호출한 후, 반환된 리스트를 `pairs`로 순회하며 `_ItemService:RemoveItem(item)`을 호출하는 구조만 제시하고 있으며, 컴포넌트가 존재하지 않거나 리스트가 비어 있을 때의 방어적 프로그래밍 [scores] | [judge_reason] | [source_doc] | **Preset List**에서 임의의 엔티티를 배치합니다. 그리고 **ItemDelete**라는 이름의 스크립트 컴포넌트를 추가합니다. **ItemDelete** 스크립트를 열고, **TriggerEnterEvent**를 추가합니다. 그리고 아래와 같이 내용을 작성합니다. ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | OnCreate 함수 안에서 아이템 테이블의 컬럼 값을 가져올 때 self.ItemTableData:GetItem("컬럼명") 형식으로 접근해야 하는 이유는 무엇인가요? [answer] | `OnCreate()` 함수는 아이템 객체가 생성되는 시점에 호출되며, 이 과정에서 아이템 테이블(DataSet)에 정의된 데이터가 아이템 객체로 전달됩니다. 전달된 테이블 데이터를 아이템 객체 내부에서 직접 변수로 접근하는 것이 아니라 `self.ItemTableData:GetItem("컬럼명")` 형식을 사용해야 하는 이유는 다음과 같습니다. 1. **데이터 전달 매개체 역할**: 아이템 테이블에 저장된 원본 데이터는 `self.ItemTableData`라는 객체를 통해 아이템 스크립트에 전달됩니다. 2. **동적 접근 방식 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 아이템 생성과 삭제 기능을 알아봅니다. 제작할 예제는 다음과 같습니다. * 맵에 놓인 아이템을 먹을 때마다 인벤토리에 랜덤한 아이템이 생성 * 아이템을 먹으면, 5초 뒤 아이템이 놓여있던 자리에 다시 생성 * 맵에 놓인 다른 아이템을 먹을 때마다 인벤토리에 있는 모든 아이템 삭제 # 아이템 테이블 만들기 먼저 개별 아이템을 만들어 봅시다. 개별 아이템은 아이템 테이블에서 정의할 수 있습니다. 아이템 테이블은 **DataSet**으로 만듭니다. **Workspace - MyDesk**에서 콘
[task] | code [pass] | ⏳ 미판정 [title] | 맵 생성과 관리 [question] | 시작 버튼 클릭 시 _UserService 의 HandleUserEnterEvent(UserEnterEvent event) 를 통해 유저가 맵에 진입하면 _TimerService:SetTimerOnce(fn, sec) 로 1초 후 포탈의 TargetPortal 참조 값을 확인하고 log() 로 출력하는 스크립트를 작성해줘 [answer] | ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { local UserId = event.UserId _TimerService:SetTimerOnce(function() local portalEntity = _EntityService:GetEntityByPath("/maps/map01/obj") local targetPortal = portalEntity.TargetPortal [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 1. 연결하려는 맵에 포탈을 설치합니다. 2. 포탈의 프로퍼티 에디터에서 **TargetPortal**의 **[◉]** 버튼을 클릭합니다. 이후 **Reference** 팝업 창에서 이동할 포탈을 선택합니다. 3. **[시작]** 버튼을 클릭한 뒤, 출발 포탈에서 도착 포탈로 잘 이동하는지 확인합니다. # 마무리 좋은 맵의 크기와 개수는 정해진 답이 없습니다. 크리에이터의 기획에 맞게 여러 개의 맵을 만들거나, 하나의 커다란 맵을 만들어도 좋습니다. 그러나 맵이 너무 거대하거나 배치된 오브젝트가 많으면 로딩 및 플
[task] | code [pass] | ⏳ 미판정 [title] | 맵 생성과 관리 [question] | 시작 맵인 map01에 유저가 진입할 때 _UserService 의 UserEnterEvent 를 처리하여 해당 유저의 아바타를 _EntityService 로 조회하고, _SpawnService 를 이용해 지정된 좌표에 NPC 를 생성하는 스크립트를 작성해줘 [answer] | 참고 문서에 포함된 mLua 예제를 분석한 결과, 요청하신 작업 중 **`_SpawnService` 를 이용해 좌표에 NPC 를 생성하는 부분**에 해당하는 API 나 코드 예제가 문서에 존재하지 않습니다. 문서에는 `_EntityService` 로 엔티티 조회하고 `_UserService` 로 유저 정보를 얻는 방법은 나와 있지만, `_SpawnService` 의 사용법이나 시그니처, NPC 생성 관련 API 에 대한 설명이 없으므로 해당 부분은 코드에 포함할 수 없습니다. 따라서 문서에 근거하여 작성할 수 있는 범위(시작 맵 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 다양한 맵은 월드를 탐험하는 유저들에게 다채로운 재미를 선사합니다. 이번 과정에서는 맵 생성과 관리 방법을 알아봅시다. # 맵 관리 방법 맵 관리 방법에는 2가지가 있습니다. * **Hierarchy - maps** 하위 엔트리의 콘텍스트 메뉴를 통해 관리 * **Window - Map List** 창에서 관리 # 새 맵 만들기 | Hierarchy | Map List | | ----------- | ------- | | **Hierarchy - maps**의 콘텍스트 메뉴에서 **Create New M
[task] | two_turn [pass] | ⏳ 미판정 [title] | 맵 생성과 관리 [question] | 출시 대상에서 맵을 제외(Exclude from Released Map)하는 경우와 다시 포함(Add Map to Publish)하는 경우의 아이콘 변화와, 공동 제작 환경에서의 권한 제한은 어떻게 적용되나요? [answer] | 출시 대상에서 맵을 제외하거나 다시 포함할 때의 아이콘 변화와 공동 제작 환경에서의 권한 제한은 다음과 같이 적용됩니다. **아이콘 변화** * **제외(Exclude from Released Map):** 맵을 출시 대상에서 제외하면 해당 맵의 **출시 아이콘이 보이지 않습니다.** * **다시 포함(Add Map to Publish):** 출시 제외했던 맵을 다시 출시 대상에 포함하려면 해당 맵의 콘텍스트 메뉴에서 **Add Map to Publish**를 클릭합니다. (참고 문서에는 다시 포함 시 아이콘이 다시 표시된 [followup] | 시작 맵을 출시 대상에서 제외할 수 없는 제약 사항과, 출시 제외된 맵을 시작 맵으로 변경했을 때 자동으로 출시 대상에 포함되는 로직에 대해 자세히 설명해 주세요. [followup_answer] | 시작 맵의 출시 대상 제외 제약과 관련된 로직은 다음과 같이 적용됩니다. **1. 시작 맵의 출시 대상 제외 불가** 시작 맵은 출시 대상에서 제외할 수 없습니다. 이는 시작 맵이 출시한 월드를 실행했을 때 플레이어 아바타가 처음 들어가는 맵이기 때문에, 출시 대상에서 제외되는 경우 월드 진입 자체가 불가능해지는 문제를 방지하기 위한 제약 사항입니다. **2. 출시 제외 맵을 시작 맵으로 변경 시 자동 포함** 출시 대상에서 제외되어 있던 맵을 시작 맵으로 변경하면, 해당 맵은 자동으로 출시 대상에 다시 포함됩니다. 즉, 시작 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 다양한 맵은 월드를 탐험하는 유저들에게 다채로운 재미를 선사합니다. 이번 과정에서는 맵 생성과 관리 방법을 알아봅시다. # 맵 관리 방법 맵 관리 방법에는 2가지가 있습니다. * **Hierarchy - maps** 하위 엔트리의 콘텍스트 메뉴를 통해 관리 * **Window - Map List** 창에서 관리 # 새 맵 만들기 | Hierarchy | Map List | | ----------- | ------- | | **Hierarchy - maps**의 콘텍스트 메뉴에서 **Create New M