[task] | single_turn [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | GetPixelTest 함수가 [client only]로 선언되어 있는데, 버튼 클릭 이벤트 핸들러는 기본적으로 서버에서 실행되는 것처럼 보이는데 이 경우 함수 호출이 정상적으로 동작하는 원리가 무엇인가요? [answer] | 제공된 참고 문서의 내용을 바탕으로 질문하신 `GetPixelTest` 함수 호출 원리에 대해 설명해 드리겠습니다. 문서에 제시된 예제 코드를 살펴보면, `ButtonClick_GetPixel` 스크립트의 `HandleButtonClickEvent` 이벤트 핸들러는 `[server]` 또는 `[client only]` 태그가 명시적으로 붙어 있지 않습니다. 또한 `GetPixelTest` 함수는 `[client only]` 태그가 붙어 있습니다. mLua의 실행 공간 규칙에 따르면, 태그가 없는 이벤트 핸들러나 메서드는 기본적으 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `GetPixel` 함수를 활용하면 제일 최근에 변경된 픽셀의 위치와 색상을 받아올 수 있습니다. 1. **Hierarchy - map01 - Create Entity - Create Empty**를 눌러 새로운 **CheckGetEntity**를 생성합니다. 2. **CheckGetEntity**에 **TransformComponent**를 추가하고 **Scale** 값으로 **X = 10, Y = 10**을 입력합니다. 그리고 **PixelRendererComponent**도 추가합니다. 3. UI 에디터
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | SpriteGUIRendererComponent의 OverrideSorting 프로퍼티가 활성화되는 조건과 UIMode의 동작 방식을 코드 주석 형식으로 설명하세요. [answer] | 참고 문서에 명시된 내용을 바탕으로 `OverrideSorting`의 활성화 조건과 `UIMode`의 동작 방식을 코드 주석 형식으로 설명합니다. ```lua Property: [None] boolean UseOverrideSorting = false Method: [client only] void OnBeginPlay() { local uiTransform = self.Entity.UITransformComponent local spriteRenderer = self.Entity.SpriteGUIRendererC [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | code [pass] | ⏳ 미판정 [title] | 로그 [question] | `OnBeginPlay`에서 `[server only]` 메서드로 `log()` 함수를 호출하여 "Script started on Server"라는 메시지를 출력하고, `OnEndPlay`에서 "Script ended"라는 경고 수준의 로그를 남기도록 `log()` 호출 시 appropriate level 처리를 가정한 스크립트를 작성해줘 [answer] | mLua API 문서에는 `log()` 함수의 심각도(정보, 경고, 오류)를 지정하는 파라미터나 별도 함수(예: `logWarning`, `logError`)에 대한 정보가 없습니다. 제공된 참고 문서의 예제에서는 `log()` 함수를 호출할 때 메시지 문자열만 전달하며, 로그의 심각도를 직접 지정하는 문법이 설명되어 있지 않습니다. 따라서 요청하신 "경고 수준의 로그"를 `log()` 호출 시 인자로 지정하는 방식은 현재 제공된 문서 범위에서 지원되는지 확인이 불가합니다. 문서에 없는 API나 문법을 지어내지 않는 원칙에 따라, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 콘솔에는 플레이 테스트 도중에 발생한 정보, 경고, 오류 로그가 출력됩니다. | 번호 | 설명 | | :---: | --- | | | 콘솔 창에 남아있는 로그를 삭제합니다. Clear 오른쪽에 확장 버튼을 눌러 Clear on Play를 활성화하고, 시작 버튼을 누르면 콘솔 창에 남아있던 로그를 자동으로 삭제하고 시작합니다. | | | 버튼을 누르면 중복 로그를 하나로 합쳐줍니다. 영역에 합쳐진 총 개수가 나옵니다. | | | 실행 공간(Client / Server) 별로 로그를 모아볼 수 있습니다. | | |
[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | SpriteGUIRendererComponent의 ImageRUID 프로퍼티를 변경하여 특정 이미지 리소스를 화면에 표시하는 스크립트를 작성해줘 [answer] | `SpriteGUIRendererComponent`의 `ImageRUID` 프로퍼티에 표시할 이미지 리소스의 ID를 문자열 형태로 할당하면 해당 이미지가 UI에 출력됩니다. 아래 예제는 스크립트가 실행될 때(`OnBeginPlay`) 특정 `ImageRUID`를 설정하여 이미지를 표시하는 간단한 예시입니다. ```lua Property: [None] string TargetImageRUID = "000000" Method: [client only] void OnBeginPlay () { local renderer = self. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent의 LineType이 'MultiLineSubmit'으로 설정되어 있을 때의 동작 방식을 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Property: [None] string InputText = "" [None] TextInputComponent InputField = EntityPath Method: [client only] void OnBeginPlay() { -- LineType을 MultiLineSubmit으로 설정합니다. -- 이 설정은 여러 줄로 입력할 수 있으며, Enter 키를 입력하면 입력이 종료되고 이벤트가 발생하게 합니다. self.InputField.LineType = InputLineType.Multi [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>
[task] | code [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | SetPixel 버튼의 TextComponent에 "SetPixel"이라는 텍스트를 표시하고, 클릭 시 연결된 PixelRendererTest 스크립트의 SetRandomPixel 메서드가 실행되도록 하는 이벤트 핸들러 스크립트를 작성해줘. [answer] | 사용자가 요청한 `ButtonClick_SetPixel` 스크립트 컴포넌트의 내용을 작성했습니다. 참고 문서에서 확인된 사실들: 1. `ButtonClick_SetPixel` 스크립트는 `Property` 블록에 `Entity PR = /maps/map01/SetPixelTest` 를 포함해야 합니다. 2. 버튼 클릭 이벤트는 `InputService` 의 `HandleButtonClickEvent` 를 통해 처리됩니다. (메이플스토리 월드 UI 이벤트의 표준 방식이며, 제공된 예제 코드에서 `HandleKeyDownEvent [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetPixel` 함수를 활용해 스프라이트에서 원하는 위치의 픽셀 색상을 변경할 수 있습니다. 버튼을 누르면 스프라이트의 랜덤한 위치에 랜덤한 색상의 픽셀이 표시되도록 해봅시다. 1. **Hierarchy - map01 - Create Entity - Create Empty**를 눌러 새로운 **SetPixelTest**를 생성합니다. 2. **SetPixelTest** 엔티티에 **TransformComponent**를 추가하고 **Scale** 프로퍼티에 **X = 10, Y = 10**을 입력합니다. 그리
[task] | code [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | UI 버튼의 ButtonClickEvent를 처리하여 PixelRendererComponent의 GetPixel을 호출하고 결과를 Entity의 TransformComponent Position에 반영하는 스크립트를 작성해줘. [answer] | 참고 문서에 따르면, `GetPixel` 함수는 **가장 최근에 변경된 픽셀**의 위치와 색상을 반환합니다. 특정 좌표를 인자로 전달하여 해당 픽셀을 조회하는 것이 아니라, 내부적으로 저장된 마지막 변경 상태를 읽어옵니다. 따라서 "특정 좌표의 픽셀을 조회하여 Position에 반영"한다는 요청은 `GetPixel` API의 동작 원리(마지막 변경된 픽셀 반환)와 맞지 않습니다. 대신, **마지막으로 설정된(SetPixel) 픽셀의 좌표와 색상을 받아와서 Entity의 TransformComponent Position에 적용**하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `GetPixel` 함수를 활용하면 제일 최근에 변경된 픽셀의 위치와 색상을 받아올 수 있습니다. 1. **Hierarchy - map01 - Create Entity - Create Empty**를 눌러 새로운 **CheckGetEntity**를 생성합니다. 2. **CheckGetEntity**에 **TransformComponent**를 추가하고 **Scale** 값으로 **X = 10, Y = 10**을 입력합니다. 그리고 **PixelRendererComponent**도 추가합니다. 3. UI 에디터
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Callback [question] | Callback의 정의를 1문장으로 요약하세요. [answer] | 주요 흐름 외에서 처리한 비동기 작업의 완료 시점을 알 수 있도록 알림을 울리는 것을 Callback이라 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | UITransformComponent의 UIMode가 Screen과 World로 고정되는 기준이 Hierarchy 구조에 따라 어떻게 달라지나요? [answer] | UITransformComponent의 UIMode는 엔티티가 Hierarchy에서 어떤 위치에 있는지 여부에 따라 자동으로 결정됩니다. * **Screen 모드**: UI 엔티티가 Hierarchy의 **UI** 아래에 위치할 때 적용됩니다. * **World 모드**: UI 엔티티가 Hierarchy의 **maps** 아래에 위치할 때 적용됩니다. 즉, 엔티티가 UI 그룹 하위에 있으면 스크린 좌표 기준으로 동작하며, maps 그룹 하위에 있으면 월드 좌표 기준으로 동작하도록 고정됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Callback [question] | 함수의 동기/비동기 실행 방식을 구분하는 함수명 어미 두 가지를 나열하세요. [answer] | 함수의 동기/비동기 실행 방식은 함수명 뒤에 붙는 어미로 구분합니다. * **동기(Synchronous)**: **Wait** * **비동기(Asynchronous)**: **Async** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다
[task] | two_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 포탈 이벤트를 통해 유저를 다른 월드로 워프시키는 컴포넌트 스크립트 작성 예시를 보여주세요. [answer] | 포탈 이벤트를 감지하여 유저를 다른 월드로 이동시키는 컴포넌트 스크립트는 `TeleportService`의 `WarpUserToWorldAndWait()` 함수를 사용해 작성할 수 있습니다. 이 함수를 사용할 때는 이동시킬 유저의 ID와 목적지 월드의 ID가 필요합니다. 또한, 현재 월드에서 쌓은 데이터를 목적지 월드에서도 사용하려면 직렬화된 데이터를 함께 전달할 수 있으며, 목적지 월드에서는 `GetWarpRecord()`로 해당 데이터를 가져올 수 있습니다. 아래는 포탈을 사용하는 유저를 지정된 월드로 워프시키는 예제 스크립트 [followup] | 워프 시 현재 월드의 데이터를 다음 월드에 전달하기 위해 `TableToString`과 `GetWarpRecord()`를 어떻게 연동해서 사용해야 하는지 코드 예시를 요청합니다. [followup_answer] | `WarpUserToWorldAndWait()` 함수를 호출할 때 세 번째 인자로 직렬화된 데이터를 전달하면, 해당 데이터는 목적지 월드에서 `GetWarpRecord()` 함수를 통해 접근할 수 있습니다. 참고 문서에 제공된 예제에서는 `_UtilLogic:TableToString()`을 사용해 테이블을 문자열로 직렬화하여 전달하는 방식을 보여줍니다. 목적지 월드에서 데이터를 가져오는 구체적인 코드 예제는 문서에 명시되어 있지 않지만, 문서 설명에 따라 `WarpUserToWorldAndWait()` 호출 시 데이터를 전달하고 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 TeleportService의 함수를 활용해 월드에서 다른 월드로 이동할 수 있습니다. # 다른 월드로 이동하기 TeleportService는 월드의 유저를 특정 장소로 이동시킬 때 사용할 수 있을 뿐 아니라, 접속 중인 월드에서 다른 월드로 이동시킬 수 있습니다. 접속 중인 월드와 이동할 월드가 공개 출시된 상태여야 이동이 가능합니다. 이 특성으로 인해 제작 중에는 워프를 테스트할 수 없습니다. | 현재 월드 | 이동할 월드 | 워프 여부 | | --- | --- | --- | | 공개 | 공개 | *
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextComponent와 SpriteGUIRendererComponent를 함께 사용했을 때 어떤 순서로 렌더링되는지 궁금합니다. [answer] | `TextComponent`와 `SpriteGUIRendererComponent`를 같은 UI 엔티티에 함께 사용할 경우, `SpriteGUIRendererComponent`보다 `TextComponent`가 항상 위에(앞에) 렌더링됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |
[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | SpriteGUIRendererComponent의 Type 프로퍼티를 Tiled로 설정하여 배경 이미지를 타일링하는 스크립트를 작성해줘 [answer] | SpriteGUIRendererComponent의 `Type` 프로퍼티를 `ImageType.Tiled`로 설정하면 동일한 이미지를 타일처럼 반복 출력하여 배경을 채울 수 있습니다. 단, 성능을 위해 참고 문서에서 권장하는 사항을 반드시 지켜야 합니다. 1. 사용된 ImageRUID 리소스의 랩 모드를 **Repeat**로 설정해야 합니다. 2. 리소스의 **Border** 값을 0으로 설정해야 합니다. 3. 리소스가 아틀라스에 포함되지 않도록 해야 합니다. (Border나 아틀라스 사용이 필수적인 경우라면 부하 절감 효과가 없으 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | SpriteGUIRendererComponent에서 OverrideSorting 프로퍼티가 활성화되기 위해 엔티티가 Hierarchy에서 특정 위치(월드 - maps 하위)에 있어야 하는 이유는 무엇인가요? [answer] | SpriteGUIRendererComponent의 OverrideSorting 프로퍼티는 UI 엔티티가 Hierarchy에서 'World - maps' 하위에 배치된 경우에만 활성화됩니다. 이는 UITransformComponent의 동작 방식과 연관이 있습니다. UI 엔티티가 Hierarchy에서 'UI' 아래에 있으면 UIMode가 Screen으로 고정되고, 'maps' 아래에 있으면 World로 고정됩니다. OverrideSorting은 SortingLayer와 OrderInLayer를 사용해 렌더링 순서를 직접 제어하는 기 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextComponent의 폰트 선택 시 Default, Maple, Bazzi, Football 중 특정 폰트를 적용하려면 어떤 프로퍼티를 수정해야 하나요? [answer] | `TextComponent`의 `Font` 프로퍼티를 수정해야 합니다. 이 프로퍼티를 통해 `Default`, `Maple`, `Bazzi`, `Football` 중에서 원하는 폰트를 선택하여 적용할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | UITransformComponent와 일반 TransformComponent의 가장 큰 차이점은 좌표 시스템이 스크린 좌표인지 월드 좌표인지에 따른 어떤 동작 차이에서 발생하나요? [answer] | UITransformComponent와 일반 TransformComponent의 가장 큰 차이점은 **좌표 시스템**이 다릅니다. * **UITransformComponent**: **스크린 좌표**에서 동작합니다. * **TransformComponent**: 일반적으로 **월드 좌표**에서 동작합니다. 또한, UI 엔티티의 **UIMode** 설정에 따라 동작 방식이 고정됩니다. * Hierarchy에서 **UI** 아래에 배치된 경우: `Screen`으로 고정됩니다. * Hierarchy에서 **maps** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | UITransformComponent의 UI 좌표 프로퍼티를 이용해 화면 중앙에 위치하도록 설정하는 스크립트를 작성해줘 [answer] | UITransformComponent의 UI 좌표 프로퍼티를 사용하여 화면 중앙에 위치하도록 설정하는 스크립트는 다음과 같습니다. 참고 문서에 따르면, `UITransformComponent`는 스크린 좌표에서 동작하며 위치를 설정하는 프로퍼티를 가집니다. 일반적으로 화면 중앙 정렬을 위해 `anchoredPosition`을 `(0, 0)`으로 설정하고, 정렬 옵션(`AlignmentOption`)을 적절한 값으로 지정하는 방식이 사용됩니다. 아래 예제는 `OnBeginPlay` 시점에 UI 엔티티의 `UITransformCom [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | SpriteGUIRendererComponent의 Type을 Tiled로 설정했을 때, ImageRUID 리소스의 Border 값이 0이 아니면 성능 부하가 발생하는 이유는 무엇인가요? [answer] | `SpriteGUIRendererComponent`의 `Type`을 `Tiled`로 설정하면 이미지가 타일처럼 반복되어 출력됩니다. 이때 `ImageRUID` 리소스의 `Border` 값이 0이 아니면 성능 부하가 발생하는 이유는 다음과 같습니다. `Border` 값이 0이 아닌 경우, 리소스가 아틀라스(Atlas)에 포함되거나 `Border` 정보가 유지되어야 하기 때문에 `Repeat` 모드를 통한 부하 절감 효과가 적용되지 않습니다. `Repeat` 모드는 크기에 영향을 받지 않고 타일링을 부하 없이 처리하도록 하지만, `B [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 로그 [question] | 플레이 테스트 중 예상치 못한 현상이 발생했을 때 로그를 어떻게 설정해야 원인을 쉽게 찾을 수 있나요? [answer] | 플레이 테스트 중 예상치 못한 현상이 발생했을 때, 스크립트의 실행 흐름과 변수 값을 추적할 수 있도록 `log()` 함수를 전략적으로 배치해야 합니다. 단순히 "실행됨"이라는 메시지만 남기는 것이 아니라, **어떤 조건이 충족되었는지**, **현재 변수의 값은 무엇인지**를 함께 출력하면 문제를 빠르게 좁혀낼 수 있습니다. 아래와 같은 원칙에 따라 로그를 설정하세요. ### 1. 핵심 분기점과 이벤트 발생 시점에 로그 출력 특정 조건이 충족되었을 때만 실행되는 코드 블록(예: `if`문 내부)의 시작 부분에 로그를 남겨야, 해 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트를 작성하고 플레이 테스트를 하다 보면 크리에이터의 생각대로 단번에 잘 작동하는 경우는 많지 않습니다. 크리에이터는 스크립트에 로그를 적절히 활용해 월드의 문제점을 보다 빠르게 파악하고 수정할 수 있습니다. 로그를 활용하여 시행착오를 줄이고 보다 효율적으로 스크립트를 작성해봅시다. > **더 알아보기** > 로그와 함께 디버그 기능을 적절히 활용하면 스크립트 오류를 보다 빠르고 정확하게 해결할 수 있습니다. > [스크립트 디버그](https://mod-developers.nexon.com/docs/?postId=202)도
[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | WarpUserToWorldAndWait와 WarpUserToWorldAsync 함수의 차이점이 무엇이며, 언제 각각을 사용해야 하는지 궁금합니다. [answer] | 제공된 문서에 따르면 `WarpUserToWorldAndWait`와 `WarpUserToWorldAsync` 함수의 구체적인 동작 차이(예: 비동기 처리 방식, 반환 값, 콜백 메커니즘 등)에 대한 상세 설명은 없습니다. 문서에는 두 함수 모두 **접속 중인 월드에서 다른 월드로 유저를 이동시킬 때** 사용되며, **이동시킬 유저 ID**와 **이동할 월드 ID**라는 두 가지 인자가 필요하다고만 명시되어 있습니다. 다만, 문서에서 언급된 두 함수의 사용 목적과 데이터 처리 방식에 있어서는 다음과 같은 차이가 있습니다. 1. * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 TeleportService의 함수를 활용해 월드에서 다른 월드로 이동할 수 있습니다. # 다른 월드로 이동하기 TeleportService는 월드의 유저를 특정 장소로 이동시킬 때 사용할 수 있을 뿐 아니라, 접속 중인 월드에서 다른 월드로 이동시킬 수 있습니다. 접속 중인 월드와 이동할 월드가 공개 출시된 상태여야 이동이 가능합니다. 이 특성으로 인해 제작 중에는 워프를 테스트할 수 없습니다. | 현재 월드 | 이동할 월드 | 워프 여부 | | --- | --- | --- | | 공개 | 공개 | *
[task] | code [pass] | ⏳ 미판정 [title] | 로그 [question] | Property 블록에 [Sync] 속성이 붙은 number Health 프로퍼티를 선언하고, OnBeginPlay()에서 log()로 초기 체력 값을 출력한 후, 외부에서 Health 값이 0 이하로 변경될 때마다 log_warning()으로 "Health Critical" 경고를 남기도록 하는 스크립트를 작성해줘 [answer] | `[Sync]` 속성이 붙은 프로퍼티는 클라이언트와 서버 간에 동기화되지만, mLua 스크립트 문법상 프로퍼티 값이 변경될 때마다 자동으로 실행되는 "변경 감지(Change Detection)" 이벤트 핸들러는 제공되지 않습니다. 따라서 "외부에서 Health 값이 0 이하로 변경될 때마다" 경고를 남기려면, **Health 값을 변경하는 로직(예: 데미지 처리)이 발생하는 곳**에서 직접 값을 확인하고 `log_warning()`을 호출하는 방식으로 구현해야 합니다. 요청하신 `Property` 선언과 `OnBeginPlay( [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로그에 대해 알아보고 월드 제작 과정에서 로그를 효과적으로 활용하는 방법을 살펴봅시다. # 로그 소개 로그(Log)란 월드 제작 중 발생하는 여러 가지 정보나 문제 상황에 대한 기록을 말합니다. 로그를 통해 현재 제작 중인 월드가 의도대로 잘 동작하고 있는지 확인할 수 있습니다. 만약 의도대로 동작하지 않는다면 문제의 원인을 파악하고 해결하는 데 로그를 활용할 수 있습니다. 로그 종류는 로그를 남기는 주체를 기준으로 구분합니다. 시스템 로그와 크리에이터 로그로 나누어 살펴봅시다. ## 시스템 로그 제작
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | `WarpUserToWorldAndWait()`로 전달한 데이터를 수신하는 스크립트에서, `GetWarpRecord()` 호출 후 `nil` 체크가 필요한 이유와 최종적으로 데이터를 테이블로 변환하는 `UtilLogic` 메서드 이름을 표로 정리해서 설명하세요. [answer] | `WarpUserToWorldAndWait()`로 데이터를 전달한 뒤, 수신 측 월드에서 해당 데이터를 가져올 때 `GetWarpRecord()` 호출 후 `nil` 체크가 필요한 이유는 다음과 같습니다. 1. **유효하지 않은 이동 기록 존재 가능성**: 사용자가 포탈을 통해 이동하지 않고 직접 해당 월드에 입장하거나, 이동 기록이 존재하지 않는 경우 `GetWarpRecord()`는 `nil`을 반환합니다. 2. **실행 오류 방지**: `nil` 값인 `warpRecord`에서 `.Data` 프로퍼티에 접근하려고 하면 런타임 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 데이터를 이동할 월드로 전달할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성합니다. 2. 맵에 포탈을 추가한 뒤, 만든 스크립트 컴포넌트를 포탈에 추가합니다. 3. 아래와 같이 `WarpUserToWorldAndWait()`와 `UtilLogic`을 활용해 다른 월드에 데이터를 전달할 수 있게 작성합니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId)
[task] | code [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | 클라이언트 스크립트에서 ButtonClickEvent 를 수신하여 PixelRendererComponent:GetPixel(10, 10) 로 특정 좌표의 색상을 확인하고, 결과 값이 null 이 아니면 PixelRendererComponent:SetAlpha(0.5) 로 알파를 고정하고 null 이면 SetAlpha(1.0) 으로 설정하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `PixelRendererComponent`에 대해 `SetAlpha`와 `ResetWithColors` 함수 사용법이 명시되어 있습니다. 하지만 사용자가 요청한 `GetPixel(x, y)` 함수나 반환값이 `null`인 경우를 처리하는 로직에 대한 설명, 그리고 `GetPixel` 함수의 정확한 시그니처(인자 및 반환 타입)에 대한 정보가 문서에 포함되어 있지 않습니다. 따라서 `GetPixel` 함수의 존재 여부와 정확한 사용법을 확인할 수 없으므로, 요청하신 대로 `GetPixel(10, 10)`을 호 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetAlpha` 함수를 활용하면 스프라이트 전체의 알파 값을 변경할 수 있습니다. 예시 코드는 아래와 같습니다. 버튼을 만들고, 함수를 추가한 다음 버튼에 **ButtonClickEvent**를 연결하는 것은 위의 예제와 동일합니다. ```lua [client only] void SetAlphaTest() { local a = _UtilLogic:RandomDouble() -- SetAlpha를 사용하여 스프라이트 전체의 알파 값을 변경합니다. self.Entity.PixelRendererComponent
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | ButtonComponent의 Transition을 ColorTint와 SpriteSwap으로 설정할 때 각각 어떤 프로퍼티를 추가로 지정해야 하나요? [answer] | ButtonComponent의 `Transition`을 `ColorTint`와 `SpriteSwap`으로 설정할 때 각각 지정해야 할 프로퍼티에 대해 제공된 문서에는 구체적인 프로퍼티 이름이나 설정 방법이 명시되어 있지 않습니다. 문서에는 `Transition` 프로퍼티에 대해 "전환 방식에 따라 아래에 설정해야 할 프로퍼티가 달라집니다"라고 언급하고, 그 방식이 `ColorTint`(색상 전환)와 `SpriteSwap`(스프라이트 교체)임을 설명할 뿐, 실제로 설정해야 하는 구체적인 프로퍼티(예: 각 상태별 색상 값, 교체할 스 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Callback [question] | 비동기 작업 완료 시점 알림과 연계 작업 실행을 위해 Callback을 사용하는 이유를 단계별 번호 목록으로 정리하세요. [answer] | 비동기 작업의 특성상 완료 시점과 연계 작업을 관리하기 위해 Callback을 사용하는 이유는 다음과 같습니다. 1. **완료 시점 알림**: 비동기 작업은 순차적인 흐름대로 진행되지 않기 때문에, 작업이 언제 끝나는지 직접적으로 알 수 없습니다. 주요 흐름 외에서 처리된 작업이 완료되었음을 알리는 알림 역할을 Callback이 수행합니다. 2. **연계 작업 정의**: 비동기 작업이 끝난 뒤에 실행해야 할 후속 작업(연계 작업)을 Callback 함수로 정의할 수 있습니다. 이를 통해 작업이 완료된 정확한 타이밍에 다음 로직을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 포탈 사용 시 데이터를 직렬화하여 전달하는 `Warp` 메서드와, 도착지에서 데이터를 역직렬화하여 로그로 출력하는 `HandleUserEnterEvent` 핸들러의 핵심 로직만 코드 블록으로 출력하되, 설명은 주석으로 작성하세요. [answer] | ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId) { -- 전달할 데이터를 테이블로 구성합니다. local warpDataTable = {} warpDataTable.testData = "test" -- 직렬화: 테이블을 문자열로 변환하여 텔레포트 서비스에서 전달할 수 있게 만듭니다. local warpData = _UtilLogic:TableToString(warpDataTable) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 데이터를 이동할 월드로 전달할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성합니다. 2. 맵에 포탈을 추가한 뒤, 만든 스크립트 컴포넌트를 포탈에 추가합니다. 3. 아래와 같이 `WarpUserToWorldAndWait()`와 `UtilLogic`을 활용해 다른 월드에 데이터를 전달할 수 있게 작성합니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId)
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | ButtonClickEvent와 ButtonPressedEvent의 발생 시점이 어떻게 다른지, 각 이벤트가 언제 트리거되는지 설명해 줄 수 있나요? [answer] | `ButtonClickEvent`와 `ButtonPressedEvent`는 버튼의 입력 상태에 따라 발생 시점이 명확히 구분됩니다. **1. ButtonClickEvent** 버튼을 **눌렀을 때** 발생하는 이벤트입니다. 사용자가 버튼을 클릭하는 동작이 완료되는 시점에 트리거됩니다. **2. ButtonPressedEvent** 버튼을 **누르고 있을 때** 발생하는 이벤트입니다. 사용자가 버튼을 누른 채로 유지하고 있는 동안 트리거됩니다. 즉, `ButtonClickEvent`는 클릭(누름) 동작에 반응하는 반면, `But [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent로 입력받은 텍스트를 화면에 바로 보여주기 위해 반드시 함께 사용해야 하는 컴포넌트는 무엇인가요? [answer] | TextInputComponent로 입력받은 텍스트를 화면에 표시하려면 반드시 **TextComponent**를 함께 사용해야 합니다. TextInputComponent는 텍스트 입력만 담당하기 때문에, 입력된 내용을 시각적으로 보여주기 위해 TextComponent가 필요합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | ImageRUID 리소스가 아틀라스에 포함되어 있으면 Tiled 모드에서 Repeat 모드의 부하 절감 효과가 적용되지 않는 이유는 무엇인가요? [answer] | ImageRUID 리소스가 아틀라스에 포함되어 있는 경우, Tiled 모드에서 Repeat 모드의 부하 절감 효과가 적용되지 않는 이유는 문서에 명시된 바와 같이 **리소스의 Border 값이 필요하거나 아틀라스에 포함되어야 하는 경우**에 해당하기 때문입니다. 아틀라스에 포함된 이미지나 Border 값이 설정된 이미지는 단순한 반복(Repeat) 방식으로 렌더링하는 것이 제한적이거나, 그래픽 엔진 내부적으로 타일링 처리 시 아틀라스의 경계나 보더 정보를 고려해야 하므로, Repeat 모드가 제공하는 "크기에 영향받지 않고 부하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent의 AutoClear 프로퍼티가 True일 때 텍스트 입력이 완료된 후 UI에 어떤 변화가 일어나나요? [answer] | `TextInputComponent`의 `AutoClear` 프로퍼티가 `True`로 설정되어 있으면, 텍스트 입력이 완료된 후 입력 영역의 텍스트가 자동으로 초기화됩니다. 즉, 사용자가 입력한 내용이 사라지고 빈 상태로 돌아갑니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>