[task] | instruction_following [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | 월드와 GUI에 영상 2개를 배치하기 위한 단계별 번호 목록으로 작성하되, 코드만 출력하고 설명은 주석으로 작성해 주세요. [answer] | ```lua -- 1. 월드에 영상 2개를 배치하기 위한 스크립트 -- Workspace - NativeModel - YoutubePlayerWorld 모델을 선택해 배치합니다. -- Size에 2를 입력하고, 아래 주석의 예시처럼 영상 2개의 Url을 입력합니다. -- https://www.youtube.com/watch?v=hvzp4kOtaSw -- https://youtu.be/3Kom6vz6nic -- 프로퍼티 값을 설정한 뒤 시작을 눌러 확인합니다. Property: [None] YoutubePlayerWorldCompo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 내가 찍은 영상 혹은 함께 보고 싶은 영상을 가져와 재생할 수 있습니다. # Youtube 관련 컴포넌트 소개 영상은 UI로 사용하거나 World에 배치해 사용할 수 있습니다. UI로 사용할 경우 YoutubeGUIPlayerComponent를 사용하고, World에 배치할 경우 YoutubePlayerWorldComponent를 사용합니다. UI로 사용한다면 영상은 배치한 곳에 고정되므로, 맵을 돌아다니더라도 유저가 보고 있는 화면의 특정 위치에서 움직이지 않습니다. World에서 영상을 사용한다면 배치한
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 인스턴스 룸에서 유저를 정적 룸으로 되돌릴 때 특정 정적 맵으로 지정하지 않으면 어떤 맵으로 복귀하게 되나요? [answer] | 인스턴스 룸에서 유저를 정적 룸으로 되돌릴 때 특정 정적 맵을 지정하지 않았다면, 시작 맵으로 복귀하게 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | two_turn [pass] | ⏳ 미판정 [title] | 제작 가이드 활용법 [question] | 기본 제작 가이드의 '보안 및 최적화' 항목에서 프로파일러로 성능을 분석하고 TargetUserSync를 통해 동기화를 최적화하는 과정은 어떻게 진행되며, 이는 월드의 안정성에 어떤 영향을 미치나요? [answer] | 제공된 참고 문서에는 '보안 및 최적화' 항목에 포함된 두 가지 가이드의 제목과 URL 링크만 나열되어 있으며, 프로파일러를 사용한 성능 분석의 구체적인 단계, TargetUserSync를 활용한 동기화 최적화 과정, 또는 이러한 작업이 월드 안정성에 미치는 영향에 대한 상세한 설명은 포함되어 있지 않습니다. 따라서 해당 과정이 어떻게 진행되는지, 그리고 월드 안정성에 어떤 영향을 미치는지에 대해 문서 근거로 답변 드리기 어렵습니다. [followup] | 프로파일러 분석 결과 특정 컴포넌트의 프로퍼티 동기화가 병목인 경우, TargetUserSync를 설정하여 최적화하는 mLua 코드 수정 예시를 만들어 주세요. [followup_answer] | 제공된 참고 문서에는 `TargetUserSync`와 프로퍼티 동기화 최적화에 대한 가이드의 제목과 URL 링크(`/docs?postId=1119`)만 나열되어 있으며, `TargetUserSync`를 설정하는 구체적인 mLua 코드 문법, 프로퍼티 선언 방식, 또는 서비스 호출 API에 대한 정보는 포함되어 있지 않습니다. 따라서 문서에 근거하여 `TargetUserSync`를 활용한 mLua 코드 수정 예시를 작성할 수 없습니다. [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 다양한 형식의 가이드를 제공하고 있습니다. 메이플스토리 월드가 생소한 크리에이터라면 기본 **제작 가이드 - 시작하기 - [메이커 사용](/docs?postId=724)을** 먼저 살펴보며 기본 기능 익히기를 권장합니다. # 난이도 가이드를 살펴보기 전, 학습권장대상 배지를 확인하고 나에게 적절한 난이도인지 확인할 수 있습니다. * **Lv.1**: 메이커의 기본 기능과 컴포넌트의 기본 기능을 사용하고 싶은 크리에이터 * **Lv.2**: MSW의 기본 문법을 알고, 간단한 동작을 직접 만들 수 있는
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | Player 스크립트에서 OnBeginPlay 함수가 실행될 때 Instance Room으로 이동하면 수행되는 동작을 1문장 이내로 설명하세요. [answer] | Instance Room으로 이동하면 Ready 버튼이 보이지 않도록 비활성화합니다. [followup] | [followup_answer] | [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] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 동일한 인스턴스 맵 구성으로 여러 인스턴스 룸을 생성할 때 서로 다른 룸을 식별하기 위해 사용하는 값은 무엇인가요? [answer] | 동일한 인스턴스 맵 구성으로 여러 인스턴스 룸을 생성할 때 서로 다른 룸을 식별하기 위해 사용하는 값은 **Key**입니다. Key는 조작 용도로 사용되며, 동일한 인스턴스 맵으로 구성되었더라도 서로 다른 인스턴스 룸을 구별하는 식별자 역할을 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 인스턴스 룸 생성 스크립트에서 `roomIdx` 프로퍼티의 초기값과 타입을 표로 정리하세요. [answer] | 참고 문서에 제시된 `GameManager` 스크립트 컴포넌트의 `roomIdx` 프로퍼티 정보는 다음과 같습니다. | 항목 | 값 | | :--- | :--- | | **타입** | `integer` | | **초기값** | `0` | | **동기화 속성** | `[None]` | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 대기실에 모인 인원 중 Ready 버튼을 누른 3명만 게임이 진행될 맵으로 이동하게 만들어봅시다. #### 준비 이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다. 1. 대기 맵과 인스턴스 맵을 만듭니다. * 정적 맵 이름: waitingmap * 인스턴스 맵 이름: dungeon 2. dungeon 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화합니다. 3. UI 에디터 - 좌측 기
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 정적 룸과 인스턴스 룸은 서로의 Service나 Logic 엔트리에 접근할 수 없다고 하는데, 이 중 정적 룸과 인스턴스 룸이 공유하는 유일한 저장소는 무엇인가요? [answer] | 정적 룸과 인스턴스 룸은 별도의 공간이므로 Service나 Logic 엔트리에 서로 접근할 수 없습니다. 하지만 하나의 월드에서는 **DataStorage**를 하나만 사용하므로, 정적 룸과 생성된 인스턴스 룸 모두 동일한 하나의 **DataStorage**를 공유합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | ReadyButton 스크립트에서 버튼 클릭 시 서버로 전송하는 메서드 이름을 2개만 나열하세요. [answer] | ReadyButton 스크립트에서 버튼 클릭 시 서버로 전송하는 메서드 이름은 다음과 같습니다. 1. `OnReady` 2. `OnCancelReady` [followup] | [followup_answer] | [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] | 모델 프로퍼티 편집 모드에서 체크한 프로퍼티가 모델 프로퍼티로 지정되는 과정을 시뮬레이션하기 위해 table 타입으로 모델 프로퍼티 목록을 관리하고, 특정 프로퍼티 이름(예: "Scale")이 체크되었을 때 해당 프로퍼티를 목록에 추가하는 HandleModelPropertyEditEvent를 구현한 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `HandleModelPropertyEditEvent`라는 이벤트 핸들러나 모델 프로퍼티 편집 모드의 이벤트를 수신하는 mLua API에 대한 정보가 **존재하지 않습니다**. 참고 문서에 따르면 모델 프로퍼티 편집은 에디터 UI에서 `View Model Property` 모드로 전환하여 체크박스를 선택하는 **시각적 편집 과정**이며, 이는 스크립트 내에서 이벤트를 통해 실시간으로 수신하는 대상이 아닙니다. 또한, 모델 프로퍼티는 컴포넌트 프로퍼티의 투영이므로, 스크립트에서 특정 프로퍼티(예: Scale)의 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모델을 통해 엔티티를 생성할 수 있으며, **Preset List**에서 제공하는 **Preset**도 결국 모델이라는 것을 [Model](/docs?postId=55) 가이드를 통해 배웠습니다. **Preset List**의 모델은 **NativeModel**에서 확장되었기 때문에 **Preset List** 카테고리 단위로 **NativeModel**의 속성을 물려받습니다. 따라서 각 카테고리에 해당하는 **NativeModel**을 변경하면 **Preset List**의 모델에도 변화가 생깁니다. 예를 들어 **Preset
[task] | two_turn [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | 월드에서 유튜브 영상이 재생되는 방식과 유튜브 플레이어 컴포넌트의 기본 구조에 대해 궁금합니다. [answer] | 월드에서 유튜브 영상을 재생하려면 **YoutubePlayerWorldComponent** (3D 월드 공간에 배치된 모델용) 또는 **YoutubePlayerGUIComponent** (GUI 요소용) 컴포넌트를 엔티티에 추가해야 합니다. 이 두 컴포넌트의 함수 사용법은 동일하며, 기본적으로 클라이언트에서만 동작하도록 설정됩니다. ### 기본 구조 및 초기화 1. **스크립트 컴포넌트 생성**: `YoutubePlayerController`와 같은 스크립트 컴포넌트를 만들어 유튜브 모델 엔티티에 추가합니다. 2. **프로퍼 [followup] | `YoutubePlayerWorldComponent`와 `YoutubePlayerGUIComponent`의 함수 사용법이 동일한지, 그리고 클라이언트 전용(`[client only]`)으로 설정했을 때 여러 유저가 같은 장면을 보지 못하는 현상을 해결하기 위한 동기화 작업이 필요할까요? [followup_answer] | 네, `YoutubePlayerWorldComponent`와 `YoutubePlayerGUIComponent`의 함수 사용법은 동일합니다. 두 컴포넌트 모두 `Play()`, `Pause()`, `PlayPause()`, `Jump()` 등의 동일한 함수를 제공합니다. 클라이언트 전용(`[client only]`)으로 설정했을 때, 각 유저의 클라이언트에서 독립적으로 영상이 제어되므로 특정 시점에 모든 유저가 같은 장면을 보지 못하는 현상이 발생합니다. 이를 해결하여 모든 유저가 동일한 화면을 보려면 **동기화 작업이 필요합니다. [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] | 정적 맵과 인스턴스 맵을 구분하는 기준은 MapComponent의 어떤 프로퍼티 값에 따라 결정되나요? [answer] | 정적 맵과 인스턴스 맵을 구분하는 기준은 Map의 `MapComponent`에 있는 **InstanceMap** 프로퍼티입니다. 크리에이터가 특정 맵을 인스턴스 맵으로 사용하고자 한다면, 해당 맵의 `MapComponent`에서 **InstanceMap** 프로퍼티 값을 **true**로 설정해야 합니다. 맵의 기본값은 정적 맵이므로, 이 프로퍼티를 `true`로 변경해야만 인스턴스 룸에 담길 수 있는 인스턴스 맵이 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 멀티플레이어 테스트 시 [시작] 버튼 외에 추가로 반드시 실행해야 하는 설정은 무엇인가요? [answer] | 멀티플레이어 테스트 시 [시작] 버튼을 누른 후, **멀티 플레이어 추가 버튼**을 필요한 유저 수만큼 눌러서 유저를 추가해야 합니다. 이는 RoomService를 테스트할 때 여러 명의 유저가 필요하기 때문입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 대기실에 모인 인원 중 Ready 버튼을 누른 3명만 게임이 진행될 맵으로 이동하게 만들어봅시다. #### 준비 이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다. 1. 대기 맵과 인스턴스 맵을 만듭니다. * 정적 맵 이름: waitingmap * 인스턴스 맵 이름: dungeon 2. dungeon 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화합니다. 3. UI 에디터 - 좌측 기
[task] | code [pass] | ⏳ 미판정 [title] | 인내의 숲 만들기 [question] | 유저가 엔티티에 터치하면 `_UserService`의 `HandleUserEnterEvent`를 통해 진입자를 확인하고, `self.Entity.TransformComponent.Position`을 변경하여 엔티티를 이동시키는 스크립트를 작성해줘. [answer] | 질문하신 내용에는 mLua의 이벤트 처리 구조에 대한 오해가 있습니다. `_UserService`의 `HandleUserEnterEvent`는 **유저가 맵(월드)에 진입할 때** 발생하는 이벤트입니다. 특정 엔티티를 터치했을 때 발생하는 이벤트는 아닙니다. 따라서 "유저가 엔티티에 터치하면"이라는 조건에 맞는 코드는 `HandleUserEnterEvent`가 아닌, 해당 엔티티에 부착된 스크립트에서 **터치 이벤트 핸들러(`HandleTouchEvent`)** 를 사용해야 합니다. 참고 문서에 명시된 mLua 스크립트 형식과 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 "인내의 숲"을 알고 계신가요? 인내의 숲을 검색해보면 많은 모험가들의 이야기를 찾아볼 수 있습니다. $$youtube HXMM4Vbx8aA $$ 인내의 숲은 점프를 이용해 발판을 넘어가며 목적지로 올라가는 게임입니다. 여러분은 인내의 숲을 보다 재미있게 만들 수 있는 색다른 아이디어를 갖고 있을지도 모릅니다. * 기존 인내의 숲은 너무 쉬운데? * 이렇게 하면 더 재미있을 것 같아. * 순위를 매기면 더 재미있지 않을까? * 서로 공격할 수 있으면 좋겠어. 메이플스토리 월드에서 이러한 아이디어를 현실화할
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 정적 룸과 인스턴스 룸의 개념 차이를 '구분 요소', '정적 룸', '인스턴스 룸' 항목으로 구성된 표로 정리하세요. [answer] | 제공된 정보를 바탕으로 정적 룸과 인스턴스 룸의 개념 차이를 정리한 표입니다. | 구분 요소 | 정적 룸 | 인스턴스 룸 | | :--- | :--- | :--- | | **정의 및 용도** | 월드에 하나만 존재하며, 정적 맵이 생성되는 기본 공간입니다. | 인스턴스 맵을 담는 바구니 역할을 하며, 특정 유저만 입장할 수 있는 특수 던전 같은 별도 공간을 만드는 데 사용됩니다. | | **생성 방식** | 월드가 생성될 때 자동으로 함께 생성됩니다. | `RoomService`를 통해 크리에이터가 원하는 인스턴스 맵 구성과 식별 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | code [pass] | ⏳ 미판정 [title] | 제작 가이드 활용법 [question] | OnBeginPlay()에서 _UserService의 HandleUserEnterEvent를 통해 유저가 입장할 때 _EntityService:GetEntityByPath("/maps/map01/obj")로 특정 오브젝트를 가져와 TransformComponent.Position을 수정하는 스크립트를 작성해줘 [answer] | 요청하신 동작은 `OnBeginPlay()`에서 `HandleUserEnterEvent`를 등록하는 것이 아니라, **`Event Handler` 블록**을 사용하여 `UserService`의 `UserEnterEvent`를 직접 처리하는 방식으로 구현해야 합니다. `OnBeginPlay()`는 스크립트가 시작될 때 한 번만 실행되는 생명주기 메서드이며, 이벤트 핸들러는 서비스의 이벤트 발생 시점에 자동으로 호출되도록 선언됩니다. 아래 코드는 `UserService`의 `UserEnterEvent`가 발생했을 때, `/maps/m [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 다양한 형식의 가이드를 제공하고 있습니다. 메이플스토리 월드가 생소한 크리에이터라면 기본 **제작 가이드 - 시작하기 - [메이커 사용](/docs?postId=724)을** 먼저 살펴보며 기본 기능 익히기를 권장합니다. # 난이도 가이드를 살펴보기 전, 학습권장대상 배지를 확인하고 나에게 적절한 난이도인지 확인할 수 있습니다. * **Lv.1**: 메이커의 기본 기능과 컴포넌트의 기본 기능을 사용하고 싶은 크리에이터 * **Lv.2**: MSW의 기본 문법을 알고, 간단한 동작을 직접 만들 수 있는
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | `MoveUsersToStaticRoom()` 함수의 동작 원리와 시작 맵으로의 기본 반환 규칙을 3문장 이내로 설명하세요. [answer] | `MoveUsersToStaticRoom()` 함수는 현재 인스턴스 맵에 있는 유저들을 정적 룸으로 이동시킵니다. 이때 이동할 정적 맵을 지정하지 않으면 시작 맵으로 돌아가게 됩니다. [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] | 정적 맵 안에 인스턴스 맵으로 이동하는 포탈을 직접 만들어도 유저가 이동하지 못하는 이유는 무엇인가요? [answer] | 정적 맵 안에 인스턴스 맵으로 이동하는 포탈을 직접 만들어도 유저가 이동하지 못하는 이유는, 정적 룸과 인스턴스 룸이 완전히 분리된 별도의 공간이기 때문입니다. 정적 룸과 인스턴스 룸 사이를 `RoomService`를 통하지 않고서는 이동할 수 없도록 설계되어 있습니다. 따라서 인스턴스 맵으로의 이동을 위해서는 반드시 `RoomService`의 기능을 활용해야 합니다. 구체적으로는 인스턴스 룸을 생성한 후, `RoomService:MoveUsersToInstanceRoom()` 또는 생성된 인스턴스 룸 객체의 `MoveUsers( [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정한 유저만 입장할 수 있는 특수 던전 같은 별도의 공간을 만들고 싶을 때가 있습니다. 이때 `RoomService`를 활용할 수 있습니다 다른 유저들과 분리할 수 있는 별도의 공간을 만들고, 유저를 이동시키는 `RoomService`를 알아봅시다. 인스턴스 맵을 활용하기 위해 정적 룸, 정적 맵 개념을 함께 설명합니다. # 정적 룸 하나의 월드에는 하나의 **정적 룸(Static Room)**이 있습니다. 정적 룸에는 정적 맵이 생성됩니다. 유저는 정적 맵 간 이동을 자유롭게 할 수
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 인스턴스 맵으로 이동 후 대기실로 복귀하는 과정을 위해 정적 룸을 두 개 설정해야 하는 구체적인 이유는 무엇인가요? [answer] | 참고 문서에 따르면, 인스턴스 맵으로 이동 후 대기실로 복귀하기 위해 정적 룸을 두 개(정적 맵)로 설정해야 하는 구체적인 이유는 문서에 명시되어 있지 않습니다. 문서에서는 대기 맵(`waitingmap`)과 인스턴스 맵(`dungeon`)을 만드는 것, 그리고 `dungeon` 맵의 `InstanceMap` 프로퍼티를 활성화하는 것만 준비 과정으로 안내하고 있습니다. 또한 "이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다"라고 언급만 있을 뿐, 왜 두 개의 정적 룸(또는 맵)이 필요한지 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 대기실에 모인 인원 중 Ready 버튼을 누른 3명만 게임이 진행될 맵으로 이동하게 만들어봅시다. #### 준비 이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다. 1. 대기 맵과 인스턴스 맵을 만듭니다. * 정적 맵 이름: waitingmap * 인스턴스 맵 이름: dungeon 2. dungeon 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화합니다. 3. UI 에디터 - 좌측 기
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | MapComponent의 InstanceMap 프로퍼티를 활성화하지 않으면 GetOrCreateInstanceRoom 호출 시 왜 오류가 발생하나요? [answer] | 제시된 참고 문서에는 `MapComponent`의 `InstanceMap` 프로퍼티를 활성화하지 않았을 때 `GetOrCreateInstanceRoom` 호출이 실패하거나 오류가 발생하는 구체적인 원인이 설명되어 있지 않습니다. 문서에서 확인 가능한 사실은 다음과 같습니다. 1. `dungeon` 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화해야 합니다. 2. 특정 인스턴스 룸으로 유저를 이동시키는 예제 코드 주석에는 "이 맵들은 Instanc [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 대기실에 모인 인원 중 Ready 버튼을 누른 3명만 게임이 진행될 맵으로 이동하게 만들어봅시다. #### 준비 이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다. 1. 대기 맵과 인스턴스 맵을 만듭니다. * 정적 맵 이름: waitingmap * 인스턴스 맵 이름: dungeon 2. dungeon 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화합니다. 3. UI 에디터 - 좌측 기
[task] | two_turn [pass] | ⏳ 미판정 [title] | 원하는 이펙트 찾기 [question] | 메이플스토리 월드의 리소스는 어떤 식별자를 가지고 있으며, 이를 컴포넌트나 스크립트에서 활용하는 주요 방법과 복사는 어떻게 하나요? [answer] | 메이플스토리 월드에서 제공하는 모든 리소스는 고유한 **32자리의 RUID**를 식별자로 가지고 있습니다. 크리에이터는 컴포넌트 또는 스크립트에서 이 RUID를 활용하여 리소스를 사용할 수 있습니다. RUID를 컴포넌트나 스크립트에서 활용하는 주요 방법은 다음과 같습니다. 1. **SpriteRendererComponent**: 월드에 배치되고 이미지를 가진 대부분의 엔티티가 이 컴포넌트를 가집니다. 검색한 리소스의 RUID를 `SpriteRendererComponent`의 `SpriteRUID` 프로퍼티 값으로 설정하면 해당 [followup] | SpriteRendererComponent에 RUID를 입력했을 때, 해당 RUID가 애니메이션인 경우 재생이 어떻게 이루어지는지(재생 속도와 프레임 동작) 설명해 주세요. [followup_answer] | SpriteRendererComponent의 SpriteRUID 프로퍼티에 애니메이션 리소스의 RUID를 입력하면, PlayRate 프로퍼티에서 지정된 속도로 EndFrameIndex까지 재생한 후 처음 프레임으로 돌아가기를 반복합니다. [scores] | [judge_reason] | [source_doc] | # 리소스 검색 리소스 검색은 현재 웹과 메이커에서 이용할 수 있습니다. * [MSW 리소스](https://maplestoryworlds.nexon.com/resource) * 메이커의 **Resource Storage** 패널 # 스킬 고유 명칭으로 리소스 찾기 제작 리소스 조회 페이지에서는 여러 태그를 제공하고 있지만 아직 정확도가 높지 않습니다. 검색 시 가장 정확도가 높은 키워드는 **스킬의 고유 명칭**입니다. 예로 스킬 고유 명칭인 **워리어리프**로 검색하면 원하는 검색 결과를 확인하실 수 있습니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | Player 스크립트의 프로퍼티(isReady, roomIdx, readyButton)와 동기화 속성([None])을 표로 정리하세요. [answer] | Player 스크립트 컴포넌트의 프로퍼티와 해당 동기화 속성은 다음과 같습니다. | 프로퍼티 이름 | 타입 | 동기화 속성 | 설명 | | :--- | :--- | :--- | :--- | | `isReady` | `boolean` | `[None]` | 플레이어의 준비(Ready) 상태를 나타냅니다. 서버에서 `OnReady()` 또는 `OnCancelReady()` 메서드가 호출될 때 값이 변경됩니다. | | `roomIdx` | `number` | `[None]` | 방 인덱스를 저장하는 변수입니다. 초기값은 0입니다. | [followup] | [followup_answer] | [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] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | `InstanceGameManager` 스크립트 컴포넌트를 dungeon 맵에 적용하기 위한 절차를 단계별 번호 목록으로 정리하세요. [answer] | `InstanceGameManager` 스크립트 컴포넌트를 dungeon 맵에 적용하기 위한 절차는 다음과 같습니다. 1. `InstanceGameManager` 스크립트 컴포넌트를 생성합니다. 2. 생성한 스크립트 컴포넌트에 필요한 로직(예: 게임 종료 후 유저를 정적 룸으로 이동시키는 코드)을 작성합니다. 3. 작성된 스크립트 컴포넌트를 dungeon 맵에 추가합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 정적 룸으로 이동시키기 게임이 끝난 맵의 유저는 `MoveUsersToStaticRoom()` 함수를 활용해 정적 룸으로 돌아가게 만듭니다. 돌아갈 정적 맵을 지정하지 않으면 시작 맵으로 돌아갑니다. * **InstanceGameManager 스크립트 컴포넌트**를 생성, 작성한 뒤 dungeon 맵에 스크립트 컴포넌트를 추가합니다. ```lua Method: [server only] void OnBeginPlay() { local playFunc = function()
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | 제시된 코드 예시를 그대로 출력하되, 모든 주석은 `--` 로 시작하도록 하세요. [answer] | ```lua Method: [server only] void OnBeginPlay() { local playFunc = function() local users = {} -- 현재 룸에 존재하는 플레이어들을 가져옵니다. for k, v in pairs(_UserService.UserEntities) do users[#users+1] = v.Name end -- 해당 플레이어들을 정적 룸으로 돌려보냅니다. _RoomSer [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 정적 룸으로 이동시키기 게임이 끝난 맵의 유저는 `MoveUsersToStaticRoom()` 함수를 활용해 정적 룸으로 돌아가게 만듭니다. 돌아갈 정적 맵을 지정하지 않으면 시작 맵으로 돌아갑니다. * **InstanceGameManager 스크립트 컴포넌트**를 생성, 작성한 뒤 dungeon 맵에 스크립트 컴포넌트를 추가합니다. ```lua Method: [server only] void OnBeginPlay() { local playFunc = function()
[task] | code [pass] | ⏳ 미판정 [title] | 원하는 이펙트 찾기 [question] | SpriteGUIRendererComponent 의 PreserveSprite 프로퍼티 값을 NativeSize로 설정하고 LocalScale 및 LocalPosition 프로퍼티를 활용해 UI 내 이미지 사이즈와 오프셋을 조정하는 스크립트를 작성해줘 [answer] | 메이플스토리 월드에서 UI에 배치된 이미지의 원본 사이즈와 비율을 유지하면서 크기와 위치를 조정하려면 `SpriteGUIRendererComponent`의 `PreserveSprite` 프로퍼티를 `NativeSize`로 설정한 후, `LocalScale`과 `LocalPosition`을 변경해야 합니다. 참고 문서에 명시된 대로 `PreserveSprite`를 `NativeSize`로 변경하면 이펙트(이미지)의 사이즈와 오프셋은 `LocalScale`, `LocalPosition` 프로퍼티로 조정할 수 있습니다. 아래는 해당 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 리소스 검색 리소스 검색은 현재 웹과 메이커에서 이용할 수 있습니다. * [MSW 리소스](https://maplestoryworlds.nexon.com/resource) * 메이커의 **Resource Storage** 패널 # 스킬 고유 명칭으로 리소스 찾기 제작 리소스 조회 페이지에서는 여러 태그를 제공하고 있지만 아직 정확도가 높지 않습니다. 검색 시 가장 정확도가 높은 키워드는 **스킬의 고유 명칭**입니다. 예로 스킬 고유 명칭인 **워리어리프**로 검색하면 원하는 검색 결과를 확인하실 수 있습니다.
[task] | two_turn [pass] | ⏳ 미판정 [title] | 제작 가이드 활용법 [question] | 응용 제작 가이드의 '게임 시스템 따라 만들기'와 '게임 따라 만들기' 섹션의 차이점이 무엇이며, 시스템 구현 예제(예: 상점과 인벤토리)를 내 월드에 적용할 때 주의해야 하는 점은 무엇인가요? [answer] | 응용 제작 가이드 내의 두 섹션은 목적과 내용에 다음과 같은 차이가 있습니다. **1. '게임 시스템 따라 만들기'와 '게임 따라 만들기'의 차이** * **게임 시스템 따라 만들기**: 메이플스토리 월드에서 제공하는 여러 **컴포넌트와 서비스**를 활용하여 특정 게임 시스템(예: UI, 발사체, 상점/인벤토리)을 구현하는 예제입니다. 특정 게임 전체를 만드는 것이 아니라, 월드에 필요한 **기능 단위**를 익히고 내 월드에 반영하는 데 초점이 맞춰져 있습니다. * **게임 따라 만들기**: 특정 게임(예: 플래피 피쉬, [followup] | '상점과 인벤토리' 시스템을 만들 때, DataStorage를 효과적으로 활용하여 아이템 데이터를 저장하고 불러오는 구체적인 mLua 스크립트 구조를 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 '상점과 인벤토리' 가이드의 구체적인 구현 코드나 아이템 데이터 구조가 포함되어 있지 않습니다. 또한, `DataStorage`를 활용하는 구체적인 API 명세(예: `SetAndWait`, `GetAndWait`의 정확한 시그니처나 에러 코드 처리)나 `ItemComponent`와 같은 아이템 관련 API도 문서에 명시되어 있지 않습니다. 따라서 요청하신 '상점과 인벤토리' 시스템에 특화된 mLua 스크립트 구조를 작성할 수 없습니다. 다만, 참고 문서의 '실제 mLua 예제' 섹션에 포함된 `DataSt [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 다양한 형식의 가이드를 제공하고 있습니다. 메이플스토리 월드가 생소한 크리에이터라면 기본 **제작 가이드 - 시작하기 - [메이커 사용](/docs?postId=724)을** 먼저 살펴보며 기본 기능 익히기를 권장합니다. # 난이도 가이드를 살펴보기 전, 학습권장대상 배지를 확인하고 나에게 적절한 난이도인지 확인할 수 있습니다. * **Lv.1**: 메이커의 기본 기능과 컴포넌트의 기본 기능을 사용하고 싶은 크리에이터 * **Lv.2**: MSW의 기본 문법을 알고, 간단한 동작을 직접 만들 수 있는
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인스턴스 맵 만들기 [question] | roomIdx를 매번 증가시켜 키로 사용하는 이유는 무엇이며, 이를 생략하면 어떤 문제가 생기나요? [answer] | `roomIdx`를 매번 증가시켜 키로 사용하는 이유는 **매번 새로운 인스턴스 룸을 생성하기 위해서**입니다. `_RoomService:GetOrCreateInstanceRoom()` 함수는 전달된 키(key)를 기준으로 인스턴스 룸을 찾거나 생성합니다. 만약 키가 동일하다면 이미 존재하는 인스턴스 룸을 반환합니다. 따라서 `roomIdx`를 증가시켜 `"DungeonMap"..tostring(self.roomIdx)`와 같이 고유한 키를 만들어야만, 기존 룸과 구별되는 **새로운** 인스턴스 룸이 생성됩니다. 이를 생략하고 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 대기실에 모인 인원 중 Ready 버튼을 누른 3명만 게임이 진행될 맵으로 이동하게 만들어봅시다. #### 준비 이 예제에서는 시작 맵을 인스턴스 맵으로 보내는 정적 룸, 돌아오는 정적 룸으로 활용합니다. 1. 대기 맵과 인스턴스 맵을 만듭니다. * 정적 맵 이름: waitingmap * 인스턴스 맵 이름: dungeon 2. dungeon 맵을 인스턴스 맵으로 사용하기 위해 프로퍼티 에디터 창에서 **MapComponent의 InstanceMap 프로퍼티**를 활성화합니다. 3. UI 에디터 - 좌측 기
[task] | single_turn [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | 영상 URL의 t=1s 파라미터와 스크립트에서 호출하는 Jump 함수의 timeInSeconds 값 중 어떤 것이 우선 적용되며, URL에 시간 정보를 포함하지 않으면 초기 재생 위치는 어디로 설정되나요? [answer] | 제공된 참고 문서에는 `t=1s`와 같은 URL 파라미터와 `Jump` 함수의 `timeInSeconds` 값 간의 우선순위, 또는 URL에 시간 정보가 없을 때의 초기 재생 위치에 대한 정보가 포함되어 있지 않습니다. 문서에는 `Jump(20.0)`과 같이 특정 지점부터 재생하기 위해 `Jump` 함수를 호출하는 방법과, `OnBeginPlay`에서 이를 실행하는 예시만 제시되어 있을 뿐, URL 자체의 파라미터가 어떻게 처리되는지 또는 기본값이 무엇인지에 대한 설명은 없습니다. [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] | code [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | NativeModel - MapObject의 Scale 값을 2로 설정했을 때 Preset List - Object 카테고리의 모델에도 변화가 생기는 것을 검증하기 위해, 모델 ID를 기반으로 _EntityService:GetEntityByPath()로 엔티티를 조회한 뒤 self.Entity.TransformComponent.Scale이 2인지 boolean으로 반환하는 IsMapObjectScaledCorrectly() 메서드를 가진 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `_EntityService:GetEntityByPath()` 메서드가 존재하며, `TransformComponent`의 `Scale` 프로퍼티에 접근할 수 있다는 정보를 확인할 수 있습니다. 다만, 질문에서 요청한 **"모델 ID를 기반으로 `_EntityService:GetEntityByPath()`로 엔티티를 조회"**하는 부분은 문서와 일치하지 않습니다. 문서의 예제 코드에서 `_EntityService:GetEntityByPath()`는 **엔티티 경로(path)** 예: `"/maps/map01/e [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모델을 통해 엔티티를 생성할 수 있으며, **Preset List**에서 제공하는 **Preset**도 결국 모델이라는 것을 [Model](/docs?postId=55) 가이드를 통해 배웠습니다. **Preset List**의 모델은 **NativeModel**에서 확장되었기 때문에 **Preset List** 카테고리 단위로 **NativeModel**의 속성을 물려받습니다. 따라서 각 카테고리에 해당하는 **NativeModel**을 변경하면 **Preset List**의 모델에도 변화가 생깁니다. 예를 들어 **Preset
[task] | single_turn [pass] | ⏳ 미판정 [title] | 영상 재생시키기 [question] | 모든 유저가 같은 장면을 보려면 동기화 작업이 필요하다고 하는데, ClientOnly로 설정된 영상 재생을 서버에서 제어하여 전 유저에게 동일한 영상 지점과 상태를 적용하려면 어떤 방식의 동기화가 필요한가요? [answer] | 참고 문서에 따르면, 영상 재생 함수(`Play`, `Pause`, `Jump`, `PlayPause`)가 `[client only]`로 설정되어 있어 각 클라이언트가 독립적으로 영상을 제어합니다. 이로 인해 특정 시점에 모든 유저가 같은 장면을 보지 못하며, 이를 해결하기 위해서는 **동기화 작업**이 필요합니다. 문서에는 "만약 모든 유저가 같은 화면을 보길 원한다면 동기화 작업이 필요합니다"라고 명시되어 있으나, **구체적인 동기화 구현 코드나 서버-클라이언트 간 통신을 위한 특정 API(예: 서버에서 클라이언트로 메시지를 [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] | `YoutubePlayerWorldComponent`와 `YoutubePlayerGUIComponent`의 프로퍼티 중 `SortingLayer`, `OrderInLayer`, `IgnoreMapLayerCheck`가 존재하는 차이점은 무엇이며, 이는 어떤 상황에서 영향을 미치나요? [answer] | `YoutubePlayerWorldComponent`와 `YoutubePlayerGUIComponent`의 프로퍼티 구성은 영상 재생기의 배치 환경(3D 월드 공간 vs 2D UI 화면)의 차이에서 기인합니다. 질문하신 세 가지 프로퍼티(`SortingLayer`, `OrderInLayer`, `IgnoreMapLayerCheck`)는 **`YoutubePlayerWorldComponent`에만 존재**하며, `YoutubePlayerGUIComponent`에는 없습니다. 이 차이점과 그 영향은 다음과 같습니다. ### 1. 존 [followup] | 두 컴포넌트 모두에서 `PlaySpeed` 범위가 0.5~3으로 제한되어 있는데, 이 값을 스크립트로 동적으로 변경하거나 `Volum`을 0~1 사이가 아닌 값으로 설정했을 때 발생하는 예외 처리나 동작은 어떻게 되나요? [followup_answer] | 제공된 참고 문서에는 `PlaySpeed`와 `Volum` 프로퍼티에 대해 각각 "0.5부터 3 사이의 값"과 "0부터 1 사이의 값"을 사용하도록 안내하고 있으나, **범위를 벗어난 값을 설정했을 때 발생하는 예외 처리, 클램핑(값 제한) 동작, 또는 에러 발생 여부 등에 대한 정보는 문서에 포함되어 있지 않습니다.** 따라서 해당 상황에서 어떤 동작이 일어나는지(예: 자동 보정, 무시, 에러 로그 출력 등)는 문서 근거로 답변할 수 없습니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 내가 찍은 영상 혹은 함께 보고 싶은 영상을 가져와 재생할 수 있습니다. # Youtube 관련 컴포넌트 소개 영상은 UI로 사용하거나 World에 배치해 사용할 수 있습니다. UI로 사용할 경우 YoutubeGUIPlayerComponent를 사용하고, World에 배치할 경우 YoutubePlayerWorldComponent를 사용합니다. UI로 사용한다면 영상은 배치한 곳에 고정되므로, 맵을 돌아다니더라도 유저가 보고 있는 화면의 특정 위치에서 움직이지 않습니다. World에서 영상을 사용한다면 배치한