[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | SpriteGUIRendererComponent의 Color에서 알파값(A)을 60으로 설정했을 때와 255로 설정했을 때의 시각적 차이는 무엇인가요? [answer] | SpriteGUIRendererComponent의 Color 프로퍼티에서 알파값(A)은 색상의 투명도를 결정합니다. * **알파값(A)이 60인 경우:** * 이는 0~255 범위의 값 중 낮은 값으로, **높은 투명도**를 의미합니다. * 구체적으로 약 **23.5%의 불투명도**(60/255 ≈ 0.235)를 가지므로, 해당 UI 요소(예: 대화창 배경)가 **반투명하게** 보입니다. * 배경이 어둡거나 흐리게 보이며, 그 뒤의 배경 이미지가 일부 드러나는 효과를 줍니다. * 참고 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 NPC들의 대화를 표현하기 위한 대화창을 제작해볼 것입니다. UI 편집기를 이용해 대화창을 구성하고 데이터 테이블에 데이터를 세팅 후 스크립트를 이용해 호출할 것입니다. 과정의 진행 순서는 다음과 같습니다. 1. UI 디자인 2. 데이터 테이블 추가 3. 스크립트 제작 제작 예시는 다음과 같습니다. # UI 디자인 1. UI 편집기 버튼을 클릭합니다. 2. UI 디자인을 진행할 새로운 **UIGroup**을 추가합니다. UIGroup을 추가한 적이 없다면 UIGroup이 추가됩
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | 카메라 제한 영역을 직접 정의하도록 CameraComponent의 UseCustomBound 프로퍼티를 True로 설정하고 LeftBottom, RightTop 프로퍼티를 통해 특정 좌표 범위로 영역을 지정하는 스크립트를 작성해줘 [answer] | 카메라 제한 영역을 직접 정의하려면 `CameraComponent`의 `UseCustomBound` 프로퍼티를 `True`로 설정하고, `LeftBottom`과 `RightTop` 프로퍼티에 좌표를 지정해야 합니다. 아래 스크립트는 엔티티가 플레이를 시작할 때(`OnBeginPlay`) 카메라 제한 영역을 직접 설정하는 예시입니다. ```lua Property: [None] Vector2 CustomLeftBottom = Vector2(0, 0) [None] Vector2 CustomRightTop = Vector2(100, 1 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카메라 제한 영역을 직접 정의해서 사용할 지 여부를 설정합니다. **UseCustomBound** 값이 **True**라면 **LeftBottom, RightTop** 프로퍼티를 사용해 카메라 제한 영역을 정의할 수 있습니다. **Collider Edit** 버튼을 누르면 Scene에 표시되는 기즈모를 통해 카메라 제한 영역을 시각적으로 확인하거나 핸들러를 통해 손쉽게 영역을 조절할 수 있습니다. CameraComponent - UseCustomBound 값이 **False**라면 맵 영역을 카메라 제한 영역으로 사용합니다. 맵
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | Name 엔티티와 Text 엔티티를 모두 TalkPanel의 자식으로 설정할 때, 부모 엔티티가 비활성화되면 자식들도 함께 숨겨지나요? [answer] | 네, 부모 엔티티가 비활성화(Enable 체크 해제)되면 그 자식으로 설정된 엔티티들도 함께 숨겨집니다. 제시된 가이드에서 **Name** 엔티티와 **Text** 엔티티를 모두 **TalkPanel**의 자식으로 설정한 뒤, **TalkPanel** 엔티티를 선택하여 Enable 체크를 해제하면 대화창 전체가 보이지 않는 상태로 변경됩니다. 이는 UI 계층 구조에서 부모의 가시성 상태가 자식에게 상속되는 일반적인 원리 때문입니다. 따라서 TalkPanel만 비활성화하면 자식인 Name과 Text도 자동으로 숨겨집니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 결과물은 다음과 같습니다. 10. 새로운 텍스트 엔티티를 추가합니다. 추가한 텍스트 엔티티를 클릭하고 이름을 **Name**으로 변경합니다. 11. **Name** 엔티티를 **TalkPanel**로 드래그하여 **TalkPanel**의 자식으로 설정합니다. 12. **Name** 엔티티의 프로퍼티를 다음과 같이 수정합니다. | 컴포넌트 | 프로퍼티 | 값 | | --- | --- | --- | | @cols=1:@rows=4:UITransformComponent | PosX | -600 |
[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | OnBeginPlay() 함수의 본문 내용만 코드 블록으로 출력하고 각 줄 뒤에 주석으로 설명을 붙이세요. [answer] | ```lua [Client only] void OnBeginPlay() { self.count = 1 -- 다음에 참조할 데이터의 rowIndex를 1로 초기화합니다. self.npcTalkData = _DataService:GetTable("NPCTalk") -- "NPCTalk" 테이블 데이터를 가져와 프로퍼티에 할당합니다. self.uiNameEntity = _EntityService:GetEntityByPath("/ui/UIGroup/TalkPanel/Name") -- NPC 이름 텍스트를 표시할 UI [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 6. 로그가 정상 출력된다면 플레이를 종료하고 **NPCTalk** 스크립트를 다시 열고, 아래와 같이 제작에 필요한 프로퍼티를 추가합니다. | type | name | value | Sync | 설명 | | --- | --- | --- | --- | --- | | number | count | 0 |none | 스크립트에서 참조할 데이터의 rowIndex를 결정하기 위해 사용합니다. 데이터를 셋팅할때 마다 값을 1씩 증가시켜 다음줄의 데이터를 참조할 수 있도록 합니다.| | any | npc
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | UITransformComponent에서 PosX와 PosY 값이 각각 -600과 110으로 설정되어 있을 때, 이는 화면 좌표계에서 어떤 위치를 의미하나요? [answer] | 참고 문서에는 `UITransformComponent`의 `PosX`와 `PosY` 값이 각각 -600과 110으로 설정된 경우를 예시로 제시하고 있으나, 이 수치들이 화면 좌표계에서 구체적으로 어떤 위치(예: 화면의 왼쪽/위쪽 여백, 픽셀 단위 등)를 의미하는지에 대한 설명이나 좌표계 규약에 대한 정보는 포함되어 있지 않습니다. 따라서 제공된 문서만으로는 `PosX: -600`과 `PosY: 110`이 화면의 어디를 가리키는지를 정확히 설명할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 결과물은 다음과 같습니다. 10. 새로운 텍스트 엔티티를 추가합니다. 추가한 텍스트 엔티티를 클릭하고 이름을 **Name**으로 변경합니다. 11. **Name** 엔티티를 **TalkPanel**로 드래그하여 **TalkPanel**의 자식으로 설정합니다. 12. **Name** 엔티티의 프로퍼티를 다음과 같이 수정합니다. | 컴포넌트 | 프로퍼티 | 값 | | --- | --- | --- | | @cols=1:@rows=4:UITransformComponent | PosX | -600 |
[task] | single_turn [pass] | ⏳ 미판정 [title] | Event System [question] | 이벤트 기반 로직을 사용했을 때 전체적인 게임 흐름 파악이 어려워지는 단점이 실제로 어떤 상황에서 문제가 될 수 있는지 예시를 들어 주세요. [answer] | 이벤트 기반 로직의 가장 큰 단점인 "전체적인 흐름 파악의 어려움"은, **특정 이벤트가 발생했을 때 실제로 어떤 처리들이 순서대로, 혹은 동시에 실행되는지 한눈에 보기 어렵다**는 점에서 발생합니다. 일반 로직(함수 호출)에서는 `A()` 함수가 `B()`, `C()`를 호출하는 식으로 코드가 한 줄에 모여 있어 실행 순서를 쉽게 추적할 수 있습니다. 하지만 이벤트 시스템에서는 "공격받음"이라는 이벤트를 발생시킨 주체(센더)는 자신이 보낸 이벤트가 어디에 전달되어 어떤 일을 하는지 알지 못합니다. 각 핸들러(구독자)가 개별적으로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 크리에이터는 로직을 여러 가지 방법으로 작성할 수 있습니다. 그 방법 중 하나는 **이벤트**를 활용하는 것입니다. 이번 시간에는 메이플스토리 월드의 이벤트 시스템과 여러 이벤트를 다루는 방법을 살펴봅니다. # 이벤트 기반의 로직 구성 로직을 작성하다 보면 **특정 타이밍에 해야 할 일**이 생깁니다. 그럴 때는 **행위가 일어난 주체**가 무엇을 할 것인지 결정해야 합니다. 예를 들어, 월드에서 캐릭터가 공격받았을 때 아래와 같이 구현한다고 가정해 봅시다. 1. **캐릭터의 HP를 감소시키고** 2.
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel 안에 자식으로 배치한 Name 엔티티의 SpriteGUIRendererComponent Color 알파값을 0으로 설정하면 왜 보이지 않나요? [answer] | 참고 문서에 따르면, `Name` 엔티티의 `SpriteGUIRendererComponent`의 `Color` 값을 `RGB 255, 255, 255 A 0` (흰색, 투명도 0%)로 설정하면 **스프라이트 렌더러의 색상이 완전히 투명**해지기 때문에 보이지 않습니다. 알파(Alpha) 값이 0이면 해당 픽셀이 완전히 투명해지므로, 배경이나 다른 UI 요소가 보이지 않고 마치 없듯이 보입니다. 이는 의도된 동작으로, 대화창이 활성화되지 않았을 때 이름 텍스트 배경이나 스프라이트를 숨기기 위해 사용될 수 있는 설정입니다. 참고로, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 결과물은 다음과 같습니다. 10. 새로운 텍스트 엔티티를 추가합니다. 추가한 텍스트 엔티티를 클릭하고 이름을 **Name**으로 변경합니다. 11. **Name** 엔티티를 **TalkPanel**로 드래그하여 **TalkPanel**의 자식으로 설정합니다. 12. **Name** 엔티티의 프로퍼티를 다음과 같이 수정합니다. | 컴포넌트 | 프로퍼티 | 값 | | --- | --- | --- | | @cols=1:@rows=4:UITransformComponent | PosX | -600 |
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | isAllowZoomInOut이 True일 때 마우스 휠 조작의 효과를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | isAllowZoomInOut이 True일 때 마우스 휠을 이용해 줌 인/아웃을 수행하는 mLua 스크립트입니다. ```lua Property: [None] number ZoomSpeed = 10 number MinZoom = 100 number MaxZoom = 500 Method: [client only] void OnUpdate(number delta) { -- 마우스 휠 입력 값을 가져옵니다. local wheelDelta = _InputService:GetMouseWheelDelta() - [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임의 메인 카메라는 항상 플레이어를 따라다닙니다. 메인 카메라를 제어하는 camera 컴포넌트는 MapleStoryPlayer 모델이 가지고 있으며 이 모델의 프로퍼티 에디터나 스크립트를 이용해 주요 값을 수정할 수 있습니다. 이번 과정에서는 Camera 컴포넌트를 프로퍼티 에디터를 통해 수정해보며 전반적인 기능을 알아보는 시간을 가져보도록 하겠습니다. # Camera 컴포넌트 접근 Workspace에서 DefaultPlayer 모델을 선택합니다. 프로퍼티 에디터에서 CameraComponent를 확인
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | NPCTalk 스크립트 컴포넌트를 Hierarchy의 World - common 노드에 추가할 때 Add Component 버튼 외에 다른 방법이 있나요? [answer] | 제공된 참고 문서에는 NPCTalk 스크립트 컴포넌트를 Hierarchy의 World - common 노드에 추가하는 방법으로 **Add Component** 버튼을 클릭하여 추가하는 절차만 명시되어 있습니다. Add Component 버튼 외에 다른 추가 방법이 있는지에 대한 정보는 문서에 포함되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트에서 구현해야 할 주요 항목은 다음과 같습니다. * 특정 키를 입력하면 대화창이 출력됩니다. * 키를 입력할 때 마다 데이터의 내용이 대화창에 갱신됩니다. * 더 이상 사용할 데이터가 없으면 대화창을 닫습니다. 먼저 키 입력을 체크하여 대화창이 출력되도록 하겠습니다. 1. 새로운 스크립트 컴포넌트를 추가합니다. 컴포넌트 이름을 **NPCTalk**로 변경합니다. 2. **Workspace**에서 **NPCTalk** 스크립트를 열고, Entity Event Handler에 **KeyDownEvent**를 추가하고 아
[task] | single_turn [pass] | ⏳ 미판정 [title] | Event System [question] | 이벤트 시스템의 구성 요소인 이벤트, 핸들러, 센더 각각이 실제 코드나 시스템에서 어떤 역할을 하는지 구체적으로 설명해 주세요. [answer] | 메이플스토리 월드의 이벤트 시스템은 **이벤트(Event)**, **핸들러(Handler)**, **센더(Sender)** 라는 세 가지 요소로 구성됩니다. 각 요소가 실제 코드와 시스템에서 수행하는 역할은 다음과 같습니다. ### 1. 이벤트(Event) 이벤트는 로직 상에서 **어떤 사건의 발생을 의미**하는 자료형입니다. * **역할:** 행위가 일어났을 때 필요한 **식별 정보**와 **추가 정보(매개변수)** 를 담고 이동합니다. * **코드에서의 형태:** 특정 이벤트가 발생했을 때 전달되는 객체입니다. 예시 코 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 크리에이터는 로직을 여러 가지 방법으로 작성할 수 있습니다. 그 방법 중 하나는 **이벤트**를 활용하는 것입니다. 이번 시간에는 메이플스토리 월드의 이벤트 시스템과 여러 이벤트를 다루는 방법을 살펴봅니다. # 이벤트 기반의 로직 구성 로직을 작성하다 보면 **특정 타이밍에 해야 할 일**이 생깁니다. 그럴 때는 **행위가 일어난 주체**가 무엇을 할 것인지 결정해야 합니다. 예를 들어, 월드에서 캐릭터가 공격받았을 때 아래와 같이 구현한다고 가정해 봅시다. 1. **캐릭터의 HP를 감소시키고** 2.
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | KeyDownEvent 핸들러에서 KeyboardKey.Z 키를 감지할 때 event.key 속성을 어떻게 접근해야 하나요? [answer] | `KeyDownEvent` 핸들러에서 키를 감지하려면 이벤트 객체의 `key` 속성을 `event.key`로 직접 접근합니다. 이후 해당 값이 `KeyboardKey.Z`와 같은지 비교하여 원하는 동작을 실행하면 됩니다. 예시 코드: ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { local key = event.key if key == KeyboardKey.Z then log("Z k [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트에서 구현해야 할 주요 항목은 다음과 같습니다. * 특정 키를 입력하면 대화창이 출력됩니다. * 키를 입력할 때 마다 데이터의 내용이 대화창에 갱신됩니다. * 더 이상 사용할 데이터가 없으면 대화창을 닫습니다. 먼저 키 입력을 체크하여 대화창이 출력되도록 하겠습니다. 1. 새로운 스크립트 컴포넌트를 추가합니다. 컴포넌트 이름을 **NPCTalk**로 변경합니다. 2. **Workspace**에서 **NPCTalk** 스크립트를 열고, Entity Event Handler에 **KeyDownEvent**를 추가하고 아
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | 더 이상 사용할 데이터가 없을 때 대화창을 닫기 위한 조건을 스크립트에서 어떻게 설정해야 하나요? [answer] | 제공된 참고 문서에는 "더 이상 사용할 데이터가 없으면 대화창을 닫습니다"라는 구현 목표만 언급되어 있을 뿐, 이를 위한 구체적인 조건 설정 방법(예: 인덱스 비교, 테이블 길이 확인 등)이나 `ShowNextText()` 함수 내부의 실제 코드 예제는 포함되어 있지 않습니다. 따라서 문서에 근거하여 대화창을 닫기 위한 구체적인 스크립트 코드를 작성해 드리는 것은 불가능합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트에서 구현해야 할 주요 항목은 다음과 같습니다. * 특정 키를 입력하면 대화창이 출력됩니다. * 키를 입력할 때 마다 데이터의 내용이 대화창에 갱신됩니다. * 더 이상 사용할 데이터가 없으면 대화창을 닫습니다. 먼저 키 입력을 체크하여 대화창이 출력되도록 하겠습니다. 1. 새로운 스크립트 컴포넌트를 추가합니다. 컴포넌트 이름을 **NPCTalk**로 변경합니다. 2. **Workspace**에서 **NPCTalk** 스크립트를 열고, Entity Event Handler에 **KeyDownEvent**를 추가하고 아
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | CameraComponent와 MapComponent의 UseCustomBound 프로퍼티 상태를 검사하여 현재 적용되는 카메라 제한 영역 유형(직접 정의, 맵 영역 기반, 기본 보정)을 로그로 출력하는 스크립트를 작성해줘 [answer] | 참고 문서에 따르면, 카메라 제한 영역은 `CameraComponent`와 `MapComponent`의 `UseCustomBound` 프로퍼티 값에 따라 결정됩니다. 1. **CameraComponent - UseCustomBound = True**: 크리에이터가 직접 정의한 카메라 제한 영역 사용. 2. **CameraComponent - UseCustomBound = False** * **MapComponent - UseCustomBound = True**: 크리에이터가 정의한 맵 영역을 카메라 제한 영역으로 사 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카메라 제한 영역을 직접 정의해서 사용할 지 여부를 설정합니다. **UseCustomBound** 값이 **True**라면 **LeftBottom, RightTop** 프로퍼티를 사용해 카메라 제한 영역을 정의할 수 있습니다. **Collider Edit** 버튼을 누르면 Scene에 표시되는 기즈모를 통해 카메라 제한 영역을 시각적으로 확인하거나 핸들러를 통해 손쉽게 영역을 조절할 수 있습니다. CameraComponent - UseCustomBound 값이 **False**라면 맵 영역을 카메라 제한 영역으로 사용합니다. 맵
[task] | code [pass] | ⏳ 미판정 [title] | Event System [question] | `UserService`의 `UserEnterEvent`를 구독하여 특정 유저가 월드에 진입하면 `_EntityService`를 통해 해당 유저의 엔티티를 찾고, `_SpawnService`로 환영용 이펙트 모델이 스폰되도록 하는 스크립트를 작성해줘 [answer] | 요청하신 `UserService`의 `UserEnterEvent`를 구독하고, 해당 유저의 엔티티를 찾아 환영 이펙트를 스폰하는 mLua 스크립트입니다. 참고: `_UserService` API 문서에 `GetUserEntityByUserId` 메서드가 존재하는지 여부는 제공된 문서에 명시되어 있지 않습니다. 제공된 예제 코드에서 `UserEnterEvent` 처리 시 `_UserService:GetUserEntityByUserId(UserId)` 또는 `_UserService.UserEntities` 딕셔너리 접근이 사용되었으므 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 크리에이터는 로직을 여러 가지 방법으로 작성할 수 있습니다. 그 방법 중 하나는 **이벤트**를 활용하는 것입니다. 이번 시간에는 메이플스토리 월드의 이벤트 시스템과 여러 이벤트를 다루는 방법을 살펴봅니다. # 이벤트 기반의 로직 구성 로직을 작성하다 보면 **특정 타이밍에 해야 할 일**이 생깁니다. 그럴 때는 **행위가 일어난 주체**가 무엇을 할 것인지 결정해야 합니다. 예를 들어, 월드에서 캐릭터가 공격받았을 때 아래와 같이 구현한다고 가정해 봅시다. 1. **캐릭터의 HP를 감소시키고** 2.
[task] | code [pass] | ⏳ 미판정 [title] | Event System [question] | `TouchEvent`를 처리하여 사용자가 화면을 터치했을 때 `_TimerService`를 이용해 0.5초 후 특정 좌표에 `_SpawnService`로 아이템 엔티티를 스폰시키는 스크립트를 작성해줘 [answer] | 사용자가 화면을 터치했을 때 `TouchEvent`를 수신하고, `_TimerService`를 통해 0.5초의 지연을 거친 후 지정된 좌표에 아이템을 스폰시키는 로직을 구현하는 방법은 다음과 같습니다. 이 스크립트는 서버에서 실행되어야 하므로, 이벤트 핸들러와 스폰 로직 모두 `[server only]` 또는 `[server]` 실행 공간을 사용합니다. `TouchEvent`는 일반적으로 클라이언트에서 발생하지만, 서버에서 해당 이벤트를 구독하여 처리하도록 작성합니다. (참고: 실제 프로젝트에서는 `TouchEvent`가 서버에서 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 크리에이터는 로직을 여러 가지 방법으로 작성할 수 있습니다. 그 방법 중 하나는 **이벤트**를 활용하는 것입니다. 이번 시간에는 메이플스토리 월드의 이벤트 시스템과 여러 이벤트를 다루는 방법을 살펴봅니다. # 이벤트 기반의 로직 구성 로직을 작성하다 보면 **특정 타이밍에 해야 할 일**이 생깁니다. 그럴 때는 **행위가 일어난 주체**가 무엇을 할 것인지 결정해야 합니다. 예를 들어, 월드에서 캐릭터가 공격받았을 때 아래와 같이 구현한다고 가정해 봅시다. 1. **캐릭터의 HP를 감소시키고** 2.
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | Scene에서 카메라 제한 영역을 시각적으로 확인하고 핸들러를 통해 조절할 수 있도록 CameraComponent의 Collider Edit 버튼 동작을 시뮬레이션하여 기즈모 표시 여부를 제어하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `CameraComponent`의 **Collider Edit** 버튼이 Scene 뷰에서 기즈모(Gizmo)를 표시하거나 핸들러를 통해 영역을 조절하는 **에디터(Editor) 기능**임을 설명하고 있습니다. 하지만 이 기능은 에디터 UI에서 직접 조작하는 것이며, **mLua 스크립트 API를 통해 기즈모 표시 여부를 제어하거나 Collider Edit 버튼의 동작을 시뮬레이션하는 메서드, 프로퍼티, 또는 이벤트 핸들러가 문서에 존재하지 않습니다.** 따라서 요청하신 "기즈모 표시 여부를 제어하는 스크립트 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카메라 제한 영역을 직접 정의해서 사용할 지 여부를 설정합니다. **UseCustomBound** 값이 **True**라면 **LeftBottom, RightTop** 프로퍼티를 사용해 카메라 제한 영역을 정의할 수 있습니다. **Collider Edit** 버튼을 누르면 Scene에 표시되는 기즈모를 통해 카메라 제한 영역을 시각적으로 확인하거나 핸들러를 통해 손쉽게 영역을 조절할 수 있습니다. CameraComponent - UseCustomBound 값이 **False**라면 맵 영역을 카메라 제한 영역으로 사용합니다. 맵
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | Name 엔티티의 FontSize를 36으로 설정하고 UseOutLine을 true로 했을 때, OutlineColor가 검은색으로 보이기 위한 필수 조건은 무엇인가요? [answer] | 참고 문서에 따르면, **OutlineColor**가 검은색으로 보이려면 **UseOutLine** 프로퍼티가 `true`로 설정되어야 합니다. 문서에서 **Name** 엔티티의 **TextComponent** 설정을 보면 다음과 같습니다: * `FontColor`: RGB 255, 255, 255 A 100 (흰색) * `FontSize`: 36 * `OutlineColor`: RGB 0, 0, 0 A 100 (검은색) * `UseOutLine`: **true** 즉, `OutlineColor` 값을 검은색으로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 결과물은 다음과 같습니다. 10. 새로운 텍스트 엔티티를 추가합니다. 추가한 텍스트 엔티티를 클릭하고 이름을 **Name**으로 변경합니다. 11. **Name** 엔티티를 **TalkPanel**로 드래그하여 **TalkPanel**의 자식으로 설정합니다. 12. **Name** 엔티티의 프로퍼티를 다음과 같이 수정합니다. | 컴포넌트 | 프로퍼티 | 값 | | --- | --- | --- | | @cols=1:@rows=4:UITransformComponent | PosX | -600 |
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | NPCTalk 데이터 테이블에서 name, portrait, text 컬럼 값을 순차적으로 읽어 대화창 UI에 표시하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `NPCTalk` 데이터 테이블의 구조(`name`, `portrait`, `text` 컬럼)와 대화 예시 데이터는 포함되어 있으나, 데이터 테이블을 순차적으로 읽거나 대화창 UI를 조작하는 구체적인 API(예: 데이터 테이블 조회 메서드, UI 컴포넌트 접근 방법, 텍스트/이미지 설정 메서드 등)는 설명되어 있지 않습니다. 따라서 요청하신 "데이터 테이블 값을 순차적으로 읽어 대화창 UI에 표시하는" 완전한 동작 스크립트는 문서에 근거하여 작성할 수 없습니다. 다만, 문서에 명시된 `NPCTalk` 데이터 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | two_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | NPCTalk 스크립트에서 UI 엔티티를 초기화하고 대화 데이터를 로드하는 `OnBeginPlay()` 로직이 어떻게 구성되는지 알려주세요. [answer] | NPCTalk 스크립트에서 `OnBeginPlay()` 로직은 클라이언트 공간(`[client only]`)에서 실행되며, 대화창 UI를 제어하기 위한 엔티티 참조와 대화 데이터 로딩을 담당합니다. 구체적인 구성은 다음과 같습니다. 1. **초기값 설정**: 대화 데이터 행을 추적하기 위한 `count` 프로퍼티를 1로 초기화합니다. 2. **대화 데이터 로드**: `_DataService:GetTable("NPCTalk")`를 호출하여 게임 데이터의 `NPCTalk` 테이블을 가져와 `npcTalkData` 프로퍼티에 할당 [followup] | `OnBeginPlay()` 함수에 `_DataService:GetTable("NPCTalk")` 호출과 엔티티 경로 설정 코드를 포함하여 전체 함수 구현을 작성해 주세요. [followup_answer] | `OnBeginPlay()` 함수는 클라이언트 공간(`[client only]`)에서 실행되며, 대화 데이터 테이블을 로드하고 대화창 UI의 각 엔티티를 경로로 참조합니다. 전체 함수 구현은 다음과 같습니다. ```lua Method: [client only] void OnBeginPlay() { self.count = 1 self.npcTalkData = _DataService:GetTable("NPCTalk") self.uiNameEntity = _EntityService:GetEntityByPath(" [scores] | [judge_reason] | [source_doc] | 6. 로그가 정상 출력된다면 플레이를 종료하고 **NPCTalk** 스크립트를 다시 열고, 아래와 같이 제작에 필요한 프로퍼티를 추가합니다. | type | name | value | Sync | 설명 | | --- | --- | --- | --- | --- | | number | count | 0 |none | 스크립트에서 참조할 데이터의 rowIndex를 결정하기 위해 사용합니다. 데이터를 셋팅할때 마다 값을 1씩 증가시켜 다음줄의 데이터를 참조할 수 있도록 합니다.| | any | npc
[task] | code [pass] | ⏳ 미판정 [title] | Event System [question] | `UserEnterEvent` 발생 시 `_UserService`를 통해 유저의 정보를 조회하고, 조회된 데이터에 따라 `_SpawnService`로 다른 모델 ID의 엔티티를 스폰하는 조건부 스포닝 스크립트를 작성해줘 [answer] | 제공된 참고 문서와 실제 mLua 예제 코드에는 `_SpawnService` API(예: `SpawnByModelId` 등)에 대한 구체적인 사용법이나 시그니처가 포함되어 있지 않습니다. 또한 `UserEnterEvent`의 `event` 객체가 프로필 코드나 레벨 등 조건부 스포닝에 사용할 수 있는 구체적인 필드(예: `event.ProfileCode`, `event.Level` 등)를 직접적으로 보여주지 않습니다. 따라서 제공된 문서 범위 내에서 `_UserService`로 유저 엔티티를 조회하는 것까지는 가능하지만, **`_ [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 크리에이터는 로직을 여러 가지 방법으로 작성할 수 있습니다. 그 방법 중 하나는 **이벤트**를 활용하는 것입니다. 이번 시간에는 메이플스토리 월드의 이벤트 시스템과 여러 이벤트를 다루는 방법을 살펴봅니다. # 이벤트 기반의 로직 구성 로직을 작성하다 보면 **특정 타이밍에 해야 할 일**이 생깁니다. 그럴 때는 **행위가 일어난 주체**가 무엇을 할 것인지 결정해야 합니다. 예를 들어, 월드에서 캐릭터가 공격받았을 때 아래와 같이 구현한다고 가정해 봅시다. 1. **캐릭터의 HP를 감소시키고** 2.
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | NPCTalk 데이터 테이블의 컬럼 이름이 name, portrait, text로 고정되어 있는지, 아니면 자유롭게 수정할 수 있는지 궁금합니다. [answer] | NPCTalk 데이터 테이블의 컬럼 이름은 고정되어 있지 않으며 자유롭게 수정할 수 있습니다. 제공된 문서의 절차는 데이터를 'NPCTalk'이라는 이름으로 생성한 뒤, **name**, **portrait**, **text** 라는 이름을 가진 3개의 컬럼을 추가하도록 안내하고 있습니다. 이는 대화창을 구현하기 위한 표준적인 구조를 예시로 보여준 것이며, 컬럼 이름을 임의로 변경하는 것을 금지하는 제약 사항이 명시되어 있지 않습니다. 다만, 컬럼 이름을 변경할 경우 해당 컬럼 이름을 참조하여 데이터를 읽어오는 스크립트 로직도 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | MapComponent의 UseCustomBound가 False인 상태인데, 카메라 제한 영역이 맵의 기본 경계와 완전히 일치하지 않고 살짝 안쪽으로 들어와 있더라고요. 이 보정된 영역의 범위를 직접 조절할 수 있는 방법은 있나요? [answer] | 제공된 문서에 따르면, `MapComponent`의 `UseCustomBound`가 `False`인 상태에서는 크리에이터가 직접 맵 영역 자체를 조절할 수 없으며, 이 경우 카메라 제한 영역은 **기본 맵 영역을 바탕으로 보정된 영역**으로 자동 설정됩니다. 문서에는 이 '보정된 영역'의 구체적 범위를 직접 조절하거나 수치를 변경하는 API나 프로퍼티에 대한 설명이 **없습니다**. 따라서 이 상태로 유지하면서 보정된 영역의 크기를 직접 조절하는 방법은 문서에 명시되지 않았습니다. 대신, 카메라 제한 영역을 직접 정의하고 조절하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카메라 제한 영역을 직접 정의해서 사용할 지 여부를 설정합니다. **UseCustomBound** 값이 **True**라면 **LeftBottom, RightTop** 프로퍼티를 사용해 카메라 제한 영역을 정의할 수 있습니다. **Collider Edit** 버튼을 누르면 Scene에 표시되는 기즈모를 통해 카메라 제한 영역을 시각적으로 확인하거나 핸들러를 통해 손쉽게 영역을 조절할 수 있습니다. CameraComponent - UseCustomBound 값이 **False**라면 맵 영역을 카메라 제한 영역으로 사용합니다. 맵
[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | GetCell() 함수로 text 값을 가져오지 못했을 경우 발생하는 처리 과정을 3문장 이내로 요약하세요. [answer] | `GetCell()` 함수로 text 값을 가져오지 못하면 `nil`이 반환됩니다. 이 경우 텍스트 창 동작을 진행할 수 없는 상태로 판단합니다. 그 후 대화창을 닫고 `ShowNextText()` 함수의 작동을 종료합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | elf.uiNameEntity.TextComponent.Text = name end if portrait ~= "" then isPortraitEnable = true self.uiPortraitEntity.SpriteGUIRendererComponent.ImageRUID = portrait end self.uiNameEntity.Enable = isNameEnable self.uiP
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | NPC 대화창을 만들 때 데이터 테이블을 사용하는 방식과 스크립트 코드로 직접 문자열을 입력하는 방식 중, 다국어 대응이나 대사 수정이 용이한 방법은 어느 쪽인가요? [answer] | 제공된 참고 문서에는 데이터 테이블과 스크립트 내 직접 문자열 입력 방식 중 어느 쪽이 다국어 대응이나 대사 수정에 유리한지에 대한 비교 분석이나 장단점 설명이 포함되어 있지 않습니다. 문서에는 데이터 테이블을 `NPCTalk` 이름으로 생성하고 `name`, `portrait`, `text` 컬럼을 사용하여 대사 데이터를 구성하는 방법과, 리소스 업로드 이벤트를 처리하는 스크립트 예제만 기술되어 있을 뿐, 두 방식의 비교에 대한 정보는 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | two_turn [pass] | ⏳ 미판정 [title] | Event System [question] | 메이플스토리 월드에서 이벤트 시스템의 기본 개념과 일반 로직과의 차이점을 설명해 주세요. [answer] | 메이플스토리 월드의 이벤트 시스템은 특정 타이밍에 실행해야 할 로직을 처리하기 위해 **행위가 일어난 주체**와 **행동 실행 주체**의 책임을 분리하는 구조입니다. ### 1. 일반 로직과 이벤트 시스템의 차이 * **일반 로직:** * **행위가 일어난 주체**가 일을 직접 처리합니다. * 예시: 캐릭터가 공격받으면, 해당 캐릭터를 관리하는 로직이 HP 감소, 대미지 표시, 무적 처리 등 모든 기능을 직접 호출합니다. * 추가 기능이 필요하면(예: 피격 이펙트 추가), 원본 로직 코드를 수 [followup] | 이벤트 시스템의 장단점을 비교했을 때, 순차 처리가 필요한 로직에서는 어떤 한계가 있는지 구체적인 예시를 들어 설명해 주세요. [followup_answer] | 참고 문서에 따르면, 이벤트 시스템의 단점으로 **"순차 처리가 어려울 수 있다"**는 점이 명시되어 있습니다. 하지만 문서에는 순차 처리가 필요한 구체적인 로직 예시나, 이벤트 시스템이 왜 순차 처리에 취약한지 그 기술적 원리에 대한 세부 설명이 포함되어 있지 않습니다. 따라서 문서에 근거하여 답변하자면, 이벤트 시스템은 **순차 처리가 어려울 수 있는 한계**가 있으며, 이는 각 이벤트가 **각각 독립적으로 처리**되기 때문에 전체적인 실행 흐름을 파악하기 어렵고 디버깅이 다소 어려울 수 있다는 점과 관련이 있습니다. 구체적 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 크리에이터는 로직을 여러 가지 방법으로 작성할 수 있습니다. 그 방법 중 하나는 **이벤트**를 활용하는 것입니다. 이번 시간에는 메이플스토리 월드의 이벤트 시스템과 여러 이벤트를 다루는 방법을 살펴봅니다. # 이벤트 기반의 로직 구성 로직을 작성하다 보면 **특정 타이밍에 해야 할 일**이 생깁니다. 그럴 때는 **행위가 일어난 주체**가 무엇을 할 것인지 결정해야 합니다. 예를 들어, 월드에서 캐릭터가 공격받았을 때 아래와 같이 구현한다고 가정해 봅시다. 1. **캐릭터의 HP를 감소시키고** 2.
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TimerService:SetTimerOnce 를 사용하여 텍스트 길이만큼 대기 후 다음 NPCTalk 행으로 자동 전환하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `TimerService:SetTimerOnce`의 사용 예시와 `NPCTalk` 데이터 테이블의 구조만 포함되어 있습니다. 하지만 **텍스트 길이를 계산하여 대기 시간을 자동으로 설정하는 API나 메서드(예: 문자열 길이 반환 함수)는 문서에 존재하지 않습니다.** 또한, NPC 대화창 UI를 조작하거나 텍스트를 변경하는 API도 문서에 명시되어 있지 않습니다. 따라서 요청하신 "텍스트 길이만큼 대기"라는 로직을 구현할 수 있는 API가 문서에 없으므로, 정확한 구현은 불가능합니다. 다만, 문서에 있는 ` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | 같은 이름의 NPC가 여러 줄에 걸쳐 다른 대사를 말하는 경우, 스크립트에서 이를 구분해서 처리하는 로직은 어떻게 작성하나요? [answer] | 제공된 참고 문서에는 NPC 대화창의 데이터 테이블 구조(`name`, `portrait`, `text` 컬럼)와 예시 데이터, 그리고 리소스 업로드 및 트리거 진입 시 코스트 변경 관련 mLua 코드 예제만 포함되어 있습니다. 문서에 따르면, 데이터 테이블에 같은 이름(`name`)의 NPC가 여러 줄에 걸쳐 다른 대사(`text`)를 가지는 구조로 데이터를 구성할 수 있습니다. 그러나 이 데이터 테이블을 스크립트에서 읽어와서 **대사 순서(index)를 추적하거나, 같은 이름의 NPC 대사를 구분하여 처리하는 구체적인 mLua [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | two_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | NPCTalk 테이블의 text 컬럼에 포함된 여러 문장이나 줄바꿈 문자가 대화창에서 어떻게 렌더링되는지 궁금합니다. [answer] | 제공된 참고 문서에는 `NPCTalk` 데이터 테이블의 구조(name, portrait, text 컬럼)와 예시 데이터만 포함되어 있습니다. 문서에는 `text` 컬럼에 포함된 여러 문장이나 줄바꿈 문자가 대화창 UI에서 어떻게 렌더링되는지(줄바꿈 처리 방식, 텍스트 자동 줄바꿈 여부, 폰트 크기, 위치 정렬 등)에 대한 기술적 설명이나 API 문서가 포함되어 있지 않습니다. 따라서 문서에 근거하여 줄바꿈 문자의 렌더링 방식을 설명할 수 없습니다. [followup] | 줄바꿈 처리를 위해 text 컬럼 값에 특수 문자를 넣거나, 스크립트에서 문자열을 분할(split)하는 로직이 필요한가요? [followup_answer] | 제공된 참고 문서에는 `NPCTalk` 테이블의 `text` 컬럼에 특수 문자를 입력하거나, 스크립트에서 문자열을 분할(split)하는 로직에 대한 정보가 없습니다. 문서에는 `name`, `portrait`, `text` 컬럼을 가진 데이터 테이블을 추가하고, 각 행에 캐릭터 이름, 포트레이트 RUID, 대사 텍스트를 입력하는 구조만 설명되어 있으며, 대화창 UI가 텍스트를 어떻게 처리하는지(줄바꿈, 분할 등)에 대한 기술적 설명이나 관련 mLua 코드 예제는 포함되어 있지 않습니다. 따라서 문서에 근거하여 특수 문자 사용 여 [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | CameraComponent의 UseCustomBound가 False일 때 맵 영역을 카메라 제한 영역으로 사용하도록 설정하고 MapComponent의 UseCustomBound 값에 따라 기본 맵 영역 보정 또는 크리에이터 정의 맵 영역을 적용하는 로직을 구현하는 스크립트를 작성해줘 [answer] | 카메라 제한 영역 로직은 `CameraComponent`와 `MapComponent`의 `UseCustomBound` 프로퍼티 값을 직접 변경하거나 계산하는 스크립트 로직이 아니라, **컴포넌트 설정 값에 따라 엔진이 내부적으로 자동 적용**하는 동작입니다. 제공된 문서에 따르면, `CameraComponent`의 `UseCustomBound`가 `False`인 경우 아래 두 가지 상황이 발생합니다. 1. **MapComponent의 `UseCustomBound`가 `True`인 경우**: * 크리에이터가 설정한 맵 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카메라 제한 영역을 직접 정의해서 사용할 지 여부를 설정합니다. **UseCustomBound** 값이 **True**라면 **LeftBottom, RightTop** 프로퍼티를 사용해 카메라 제한 영역을 정의할 수 있습니다. **Collider Edit** 버튼을 누르면 Scene에 표시되는 기즈모를 통해 카메라 제한 영역을 시각적으로 확인하거나 핸들러를 통해 손쉽게 영역을 조절할 수 있습니다. CameraComponent - UseCustomBound 값이 **False**라면 맵 영역을 카메라 제한 영역으로 사용합니다. 맵
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 위치, 크기, 회전 조정 [question] | Z 값 변경 시 엔티티 겹침 순서가 어떻게 바뀌는지 단계별 번호 목록으로 설명하고, 바람직한 순서 변경 방법은 주석으로 코드만 출력해 주세요. [answer] | 1. `Position`의 `Z` 값이 작은 엔티티가 화면에서 뒤에 배치됩니다. 2. `Position`의 `Z` 값이 큰 엔티티가 화면에서 앞에 배치됩니다. 3. 여러 엔티티가 겹쳐 있을 때 `Z` 값을 조정하면 레이어 순서처럼 겹침 순서가 바뀝니다. ```lua -- 바람직한 엔티티 순서 변경 방법: SpriteRendererComponent의 OrderInLayer 프로퍼티를 사용 ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **TransformComponent** 구성과 사용 방법을 설명합니다. 좌표 개념을 이해하고, 엔티티의 이동, 회전, 크기 조절을 할 수 있습니다. # 엔티티 변형 방법 엔티티를 변형하는 방법은 두 가지입니다. 크리에이터의 선호에 따라 사용할 수 있습니다. * 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경합니다. * **Scene**에서 엔티티를 선택, 드래그하거나 핸들러를 이용해 조정합니다. # 좌표 이해하기 **TransformComponent**를 사용하기 위해