[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 스크립트 컴포넌트에 UserService 관련 이벤트 핸들러를 추가할 때 서비스 태그를 어떻게 표기해야 하는지 알려주세요. [answer] | UserService 관련 이벤트 핸들러를 추가할 때 서비스 태그는 `[service: UserService]` 형식으로 표기해야 합니다. 예를 들어, 유저가 월드에 입장했을 때 처리하는 `UserEnterEvent` 핸들러를 추가한다면 다음과 같이 작성합니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent 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] | code [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | **Hierarchy**에서 각 엔티티의 콘텍스트 메뉴를 열고 **Copy Entity Path**를 클릭해 경로를 복사한 뒤 따로 기록합니다. [answer] | Hierarchy 창에서 특정 엔티티를 우클릭해 열리는 콘텍스트 메뉴에서 **Copy Entity Path** 항목을 선택하면, 해당 엔티티의 경로를 클립보드에 복사할 수 있습니다. 이 경로는 `TeleportService`의 `TeleportToEntityPath` 함수나 `_EntityService:GetEntityByPath` 메서드 등을 사용할 때 목적지 엔티티를 정확히 지정하기 위해 필요합니다. 따라서 텔레포트 대상이 될 엔티티의 경로를 미리 복사하여 기록해 두어야 합니다. 예를 들어, 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] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 유저가 월드에 입장했을 때 UserEnterEvent 핸들러를 통해 UserId를 어떻게 받아서 로그로 출력할 수 있나요? [answer] | 유저가 월드에 입장했을 때 `UserService`에서 `UserEnterEvent`가 발생합니다. 스크립트 컴포넌트에 해당 이벤트 핸들러를 추가하면, 핸들러의 매개 변수로 들어오는 `event` 객체를 통해 입장한 유저의 `UserId`를 가져올 수 있습니다. `UserId`를 콘솔 로그로 출력하는 예제 코드는 다음과 같습니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters [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] | two_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService의 접속 끊김(UserDisconnectEvent) 및 재접속(UserReconnectEvent) 이벤트 핸들러는 어떤 시점에 주로 처리해야 하는가? [answer] | 유저의 네트워크 접속이 불안정하여 끊기거나, 끊긴 후 다시 재접속하는 시점에 처리해야 합니다. * **UserDisconnectEvent**: 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하므로, 접속이 끊긴 시점에 별도 처리를 추가해야 합니다. * **UserReconnectEvent**: 유저가 재접속했을 때 발생하므로, 재접속이 발생했을 때의 처리를 추가해야 합니다. 이러한 이벤트는 스크립트 컴포넌트에서 이벤트 핸들러를 추가하여 처리하며, 일반적으로 접속 끊김 및 재접속 상황을 테스트하기는 어렵기 때문에 로그를 [followup] | UserDisconnectEvent와 UserReconnectEvent에서 각각 접근 가능한 필드(DisconnectMapName, TimeNetworkClosed, UserId 등)는 무엇이며, 이 정보를 활용해 유저의 이전 위치나 상태를 저장하는 코드 예시를 작성해 주세요. [followup_answer] | `UserDisconnectEvent`와 `UserReconnectEvent`에서 각각 접근 가능한 필드는 다음과 같습니다. ### UserDisconnectEvent 필드 * **UserId**: 접속이 끊긴 유저의 ID * **DisconnectMapName**: 접속이 끊긴 맵의 이름 * **TimeNetworkClosed**: 네트워크가 닫힌 시간 ### UserReconnectEvent 필드 * **UserId**: 재접속한 유저의 ID * **ReconnectMapName**: 재접속한 맵의 이름 * [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | code [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | 이동했을 때 쉽게 알아볼 수 있도록 각 맵을 특색 있게 꾸밉니다. 그리고 각 맵으로 텔레포트했을 때, 목적지 역할을 할 엔티티를 하나씩 배치합니다. [answer] | 각 맵을 특색 있게 꾸미고, 텔레포트 목적지 역할을 할 엔티티를 배치하는 과정은 다음과 같습니다. 1. **맵 꾸미기**: 각 맵(map01, map02, map03)을 방문하여 지형, 배경, 오브젝트 등을 수정하여 서로 다른 분위기를 연출합니다. 2. **목적지 엔티티 배치**: 각 맵에 텔레포트 시 도착할 위치를 나타내는 엔티티(예: 오브젝트, 캐릭터 모델 등)를 하나씩 배치합니다. 3. **엔티티 경로 확인 및 기록**: * 에디터의 **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] | single_turn [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | 특정 시간마다 캐릭터가 다른 맵으로 순환 이동하도록 만들려면 TeleportService 를 어떻게 조합해서 사용해야 하나요? [answer] | 제공된 참고 문서에는 `TeleportService`의 `TeleportToEntityPath` 함수를 사용한다는 내용과, `RateLimitService`를 통해 이 함수에 호출 제한을 설정하는 예시는 포함되어 있습니다. 하지만, **"특정 시간마다" 자동으로 순환 이동하도록 하는 타이머 로직이나 `TeleportToEntityPath`의 실제 호출 코드(인자 구성 포함)에 대한 구체적인 예제는 제공된 문서에 포함되어 있지 않습니다.** 문서에 포함된 정보만으로는 다음과 같은 사항만 확인 가능합니다: 1. 캐릭터가 이동할 대 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 특정 시간마다 캐릭터를 다른 맵으로 이동시키는 기능을 만들어 보면서 `TeleportService`의 `TeleportToEntityPath` 함수 사용법을 알아봅시다. ##### 참고 API Reference [TeleportService](/apiReference/Services/TeleportService) # 이동할 맵 만들기 먼저 캐릭터가 이동할 맵을 만듭니다. 1. **Window - Map List** 창을 엽니다. 2. **Map List** 창에서 **[새 맵 만들기]** 버튼을 클릭
[task] | code [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 유저가 게임에 접속할 때마다 `_UserService:GetUserCount()`를 호출하여 현재 참여 중인 총 유저 수를 로그로 출력하는 스크립트를 작성해줘 [answer] | 유저가 게임에 접속할 때마다 현재 참여 중인 총 유저 수를 로그로 출력하는 스크립트는 `UserService`의 `UserEnterEvent` 이벤트 핸들러를 활용하여 작성할 수 있습니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { local userCount = _UserService:GetUserCount() log("CurrentUserCount : "..userCount) } ``` 이 스크 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `GetUserCount()`는 현재 게임에 참여 중인 유저 수를 리턴하는 함수입니다. 다음은 유저가 게임에 들어올 때마다 게임에 참여 중인 모든 유저 수를 출력하는 예제입니다. **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId --------------------
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 접속 끊김과 재접속 상황을 실제 플레이어로 테스트하기가 어렵다는 점은 무엇과 관련이 있나요? [answer] | 접속 끊김과 재접속 상황이 실제 플레이어로 테스트하기 어려운 점은, 이러한 네트워크 상태 변화(불안정성, 연결 단절, 재연결)가 일반적인 플레이 환경에서는 자연스럽게 발생하기가 드물기 때문입니다. 따라서 실제 상황에서 이 이벤트를 트리거하고 동작을 확인하기가 까다로워, 코드를 작성하여 로그를 남기는 방식으로 이벤트 발생 여부를 확인하는 것이 유용합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | two_turn [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | 피자 비유를 통해 컴포넌트 조합의 원리를 이해했는데, 실제 메이플스토리 월드에서 보이지 않는 로직을 담당하는 컴포넌트는 어떻게 관리되고 있나요? [answer] | 메이플스토리 월드에서 보이지 않는 로직을 담당하는 컴포넌트(스크립트)는 **프로퍼티 에디터(Property Editor)** 를 통해 관리됩니다. 엔티티는 다양한 컴포넌트의 집합체이며, 시각적 요소뿐만 아니라 내부 로직을 처리하는 컴포넌트도 모두 이 에디터에서 추가하거나 설정합니다. 이를 통해 재사용성이 높은 기능들을 조합하여 원하는 동작을 하는 엔티티를 제작할 수 있습니다. 실제로 스크립트 컴포넌트를 작성할 때는 `Property`, `Method`, `Event Handler` 블록을 사용하여 구조를 정의하며, 보이지 않는 [followup] | 특정 엔티티의 컴포넌트 목록을 조회하여 각 컴포넌트가 담당하는 기능을 확인하는 mLua 스크립트 예제를 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 특정 엔티티의 컴포넌트 목록을 조회하거나 각 컴포넌트의 기능을 동적으로 확인하는 mLua API(메서드)가 언급되어 있지 않습니다. 문서에서는 엔티티가 컴포넌트의 집합체임을 설명하고, 프로퍼티 에디터나 Entity Editor를 통해 컴포넌트를 관리하는 것을 언급하고 있으나, 스크립트 내에서 런타임에 컴포넌트 리스트를 가져오는 함수나 `GetComponent`와 유사한 동적 조회 API에 대한 정보는 없습니다. 따라서 요청하신 특정 조회 로직을 mLua로 작성할 수 있는 근거가 문서에 존재하지 않습니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Entity와 Component 그리고 Property에 대해서 개념을 이해합니다. # Entity 엔티티는 메이플스토리 월드 내에서 존재하는 객체입니다. 아래의 그림에서 Entity는 어떤 것들일까요? 빨간색을 칠한 부분이 Entity입니다. 그뿐만 아니라 보이지는 않지만 돌아가고 있는 모든 것들이 Entity입니다. 메이플스토리 월드에서는 실제로 수많은 Entity가 배치되어 있고 실시간으로 생성, 변경, 삭제됩니다. Entity들이 실제 게임상에서 활동함으로써 시각적으로 보이며, 내부적으로 로직
[task] | two_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 현재 게임에 참여 중인 전체 유저 수를 확인하고 싶어요 [answer] | 현재 게임에 참여 중인 전체 유저 수는 `_UserService:GetUserCount()` 함수를 호출하여 확인할 수 있습니다. 이 함수는 현재 게임에 접속한 모든 유저의 수를 숫자로 반환합니다. 유저가 게임에 들어올 때마다 현재 참여 중인 전체 유저 수를 콘솔에 출력하는 예제 코드는 다음과 같습니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = [followup] | `GetUserCount()`를 사용하여 유저가进入游戏할 때마다 현재 참여 유저 수를 로그로 출력하는 `HandleUserEnterEvent` 코드를 작성해 주세요. [followup_answer] | ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId -------------------------------------------------------- local userCount = _UserService:GetUserCount() log("CurrentUserCount : "..userCount) } ``` [scores] | [judge_reason] | [source_doc] | `GetUserCount()`는 현재 게임에 참여 중인 유저 수를 리턴하는 함수입니다. 다음은 유저가 게임에 들어올 때마다 게임에 참여 중인 모든 유저 수를 출력하는 예제입니다. **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId --------------------
[task] | code [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | 같은 ChatBalloonComponent 를 여러 Entity 에 부착하되, 각 Entity 의 BalloonScale 과 FontSize Property 값을 상이하게 초기화하는 스크립트를 작성해줘 [answer] | 참고 문서에 따르면 `ChatBalloonComponent`는 `BalloonScale`과 `FontSize`라는 Property를 가지고 있으며, 이는 Entity별로 다르게 설정할 수 있습니다. 요청하신 대로 여러 Entity에 `ChatBalloonComponent`를 부착하고, 각 Entity의 `BalloonScale`과 `FontSize` 값을 상이하게 초기화하는 스크립트는 다음과 같습니다. 여기서는 예시로 `BalloonScale`과 `FontSize`의 초기 값을 결정하기 위해 임의의 로직(예: Entity 이름이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Property는 각 Component의 세부사항을 설정합니다. Component에서 예시를 든 피자로 다시 돌아와 볼까요? 세 명의 아이가 페퍼로니 피자를 먹고 싶어 합니다. 철수는 페퍼로니가 2배들어 있는 피자를 원하고, 영희는 들어 있는 치즈가 체다가 아닌 모짜렐라 치즈를 원합니다. 윤후는 사이즈를 조금 더 크게 먹고 싶습니다. 기존에 도우 Component, 페퍼로니 Component, 치즈 Component 가 있습니다. 자, 어떻게 하면 될까요? 철수는 페퍼로니 2배 Component를 추가하고 영희는 모짜렐라 치즈
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | `GetUserCount()` 함수의 리턴값과 `UserEnterEvent` 핸들러 내에서의 호출 위치를 3문장 이내로 설명하세요. [answer] | `GetUserCount()` 함수는 현재 게임에 참여 중인 유저 수를 리턴합니다. `UserEnterEvent` 핸들러에서는 이벤트가 발생하자마자 즉시 호출됩니다. 이 호출은 새로 들어온 유저를 포함하여 현재 전체 유저 수를 확인하기 위한 목적으로 사용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `GetUserCount()`는 현재 게임에 참여 중인 유저 수를 리턴하는 함수입니다. 다음은 유저가 게임에 들어올 때마다 게임에 참여 중인 모든 유저 수를 출력하는 예제입니다. **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId --------------------
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService 이벤트 핸들러에서 UserDisconnectEvent 와 UserReconnectEvent 를 구분해서 처리하려면 각각 어떤 함수 이름을 사용해야 하나요? [answer] | `UserService` 이벤트 핸들러에서 두 이벤트를 구분해서 처리하려면 각각 다음과 같은 함수 이름을 사용해야 합니다. 1. **UserDisconnectEvent**: `HandleUserDisconnectEvent` 2. **UserReconnectEvent**: `HandleUserReconnectEvent` 이벤트 발생 시점에 특정 로직을 실행하려면 아래 코드의 형식을 따라 이벤트 핸들러를 정의합니다. ```lua Event Handler: [service: UserService] HandleUserDisconn [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 유저의 네트워크가 불안정해 접속이 끊겼을 때 발생하는 이벤트 핸들러에서 접근할 수 있는 파라미터에는 어떤 것들이 있나요? [answer] | `UserDisconnectEvent` 이벤트 핸들러에서 접근할 수 있는 파라미터는 다음 3가지입니다. * `event.UserId`: 접속이 끊긴 유저의 ID * `event.DisconnectMapName`: 접속이 끊긴 맵의 이름 * `event.TimeNetworkClosed`: 네트워크가 닫힌 시간 이 파라미터들을 사용해서 접속 끊김 상황을 로그로 출력하는 예제 코드는 다음과 같습니다. ```lua Event Handler: [service: UserService] HandleUserDisconnectEve [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 재접속 이벤트 핸들러에서 로그를 출력할 때 재접속한 맵 이름과 시간을 함께 확인하려면 event 객체의 어떤 필드를 참조해야 하나요? [answer] | 재접속 이벤트 핸들러(`HandleUserReconnectEvent`)에서 재접속한 맵 이름과 시간을 확인하려면 `UserReconnectEvent` 객체의 다음 필드를 참조해야 합니다. * **재접속한 맵 이름**: `event.ReconnectMapName` * **재접속 시간**: `event.TimeNetworkClosed` 해당 필드를 사용하여 로그를 출력하는 예제는 다음과 같습니다. ```lua Event Handler: [service: UserService] HandleUserReconnectEvent ( [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 새 유저가 입장할 때마다 게임에 있는 모든 플레이어의 이름을 순회하며 출력하려면 어떤 이벤트 핸들러와 프로퍼티를 조합해서 사용해야 하나요? [answer] | 새 유저가 입장할 때마다 게임에 있는 모든 플레이어의 이름을 순회하며 출력하려면 **`UserService`** 서비스의 **`UserEnterEvent`** 이벤트 핸들러와 **`UserEntities`** 프로퍼티를 조합하여 사용합니다. `UserEnterEvent`는 새로운 유저가 게임에 입장할 때 트리거되며, `UserEntities`는 현재 게임에 참여 중인 모든 유저 엔티티를 `UserId`를 키(Key)로, 해당 유저의 `MODEntity`를 값(Value)으로 하는 사전(Dictionary) 형태로 제공합니다. 이 [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] | single_turn [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | 텔레포트 목적지 엔티티의 경로를 잘못 기재했을 때 발생하는 오류의 원인은 무엇이며, 올바른 경로 형식은 어떻게 확인하나요? [answer] | 텔레포트 목적지 엔티티의 경로를 잘못 기재했을 때 발생하는 오류의 원인은, 해당 경로로 엔티티를 찾지 못해 `nil` 값이 반환되거나, 엔티티는 존재하지만 필요한 컴포넌트(예: `PortalComponent`)가 없기 때문입니다. 참고 문서의 예제 코드를 보면, 경로를 이용해 엔티티를 조회한 후 다음과 같은 검증 로직이 수행됩니다: ```lua local fullPath = self.Entity.CurrentMap.Path .. "/" .. self.PortalEntityPath local targetEntity = _Entit [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] | 텔레포트 [question] | 이동 텔레포트 기능을 구현할 때 TeleportService 의 TeleportToEntityPath 함수와 _SpawnService 의 SpawnByModelId 함수는 용도에서 어떤 차이가 있나요? [answer] | `TeleportService`의 `TeleportToEntityPath` 함수와 `_SpawnService`의 `SpawnByModelId` 함수는 엔티티를 생성하는 방식과 목적지에서 명확한 차이가 있습니다. **1. `_SpawnService:SpawnByModelId`** * **용도:** 모델 ID를 기반으로 **새로운 엔티티를 생성(Spawn)**합니다. * **특징:** 월드에 원래 없던 객체를 지정한 위치와 이름으로 새로 만들어 배치하는 기능입니다. * **코드 예시:** ```lua Meth [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 특정 시간마다 캐릭터를 다른 맵으로 이동시키는 기능을 만들어 보면서 `TeleportService`의 `TeleportToEntityPath` 함수 사용법을 알아봅시다. ##### 참고 API Reference [TeleportService](/apiReference/Services/TeleportService) # 이동할 맵 만들기 먼저 캐릭터가 이동할 맵을 만듭니다. 1. **Window - Map List** 창을 엽니다. 2. **Map List** 창에서 **[새 맵 만들기]** 버튼을 클릭
[task] | two_turn [pass] | ⏳ 미판정 [title] | Entity, Component, Property [question] | 엔티티는 컴포넌트의 집합체라고 하셨는데, 프로퍼티가 이 구조에서 어떤 역할을 하는지 개념적으로 설명해 주세요. [answer] | 엔티티(Entity)는 컴포넌트(Component)들의 집합체이며, 각 컴포넌트는 특정 기능(예: 히트박스, 모델, 스크립트 등)을 담당합니다. 프로퍼티(Property)는 이러한 컴포넌트 내부에서 **상태를 저장하고 제어하는 데이터 단위**입니다. 개념적으로 프로퍼티의 역할은 다음과 같습니다: 1. **컴포넌트의 상태 데이터 저장**: 컴포넌트가 실행하는 로직이 필요로 하는 값들(예: 생명력, 속도, 아이템 목록 등)을 저장합니다. 제공된 예제에서 `Health`나 `InitialHealth`는 엔티티의 생명력 상태를 [followup] | 컴포넌트의 프로퍼티 값을 런타임에 동적으로 변경하여 엔티티의 상태(예: 이동 속도, 색상 등)를 바꾸는 mLua 코드 예시를 보여주세요. [followup_answer] | 제시된 참고 문서에는 런타임에 프로퍼티 값을 동적으로 변경하는 구체적인 mLua 코드 예시(이동 속도 변경, 색상 변경 등)가 포함되어 있지 않습니다. 문서에는 `OnBeginPlay`에서 초기값을 설정하거나(`self.InitialHealth = self.Health`), 이벤트 핸들러에서 값을 수정하는(`self.Health = self.Health - TotalDamage`) 구조적인 예제는 있지만, "이동 속도"나 "색상"을 바꾸는 특정 API나 프로퍼티에 대한 설명은 없습니다. 따라서 문서에 근거하여 해당 주제의 정확한 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Entity와 Component 그리고 Property에 대해서 개념을 이해합니다. # Entity 엔티티는 메이플스토리 월드 내에서 존재하는 객체입니다. 아래의 그림에서 Entity는 어떤 것들일까요? 빨간색을 칠한 부분이 Entity입니다. 그뿐만 아니라 보이지는 않지만 돌아가고 있는 모든 것들이 Entity입니다. 메이플스토리 월드에서는 실제로 수많은 Entity가 배치되어 있고 실시간으로 생성, 변경, 삭제됩니다. Entity들이 실제 게임상에서 활동함으로써 시각적으로 보이며, 내부적으로 로직
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 새 클라이언트를 추가하여 유저 입장/퇴장을 테스트할 때, 콘솔 창에 로그가 출력되지 않으면 주로 어떤 부분을 확인해야 하나요? [answer] | 유저 입장/퇴장 시 콘솔 창에 로그가 출력되지 않는 경우, 주로 다음 세 가지 부분을 확인해야 합니다. 1. **이벤트 핸들러 등록 여부 및 서비스 매칭** - 스크립트 컴포넌트에 `UserService`의 이벤트 핸들러가 정확히 추가되었는지 확인합니다. - 핸들러의 서비스 지정이 `[service: UserService]`로 올바르게 설정되었는지, 함수 이름과 파라미터 타입이 각각 `HandleUserEnterEvent(UserEnterEvent event)`와 `HandleUserLeaveEvent(UserLeave [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를 통해 특정 유저의 접속 상태 변화(접속 끊김 및 재접속)에 대응하려면, 스크립트 컴포넌트에 **Event Handler** 블록을 추가해야 합니다. 구체적으로는 `UserService`의 서비스 연결을 지정하고, 각각의 이벤트 핸들러 함수(`HandleUserDisconnectEvent`, `HandleUserReconnectEvent`)를 작성해야 합니다. ```lua Event Handler: [service: UserService] HandleUserDisconnectEvent (UserDisconn [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | single_turn [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService에서 제공하는 Users 프로퍼티를 통해 유저의 UserId, Nickname, ProfileCode를 로그로 출력하는 코드 구조는 어떻게 작성하나요? [answer] | `UserService`의 `Users` 프로퍼티는 게임에 참여 중인 모든 유저의 `UserId`, `Nickname`, `ProfileCode` 정보를 담고 있습니다. 이 데이터를 순회하여 로그로 출력하는 구조는 `UserEnterEvent` 이벤트 핸들러 내에서 `pairs` 함수를 사용해 테이블을 반복하는 방식으로 작성합니다. 아래는 유저가 게임에 입장할 때마다 현재 참여 중인 모든 유저의 정보를 콘솔에 출력하는 코드 예시입니다. ```lua Event Handler: [service: UserService] HandleU [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] | `GetUsersByMapName()` 함수를 사용해 map01의 유저 정보를 출력하는 코드를 주석으로 설명만 추가한 형태(코드만 출력)로 작성하세요. [answer] | ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId -------------------------------------------------------- -- /maps/map01 경로에 해당하는 엔티티를 찾아 그 이름(Name)을 mapName 변수에 저장합니다. local mapName = _EntityServ [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `GetUserCount()`는 현재 게임에 참여 중인 유저 수를 리턴하는 함수입니다. 다음은 유저가 게임에 들어올 때마다 게임에 참여 중인 모든 유저 수를 출력하는 예제입니다. **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId --------------------
[task] | code [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | 유저가 게임에 접속할 때마다 `_EntityService:GetEntityByPath("/maps/map01").Name`으로 맵 이름을 가져온 뒤 `_UserService:GetUsersByMapName()`을 사용해 해당 맵에 있는 모든 유저의 이름과 현재 위치 맵 이름을 반복문을 통해 로그로 출력하는 스크립트를 작성해줘 [answer] | 요청하신 기능은 `UserEnterEvent`가 발생했을 때, `map01`의 이름을 가져와 해당 맵에 있는 유저 목록을 조회하고, 각 유저의 이름과 현재 위치 맵 이름을 로그로 출력하는 것입니다. 다음은 이를 구현한 mLua 스크립트입니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId ----------------- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `GetUserCount()`는 현재 게임에 참여 중인 유저 수를 리턴하는 함수입니다. 다음은 유저가 게임에 들어올 때마다 게임에 참여 중인 모든 유저 수를 출력하는 예제입니다. **UserEnterEvent**를 다음과 같이 수정합니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) { -- Parameters local UserId = event.UserId --------------------
[task] | code [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService의 UserDisconnectEvent 핸들러를 구현하여 접속이 끊긴 유저의 UserId와 DisconnectMapName을 로그로 출력하는 스크립트를 작성해줘 [answer] | ```lua Event Handler: [service: UserService] HandleUserDisconnectEvent(UserDisconnectEvent event) { local UserId = event.UserId local DisconnectMapName = event.DisconnectMapName log("UserDisconnectEvent : UserId = "..UserId.." : DisconnectMapName = "..DisconnectMapName) } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | code [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService의 UserReconnectEvent 핸들러를 구현하여 재접속한 유저의 UserId와 ReconnectMapName을 로그로 출력하는 스크립트를 작성해줘 [answer] | 요청하신 `UserService`의 `UserReconnectEvent` 핸들러를 구현한 스크립트입니다. ```lua Event Handler: [service: UserService] HandleUserReconnectEvent (UserReconnectEvent event) { local ReconnectMapName = event.ReconnectMapName local UserId = event.UserId log("UserReconnectEvent : " .. UserId .. " : " .. Rec [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | two_turn [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | `_T` 프로퍼티를 활용해 텔레포트 목적지 테이블을 초기화하는 구체적인 코드는 어떻게 작성하나요? [answer] | `_T` 프로퍼티를 활용해 텔레포트 목적지 테이블을 초기화하는 코드는 `OnUpdate` 함수 내부에서 다음과 같이 작성합니다. `_T`는 프로퍼티 동기화가 필요 없는 임시 데이터 저장을 위해 사용하는 테이블 타입의 프로퍼티입니다. 처음 실행될 때 `self._T.destinationTable`이 `nil`인지 확인한 뒤, 각 맵에 배치한 목적지 엔티티의 Path를 배열 형태로 저장합니다. ```lua [server only] void OnUpdate(number delta) { --프로퍼티 동기화가 필요 없으므로 _T [followup] | `self._T.destinationTable`에 맵 엔티티의 Path를 배열 형태로 저장하는 초기화 로직을 포함해 전체 `OnUpdate` 함수를 작성해 주세요. [followup_answer] | `self._T.destinationTable`에 맵 엔티티의 Path를 배열 형태로 저장하는 초기화 로직을 포함하여, 3초마다 캐릭터를 지정된 목적지로 텔레포트하는 전체 `OnUpdate` 함수는 다음과 같이 작성합니다. ```lua [server only] void OnUpdate(number delta) { --프로퍼티 동기화가 필요 없으므로 _T 프로퍼티를 활용 if self._T.accTime == nil then self._T.accTime = 0 end if self._T.teleportCnt = [scores] | [judge_reason] | [source_doc] | 스크립트를 통해 텔레포트 기능을 만듭니다. 새 스크립트 컴포넌트를 만든 뒤 캐릭터에 추가합니다. 1. **Workspace - MyDesk** 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭해 새 컴포넌트를 추가합니다. 2. 컴포넌트 이름을 **Teleport**로 설정합니다. 3. **Workspace - DefaultPlayer**에 **Teleport** 컴포넌트를 추가합니다. 이제 본격적으로 스크립트를 작성해 봅시다.
[task] | code [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | UserService의 UserReconnectEvent 핸들러에서 재접속한 유저의 UserId를 추출하여 "Welcome back, [UserId]" 형태의 문구로 로그를 출력하는 스크립트를 작성해줘 [answer] | UserService의 `UserReconnectEvent` 이벤트 핸들러를 등록하고, 이벤트 객체에서 `UserId`를 추출하여 요청하신 형식으로 로그를 출력하는 스크립트는 다음과 같습니다. ```lua Event Handler: [service: UserService] HandleUserReconnectEvent(UserReconnectEvent event) { local UserId = event.UserId log("Welcome back, "..UserId) } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 네트워크가 불안정하면 접속이 끊길 수 있습니다. 또한 다시 재접속할 수도 있습니다. 이와 같이 접속 끊김/재접속 이벤트가 `UserService`에서 발생합니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 유저의 접속 끊김 또는 재접속 시점에 별도 처리를 추가할 수 있습니다. ### UserDisconnectEvent 유저의 네트워크 접속이 불안정하여 끊겼을 때 발생하는 이벤트입니다. 스크립트 컴포넌트에서 해당 이벤트 핸들러를 추가하여 접속이 끊겼을 때 처리를 추가할 수 있습니다. 다음은 접속이 끊긴 **Us
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 유저 엔티티를 찾아주는 UserService [question] | `GetUsersByMapComponent()`와 `GetUserEntityByUserId()` 함수의 매개변수 및 반환값 차이를 3문장 이내로 요약하세요. [answer] | `GetUsersByMapComponent()`는 특정 맵의 `mapComponent`를 매개변수로 받아 해당 맵에 있는 유저 엔티티 배열을 반환합니다. `GetUserEntityByUserId()`는 `UserId`를 매개변수로 받아 해당 ID에 해당하는 단일 플레이어 엔티티를 반환합니다. 따전자자는 맵 단위의 복수 유저를 조회하는 반면, 후자는 특정 유저 한 명을 직접적으로 조회하는 데 사용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `GetUsersByMapComponent()` 역시 특정 맵에 있는 유저 엔티티를 얻어오는 함수입니다. 특정 맵의 **mapId**가 아닌 **mapComponent**를 매개 변수로 넘겨줍니다. 다음은 map01에 있는 모든 유저를 `GetUsersByMapComponent()`로 받아오는 코드입니다. **UserEnterEvent**을 다음과 같이 수정합니다. ```lua Event Handler: [service: UserService] HandleUserEnterEvent (UserEnterEvent event) {
[task] | two_turn [pass] | ⏳ 미판정 [title] | 텔레포트 [question] | 3초마다 다른 맵으로 이동하는 로직에서 `teleportCnt % 3 + 1`을 사용하는 이유는 무엇인가요? [answer] | `teleportCnt % 3 + 1`을 사용하는 이유는 **3개의 목적지 엔티티 경로(`destinationTable[1]`, `destinationTable[2]`, `destinationTable[3]`) 사이를 순환적으로 반복하기** 위해서입니다. 구체적인 동작은 다음과 같습니다. 1. **나머지 연산자 (`%`)**: `teleportCnt`가 1씩 증가할 때마다 `teleportCnt % 3`은 `1, 2, 0, 1, 2, 0...`의 순서로 반복됩니다. 2. **1 더하기 (`+ 1`)**: 테이블 인덱스는 0부 [followup] | `TeleportToEntityPath`를 호출할 때 `self.Entity`와 목적지 Path를 매개변수로 전달하는 정확한 코드 구문을 알려주세요. [followup_answer] | `_TeleportService`의 `TeleportToEntityPath` 함수를 호출할 때, 첫 번째 매개변수로 이동시킬 엔티티(`self.Entity`), 두 번째 매개변수로 목적지 엔티티의 Path 문자열을 전달합니다. 정확한 코드 구문은 다음과 같습니다. ```lua _TeleportService:TeleportToEntityPath(self.Entity, self._T.destinationTable[destinationNum]) ``` 여기서 `destinationNum`은 1부터 3 사이의 숫자이며, `self._ [scores] | [judge_reason] | [source_doc] | 스크립트를 통해 텔레포트 기능을 만듭니다. 새 스크립트 컴포넌트를 만든 뒤 캐릭터에 추가합니다. 1. **Workspace - MyDesk** 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭해 새 컴포넌트를 추가합니다. 2. 컴포넌트 이름을 **Teleport**로 설정합니다. 3. **Workspace - DefaultPlayer**에 **Teleport** 컴포넌트를 추가합니다. 이제 본격적으로 스크립트를 작성해 봅시다.