[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 유저 입장 시와 퇴장 시 발생하는 이벤트 이름 및 이벤트 객체에서 접근 가능한 UserId 변수를 추출하여 2행짜리 표로 정리하세요. [answer] | | 이벤트 이름 | UserId 접근 방법 | | :--- | :--- | | UserEnterEvent | event.UserId | | UserLeaveEvent | event.UserId | [followup] | [followup_answer] | [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] | single_turn [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | Entity와 Component의 관계가 피자와 토핑의 비유로 설명되는데, 실제 스크립트에서 특정 기능(예: 이동)을 구현할 때 Component를 어떻게 조합해야 하는지 구체적으로 알고 싶어요. [answer] | 참고 문서에는 Entity와 Component의 관계가 피자와 토핑으로 비유되어 설명되어 있지만, 실제 스크립트에서 특정 기능(이동 등)을 구현하기 위해 어떤 Component를 어떻게 조합해야 하는지에 대한 구체적인 가이드나 예제는 제공되지 않습니다. 문서에서 확인할 수 있는 사실은 다음과 같습니다: 1. **Entity**는 Component들의 집합체입니다. 2. **Component**는 각각의 기능을 담당하며, 재사용성을 높이기 위해 분리되어 있습니다. 3. 프로퍼티 에디터에서 Component를 관리하고, Entity [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Entity와 Component 그리고 Property에 대해서 개념을 이해합니다. # Entity 엔티티는 메이플스토리 월드 내에서 존재하는 객체입니다. 아래의 그림에서 Entity는 어떤 것들일까요? 빨간색을 칠한 부분이 Entity입니다. 그뿐만 아니라 보이지는 않지만 돌아가고 있는 모든 것들이 Entity입니다. 메이플스토리 월드에서는 실제로 수많은 Entity가 배치되어 있고 실시간으로 생성, 변경, 삭제됩니다. Entity들이 실제 게임상에서 활동함으로써 시각적으로 보이며, 내부적으로 로직
[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델 [question] | 메이플스토리 리소스를 기반으로 컴포넌트와 프로퍼티를 수정한 엔티티를 자주 재사용해야 할 때 추천하는 제작 방식은 무엇인가요? [answer] | 메이플스토리 리소스를 기반으로 컴포넌트와 프로퍼티를 수정한 엔티티를 자주 재사용해야 할 때는 해당 엔티티를 **모델화(Modeling)** 하는 것이 추천되는 제작 방식입니다. 기존 엔티티에 컴포넌트를 추가하거나 프로퍼티를 수정해 원하는 모습(예: 말하는 나무)으로 완성한 후, 해당 엔티티의 콘텍스트 메뉴에서 **Create Model From Entity**를 클릭하면 엔티티가 모델로 변환됩니다. 이렇게 만든 모델은 **Workspace - MyDesk**에서 확인할 수 있으며, 이후에는 이 모델을 기반으로 필요한 위치와 개수만 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 자주 사용했던 모델의 개념을 정확히 이해합니다. # 원하는 Entity 만들기 원하는 엔티티를 만들려면, 엔티티에 컴포넌트를 추가하고 프로퍼티를 수정해야 합니다. 다음과 같은 나무를 만들어봅시다. 엔티티를 만들고 컴포넌트를 추가하고 프로퍼티를 알맞게 수정했습니다. 완성이군요! 이렇게 여러 개의 나무를 모아서 숲을 만들고 싶습니다. 어떻게 하면 될까요? 엔티티를 만들고 컴포넌트를 추가하고 프로퍼티를 4번 수정하면 되겠군요. 나무가 100개가 있다면 어떻게 하면 될까요? 그렇습니다. 100번을 해야
[task] | single_turn [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | Entity가 보이지 않는 로직도 포함한다고 했을 때, 단순히 화면에 보이는 객체만 Entity로 취급해도 되는지, 그리고 배경음악이나 사운드 같은 것은 Entity로 존재하는 건지 궁금해요. [answer] | 참고 문서에 따르면, Entity는 단순히 화면에 보이는 객체만을 의미하지 않습니다. 문서에서는 "보이지는 않지만 돌아가고 있는 모든 것들이 Entity입니다"라고 명확히 설명하고 있습니다. 즉, 시각적으로 드러나지 않는 내부 로직이나 시스템이 작동하는 객체도 Entity로 취급됩니다. 다만, 배경음악이나 사운드가 구체적으로 Entity로 존재하는지에 대한 언급은 제공된 문서에 포함되어 있지 않습니다. 문서에는 Entity의 개념, Component와의 관계, 그리고 보이지 않는 로직 포함 여부에 대한 일반적 설명만 있을 뿐, 사 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Entity와 Component 그리고 Property에 대해서 개념을 이해합니다. # Entity 엔티티는 메이플스토리 월드 내에서 존재하는 객체입니다. 아래의 그림에서 Entity는 어떤 것들일까요? 빨간색을 칠한 부분이 Entity입니다. 그뿐만 아니라 보이지는 않지만 돌아가고 있는 모든 것들이 Entity입니다. 메이플스토리 월드에서는 실제로 수많은 Entity가 배치되어 있고 실시간으로 생성, 변경, 삭제됩니다. Entity들이 실제 게임상에서 활동함으로써 시각적으로 보이며, 내부적으로 로직
[task] | single_turn [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | Property 값을 변경하지 않고 단순히 새로운 Component를 계속 추가하는 방식과 Property를 활용하는 방식의 차이점이 무엇인가요? [answer] | Property를 활용하는 방식과 단순히 새로운 Component를 계속 추가하는 방식의 핵심 차이점은 **재사용성(Reusability)** 과 **유지보수 용이성**입니다. **1. 새로운 Component를 계속 추가하는 방식** * **문제점:** 요구사항(예: 페퍼로니 2배, 모짜렐라 치즈, 큰 사이즈 등)이 조금만 변해도 새로운 Component를 만들어야 합니다. * **결과:** 동일한 기본 동작을 가진 Component들이 세부 설정 차이만으로도 수많은 버전으로 분산됩니다. 이는 코드 관리의 복잡도를 높이고 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Property는 각 Component의 세부사항을 설정합니다. Component에서 예시를 든 피자로 다시 돌아와 볼까요? 세 명의 아이가 페퍼로니 피자를 먹고 싶어 합니다. 철수는 페퍼로니가 2배들어 있는 피자를 원하고, 영희는 들어 있는 치즈가 체다가 아닌 모짜렐라 치즈를 원합니다. 윤후는 사이즈를 조금 더 크게 먹고 싶습니다. 기존에 도우 Component, 페퍼로니 Component, 치즈 Component 가 있습니다. 자, 어떻게 하면 될까요? 철수는 페퍼로니 2배 Component를 추가하고 영희는 모짜렐라 치즈
[task] | single_turn [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | Entity Editor에서 Component 목록을 확인하는 방법은 알겠는데, 특정 Entity에 이미 부착된 Component를 코드(mLua)로 직접 추가하거나 삭제하는 API가 있는지 알고 싶어요. [answer] | 제시된 참고 문서에는 Entity Editor를 통해 Component를 관리하는 방법과 Component의 개념, 그리고 Property/Method/Event Handler를 활용한 mLua 스크립트 작성 예제만 포함되어 있습니다. 특정 Entity에 이미 부착된 Component를 **코드(mLua)로 직접 추가하거나 삭제하는 API**에 대한 설명은 참고 문서에 존재하지 않습니다. 따라서 해당 기능이 있는지 여부는 확인이 불가능합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Entity와 Component 그리고 Property에 대해서 개념을 이해합니다. # Entity 엔티티는 메이플스토리 월드 내에서 존재하는 객체입니다. 아래의 그림에서 Entity는 어떤 것들일까요? 빨간색을 칠한 부분이 Entity입니다. 그뿐만 아니라 보이지는 않지만 돌아가고 있는 모든 것들이 Entity입니다. 메이플스토리 월드에서는 실제로 수많은 Entity가 배치되어 있고 실시간으로 생성, 변경, 삭제됩니다. Entity들이 실제 게임상에서 활동함으로써 시각적으로 보이며, 내부적으로 로직
[task] | single_turn [pass] | ⏳ 미판정 [title] | 컴포넌트 추가와 삭제 [question] | 프로퍼티 에디터에서 컴포넌트 아이콘을 보고 어떤 기능이 있는지 바로 알 수 있나요? [answer] | 네, 프로퍼티 에디터에서 컴포넌트 아이콘을 보고 해당 컴포넌트의 주요 기능 범주를 바로 파악할 수 있습니다. 프로퍼티 에디터의 컴포넌트는 **Map, UI, Player, Etc** 4가지 항목으로 분류되며, 각 컴포넌트 앞의 아이콘은 그 특징을 나타냅니다. 주요 아이콘과 의미는 다음과 같습니다. * **아바타 관련 컴포넌트** * **UI 관련 컴포넌트** * **AI 관련 컴포넌트** * **기타 컴포넌트 (크리에이터 제작 컴포넌트 포함)** * **카메라 관련 컴포넌트** * **플레이어 관련 컴포넌트 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티에 정체성을 불어넣는 방법은 컴포넌트를 이용하는 것입니다. 컴포넌트와 프로퍼티 에디터 창 이용 방법을 알아보겠습니다. # 컴포넌트 구분 컴포넌트는 엔티티의 정체성을 결정하는 역할을 합니다. 컴포넌트는 크리에이터가 제작한 모델에서 몇 가지 컴포넌트를 추가하거나, 삭제해 겉모습은 같지만 다르게 동작하는 엔티티를 제작할 수 있습니다. 프로퍼티 에디터 창에서 컴포넌트는 **Map, UI, Player, Etc** 4가지 항목으로 분류하고 있습니다.각 항목에 맞는 컴포넌트가 들어 있으며, 컴포넌트의 특징은 아
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserDisconnectEvent와 UserReconnectEvent에서 접근 가능한 필드 이름을 3문장 이내로 나열하세요. [answer] | UserDisconnectEvent와 UserReconnectEvent 모두에서 `event.UserId`, `event.TimeNetworkClosed` 필드에 접근할 수 있습니다. UserDisconnectEvent만은 `event.DisconnectMapName` 필드를, UserReconnectEvent만은 `event.ReconnectMapName` 필드를 추가로 제공합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | Test 컴포넌트 생성부터 Hierarchy - Common 엔티티에 추가하는 과정까지를 3단계 이하의 번호 목록으로 요약하세요. [answer] | 1. Workspace - MyDesk의 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭하여 새 스크립트 컴포넌트를 생성한 뒤 이름을 **Test**로 변경합니다. 2. 생성한 **Test** 컴포넌트를 **Hierarchy - Common** 엔티티에 추가합니다. [followup] | [followup_answer] | [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] | single_turn [pass] | ⏳ 미판정 [title] | 스크립트 에디터 오리엔테이션 [question] | 스크립트 컴포넌트를 만든 후 DefaultPlayer에 추가했는데 왜 콘솔에 로그가 안 뜨나요? [answer] | 스크립트 컴포넌트를 `DefaultPlayer`에 추가했는데 콘솔에 로그가 출력되지 않는다면, 스크립트 컴포넌트 자체가 제대로 실행되고 있지 않거나, 로그를 출력하는 함수가 호출되지 않는 상태일 가능성이 높습니다. 제공된 가이드 문서의 절차와 비교하여 아래 항목들을 확인해 보세요. **1. 스크립트 컴포넌트가 실제로 엔티티에 추가되었는지 확인** 가이드에 따르면 `Workspace - DefaultPlayer`를 클릭한 후 프로퍼티 에디터의 **[Add Component]** 버튼을 통해 컴포넌트를 검색하여 추가해야 합니다. 단순 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 스크립트 에디터를 사용해 크리에이터가 원하는 컴포넌트나 로직을 만들 수 있습니다. 스크립트 문법은 **Lua Script**를 사용하며 다양한 **API**를 지원합니다. 월드를 만들다 보면, 메이플스토리 월드에서 제공하는 스크립트나 다른 크리에이터가 작성한 스크립트를 수정해야 할 일이 생깁니다. 스크립트를 수정하기 위해서라도 스크립트 에디터 기본 사용법을 익혀두는 것이 좋습니다. 이번 과정에서는 간단하게 스크립트로 로그를 출력하는 방법을 알아보고, 스크립트 에디터의 다양한 편의 기능도
[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델 [question] | 나무 엔티티에 컴포넌트를 추가해 만든 "말하는 나무"를 100개 배치할 때 모델화를 해야 하는 구체적인 이유는 무엇인가요? [answer] | "말하는 나무"를 100개 배치할 때 모델화를 해야 하는 구체적인 이유는 **반복적인 수작업(컴포넌트 추가 및 프로퍼티 수정)을 피하기 위해서**입니다. 참고 문서에 따르면, "말하는 나무"를 직접 만들어 배치하려면 다음과 같은 과정이 필요합니다. 1. 나무 엔티티를 배치한다. 2. `ChatBalloonComponent`를 추가한다. 3. 필요한 경우 프로퍼티를 수정한다. 이 과정을 100번 반복해야 하므로 매우 번거롭고 피곤한 작업이 됩니다. 반면, 처음 만든 "말하는 나무" 엔티티를 **모델화(Model)** 하면, 이 엔 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 자주 사용했던 모델의 개념을 정확히 이해합니다. # 원하는 Entity 만들기 원하는 엔티티를 만들려면, 엔티티에 컴포넌트를 추가하고 프로퍼티를 수정해야 합니다. 다음과 같은 나무를 만들어봅시다. 엔티티를 만들고 컴포넌트를 추가하고 프로퍼티를 알맞게 수정했습니다. 완성이군요! 이렇게 여러 개의 나무를 모아서 숲을 만들고 싶습니다. 어떻게 하면 될까요? 엔티티를 만들고 컴포넌트를 추가하고 프로퍼티를 4번 수정하면 되겠군요. 나무가 100개가 있다면 어떻게 하면 될까요? 그렇습니다. 100번을 해야
[task] | code [pass] | ⏳ 미판정 [title] | 맵 레이어 [question] | Layer4에 배치된 나무 오브젝트와 Layer1에 있는 플레이어 아바타 간의 레이어 차이(OrderInLayer)를 비교하여 아바타가 나무 뒤에 위치하도록 렌더링 순서를 확인하는 스크립트를 작성해줘. [answer] | 제시된 참고 문서에는 `OrderInLayer` 값이나 레이어 순서를 직접 조회·비교하는 mLua API(예: `Entity.Layer`, `Entity.OrderInLayer` 등)가 포함되어 있지 않습니다. 문서에서는 레이어 배치가 렌더링 순서를 결정한다는 원리와 활용 예시만 설명하고 있을 뿐, 스크립트로 해당 값을 읽어와 비교하는 방법은 제공하지 않습니다. 따라서 문서에 근거하여 레이어 차이를 코드로 비교하는 스크립트를 작성하는 것은 불가능합니다. 참고로, 문서의 '활용 예시 2'에 따르면 레이어 순서와 렌더링 관계는 다음 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 초록 타일은 Layer1에, 연두 타일은 Layer2에 배치했습니다. 초록 타일을 밟고 있는 플레이어 아바타는 점프할 때까지는 Layer1에 머물러 있지만, 노란 타일에 착지하는 순간 Layer2에 있는 상태가 됩니다. #### 활용 예시 2 4개의 레이어에 각각 타일과 오브젝트를 배치했습니다.(OrderInLayer는 기본값입니다.) 플레이어 아바타는 밟고 있는 엔티티 레이어가 귀속 기준이므로 가장 아래 있는 layer1에서 움직이기 시작합니다. 초록 타일 위 나무 오브젝트들은 Layer4에 배치되어 있습니다. 그러므로 초록
[task] | code [pass] | ⏳ 미판정 [title] | 맵 레이어 [question] | Layer1에 배치된 초록 타일 위를 밟고 있는 플레이어 아바타의 현재 소속 레이어(Layer1)를 확인하여 콘솔에 출력하는 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 맵 레이어의 개념과 아바타가 밟고 있는 타일의 레이어에 따라 소속이 변경되는 원리는 설명되어 있지만, **mLua 스크립트에서 플레이어 아바타의 현재 소속 레이어(Layer) 값을 직접 조회하거나 출력하는 API(함수, 프로퍼티, 메서드)가 명시되어 있지 않습니다.** 따라서 문서에 근거하여 "현재 소속 레이어를 확인하여 콘솔에 출력하는" 완전한 mLua 코드를 작성하는 것은 불가능합니다. 문서에 없는 API를 지어내지 않기 때문입니다. 참고로, 문서에서 언급된 내용과 일반적인 mLua 구조를 참고하면 플레 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 초록 타일은 Layer1에, 연두 타일은 Layer2에 배치했습니다. 초록 타일을 밟고 있는 플레이어 아바타는 점프할 때까지는 Layer1에 머물러 있지만, 노란 타일에 착지하는 순간 Layer2에 있는 상태가 됩니다. #### 활용 예시 2 4개의 레이어에 각각 타일과 오브젝트를 배치했습니다.(OrderInLayer는 기본값입니다.) 플레이어 아바타는 밟고 있는 엔티티 레이어가 귀속 기준이므로 가장 아래 있는 layer1에서 움직이기 시작합니다. 초록 타일 위 나무 오브젝트들은 Layer4에 배치되어 있습니다. 그러므로 초록
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService의 UserEnterEvent와 UserLeaveEvent 핸들러 코드만 출력하고, 각 핸들러의 동작 설명은 주석으로 작성하세요. [answer] | ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- 유저가 월드에 입장했을 때 발생하는 이벤트입니다. -- event.UserId를 통해 현재 게임에 입장한 유저의 UserId를 받습니다. local UserId = event.UserId log("User Enter! : "..UserId) } Event Handler: [service: UserService] HandleUserLeav [followup] | [followup_answer] | [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] | 유저 엔티티를 찾아주는 UserService [question] | UserService의 UserEntities 프로퍼티가 반환하는 사전(Dictionary) 타입의 Key와 Value가 각각 무엇인지 2문장 이내로 설명하세요. [answer] | Key는 UserId이고, Value는 MODEntity입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **UserService**는 게임에 참여 중인 모든 유저 엔티티를 받아오는 **UserEntities** 프로퍼티를 제공합니다. **UserEntities**는 사전(Dictionary) 타입입니다. **Key - Value** 값으로 **UserId - MODEntity**를 반환합니다. 다음은 유저가 게임에 들어올 때마다 모든 플레이어를 순회하며 **Entity Name**을 출력하는 예제입니다. 위의 **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: User
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 이름표 붙이기 [question] | NameTagComponent.FontColor 를 "f5e38b"에서 "ffffff"로 2초 간격으로 번갈아 변경하여 이름표 글씨 색상이 깜빡이는 효과를 내는 스크립트를 작성해줘 [answer] | NameTagComponent 의 FontColor 프로퍼티는 색상 값(Color)을 사용합니다. 제공된 문서의 예제에서는 Color.green, Color.magenta, Color.cyan 등 이름이 있는 색상 상수를 사용하거나, "f5e38b"와 같은 16진수 문자열을 직접 프로퍼티에 대입하는 방식으로 설명하고 있습니다. 문서에는 16진수 문자열("f5e38b", "ffffff")을 직접 Color 프로퍼티에 대입할 수 있다는 명시적인 API 또는 예제가 **없습니다**. 제공된 코드 예제에서는 Color.green과 같은 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 사물을 구분하는 효과적인 방법은 이름을 붙이는 것입니다. 이름표를 이용해 오브젝트와 NPC를 구분하거나, 유저를 구분할 수 있습니다. NameTagComponent 사용 방법과 활용 예시를 소개합니다. # 이름표 붙이기 엔티티를 선택하고 **NameTagComponent**를 추가합니다. 프로퍼티 값을 변경해 원하는 이름표를 만듭니다. NameTagComponent 프로퍼티 구성은 다음과 같습니다. | 이름 | 설명 | | --- | --- | | FontColor | 글씨 색상을 변경합니다. 색상 변
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | 3초마다 텔레포트가 실행되도록 설정하는 로직을 구현하는 OnUpdate 함수 본문만 ```lua 코드 블록으로 출력하고, 설명은 주석으로만 작성하세요. [answer] | ```lua [server only] void OnUpdate(number delta) { -- 프로퍼티 동기화가 필요 없으므로 _T 프로퍼티를 활용 if self._T.accTime == nil then self._T.accTime = 0 end if self._T.teleportCnt == nil then self._T.teleportCnt = 0 end -- 테이블 타입의 프로퍼티를 선언, 각 맵에 배치한 목적지 엔티티의 Path 입력 if self._T.destinationTabl [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트를 통해 텔레포트 기능을 만듭니다. 새 스크립트 컴포넌트를 만든 뒤 캐릭터에 추가합니다. 1. **Workspace - MyDesk** 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭해 새 컴포넌트를 추가합니다. 2. 컴포넌트 이름을 **Teleport**로 설정합니다. 3. **Workspace - DefaultPlayer**에 **Teleport** 컴포넌트를 추가합니다. 이제 본격적으로 스크립트를 작성해 봅시다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 컴포넌트 추가와 삭제 [question] | 같은 모델의 엔티티인데 겉모습은 같게 유지하면서 동작만 다르게 만들고 싶어요. [answer] | 같은 모델의 엔티티를 겉모습은 유지하면서 동작만 다르게 만드는 방법은 **컴포넌트(Component)** 를 활용하는 것입니다. 크리에이터가 제작한 모델에는 기본 컴포넌트가 포함되어 있지만, 프로퍼티 에디터를 통해 특정 엔티티에만 추가적인 컴포넌트를 추가하거나 기존 컴포넌트를 삭제함으로써, 동일한 모델이라도 서로 다른 행동을 하는 엔티티를 제작할 수 있습니다. ### 컴포넌트 추가 및 설정 방법 1. **컴포넌트 추가**: 프로퍼티 에디터 창 하단의 **Add component** 버튼을 누릅니다. 2. **컴포넌트 선택* [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티에 정체성을 불어넣는 방법은 컴포넌트를 이용하는 것입니다. 컴포넌트와 프로퍼티 에디터 창 이용 방법을 알아보겠습니다. # 컴포넌트 구분 컴포넌트는 엔티티의 정체성을 결정하는 역할을 합니다. 컴포넌트는 크리에이터가 제작한 모델에서 몇 가지 컴포넌트를 추가하거나, 삭제해 겉모습은 같지만 다르게 동작하는 엔티티를 제작할 수 있습니다. 프로퍼티 에디터 창에서 컴포넌트는 **Map, UI, Player, Etc** 4가지 항목으로 분류하고 있습니다.각 항목에 맞는 컴포넌트가 들어 있으며, 컴포넌트의 특징은 아
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 문서에 포함된 두 이벤트 핸들러 예제 코드를 한 개의 코드 블록으로 통합하여, 설명은 주석으로만 작성하세요. [answer] | ```lua Event Handler: [service: UserService] HandleUserDisconnectEvent (UserDisconnectEvent event) { -- Parameters local DisconnectMapName = event.DisconnectMapName local TimeNetworkClosed = event.TimeNetworkClosed local UserId = event.UserId ------------------------------------- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | code [pass] | ⏳ 미판정 [title] | 맵 레이어 [question] | Layer3에 속한 연두 타일 위를 이동하는 플레이어 아바타와 Layer2에 배치된 장난감 오브젝트의 레이어 관계를 검증하여 아바타가 장난감 앞으로 지나가도록 하는 로직을 구현하는 스크립트를 작성해줘. [answer] | 제공된 문서에는 플레이어 아바타의 레이어 귀속 상태(현재 밟고 있는 타일의 레이어)를 직접 조회하거나, 타일 레이어와 오브젝트 레이어를 비교하는 mLua API가 포함되어 있지 않습니다. 문서에서 확인 가능한 사실은 다음과 같습니다. 1. **레이어 귀속 규칙**: 플레이어 아바타는 밟고 있는 엔티티(타일)의 레이어가 귀속 기준이 됩니다. 2. **렌더링 순서**: 아바타가 속한 레이어가 오브젝트 레이어보다 위에 있으면 아바타가 앞으로, 아래면 뒤로 지나갑니다. 3. **문서의 시나리오**: 연두 타일이 Layer3에 있고, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 초록 타일은 Layer1에, 연두 타일은 Layer2에 배치했습니다. 초록 타일을 밟고 있는 플레이어 아바타는 점프할 때까지는 Layer1에 머물러 있지만, 노란 타일에 착지하는 순간 Layer2에 있는 상태가 됩니다. #### 활용 예시 2 4개의 레이어에 각각 타일과 오브젝트를 배치했습니다.(OrderInLayer는 기본값입니다.) 플레이어 아바타는 밟고 있는 엔티티 레이어가 귀속 기준이므로 가장 아래 있는 layer1에서 움직이기 시작합니다. 초록 타일 위 나무 오브젝트들은 Layer4에 배치되어 있습니다. 그러므로 초록
[task] | code [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | Component 의 재사용성을 높이기 위해, 동일한 ChatBalloonComponent 를 사용하면서 Property 값만 다르게 설정하는 구조를 만드는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `ChatBalloonComponent`의 `BalloonScale`과 `FontSize` Property가 존재하며, Entity별로 Property 값을 다르게 설정할 수 있다는 정보가 포함되어 있습니다. 또한, `OnBeginPlay`와 `OnUpdate`를 사용하여 컴포넌트를 초기화하고 값을 업데이트하는 mLua 스크립트 구조가 예시로 제시되어 있습니다. 문서에는 `ChatBalloonComponent`의 다른 Property(예: `Message`, `AutoShowEnabled` 등)에 대한 구체적 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Property는 각 Component의 세부사항을 설정합니다. Component에서 예시를 든 피자로 다시 돌아와 볼까요? 세 명의 아이가 페퍼로니 피자를 먹고 싶어 합니다. 철수는 페퍼로니가 2배들어 있는 피자를 원하고, 영희는 들어 있는 치즈가 체다가 아닌 모짜렐라 치즈를 원합니다. 윤후는 사이즈를 조금 더 크게 먹고 싶습니다. 기존에 도우 Component, 페퍼로니 Component, 치즈 Component 가 있습니다. 자, 어떻게 하면 될까요? 철수는 페퍼로니 2배 Component를 추가하고 영희는 모짜렐라 치즈
[task] | single_turn [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | TeleportToEntityPath 함수에 전달해야 하는 목적지 엔티티의 정확한 경로는 Hierarchy 뷰에서 어떻게 복사해서 확인하나요? [answer] | Hierarchy 뷰에서 목적지 엔티티의 정확한 경로를 복사하는 방법은 다음과 같습니다. 1. **Hierarchy** 창에서 텔레포트의 목적지로 삼을 엔티티를 찾습니다. 2. 해당 엔티티에서 마우스 우클릭을 하여 **Context Menu(컨텍스트 메뉴)** 를 엽니다. 3. 메뉴 목록에서 **Copy Entity Path**를 클릭합니다. 이렇게 복사한 경로 문자열을 스크립트의 `TeleportToEntityPath` 함수에 전달하는 파라미터로 사용하면 됩니다. 예를 들어, `map01` 맵의 특정 엔티티 경로가 다음과 같 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 특정 시간마다 캐릭터를 다른 맵으로 이동시키는 기능을 만들어 보면서 `TeleportService`의 `TeleportToEntityPath` 함수 사용법을 알아봅시다. ##### 참고 API Reference [TeleportService](/apiReference/Services/TeleportService) # 이동할 맵 만들기 먼저 캐릭터가 이동할 맵을 만듭니다. 1. **Window - Map List** 창을 엽니다. 2. **Map List** 창에서 **[새 맵 만들기]** 버튼을 클릭
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService의 Users 프로퍼티가 반환하는 유저 정보의 구성 요소 3가지를 표로 정리해서 작성하세요. [answer] | `UserService`의 `Users` 프로퍼티는 게임에 참여 중인 모든 유저의 다음 정보 3가지를 반환합니다. | 구성 요소 | 설명 | | :--- | :--- | | **UserId** | 유저의 고유 식별자 | | **Nickname** | 유저의 프로필 이름 | | **ProfileCode** | 유저의 프로필 코드 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **UserService**는 게임에 참여 중인 모든 유저 엔티티를 받아오는 **UserEntities** 프로퍼티를 제공합니다. **UserEntities**는 사전(Dictionary) 타입입니다. **Key - Value** 값으로 **UserId - MODEntity**를 반환합니다. 다음은 유저가 게임에 들어올 때마다 모든 플레이어를 순회하며 **Entity Name**을 출력하는 예제입니다. 위의 **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: User
[task] | code [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | Property 를 통해 ChatBalloonComponent 의 BalloonScale 값을 변경했을 때 말풍선의 크기가 실제로 변하는지 확인하는 테스트용 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `ChatBalloonComponent`의 `BalloonScale` 프로퍼티가 말풍선의 크기를 설정한다는 설명은 있지만, 해당 값을 변경했을 때 시각적으로 실제로 변하는지 확인하기 위한 **API, 이벤트, 또는 특정 테스트 메서드**에 대한 기술이 없습니다. 문서에서 확인할 수 있는 `ChatBalloonComponent` 관련 정보와 실제 사용 예제는 다음과 같습니다: 1. `ChatBalloonComponent`는 `BalloonScale`과 `FontSize` 프로퍼티를 가집니다. 2. `OnBe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Property는 각 Component의 세부사항을 설정합니다. Component에서 예시를 든 피자로 다시 돌아와 볼까요? 세 명의 아이가 페퍼로니 피자를 먹고 싶어 합니다. 철수는 페퍼로니가 2배들어 있는 피자를 원하고, 영희는 들어 있는 치즈가 체다가 아닌 모짜렐라 치즈를 원합니다. 윤후는 사이즈를 조금 더 크게 먹고 싶습니다. 기존에 도우 Component, 페퍼로니 Component, 치즈 Component 가 있습니다. 자, 어떻게 하면 될까요? 철수는 페퍼로니 2배 Component를 추가하고 영희는 모짜렐라 치즈
[task] | code [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | 텔레포트로 3개 맵을 순환하도록 만들 것이므로 2개의 새 맵을 추가합니다. [answer] | 메이플스토리 월드에서 텔레포트로 3개 맵을 순환하는 기능을 만들려면, 이미 존재하는 맵 하나를 제외하고 **2개의 새로운 맵**을 추가해야 합니다. 이 과정은 다음과 같은 단계로 진행됩니다: 1. **Window - Map List** 창을 엽니다. 2. **Map List** 창에서 **[새 맵 만들기]** 버튼을 클릭하여 2개의 새 맵을 생성합니다. 3. 각 맵을 쉽게 구분할 수 있도록 특색 있게 꾸밉니다. 4. 각 맵으로 텔레포트했을 때 목적지 역할을 할 엔티티를 하나씩 배치합니다. 5. **Hierarchy** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 특정 시간마다 캐릭터를 다른 맵으로 이동시키는 기능을 만들어 보면서 `TeleportService`의 `TeleportToEntityPath` 함수 사용법을 알아봅시다. ##### 참고 API Reference [TeleportService](/apiReference/Services/TeleportService) # 이동할 맵 만들기 먼저 캐릭터가 이동할 맵을 만듭니다. 1. **Window - Map List** 창을 엽니다. 2. **Map List** 창에서 **[새 맵 만들기]** 버튼을 클릭
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 유저가 게임에 들어올 때마다 모든 플레이어를 순회하며 Entity Name을 출력하는 HandleUserEnterEvent 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId -------------------------------------------------------- --UserService로 모든 유저를 Dictionary로 받음 local AllUserEntitiesDic = _UserService.UserEntities [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **UserService**는 게임에 참여 중인 모든 유저 엔티티를 받아오는 **UserEntities** 프로퍼티를 제공합니다. **UserEntities**는 사전(Dictionary) 타입입니다. **Key - Value** 값으로 **UserId - MODEntity**를 반환합니다. 다음은 유저가 게임에 들어올 때마다 모든 플레이어를 순회하며 **Entity Name**을 출력하는 예제입니다. 위의 **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: User
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserDisconnectEvent와 UserReconnectEvent의 발생 시점과 주요 파라미터를 비교하는 표로 정리하세요. [answer] | UserDisconnectEvent와 UserReconnectEvent는 모두 `UserService`에서 발생하는 이벤트로, 각각 유저의 네트워크 접속이 끊겼을 때와 재접속했을 때 트리거됩니다. 두 이벤트의 발생 시점과 주요 파라미터는 다음과 같습니다. | 구분 | UserDisconnectEvent | UserReconnectEvent | | :--- | :--- | :--- | | **발생 시점** | 유저의 네트워크 접속이 불안정하여 끊겼을 때 | 유저가 다시 재접속했을 때 | | **UserId** | `event.Use [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | single_turn [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | 스크립트에서 TeleportService 를 호출할 때 언더스코어 접두사(_TeleportService)를 붙여야 하는 이유는 무엇인가요? [answer] | mLua 스크립트에서 `TeleportService`를 포함한 모든 서비스(Services)를 호출할 때는 반드시 언더스코어(`_`) 접두사를 붙여야 합니다. 이는 mLua의 **서비스 접근 규칙** 때문입니다. `TeleportService`, `UserService`, `EntityService`, `SpawnService`, `TimerService` 등은 스크립트 컴포넌트 내부에서 직접 인스턴스를 생성하거나 `GetComponent`로 가져오는 것이 아니라, 언더스코어 접두사를 붙인 전역 서비스 객체(예: `_Telepor [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 특정 시간마다 캐릭터를 다른 맵으로 이동시키는 기능을 만들어 보면서 `TeleportService`의 `TeleportToEntityPath` 함수 사용법을 알아봅시다. ##### 참고 API Reference [TeleportService](/apiReference/Services/TeleportService) # 이동할 맵 만들기 먼저 캐릭터가 이동할 맵을 만듭니다. 1. **Window - Map List** 창을 엽니다. 2. **Map List** 창에서 **[새 맵 만들기]** 버튼을 클릭
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService에서 제공하는 UserLeaveEvent 핸들러를 추가해서 유저가 퇴장할 때 해당 유저의 UserId를 확인하려면 어떤 코드를 작성해야 하나요? [answer] | `UserService`의 `UserLeaveEvent` 핸들러를 추가하면, 유저가 월드에서 퇴장할 때 발생하는 이벤트를 처리할 수 있습니다. 이벤트 매개변수 `event`에서 `UserId`를 가져와 로그로 출력하는 코드는 다음과 같습니다. ```lua Event Handler: [service: UserService] HandleUserLeaveEvent (UserLeaveEvent event) { -- Parameters local UserId = event.UserId ------------------ [followup] | [followup_answer] | [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] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 게임에 현재 참여하고 있는 유저의 총 수를 확인하고 싶을 때 UserService에서 어떤 메서드를 호출해야 하나요? [answer] | 게임에 현재 참여하고 있는 유저의 총 수를 확인하려면 `UserService`의 `GetUserCount()` 메서드를 호출해야 합니다. ```lua local userCount = _UserService:GetUserCount() log("현재 참여 중인 유저 수: " .. userCount) ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **UserService**는 게임에 참여 중인 모든 유저 엔티티를 받아오는 **UserEntities** 프로퍼티를 제공합니다. **UserEntities**는 사전(Dictionary) 타입입니다. **Key - Value** 값으로 **UserId - MODEntity**를 반환합니다. 다음은 유저가 게임에 들어올 때마다 모든 플레이어를 순회하며 **Entity Name**을 출력하는 예제입니다. 위의 **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: User