[task] | two_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | `MoveUsersToStaticRoom()` 함수를 사용하여 게임 종료 후 유저를 정적 룸으로 이동시키는 원리와 기본 사용법을 설명해 주세요. [answer] | `MoveUsersToStaticRoom()` 함수는 게임이 끝난 맵(인스턴스 맵)에 남아있는 유저들을 정적 룸(일반 맵)으로 돌려보내기 위해 사용하는 함수입니다. ### 기본 원리 1. **대상 유저 목록 확보**: 현재 인스턴스 맵에 존재하는 모든 플레이어의 이름(또는 식별자)을 모아서 테이블로 구성합니다. * `_UserService.UserEntities`를 통해 현재 룸에 있는 유저 엔티티들을 조회할 수 있습니다. 2. **이동 실행**: `_RoomService:MoveUsersToStaticRoom(us [followup] | `InstanceGameManager` 스크립트 컴포넌트를 dungeon 맵에 추가하여 `_TimerService:SetTimerOnce` 로 10초 후 실행되도록 하는 구체적인 코드 예시를 보여주세요. [followup_answer] | `InstanceGameManager` 스크립트 컴포넌트를 dungeon 맵에 추가하고, `_TimerService:SetTimerOnce`를 사용하여 10초 후 유저를 정적 룸으로 이동시키는 구체적인 코드 예시는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { local playFunc = function() local users = {} -- 현재 룸에 존재하는 플레이어들을 가져옵니다. for k, v in pairs( [scores] | [judge_reason] | [source_doc] | #### 정적 룸으로 이동시키기 게임이 끝난 맵의 유저는 `MoveUsersToStaticRoom()` 함수를 활용해 정적 룸으로 돌아가게 만듭니다. 돌아갈 정적 맵을 지정하지 않으면 시작 맵으로 돌아갑니다. * **InstanceGameManager 스크립트 컴포넌트**를 생성, 작성한 뒤 dungeon 맵에 스크립트 컴포넌트를 추가합니다. ```lua Method: [server only] void OnBeginPlay() { local playFunc = function()
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | `Ready` 상태인 플레이어를 인스턴스 룸으로 이동시키는 과정에서 `_UserService.UserEntities` 를 반복하며 변수 `readyPlayers` 에 저장되는 데이터의 타입과 구조를 표로 정리하세요. [answer] | `_UserService.UserEntities` 를 반복하며 `readyPlayers` 테이블에 저장되는 데이터의 구조는 다음과 같습니다. 참고 문서의 코드를 분석하면, `readyPlayers` 는 **Player 이름(string)** 을 요소로 가지는 **배열 형태의 테이블(table)** 입니다. ### `readyPlayers` 데이터 구조 표 | 항목 | 내용 | | :--- | :--- | | **데이터 타입** | `table` (배열 구조) | | **요소 타입** | `string` | | **요소 내용** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임이 진행될 인스턴스 룸에 입장할 수 있는 유저를 정하는 조건을 만들어 유저를 이동시켜봅시다. 조건은 크리에이터의 기획에 따라 달라질 수 있습니다. 예시는 **'Ready' 버튼을 3명 이상의 유저가 누르면** 새로운 인스턴스 룸으로 이동시킵니다. 1. **GameManager 스크립트 컴포넌트**에 주기적으로 유저의 Ready 상태를 확인해, 인스턴스 룸으로 이동시키는 스크립트를 작성합니다. ```lua Property: [None] number checkReadyPlayerTimer = 0
[task] | code [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | RoomService:DestroyInstanceRoom을 사용하여 특정 Key로 구별된 인스턴스 룸을 안전하게 파괴하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `RoomService`가 인스턴스 룸을 생성, 파괴하거나 유저를 이동시킬 수 있다고 언급하고 있지만, **`DestroyInstanceRoom` 메서드의 정확한 시그니처(파라미터)나 사용 예제가 문서에 포함되어 있지 않습니다.** 따라서 문서에 근거하여 `DestroyInstanceRoom`을 사용하는 정확한 코드(예: `roomKey`를 파라미터로 전달하는지, `instanceRoom` 객체를 전달하는지 등)를 작성할 수 없습니다. 문서에 따르면 `RoomService`를 통해 인스턴스 룸을 파괴할 수 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | UseCustomeEquipOnly 프로퍼티의 활성/비활성 상태별 적용 결과를 3문장 이내로 요약해서 설명해 주세요. [answer] | `UseCustomeEquipOnly`가 비활성 상태에서는 유저가 원래 착용하고 있던 복장 중 크리에이터가 특정 항목(예: 롱코트)만 변경한 상태로 적용됩니다. 반면, 활성 상태에서는 크리에이터가 지정하지 않은 항목은 기본값으로 초기화되고 지정된 항목만 적용되어 모든 유저가 동일한 복장 구성으로 입장합니다. 따라서 모든 유저에게 동일한 아바타 외형을 적용하려면 해당 프로퍼티를 활성화해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아바타 구성을 살펴보고, 아바타의 장비를 교체하는 방법을 알아봅니다. 아바타의 구성을 이해해 새로운 방식으로 아바타를 활용할 수 있습니다. # 아바타 **DefaultPlayer**의 프로퍼티 에디터에는 **AvatarRendererComponent**와 **CostumeManagerComponent**가 있습니다. * **AvatarRendererComponent** * 복장 정보를 가져와 아바타를 그리는(Rendering) 역할을 합니다. * **CostumeManagerComponent**
[task] | code [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | RoomService:CreateInstanceRoom과 RoomService:MoveUsersToInstanceRoom을 사용하여 정적 맵에서 유저를 인스턴스 룸으로 이동시키는 스크립트를 작성해줘 [answer] | `RoomService`를 활용하여 정적 맵에서 유저를 인스턴스 룸으로 이동시키는 스크립트는 다음과 같이 작성할 수 있습니다. 이 스크립트는 다음 두 가지 단계를 수행합니다. 1. `RoomService:CreateInstanceRoom`으로 인스턴스 룸을 생성합니다. (이미 존재하는 룸이라면 새로 생성하지 않고 기존 것을 사용할 수 있도록 `CreateInstanceRoom`이 실패할 경우를 처리하거나, 키를 고유하게 만들어주는 로직이 필요합니다. 참고 문서 예시처럼 고유 키를 생성하여 생성하는 방식을 따릅니다.) 2. 생성된 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 문서의 GameManager 스크립트 예시에서 `OnUpdate` 메서드 내부의 `if self.checkReadyPlayerTimer >= 5.0` 조건을 만족했을 때 실행되는 로직의 흐름을 단계별 번호 목록으로 정리하세요. [answer] | 문서의 `GameManager` 스크립트 예시에서 `if self.checkReadyPlayerTimer >= 5.0` 조건이 만족되었을 때 실행되는 로직의 흐름은 다음과 같습니다. 1. `self.checkReadyPlayerTimer` 값을 `0.0`으로 초기화하여 타이머를 리셋합니다. 2. Ready 상태인 플레이어의 수(`readyPlayerNum`)와 이름 목록(`readyPlayers`)을 저장할 변수를 초기화합니다. 3. `_UserService.UserEntities`를 반복하여 `v.Player.isReady`가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임이 진행될 인스턴스 룸에 입장할 수 있는 유저를 정하는 조건을 만들어 유저를 이동시켜봅시다. 조건은 크리에이터의 기획에 따라 달라질 수 있습니다. 예시는 **'Ready' 버튼을 3명 이상의 유저가 누르면** 새로운 인스턴스 룸으로 이동시킵니다. 1. **GameManager 스크립트 컴포넌트**에 주기적으로 유저의 Ready 상태를 확인해, 인스턴스 룸으로 이동시키는 스크립트를 작성합니다. ```lua Property: [None] number checkReadyPlayerTimer = 0
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | CostumeManagerComponent에서 한손무기와 양손무기를 동시에 지정하면 어떤 결과가 나오나요? [answer] | CostumeManagerComponent에서 한손무기와 양손무기(두손무기)를 동시에 지정하면 중복으로 장착할 수 없습니다. 이때 두 손무기만 출력됩니다. 즉, 한손무기 혹은 보조무기는 양손무기와 중복으로 착용할 수 없으며, 동시 착용이 불가능한 아이템을 같이 입력한 경우 최종적으로 두손무기만 적용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아바타 구성을 살펴보고, 아바타의 장비를 교체하는 방법을 알아봅니다. 아바타의 구성을 이해해 새로운 방식으로 아바타를 활용할 수 있습니다. # 아바타 **DefaultPlayer**의 프로퍼티 에디터에는 **AvatarRendererComponent**와 **CostumeManagerComponent**가 있습니다. * **AvatarRendererComponent** * 복장 정보를 가져와 아바타를 그리는(Rendering) 역할을 합니다. * **CostumeManagerComponent**
[task] | code [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | YoutubePlayerWorldComponent 를 사용하여 OnBeginPlay 에서 20초 지점부터 재생을 시작하고, InputService 의 KeyDownEvent 를 통해 P 키 입력 시 Pause, L 키 입력 시 PlayPause, 숫자 0 키 입력 시 0초로 Jump 후 Play 로 동작하는 YoutubePlayerController 스크립트를 작성해줘 [answer] | 요청하신 요구사항을 만족하는 `YoutubePlayerController` 스크립트입니다. 1. **OnBeginPlay**: `YoutubePlayerWorldComponent` 참조를 저장하고, 20초 지점(`Jump`)으로 이동한 후 재생(`Play`)을 시작합니다. 2. **KeyDownEvent**: * **P 키**: `Pause()` 호출 * **L 키**: `PlayPause()` 호출 * **0 키 (Alpha0 또는 Keypad0)**: 0초 지점으로 `Jump` 한 후 `Pl [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 월드에 입장하면 영상을 바로 00:20초부터 재생을 시작하게 만들고, 재생 중에 특정 키를 입력할 때 함수가 동작하게 만듭니다. YoutubePlayerWorldComponent와 YoutubePlayerGUIComponent의 함수 사용법은 동일합니다. 예시는 YoutubePlayerWorldComponent가 기준입니다. 예시 Url: https://www.youtube.com/watch?v=9pL_b1fl9LQ&t=1s 1. YoutubePlayerController 스크립트 컴포넌트를 만들어, 배치한 Youtube 모델에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | 상하의와 한벌옷을 동시에 입력했을 때 아바타에 실제로 반영되는 복장은 무엇인가요? [answer] | 상하의와 한벌옷을 동시에 입력하면 중복 착용이 불가능하기 때문에 **한벌옷**만 출력됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아바타 구성을 살펴보고, 아바타의 장비를 교체하는 방법을 알아봅니다. 아바타의 구성을 이해해 새로운 방식으로 아바타를 활용할 수 있습니다. # 아바타 **DefaultPlayer**의 프로퍼티 에디터에는 **AvatarRendererComponent**와 **CostumeManagerComponent**가 있습니다. * **AvatarRendererComponent** * 복장 정보를 가져와 아바타를 그리는(Rendering) 역할을 합니다. * **CostumeManagerComponent**
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | 아바타의 Body와 Face 하위에 자동 구현되는 Selector 컴포넌트 두 가지의 이름과 역할을 단계별 번호 목록으로 작성해 주세요. [answer] | 아바타의 Body와 Face 하위에 자동 구현되는 Selector 컴포넌트 두 가지의 이름과 역할은 다음과 같습니다. 1. **AvatarBodyActionSelectorComponent** * **위치**: 아바타의 `Body` 하위에 자동 구현됩니다. * **역할**: 어떤 애니메이션을 재생할지 `AvatarRendererComponent`에게 전달하는 역할을 합니다. 2. **AvatarFaceActionSelectorComponent** * **위치**: 아바타의 `Face` 하위에 자동 구현됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아바타 구성을 살펴보고, 아바타의 장비를 교체하는 방법을 알아봅니다. 아바타의 구성을 이해해 새로운 방식으로 아바타를 활용할 수 있습니다. # 아바타 **DefaultPlayer**의 프로퍼티 에디터에는 **AvatarRendererComponent**와 **CostumeManagerComponent**가 있습니다. * **AvatarRendererComponent** * 복장 정보를 가져와 아바타를 그리는(Rendering) 역할을 합니다. * **CostumeManagerComponent**
[task] | two_turn [pass] | ⏳ 미판정 [title] | 제작 가이드 활용법 [question] | 메이플스토리 월드의 제작 가이드 난이도(Lv.1~Lv.4) 중 내 현재 실력에 가장 적합한 레벨은 무엇이며, 해당 레벨에서 집중적으로 학습해야 하는 기본 제작 가이드 영역은 어디인가요? [answer] | 메이플스토리 월드의 제작 가이드 난이도는 총 4단계로 나뉘며, 각 단계는 크리에이터의 현재 실력과 학습 목표에 따라 다음과 같이 정의됩니다. 1. **Lv.1**: 메이커의 기본 기능과 컴포넌트의 기본 기능을 사용하고 싶은 크리에이터 2. **Lv.2**: MSW의 기본 문법을 알고, 간단한 동작을 직접 만들 수 있는 크리에이터 3. **Lv.3**: 서버와 클라이언트의 관계를 알고, 활용할 수 있는 크리에이터 4. **Lv.4**: 월드와 인스턴트를 알고, 월드 최적화와 보안을 고려하는 크리에이터 **가장 적합한 레벨을 [followup] | Lv.3(서버와 클라이언트 관계 이해)를 선택했을 때, '프로퍼티 동기화'와 '월드 인스턴스' 개념을 실제 스크립트에서 어떻게 연결하여 적용하는지 구체적인 코드 예제를 보여주세요. [followup_answer] | 참고 문서에는 '프로퍼티 동기화'와 '월드 인스턴스' 개념을 실제 스크립트에서 연결하여 적용하는 구체적인 코드 예제가 포함되어 있지 않습니다. 문서에는 해당 개념들을 학습할 수 있는 가이드 항목 이름만 제시되어 있으며, 실제 mLua 코드 구현 예시는 제공되지 않습니다. * **프로퍼티 동기화**: [프로퍼티 동기화](/docs?postId=208) 가이드에서 개념을 학습할 수 있습니다. * **월드 인스턴스**: [월드 인스턴스](/docs?postId=984) 가이드에서 개념을 학습할 수 있습니다. 따라서 요청하신 [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 다양한 형식의 가이드를 제공하고 있습니다. 메이플스토리 월드가 생소한 크리에이터라면 기본 **제작 가이드 - 시작하기 - [메이커 사용](/docs?postId=724)을** 먼저 살펴보며 기본 기능 익히기를 권장합니다. # 난이도 가이드를 살펴보기 전, 학습권장대상 배지를 확인하고 나에게 적절한 난이도인지 확인할 수 있습니다. * **Lv.1**: 메이커의 기본 기능과 컴포넌트의 기본 기능을 사용하고 싶은 크리에이터 * **Lv.2**: MSW의 기본 문법을 알고, 간단한 동작을 직접 만들 수 있는
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | MoveUsersToStaticRoom() 함수를 호출할 때 정적 맵 경로를 지정하지 않으면 어떤 맵으로 이동하게 되나요? [answer] | 정적 맵 경로를 지정하지 않으면 시작 맵으로 이동하게 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 정적 룸으로 이동시키기 게임이 끝난 맵의 유저는 `MoveUsersToStaticRoom()` 함수를 활용해 정적 룸으로 돌아가게 만듭니다. 돌아갈 정적 맵을 지정하지 않으면 시작 맵으로 돌아갑니다. * **InstanceGameManager 스크립트 컴포넌트**를 생성, 작성한 뒤 dungeon 맵에 스크립트 컴포넌트를 추가합니다. ```lua Method: [server only] void OnBeginPlay() { local playFunc = function()
[task] | two_turn [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | 월드에서 YouTube 영상을 배치하고 재생하는 기본 절차와 두 가지 컴포넌트(World/GUI)의 차이는 무엇인가요? [answer] | 월드에서 YouTube 영상을 배치하고 재생하는 기본 절차와 `YoutubePlayerWorldComponent` 및 `YoutubePlayerGUIComponent`의 차이는 다음과 같습니다. ### 1. 두 가지 컴포넌트의 차이 영상은 사용 목적에 따라 두 가지 컴포넌트를 사용하여 배치할 수 있습니다. | 구분 | YoutubePlayerWorldComponent | YoutubePlayerGUIComponent | | :--- | :--- | :--- | | **배치 위치** | 월드(World) 공간 내 특정 좌표에 배 [followup] | `YoutubePlayerWorldComponent`의 `Urls`에 여러 주소를 입력하고 `Shuffle`을 활성화했을 때, `PlayOnAwake`와 `Loop`가 함께 작용하는 구체적인 재생 순서와 동작은 어떻게 되나요? [followup_answer] | `YoutubePlayerWorldComponent`에서 `Urls`에 여러 주소를 입력하고 `Shuffle`, `PlayOnAwake`, `Loop`를 모두 활성화했을 때의 동작은 다음과 같습니다. 1. **자동 재생 시작 (`PlayOnAwake`)** * 플레이어가 월드에 입장하는 즉시 영상이 자동으로 재생을 시작합니다. 수동으로 재생 버튼을 누를 필요가 없습니다. 2. **재생 순서 섞기 (`Shuffle`)** * `Urls` 배열에 입력된 영상들의 재생 순서가 무작위로 섞입니다. * [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 내가 찍은 영상 혹은 함께 보고 싶은 영상을 가져와 재생할 수 있습니다. # Youtube 관련 컴포넌트 소개 영상은 UI로 사용하거나 World에 배치해 사용할 수 있습니다. UI로 사용할 경우 YoutubeGUIPlayerComponent를 사용하고, World에 배치할 경우 YoutubePlayerWorldComponent를 사용합니다. UI로 사용한다면 영상은 배치한 곳에 고정되므로, 맵을 돌아다니더라도 유저가 보고 있는 화면의 특정 위치에서 움직이지 않습니다. World에서 영상을 사용한다면 배치한
[task] | code [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | RoomService의 GetOrCreateInstanceRoom과 MoveUserToInstanceRoom API를 활용해 Ready 상태를 관리하는 테이블을 갱신하고, 3명이 Ready 상태가 되는 즉시 해당 인스턴스 룸으로 이동시키는 GameManager 스크립트를 작성해줘. [answer] | ```lua Property: [None] integer roomIdx = 0 table ReadyUserIds = {} string TargetMapName = "dungeon" Method: [server only] void OnBeginPlay() { self.ReadyUserIds = {} } [server only] any GetOrCreateInstanceRoom() { local instanceRoom = _RoomService:GetOrCreateInstanceRoom("DungeonMap" .. t [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 대기실에 모인 인원 중 Ready 버튼을 누른 3명만 게임이 진행될 맵으로 이동하게 만들어봅시다. #### 준비 이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다. 1. 대기 맵과 인스턴스 맵을 만듭니다. * 정적 맵 이름: waitingmap * 인스턴스 맵 이름: dungeon 2. dungeon 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화합니다. 3. UI 에디터 - 좌측 기
[task] | code [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | InputService 의 KeyDownEvent 핸들러에서 event.key 값을 문자열로 변환하여 "P", "L", "Alpha0", "Keypad0" 값을 판별하고 각각 Pause, PlayPause, PlayFromStart 메서드를 호출하는 YoutubePlayerController 스크립트를 작성해줘 [answer] | 요청하신 기능(00:20부터 자동 재생, P키로 멈춤, L키로 일시정지/재생, 0키로 처음부터 재생)을 구현한 `YoutubePlayerController` 스크립트입니다. 참고 문서에 따르면 `YoutubePlayerWorldComponent`와 `YoutubePlayerGUIComponent`의 함수 사용법이 동일하므로, 배치된 유튜브 모델에 따라 `YoutubePlayerWorldComponent`를 기준으로 작성했습니다. 또한 키 입력 판별은 `tostring(event.key)`를 사용하여 문자열 비교 방식으로 처리했습니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 월드에 입장하면 영상을 바로 00:20초부터 재생을 시작하게 만들고, 재생 중에 특정 키를 입력할 때 함수가 동작하게 만듭니다. YoutubePlayerWorldComponent와 YoutubePlayerGUIComponent의 함수 사용법은 동일합니다. 예시는 YoutubePlayerWorldComponent가 기준입니다. 예시 Url: https://www.youtube.com/watch?v=9pL_b1fl9LQ&t=1s 1. YoutubePlayerController 스크립트 컴포넌트를 만들어, 배치한 Youtube 모델에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | YoutubePlayerWorldComponent와 YoutubePlayerGUIComponent의 함수 사용법이 동일하다고 하는데, 실제 코드를 작성할 때 둘의 차이점이나 적용 가능한 대상이 구체적으로 어떻게 다른지 알고 싶습니다. [answer] | 제공된 문서에는 `YoutubePlayerWorldComponent`와 `YoutubePlayerGUIComponent`의 **함수 사용법이 동일하다**는 사실과, 각각의 예제 코드가 포함되어 있습니다. 하지만 두 컴포넌트 간의 **구체적인 차이점(적용 대상, 동작 방식 등)** 에 대한 설명은 문서에 포함되어 있지 않습니다. 문서에 근거하여 확인 가능한 내용은 다음과 같습니다. 1. **함수 동일성**: 두 컴포넌트 모두 `Play()`, `Pause()`, `Jump(timeInSeconds)`, `PlayPause()` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 월드에 입장하면 영상을 바로 00:20초부터 재생을 시작하게 만들고, 재생 중에 특정 키를 입력할 때 함수가 동작하게 만듭니다. YoutubePlayerWorldComponent와 YoutubePlayerGUIComponent의 함수 사용법은 동일합니다. 예시는 YoutubePlayerWorldComponent가 기준입니다. 예시 Url: https://www.youtube.com/watch?v=9pL_b1fl9LQ&t=1s 1. YoutubePlayerController 스크립트 컴포넌트를 만들어, 배치한 Youtube 모델에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | 아바타의 Body와 Face 하위에 자동으로 구현되는 Selector 컴포넌트들은 어떤 기능을 수행하나요? [answer] | 아바타의 Body와 Face 하위에 자동으로 구현되는 Selector 컴포넌트들은 어떤 애니메이션을 재생할지 `AvatarRendererComponent`에게 전달하는 역할을 수행합니다. 구체적으로 다음과 같습니다: * **Body** 하위: `AvatarBodyActionSelectorComponent` * **Face** 하위: `AvatarFaceActionSelectorComponent` 이 두 컴포넌트는 각각 몸과 얼굴의 동작을 결정하여 렌더링 컴포넌트에 정보를 전달합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아바타 구성을 살펴보고, 아바타의 장비를 교체하는 방법을 알아봅니다. 아바타의 구성을 이해해 새로운 방식으로 아바타를 활용할 수 있습니다. # 아바타 **DefaultPlayer**의 프로퍼티 에디터에는 **AvatarRendererComponent**와 **CostumeManagerComponent**가 있습니다. * **AvatarRendererComponent** * 복장 정보를 가져와 아바타를 그리는(Rendering) 역할을 합니다. * **CostumeManagerComponent**
[task] | single_turn [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | 특정 키 입력 시 숫자 0을 감지하기 위해 Alpha0와 Keypad0를 모두 확인해야 하는 이유는 무엇이며, 다른 특수 키나 문자열을 처리할 때는 어떤 형식으로 event.key 값을 변환해야 하나요? [answer] | 메이플스토리 월드의 `KeyDownEvent`에서 `event.key` 값은 키의 종류에 따라 문자열(`string`)이나 열거형(`enum`, 예: `KeyboardKey`)으로 전달될 수 있습니다. 따라서 특정 키를 감지하기 위해서는 `event.key`의 실제 값을 확인하고, 필요에 따라 문자열로 변환하여 비교하는 로직을 작성해야 합니다. **1. 숫자 0을 감지할 때 Alpha0와 Keypad0를 모두 확인해야 하는 이유** 키보드에는 숫자 0을 입력할 수 있는 물리적 키가 두 개 있습니다. * **Alpha0**: 키 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 월드에 입장하면 영상을 바로 00:20초부터 재생을 시작하게 만들고, 재생 중에 특정 키를 입력할 때 함수가 동작하게 만듭니다. YoutubePlayerWorldComponent와 YoutubePlayerGUIComponent의 함수 사용법은 동일합니다. 예시는 YoutubePlayerWorldComponent가 기준입니다. 예시 Url: https://www.youtube.com/watch?v=9pL_b1fl9LQ&t=1s 1. YoutubePlayerController 스크립트 컴포넌트를 만들어, 배치한 Youtube 모델에
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | CostumeManagerComponent에서 상하의와 한벌옷, 또는 한손무기와 양손무기를 동시에 지정했을 때 최종 출력되는 아이템을 중복 금지 규칙에 따라 표로 정리해서 설명해 주세요. [answer] | CostumeManagerComponent의 중복 금지 규칙에 따라, 상하의와 한벌옷 또는 한손무기(보조무기 포함)와 양손무기를 동시에 지정했을 때 최종 출력되는 아이템은 다음과 같습니다. | 입력된 아이템 조합 | 최종 출력되는 아이템 | | :--- | :--- | | 상하의 + 한벌옷 | 한벌옷 | | 한손무기 + 양손무기 | 양손무기 | | 보조무기 + 양손무기 | 양손무기 | **설명:** * **상하의와 한벌옷:** 이 두 가지는 중복으로 착용할 수 없습니다. 동시에 입력된 경우, 최종적으로 **한벌옷**만 출력됩 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아바타 구성을 살펴보고, 아바타의 장비를 교체하는 방법을 알아봅니다. 아바타의 구성을 이해해 새로운 방식으로 아바타를 활용할 수 있습니다. # 아바타 **DefaultPlayer**의 프로퍼티 에디터에는 **AvatarRendererComponent**와 **CostumeManagerComponent**가 있습니다. * **AvatarRendererComponent** * 복장 정보를 가져와 아바타를 그리는(Rendering) 역할을 합니다. * **CostumeManagerComponent**
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | 아바타 모양 포탈을 만들 때 필수로 추가해야 하는 3가지 컴포넌트 이름을 나열해서 [answer] | 아바타 모양 포탈을 만들 때 필수로 추가해야 하는 3가지 컴포넌트는 다음과 같습니다. 1. TransformComponent 2. AvatarRendererComponent 3. CostumeManagerComponent [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **AvatarRendererComponent**와 **CostumeManagerComponent**를 활용해 새로운 아바타를 만들어 사용할 수 있습니다. 몬스터, 포탈, NPC 혹은 크리에이터만의 특별한 엔티티로 제작할 수 있습니다. 이때 **TransformComponent, AvatarRendererComponent, CostumeManagerComponent** 총 3가지는 필수 컴포넌트입니다. 필수 컴포넌트와 더불어 다른 네이티브 컴포넌트를 추가하거나, 크리에이터가 제작한 새로운 컴포넌트를 추가해 활용합니다. #### 아
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | InstanceGameManager 스크립트에서 _UserService.UserEntities 를 직접 순회하며 유저를 수집하는 대신 다른 서비스나 방법을 써야 하는 이유가 있나요? [answer] | 제공된 참고 문서에는 `_UserService.UserEntities`를 직접 순회하는 방식 외에 다른 서비스나 방법을 사용해야 하는 이유에 대한 설명이 없습니다. 문서에서 제시된 예제는 `_UserService.UserEntities`를 `pairs`로 순회하여 현재 룸에 존재하는 플레이어들을 `users` 테이블에 수집한 뒤, `_RoomService:MoveUsersToStaticRoom(users)`를 호출하도록 작성되어 있습니다. 따라서 문서의 범위 내에서는 해당 방식을 사용하는 것이 표준적인 구현 방법으로 제시되며, 다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 정적 룸으로 이동시키기 게임이 끝난 맵의 유저는 `MoveUsersToStaticRoom()` 함수를 활용해 정적 룸으로 돌아가게 만듭니다. 돌아갈 정적 맵을 지정하지 않으면 시작 맵으로 돌아갑니다. * **InstanceGameManager 스크립트 컴포넌트**를 생성, 작성한 뒤 dungeon 맵에 스크립트 컴포넌트를 추가합니다. ```lua Method: [server only] void OnBeginPlay() { local playFunc = function()
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | dungeon 맵에 InstanceGameManager 스크립트 컴포넌트를 추가했는데 OnBeginPlay 가 실행되지 않는 경우, 가장 먼저 확인해야 할 실행 공간 설정은 무엇인가요? [answer] | `OnBeginPlay`가 실행되지 않는 경우, 가장 먼저 확인해야 할 실행 공간 설정은 **`[server only]`** 입니다. 참고 문서의 예제와 실제 mLua 예제 모두 `OnBeginPlay` 메서드가 `Method:` 블록 내에 있으며, 그 위에 `[server only]` 어노테이션이 붙어 있습니다. `MoveUsersToStaticRoom`과 같은 룸 관리 로직은 서버 측에서 처리되므로, 해당 메서드가 서버에서 실행되도록 `[server only]`로 설정되어 있는지 반드시 확인해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 정적 룸으로 이동시키기 게임이 끝난 맵의 유저는 `MoveUsersToStaticRoom()` 함수를 활용해 정적 룸으로 돌아가게 만듭니다. 돌아갈 정적 맵을 지정하지 않으면 시작 맵으로 돌아갑니다. * **InstanceGameManager 스크립트 컴포넌트**를 생성, 작성한 뒤 dungeon 맵에 스크립트 컴포넌트를 추가합니다. ```lua Method: [server only] void OnBeginPlay() { local playFunc = function()
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | 모든 유저가 같은 복장을 착용하게 하려면 UseCustomeEquipOnly 프로퍼티를 어떻게 설정해야 하나요? [answer] | 모든 유저가 동일한 복장을 착용하게 하려면 **CostumeManagerComponent**의 **UseCustomeEquipOnly** 프로퍼티를 **활성화(True)** 상태로 설정해야 합니다. **활성화 시 동작 방식:** 1. 크리에이터가 **CostumeManagerComponent**의 프로퍼티(예: `CustomCapEquip`, `CustomLongcoatEquip` 등)에 특정 아이템의 RUID 값을 지정합니다. 2. **UseCustomeEquipOnly**가 활성화되어 있으면, 월드에 접속하는 모든 유저는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아바타 구성을 살펴보고, 아바타의 장비를 교체하는 방법을 알아봅니다. 아바타의 구성을 이해해 새로운 방식으로 아바타를 활용할 수 있습니다. # 아바타 **DefaultPlayer**의 프로퍼티 에디터에는 **AvatarRendererComponent**와 **CostumeManagerComponent**가 있습니다. * **AvatarRendererComponent** * 복장 정보를 가져와 아바타를 그리는(Rendering) 역할을 합니다. * **CostumeManagerComponent**
[task] | two_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | Ready UI 버튼과 Player 컴포넌트를 통해 유저의 준비 상태를 서버로 동기화하는 로직은 어떻게 구성되나요? [answer] | Ready UI 버튼과 Player 컴포넌트를 통한 유저 준비 상태 동기화 로직은 클라이언트와 서버 간 통신을 통해 이루어집니다. 이 과정은 크게 1) 클라이언트에서 버튼 클릭 이벤트를 감지하여 서버에 상태 변경 요청을 보내는 단계와, 2) 서버에서 해당 요청을 수신하여 플레이어의 상태를 업데이트하는 단계로 구성됩니다. **1. 클라이언트: Ready UI 버튼 (ReadyButton 스크립트)** 클라이언트 측 `ReadyButton` 컴포넌트는 유저의 버튼 클릭을 감지하고, 현재 준비 상태(`isReady`)에 따라 서버에 ` [followup] | Instance Room으로 이동 시 Ready 버튼을 숨기도록 처리하는 OnBeginPlay 메서드에서 _EntityService:GetEntity("Entity ID")를 사용하는 구체적인 이유와, 버튼의 Enable 속성을 false로 설정하는 코드의 정확한 위치는 어디인가요? [followup_answer] | 참고 문서에 따르면 `_EntityService:GetEntity("Entity ID")`를 사용하는 구체적인 이유나 `Enable` 속성을 `false`로 설정하는 코드의 "정확한 위치"에 대한 추가 설명(예: 왜 GetEntity를 사용하는지, 특정 라인 번호 등)은 제공되지 않습니다. 문서에 명시된 내용은 다음과 같습니다: 1. **`_EntityService:GetEntity("Entity ID")` 사용**: * 문서의 코드는 `self.readyButton = _EntityService:GetEntity( [scores] | [judge_reason] | [source_doc] | 3. **ReadyButton** 스크립트 컴포넌트를 생성하고 **Ready UI 버튼**에 추가합니다. 유저가 준비 상태가 되면 서버에 해당 유저가 준비되었다는 정보를 보내줍니다. ```lua Property: [None] boolean isReady = false Event Handler: [client only] [Entity: UIButton(/ui/DefaultGroup/UIButton)] HandleButtonClickEvent(ButtonClickEvent e
[task] | code [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | RoomService의 GetUsersInRoom API를 사용해 대기실에 있는 유저 목록을 조회하고, 각 유저의 UI 버튼 이벤트를 통해 Ready 상태를 추적하는 로직을 포함하는 ReadyManager 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 `RoomService`의 `GetUsersInRoom` API에 대한 설명이나 사용 예시가 포함되어 있지 않습니다. 또한, UI 버튼 이벤트를 통해 유저별 Ready 상태를 추적하는 구체적인 프로퍼티나 메서드 정의가 문서에 제시되어 있지 않습니다. 따라서 요청하신 `GetUsersInRoom` API를 사용한 조회 로직은 문서에 근거하여 작성할 수 없습니다. 다만, 문서에 있는 `GetOrCreateInstanceRoom` 및 `MoveUsers`를 활용해, **외부에서 전달받은 `userIds` 리스트를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 대기실에 모인 인원 중 Ready 버튼을 누른 3명만 게임이 진행될 맵으로 이동하게 만들어봅시다. #### 준비 이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다. 1. 대기 맵과 인스턴스 맵을 만듭니다. * 정적 맵 이름: waitingmap * 인스턴스 맵 이름: dungeon 2. dungeon 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화합니다. 3. UI 에디터 - 좌측 기
[task] | code [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | YoutubePlayerWorldComponent 의 Jump 함수를 활용해 월드 입장 시 영상 재생 위치를 20초로 설정하고, 이후 키 입력에 따라 재생 상태를 제어하는 로직을 포함하는 YoutubePlayerController 스크립트를 작성해줘 [answer] | 요청하신 로직을 구현하기 위해 `YoutubePlayerWorldComponent`의 `Jump`, `Pause`, `Play`, `PlayPause` 함수와 `InputService`의 `KeyDownEvent`를 활용하는 스크립트를 작성했습니다. 월드 입장 시(`OnBeginPlay`) 영상의 재생 위치를 20초로 설정하고, 키 입력에 따라 다음과 같이 제어하도록 구성했습니다. - **P 키**: 영상 멈춤 (`Pause`) - **L 키**: 일시 정지/재생 전환 (`PlayPause`) - **0 키** (숫자 0 또는 숫 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 월드에 입장하면 영상을 바로 00:20초부터 재생을 시작하게 만들고, 재생 중에 특정 키를 입력할 때 함수가 동작하게 만듭니다. YoutubePlayerWorldComponent와 YoutubePlayerGUIComponent의 함수 사용법은 동일합니다. 예시는 YoutubePlayerWorldComponent가 기준입니다. 예시 Url: https://www.youtube.com/watch?v=9pL_b1fl9LQ&t=1s 1. YoutubePlayerController 스크립트 컴포넌트를 만들어, 배치한 Youtube 모델에
[task] | two_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | InstanceMap 프로퍼티를 활성화해야 인스턴스 맵으로 작동하는 원리와, 이 프로퍼티를 설정하지 않으면 RoomService 호출 시 어떤 오류가 나는지 설명해 주세요. [answer] | 제공된 참고 문서에는 `InstanceMap` 프로퍼티를 활성화해야 인스턴스 맵으로 작동하는 **원리**에 대한 기술적인 설명이나, 프로퍼티를 설정하지 않을 때 발생하는 **구체적인 오류 메시지나 예외 상황**에 대한 내용이 포함되어 있지 않습니다. 문서에는 다음과 같은 사실만 명시되어 있습니다. 1. `dungeon` 맵을 인스턴스 맵으로 사용하려면 프로퍼티 에디터에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화해야 합니다. 2. `CreateInstanceRoom` 함수 호출 시, 특정 맵(예: [followup] | InstanceMap 프로퍼티 미설정 상태에서 GetOrCreateInstanceRoom()을 호출했을 때의 에러 로그 형식과, 이를 방지하기 위한 OnBeginPlay() 단계에서의 검증 코드 예시를 보여주세요. [followup_answer] | 제공된 참고 문서에는 `InstanceMap` 프로퍼티를 미설정 상태로 `GetOrCreateInstanceRoom()`을 호출했을 때 발생하는 **구체적인 에러 로그 형식**이나, 이를 방지하기 위한 **`OnBeginPlay()` 단계에서의 검증 코드**에 대한 내용이 포함되어 있지 않습니다. 문서에는 `CreateInstanceRoom` 함수를 사용할 때 "이미 사용 중인 식별자이거나 자주 요청했을 경우 생성에 실패할 수 있다"는 언급과 함께 `log_error("Cannot create instance room. roomK [scores] | [judge_reason] | [source_doc] | 대기실에 모인 인원 중 Ready 버튼을 누른 3명만 게임이 진행될 맵으로 이동하게 만들어봅시다. #### 준비 이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다. 1. 대기 맵과 인스턴스 맵을 만듭니다. * 정적 맵 이름: waitingmap * 인스턴스 맵 이름: dungeon 2. dungeon 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화합니다. 3. UI 에디터 - 좌측 기
[task] | code [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | InstanceMap 프로퍼티가 true인 맵에서 RoomService를 통해 정적 맵으로 복귀할 때 지정된 MapName으로 돌아가지 않고 시작 맵으로 복귀하도록 로직을 구성하는 스크립트를 작성해줘 [answer] | 질문하신 내용과 관련하여 참고 문서의 정보를 확인해 보겠습니다. 문서에는 "인스턴스 룸에서 벗어나 다시 정적 맵으로 돌아갈 때 돌아갈 정적 맵을 MapName으로 정할 수 있습니다. 돌아갈 정적 맵을 정하지 않았다면 시작 맵으로 돌아가게 됩니다."라는 설명이 있습니다. 이는 **인스턴스 룸에서 정적 룸으로 복귀할 때**, `RoomService`의 해당 기능이 **MapName을 지정하지 않는 경우**에 자동으로 시작 맵으로 복귀한다는 것을 의미합니다. 즉, "지정된 MapName으로 돌아가지 **않고** 시작 맵으로 복귀하도록 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | 아바타를 몬스터, 포탈, NPC 등으로 제작할 때 활용할 수 있는 컴포넌트 추가 방식에 대해 단계별 번호 목록으로 [answer] | 아바타를 몬스터, 포탈, NPC 등으로 제작할 때 활용할 수 있는 컴포넌트 추가 방식은 다음과 같습니다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Model**을 선택해 새로운 모델을 만듭니다. 2. 만든 모델에 필수 컴포넌트인 **TransformComponent**, **AvatarRendererComponent**, **CostumeManagerComponent**를 추가합니다. 3. **CostumeManagerComponent**에 복장 정보 RUID를 입력하여 원하는 아바타 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **AvatarRendererComponent**와 **CostumeManagerComponent**를 활용해 새로운 아바타를 만들어 사용할 수 있습니다. 몬스터, 포탈, NPC 혹은 크리에이터만의 특별한 엔티티로 제작할 수 있습니다. 이때 **TransformComponent, AvatarRendererComponent, CostumeManagerComponent** 총 3가지는 필수 컴포넌트입니다. 필수 컴포넌트와 더불어 다른 네이티브 컴포넌트를 추가하거나, 크리에이터가 제작한 새로운 컴포넌트를 추가해 활용합니다. #### 아
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 정적 룸으로 이동시킬 유저 목록(users)을 구성할 때 v.Name 을 사용하는 이유와, 엔티티 객체 자체를 전달할 수 없는 이유는 무엇인가요? [answer] | `MoveUsersToStaticRoom()` 함수가 요구하는 파라미터 타입이 **엔티티 객체가 아닌 유저 이름(string)의 목록**이기 때문입니다. 따라서 `users` 테이블에 유저 엔티티 객체(`v`) 자체가 아닌, 그 엔티티의 이름(`v.Name`)을 담아 전달해야 합니다. 만약 엔티티 객체 자체를 전달하면 함수가 예상하는 데이터 타입(string)과 맞지 않아 정상적으로 동작하지 않거나 오류가 발생합니다. 참고 문서의 예제 코드에서도 이 점을 명확히 보여줍니다. ```lua Method: [server only] [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 정적 룸으로 이동시키기 게임이 끝난 맵의 유저는 `MoveUsersToStaticRoom()` 함수를 활용해 정적 룸으로 돌아가게 만듭니다. 돌아갈 정적 맵을 지정하지 않으면 시작 맵으로 돌아갑니다. * **InstanceGameManager 스크립트 컴포넌트**를 생성, 작성한 뒤 dungeon 맵에 스크립트 컴포넌트를 추가합니다. ```lua Method: [server only] void OnBeginPlay() { local playFunc = function()