[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 위치, 크기, 회전 조정 [question] | Rotate 함수와 ZRotation 속성을 활용하여 엔티티를 반시계 방향으로 45도 회전시키는 방법을 단계별 번호 목록으로 정리하세요. [answer] | mLua 스크립트를 사용하여 엔티티를 반시계 방향으로 45도 회전시키는 방법은 다음과 같습니다. 1. **`Rotate` 함수를 호출하여 상대 회전 값 설정** 엔티티의 현재 위치를 기준으로 반시계 방향으로 45도 회전하려면 `TransformComponent`의 `Rotate` 함수에 45를 전달합니다. ```lua void OnBeginPlay() { self.Entity.TransformComponent:Rotate(45) log("Rotated 45 degrees [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Scale**의 **X, Y**값에 **4**를 입력하면 기존 대비 비례하게 4배 커집니다. # 회전 **WorldZRotation**과 **ZRotaion**은 값을 상호 교환합니다. #### 방법 1 **TransformComponent**의 **ZRotation** 값을 **45**로 변경합니다. 엔티티가 반시계 방향으로 45도 회전된 것을 확인합니다. #### 방법 2 1. **Scene**에서 엔티티를 선택, 핸들러를 활성화합니다. 2. 핸들러 박스의 모서리 쪽으로 마우스를 움직입니다. 3. 커서가 모양으로
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원하는 이미지 갖고 오기 [question] | Workspace의 MyDesk에서 이미지를 불러오는 과정과 Scene에 배치하는 3가지 방법을 단계별 번호 목록으로 정리해 주세요. [answer] | Workspace의 MyDesk에서 이미지를 불러오고 Scene에 배치하는 과정은 다음과 같습니다. ### 1. 이미지 불러오기 1. **Workspace - MyDesk**의 콘텍스트 메뉴를 엽니다. 2. **Import From - Import Image**를 선택합니다. 3. 사용할 이미지를 선택하여 불러옵니다. (이 과정 후 **MyDesk** 하위에 불러온 이미지 파일이 개별 생성됩니다.) ### 2. Scene에 이미지 배치하는 3가지 방법 **첫 번째 방법: Place To Hierarchy 사용** 1. **Wo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임에 필요한 이미지 리소스를 찾아 메이커에서 활용할 수 있습니다. # 이미지 불러오기 1. **Workspace - MyDesk**의 콘텍스트 메뉴를 열고, **Import From - Import Image**를 선택합니다. 2. 사용할 이미지를 선택하여 불러옵니다. **MyDesk** 하위에 불러온 이미지 파일이 개별 생성됩니다. 3. 원하는 방식으로 이미지를 활용합니다. # 이미지 활용 방식 이미지를 배치하는 방법은 크게 3가지가 있습니다. **첫 번째 방법**은 **Workspace -
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | Hierarchy의 World - common 엔티티에 NPCTalk 스크립트 컴포넌트를 추가하고, KeyDownEvent 핸들러에서 event.key 값이 KeyboardKey.Z일 때만 ShowNextText()를 호출하도록 하는 입력 처리 코드를 작성해줘 [answer] | Hierarchy의 `World - common` 엔티티에 `NPCTalk` 스크립트 컴포넌트를 추가한 후, `KeyDownEvent` 핸들러에서 `event.key` 값이 `KeyboardKey.Z`일 때만 `ShowNextText()`를 호출하도록 구현한代码如下입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { local key = event.key if key == KeyboardKey.Z [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트에서 구현해야 할 주요 항목은 다음과 같습니다. * 특정 키를 입력하면 대화창이 출력됩니다. * 키를 입력할 때 마다 데이터의 내용이 대화창에 갱신됩니다. * 더 이상 사용할 데이터가 없으면 대화창을 닫습니다. 먼저 키 입력을 체크하여 대화창이 출력되도록 하겠습니다. 1. 새로운 스크립트 컴포넌트를 추가합니다. 컴포넌트 이름을 **NPCTalk**로 변경합니다. 2. **Workspace**에서 **NPCTalk** 스크립트를 열고, Entity Event Handler에 **KeyDownEvent**를 추가하고 아
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 위치, 크기, 회전 조정 [question] | TransformComponent의 Position Z 값을 조정하면 왜 2D 엔티티의 크기가 변하지 않고 겹쳐진 순서만 바뀌나요? [answer] | 메이플스토리 월드는 2D 모델을 기반으로 하기 때문에 엔티티는 본질적으로 '면'으로만 존재하며 앞뒤로 튀어나온 부피가 없습니다. 따라서 **Scale**의 Z 값을 변경해도 실제 크기가 변하지 않습니다. 반면 **Position**의 Z 값은 렌더링 순서, 즉 레이어 순서에 영향을 줍니다. 여러 엔티티가 겹쳐져 있을 때 Z 값이 클수록 화면 앞에, 작을수록 뒤에 배치됩니다. 따라서 Position Z 값을 조정하면 엔티티의 시각적 크기가 변하는 것이 아니라 겹쳐진 순서만 바뀌어 보입니다. 참고로, 엔티티의 겹침 순서를 변경해야 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **TransformComponent** 구성과 사용 방법을 설명합니다. 좌표 개념을 이해하고, 엔티티의 이동, 회전, 크기 조절을 할 수 있습니다. # 엔티티 변형 방법 엔티티를 변형하는 방법은 두 가지입니다. 크리에이터의 선호에 따라 사용할 수 있습니다. * 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경합니다. * **Scene**에서 엔티티를 선택, 드래그하거나 핸들러를 이용해 조정합니다. # 좌표 이해하기 **TransformComponent**를 사용하기 위해
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | OnBeginPlay 함수의 실행 공간을 ClientOnly로 설정해야 하는 구체적인 이유는 무엇인가요? [answer] | NPC 대화창 스크립트에서 `OnBeginPlay` 함수의 실행 공간을 **Client only**로 설정해야 하는 구체적인 이유는, 해당 함수 내에서 수행되는 작업들이 모두 **클라이언트(플레이어) 화면에 표시되는 UI 요소와 데이터를 다루기 때문**입니다. 참고 문서에 명시된 `OnBeginPlay` 함수의 내용을 분석하면 다음과 같은 작업들이 수행됩니다. 1. **UI 엔티티 경로 참조**: `_EntityService:GetEntityByPath`를 사용하여 `/ui/UIGroup/TalkPanel` 하위의 `Name` [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] | 엔티티의 위치, 크기, 회전 조정 [question] | Scale의 X 값만 변경했을 때와 X, Y 값을 동시에 변경했을 때 엔티티의 형태 변화가 어떻게 달라지나요? [answer] | Scale의 X 값만 변경하면 엔티티는 좌우 방향으로만 늘어나거나 줄어듭니다. 즉, 가로 방향의 크기만 변하고 세로 방향의 크기는 그대로 유지되어 원형이 타원처럼 변형되거나 사각형이 가로로 길어지는 형태가 됩니다. 반면, Scale의 X, Y 값을 동시에 변경하면 좌우와 상하 방향의 크기가 모두 변합니다. 이때 X, Y 값이 동일하게 변경되면 비율이 유지된 채로 전체적으로 확대 또는 축소되며, 값이 다르게 변경되면 가로와 세로 비율이 달라져 비율이 왜곡된 형태로 변형됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **TransformComponent** 구성과 사용 방법을 설명합니다. 좌표 개념을 이해하고, 엔티티의 이동, 회전, 크기 조절을 할 수 있습니다. # 엔티티 변형 방법 엔티티를 변형하는 방법은 두 가지입니다. 크리에이터의 선호에 따라 사용할 수 있습니다. * 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경합니다. * **Scene**에서 엔티티를 선택, 드래그하거나 핸들러를 이용해 조정합니다. # 좌표 이해하기 **TransformComponent**를 사용하기 위해
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel의 UITransformComponent를 이용해 PosX 0, PosY 150, Width 1600, Height 200으로 레이아웃을 고정하고, Anchor Presets가 Bottom, Center로 설정되었는지 검증하여 올바르게 배치하는 스크립트를 작성해줘 [answer] | 참고 문서에 따르면, UI 엔티티의 `Anchor Presets` (앵커 프리셋)는 UI 편집기에서 직접 설정하는 프로퍼티이며, mLua 스크립트 API를 통해 런타임에 설정하거나 검증하는 구체적인 메서드(예: `SetAnchorPreset` 등)가 문서에 명시되어 있지 않습니다. 따라서 스크립트로 Anchor Presets를 직접 변경하거나 검증하는 것은 불가능합니다. 하지만 문서에 제시된 `UITransformComponent`의 프로퍼티(`PosX`, `PosY`, `Width`, `Height`)는 스크립트에서 접근하여 값 [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] | TransformComponent의 Scale X, Y 값을 2배로 변경하여 엔티티의 크기를 늘리는 스크립트를 작성해줘 [answer] | `TransformComponent`의 `Scale` 프로퍼티를 직접 수정하여 엔티티의 크기를 변경할 수 있습니다. 제공된 문서에 따르면, `Scale`의 X 값은 좌우 크기, Y 값은 상하 크기를 제어합니다. 기존 크기의 2배로 늘리기 위해서는 현재 `Scale` 값에 2를 곱하여 다시 할당해야 합니다. 아래는 스크립트가 시작될 때(`OnBeginPlay`) 실행되어 엔티티 크기를 2배로 늘리는 예제입니다. ```lua Property: [None] Method: [server only] void OnBeginPlay() { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **TransformComponent** 구성과 사용 방법을 설명합니다. 좌표 개념을 이해하고, 엔티티의 이동, 회전, 크기 조절을 할 수 있습니다. # 엔티티 변형 방법 엔티티를 변형하는 방법은 두 가지입니다. 크리에이터의 선호에 따라 사용할 수 있습니다. * 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경합니다. * **Scene**에서 엔티티를 선택, 드래그하거나 핸들러를 이용해 조정합니다. # 좌표 이해하기 **TransformComponent**를 사용하기 위해
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 위치, 크기, 회전 조정 [question] | Scene 뷰에서 엔티티를 드래그하는 것과 스크립트 또는 프로퍼티 에디터에서 Position 값을 직접 수정하는 것은 결과적으로 동일한 효과를 내나요? [answer] | 네, 결과적으로 동일한 효과를 냅니다. 참고 문서에 따르면 엔티티를 변형하는 방법은 두 가지로 제시되며, 크리에이터의 선호에 따라 사용할 수 있다고 명시되어 있습니다. 1. 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경하는 것 2. **Scene**에서 엔티티를 선택한 후, 드래그하거나 핸들러를 이용해 조정하는 것 이 두 가지 방법은 모두 엔티티의 `TransformComponent` 속성(위치, 크기, 회전)을 변경하는 동일한 작업의 다른 입력 수단일 뿐입니다. `Scene` 뷰에서 드래그하여 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **TransformComponent** 구성과 사용 방법을 설명합니다. 좌표 개념을 이해하고, 엔티티의 이동, 회전, 크기 조절을 할 수 있습니다. # 엔티티 변형 방법 엔티티를 변형하는 방법은 두 가지입니다. 크리에이터의 선호에 따라 사용할 수 있습니다. * 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경합니다. * **Scene**에서 엔티티를 선택, 드래그하거나 핸들러를 이용해 조정합니다. # 좌표 이해하기 **TransformComponent**를 사용하기 위해
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | 맵 영역을 커스텀으로 설정해 놓은 상태에서, 특정 구간에서는 맵 영역을 따르다가 또 다른 구간에서는 완전히 다른 카메라 제한 영역을 적용하고 싶어요. 이 두 가지 동작을 전환하는 로직을 스크립트로 구현할 때 어떤 프로퍼티를 조작해야 하나요? [answer] | 제공된 참고 문서에 따르면, 카메라 제한 영역을 제어하는 핵심 프로퍼티는 `CameraComponent`의 **`UseCustomBound`**입니다. 질문하신 "특정 구간에서는 맵 영역을 따르고, 다른 구간에서는 완전히 다른 카메라 제한 영역을 적용"하는 로직을 구현하기 위해서는 **`UseCustomBound`** 프로퍼티의 값을 `false`와 `true`로 전환해야 합니다. ### 동작 원리 1. **`UseCustomBound = false`**: * 카메라 제한 영역이 `MapComponent`의 설정(` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카메라 제한 영역을 직접 정의해서 사용할 지 여부를 설정합니다. **UseCustomBound** 값이 **True**라면 **LeftBottom, RightTop** 프로퍼티를 사용해 카메라 제한 영역을 정의할 수 있습니다. **Collider Edit** 버튼을 누르면 Scene에 표시되는 기즈모를 통해 카메라 제한 영역을 시각적으로 확인하거나 핸들러를 통해 손쉽게 영역을 조절할 수 있습니다. CameraComponent - UseCustomBound 값이 **False**라면 맵 영역을 카메라 제한 영역으로 사용합니다. 맵
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 위치, 크기, 회전 조정 [question] | TransformComponent의 Position Z 값을 10으로 설정하여 다른 엔티티보다 앞에 놓이도록 레이어 순서를 조정하는 스크립트를 작성해줘 [answer] | 메이플스토리 월드에서 2D 엔티티의 앞뒤 배치 순서(레이어)를 조정하려면 `TransformComponent`의 `Position` Z 값을 변경할 수 있습니다. Z 값이 클수록 다른 엔티티보다 앞에 배치됩니다. 요청하신 대로 Position Z 값을 10으로 설정하여 엔티티를 가장 앞에 나오도록 하는 스크립트는 다음과 같습니다. ```lua Property: [None] number TargetZPosition = 10 Method: [server only] void OnBeginPlay() { local transf [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **TransformComponent** 구성과 사용 방법을 설명합니다. 좌표 개념을 이해하고, 엔티티의 이동, 회전, 크기 조절을 할 수 있습니다. # 엔티티 변형 방법 엔티티를 변형하는 방법은 두 가지입니다. 크리에이터의 선호에 따라 사용할 수 있습니다. * 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경합니다. * **Scene**에서 엔티티를 선택, 드래그하거나 핸들러를 이용해 조정합니다. # 좌표 이해하기 **TransformComponent**를 사용하기 위해
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel 엔티티에 스크립트를 붙여 TalkPanel 자체의 활성화 상태를 비활성화(Enable 해제) 상태로 초기화하는 스크립트를 작성해줘. [answer] | TalkPanel 엔티티의 활성화 상태(Enable)를 비활성화 상태로 초기화하는 스크립트는 `OnBeginPlay` 라이프사이클 메서드에서 `self.Entity`의 활성화 속성을 `false`로 설정하여 작성할 수 있습니다. 참고 문서에 명시된 구체적인 활성화 상태 변경 API(예: `SetActive` 등)는 제공되지 않았으나, mLua 표준 생명주기 및 엔티티 접근 규칙에 따라 `OnBeginPlay`에서 초기화하는 방식을 적용합니다. ```lua Method: [client only] void OnBeginPlay() [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] | 원하는 이미지 갖고 오기 [question] | 제시된 원문은 이미지 리소스의 임포트(Import) 및 배치(Place) 절차와 활용 방식(3가지)만 설명하고 있으며, mLua 스크립트 컴포넌트, 메서드, 이벤트 핸들러, 서비스 API 등 코딩에 필요한 기술적 정보가 전혀 포함되어 있지 않습니다. 따라서 원문에 있는 정보만 사용하여 mLua 코딩 과제를 만들 수 없습니다. [answer] | 제시된 원문에는 이미지 리소스의 임포트(Import) 및 배치(Place) 절차와 3가지 활용 방식만 설명되어 있으며, mLua 스크립트 컴포넌트, 메서드, 이벤트 핸들러, 서비스 API 등 코딩에 필요한 기술적 정보가 포함되어 있지 않습니다. 따라서 원문에 있는 정보만 사용하여 mLua 코드 예제를 작성할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임에 필요한 이미지 리소스를 찾아 메이커에서 활용할 수 있습니다. # 이미지 불러오기 1. **Workspace - MyDesk**의 콘텍스트 메뉴를 열고, **Import From - Import Image**를 선택합니다. 2. 사용할 이미지를 선택하여 불러옵니다. **MyDesk** 하위에 불러온 이미지 파일이 개별 생성됩니다. 3. 원하는 방식으로 이미지를 활용합니다. # 이미지 활용 방식 이미지를 배치하는 방법은 크게 3가지가 있습니다. **첫 번째 방법**은 **Workspace -
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel 엔티티의 Name 자식 엔티티에 스크립트를 붙여 TextComponent.FontColor를 흰색(RGB 255,255,255, A 100)으로, OutlineColor를 검은색(RGB 0,0,0, A 100)으로, UseOutLine을 true로 설정하는 스크립트를 작성해줘. [answer] | 참고 문서에 제시된 값(RGB 255,255,255 A 100, RGB 0,0,0 A 100, UseOutLine true)을 `TextComponent` 프로퍼티에 직접 적용하는 mLua 스크립트입니다. 스크립트는 `Name` 엔티티에 붙이고, 실행 공간은 클라이언트(`[client only]`)로 설정하여 UI 렌더링이 정상적으로 반영되도록 합니다. ```lua Method: [client only] void OnBeginPlay() { local textComponent = self.Entity.TextComponent [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] | NPC 대화창 만들기 [question] | 대화창 종료 후 다시 열었을 때 이전 대화 내용이 남아있는 것처럼 보이는 경우, isNameEnable과 isPortraitEnable 변수의 초기화 위치를 어떻게 수정해야 하나요? [answer] | 대화창이 다시 열렸을 때 이전 대화의 이름이나 포트레이트가 남아 보이는 문제는 `isNameEnable`과 `isPortraitEnable` 변수가 `ShowNextText()` 함수의 **가장 시작 부분**에 선언되고 초기화되지 않기 때문에 발생합니다. 참고 문서의 설명에 따르면, `ShowNextText()` 함수의 작동 방식은 다음과 같습니다. 1. **로컬 변수 `isNameEnable`, `isPortraitEnable`를 선언 후 기본값을 `false`로 초기화**합니다. 2. 데이터에서 텍스트(`text`)를 가 [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] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | 빈 셀의 경우 nil이 아닌 빈 문자열이 할당되는 이유와 name, portrait 값이 존재하지 않을 때 대화창 진행에 영향을 주지 않는 근거를 표로 정리해서 설명하세요. [answer] | 빈 셀의 값 처리 방식과 `name`, `portrait` 값이 없을 때 대화창 진행에 영향을 주지 않는 이유는 데이터의 존재 여부가 대화의 핵심 요소인 `text`(본문)의 흐름과는 독립적으로 처리되기 때문입니다. **1. 빈 셀의 경우 `nil`이 아닌 빈 문자열(`""`)이 할당되는 이유** * **데이터 구조 특성**: 테이블(데이터)에서 셀을 조회할 때, 해당 셀에 값이 입력되어 있지 않은 상태(빈 셀)는 '값이 없음'(`nil`)이 아니라 '값이 있는 상태이지만 그 값이 빈 문자열'(`""`)로 처리됩니다. * [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] | 엔티티의 위치, 크기, 회전 조정 [question] | 프로퍼티 에디터의 OrderInLayer와 Position Z 값을 통한 엔티티 겹침 순서 조정은 어떤 차이가 있나요? [answer] | 프로퍼티 에디터의 `OrderInLayer`와 `Position`의 `Z` 값을 모두 사용해 엔티티 겹침 순서를 조절할 수 있지만, 그 원리와 권장 수준에 차이가 있습니다. **1. `Position`의 `Z` 값** * **작동 원리:** 2D 모델은 앞뒤 부피가 없으므로 `Z` 값을 변경해도 시각적 크기나 형태가 변하지 않습니다. 다만, 여러 엔티티가 겹쳐 있을 때 `Z` 값이 클수록 화면 앞에, 작을수록 뒤에 배치되는 레이어 순서와 유사한 효과를 줍니다. * **특징:** `Position`은 `X`, `Y` 이동과 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **TransformComponent** 구성과 사용 방법을 설명합니다. 좌표 개념을 이해하고, 엔티티의 이동, 회전, 크기 조절을 할 수 있습니다. # 엔티티 변형 방법 엔티티를 변형하는 방법은 두 가지입니다. 크리에이터의 선호에 따라 사용할 수 있습니다. * 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경합니다. * **Scene**에서 엔티티를 선택, 드래그하거나 핸들러를 이용해 조정합니다. # 좌표 이해하기 **TransformComponent**를 사용하기 위해
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다른 위치로 이동하는 포탈 만들기 [question] | PortalComponent의 PortalEntityRef를 설정했는데도 포탈 목록에 목적지가 안 보일 때, 무엇이 원인인지 알고 싶습니다. [answer] | 참고 문서에 따르면, `PortalComponent`의 `PortalEntityRef`에 목적지를 선택했는데도 포탈 경로 목록에 해당 엔티티가 보이지 않는 가장 큰 원인은 **저장(Ctrl + S) 또는 테스트 실행을 하지 않아 경로 정보가 갱신되지 않았기 때문**입니다. 포탈 경로는 World에 배치한 다음 반드시 **저장(Ctrl + S)** 하거나 **테스트를 실행**해야만 갱신됩니다. 이 과정을 거치지 않으면 설치한 포탈 경로가 목록에 나타나지 않으므로, 편집 후 저장이나 테스트를 진행하면 해결됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드나 하나의 맵 안에서 이동하는 포탈을 만들어 간단하게 플레이어 아바타가 맵을 이동하게 만들 수 있습니다. [PortalComponent](/apiReference/Components/PortalComponent) 사용 방법을 알아보겠습니다. # 포탈 만들기 [PortalComponent](/apiReference/Components/PortalComponent)는 동일한 포탈 컴포넌트를 가진 엔티티를 목적지로 설정하고, 플레이어 아바타가 포탈 영역에서 특정 동작을 수행하면(키 입력) 목적지로 이동할 수
[task] | single_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | Entity 타입의 프로퍼티인 uiNameEntity와 uiMessageEntity의 초기값을 nil로 지정해 두는 것이 필수적인 이유와 이 값들이 OnBeginPlay에서 실제 엔티티로 바인딩되는 과정은 어떻게 이루어지나요? [answer] | `Entity` 타입의 프로퍼티인 `uiNameEntity`와 `uiMessageEntity`의 초기값을 `nil`로 지정해 두는 것은 스크립트가 시작될 때 해당 변수들이 아직 실제 UI 엔티티와 연결되지 않았음을 명확히 하기 위함입니다. `Entity` 타입은 메모리 상의 객체 참조를 저장하므로, 참조할 대상이 없으면 `nil`이어야 합니다. 만약 초기값을 다른 값으로 설정하거나 공란으로 두면, `OnBeginPlay()`가 실행되기 전에 이 변수들에 접근하는 코드가 존재할 경우 오류가 발생할 수 있습니다. 이 값들이 실제 엔티 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 6. 로그가 정상 출력된다면 플레이를 종료하고 **NPCTalk** 스크립트를 다시 열고, 아래와 같이 제작에 필요한 프로퍼티를 추가합니다. | type | name | value | Sync | 설명 | | --- | --- | --- | --- | --- | | number | count | 0 |none | 스크립트에서 참조할 데이터의 rowIndex를 결정하기 위해 사용합니다. 데이터를 셋팅할때 마다 값을 1씩 증가시켜 다음줄의 데이터를 참조할 수 있도록 합니다.| | any | npc
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel 엔티티에 스크립트를 붙여 Name, Text 자식 엔티티의 UITransformComponent 프로퍼티(PosX, PosY, Width, Height)를 문서에 명시된 값(-600, 110, 300, 100 및 0, 0, 1550, 150)으로 초기화하는 스크립트를 작성해줘. [answer] | 문서에서 명시된 `Name`과 `Text` 자식 엔티티의 `UITransformComponent` 프로퍼티 값을 초기화하는 스크립트입니다. `TalkPanel` 엔티티에 붙일 스크립트로, `OnBeginPlay` 시점에 자식 엔티티를 찾아서 각각의 좌표와 크기를 문서의 표에 맞춰 설정합니다. ```lua Method: [client only] void OnBeginPlay() { -- Name 자식 엔티티 초기화 local nameEntity = self.Entity:GetChild("Name") if nameEntity [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] | NPC 대화창 만들기 [question] | ShowNextText 함수에서 name과 portrait 값이 없을 때에도 대화 흐름을 유지하려면 어떤 조건 분기를 설정해야 하나요? [answer] | `ShowNextText()` 함수에서 `name`과 `portrait` 값이 없을 때에도 대화 흐름을 유지하려면, **`text` 값이 `nil`이 아닌 경우에만** 다음 텍스트로 진행하도록 조건을 설정해야 합니다. `name`과 `portrait`는 선택 사항이므로 존재하지 않거나 빈 문자열(`""`)이어도 대화 자체는 정상적으로 진행되어야 합니다. 따라서 대화 진행의 핵심 조건은 `text` 컬럼의 값이 유효한지 여부입니다. 아래는 이를 반영한 `ShowNextText` 함수의 조건 분기 로직입니다. ```lua void [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] | instruction_following [pass] | ⏳ 미판정 [title] | 게임 시작 위치 설정 [question] | 플레이어 아바타의 기본 위치 좌표와 해당 값을 확인하는 컴포넌트 경로를 2문장 이내로 설명하세요. [answer] | 플레이어 아바타의 기본 위치 좌표는 X 0, Y 0입니다. 이 값은 DefaultPlayer의 TransformComponent에서 확인할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **플레이어 아바타**의 등장 위치 설정 방법을 소개합니다. 게임 시작 위치, 재등장(리스폰), 게임 제작 중 테스트 위치 설정에 대해 알아보겠습니다. # 플레이어 아바타의 기본 위치 플레이어 아바타의 기본 위치는 화면 중간입니다. X, Y 좌표상 X값 0, Y값 0인 위치입니다. 기본적으로 게임 시작과 리스폰 위치가 이 설정을 따릅니다. 플레이어 아바타의 기본 위치는 **DefaultPlayer의 TransformComponent**에서 확인할 수 있습니다. # SpawnLocation을 이용한 시작
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다른 위치로 이동하는 포탈 만들기 [question] | 스프라이트 크기와는 상관없이 포탈이 인식되는 범위를 넓히거나 줄이려면 어떤 프로퍼티를 조정해야 하나요? [answer] | 포탈이 인식되는 범위는 스프라이트의 크기와 무관하게 **BoxCollider** 컴포넌트에서 관리하는 프로퍼티를 조정하여 변경할 수 있습니다. 구체적으로 다음과 같은 프로퍼티를 사용합니다. * **BoxSize**: 포탈의 박스 크기를 변경합니다. * **BoxOffset**: 포탈로 인식하는 범위의 오프셋(위치)을 조정합니다. 이 두 프로퍼티는 연동되어 있어, `Box Collider - Edit` 기능을 활성화한 후 X, Y 값을 직접 입력하거나 박스 핸들러를 잡아당겨 원하는 크기로 설정할 수 있습니다. 박스 범위를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드나 하나의 맵 안에서 이동하는 포탈을 만들어 간단하게 플레이어 아바타가 맵을 이동하게 만들 수 있습니다. [PortalComponent](/apiReference/Components/PortalComponent) 사용 방법을 알아보겠습니다. # 포탈 만들기 [PortalComponent](/apiReference/Components/PortalComponent)는 동일한 포탈 컴포넌트를 가진 엔티티를 목적지로 설정하고, 플레이어 아바타가 포탈 영역에서 특정 동작을 수행하면(키 입력) 목적지로 이동할 수
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 게임 시작 위치 설정 [question] | 'SpawnLocation'이 한 맵에 여러 개 배치된 경우, 재등장 위치 선택 기준을 1문장으로 간결하게 서술하세요. [answer] | 'SpawnLocation'과 플레이어 아바타 사이의 거리가 재등장 위치 선택 기준이 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **플레이어 아바타**의 등장 위치 설정 방법을 소개합니다. 게임 시작 위치, 재등장(리스폰), 게임 제작 중 테스트 위치 설정에 대해 알아보겠습니다. # 플레이어 아바타의 기본 위치 플레이어 아바타의 기본 위치는 화면 중간입니다. X, Y 좌표상 X값 0, Y값 0인 위치입니다. 기본적으로 게임 시작과 리스폰 위치가 이 설정을 따릅니다. 플레이어 아바타의 기본 위치는 **DefaultPlayer의 TransformComponent**에서 확인할 수 있습니다. # SpawnLocation을 이용한 시작
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 위치, 크기, 회전 조정 [question] | 메이플스토리 월드에서 엔티티를 회전시킬 때 X, Y 축 대신 ZRotation만 사용해야 하는 구체적인 이유를 설명해 주세요. [answer] | 메이플스토리 월드는 2D 모델을 기반으로 하기 때문에, 엔티티의 회전을 ZRotation(또는 WorldZRotation)으로만 수행해야 합니다. X, Y 축을 기준으로 회전하는 것은 2D 환경에서 올바른 결과를 만들지 않기 때문입니다. 구체적인 이유는 다음과 같습니다. 1. **2D 이미지의 특성**: 2D 이미지는 면(Plane)으로만 존재하며, 앞뒤로 튀어나온 부피가 없습니다. 2. **X, Y 축 회전의 문제점**: - X 축이나 Y 축을 기준으로 회전하면, 2D 이미지는 화면에 대해 '얇아지거나' '일그러지는' [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **TransformComponent** 구성과 사용 방법을 설명합니다. 좌표 개념을 이해하고, 엔티티의 이동, 회전, 크기 조절을 할 수 있습니다. # 엔티티 변형 방법 엔티티를 변형하는 방법은 두 가지입니다. 크리에이터의 선호에 따라 사용할 수 있습니다. * 프로퍼티 에디터에서 **TransformComponent** 프로퍼티 값을 변경합니다. * **Scene**에서 엔티티를 선택, 드래그하거나 핸들러를 이용해 조정합니다. # 좌표 이해하기 **TransformComponent**를 사용하기 위해
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 위치, 크기, 회전 조정 [question] | Scale의 X, Y 값을 4로 설정하면 엔티티가 비례적으로 4배 커지는 것인가요? [answer] | 네, Scale의 X, Y 값에 4를 입력하면 엔티티는 기존 크기에 비해 비례하게 4배로 커집니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Scale**의 **X, Y**값에 **4**를 입력하면 기존 대비 비례하게 4배 커집니다. # 회전 **WorldZRotation**과 **ZRotaion**은 값을 상호 교환합니다. #### 방법 1 **TransformComponent**의 **ZRotation** 값을 **45**로 변경합니다. 엔티티가 반시계 방향으로 45도 회전된 것을 확인합니다. #### 방법 2 1. **Scene**에서 엔티티를 선택, 핸들러를 활성화합니다. 2. 핸들러 박스의 모서리 쪽으로 마우스를 움직입니다. 3. 커서가 모양으로
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | KeyDownEvent에서 KeyboardKey.Z 키 입력을 감지하여 대화 데이터 배열의 다음 인덱스를 호출하고, 데이터가 모두 소비되면 대화창 UI를 닫도록 하는 NPCTalk 스크립트를 작성해줘 [answer] | 사용자 질문에 맞춰, `KeyDownEvent`에서 `KeyboardKey.Z`를 감지하여 대화 데이터를 순차적으로 출력하고, 데이터가 모두 소비되면 대화창을 닫는 `NPCTalk` 스크립트를 작성합니다. 참고 문서에는 대화창 UI의 구체적인 조작 API(텍스트 설정, UI 숨김/표시 메서드 등)가 명시되어 있지 않으므로, 대화 데이터 관리 로직과 키 입력 감지 부분만 정확한 mLua 형식으로 구현하고, UI 조작 부분은 주석으로 처리합니다. ```lua Property: [None] string[] TalkData = { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트에서 구현해야 할 주요 항목은 다음과 같습니다. * 특정 키를 입력하면 대화창이 출력됩니다. * 키를 입력할 때 마다 데이터의 내용이 대화창에 갱신됩니다. * 더 이상 사용할 데이터가 없으면 대화창을 닫습니다. 먼저 키 입력을 체크하여 대화창이 출력되도록 하겠습니다. 1. 새로운 스크립트 컴포넌트를 추가합니다. 컴포넌트 이름을 **NPCTalk**로 변경합니다. 2. **Workspace**에서 **NPCTalk** 스크립트를 열고, Entity Event Handler에 **KeyDownEvent**를 추가하고 아
[task] | two_turn [pass] | ⏳ 미판정 [title] | 배경음악 변경하기 [question] | SoundComponent를 맵에 추가하는 기본 절차는 무엇인가요? [answer] | 맵에 SoundComponent를 추가하는 기본 절차는 다음과 같습니다. 1. 에디터의 **Preset List**에서 **BGM** 항목을 선택합니다. 2. 원하는 배경음악을 클릭하여 선택합니다. 3. 맵의 **Property** 창을 확인하면 **SoundComponent**가 추가된 것을 확인할 수 있습니다. 이와 같이 배경음악을 선택하면 자동으로 SoundComponent가 맵에 적용되어, 게임을 시작하면 해당 배경음악이 재생됩니다. [followup] | SoundComponent의 제어 가능한 프로퍼티는 무엇이며, 배경음악 재생을 테스트하기 위한 구체적인 설정 방법은 무엇인가요? [followup_answer] | 제공된 참고 문서에는 SoundComponent의 구체적인 제어 가능한 프로퍼티 목록이 명시되어 있지 않습니다. 문서에서는 "제어할 수 있는 프로퍼티에 대한 자세한 내용은 SoundComponent 항목을 참고합니다"라고만 안내하고 있을 뿐, 프로퍼티 이름이나 값을 직접 다루지 않습니다. 배경음악 재생을 테스트하기 위한 구체적인 설정 방법은 다음과 같습니다. 1. 에디터의 **Preset List - BGM**에서 원하는 배경음악을 선택합니다. 2. 맵의 **Property** 창에 **SoundComponent**가 추가되었는 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임에 어울리는 배경음악을 간편하게 넣어봅시다. # 배경음악 넣기 1. **Preset List - BGM**을 선택합니다. 2. 원하는 배경음악을 클릭합니다. 3. map의 **Property**에 [**SoundComponent**](/apiReference/Components/SoundComponent)가 추가된 것을 확인할 수 있습니다. 제어할 수 있는 프로퍼티에 대한 자세한 내용은 [**SoundComponent**](/apiReference/Com
[task] | code [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | Portrait 이미지 엔티티의 SpriteGUIRendererComponent를 통해 NPC 고유 스프라이트를 설정하고, 대화창이 열릴 때 Portrait의 PosX, PosY, Width, Height를 문서에 명시된 값으로 초기화하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 UI 편집기를 통해 `Portrait` 엔티티의 `SpriteGUIRendererComponent`와 `UITransformComponent` 프로퍼티를 설정하는 **UI 디자인 단계**에 대한 설명만 포함되어 있습니다. 문서에는 다음 사항이 **스크립트(mLua) 코드 예제나 API 설명으로 제공되지 않습니다**: 1. 스크립트에서 특정 NPC ID나 모델 ID를 기반으로 `SpriteGUIRendererComponent`의 스프라이트(텍스처)를 동적으로 변경하는 API (예: `Sprite`, `Text [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 NPC들의 대화를 표현하기 위한 대화창을 제작해볼 것입니다. UI 편집기를 이용해 대화창을 구성하고 데이터 테이블에 데이터를 세팅 후 스크립트를 이용해 호출할 것입니다. 과정의 진행 순서는 다음과 같습니다. 1. UI 디자인 2. 데이터 테이블 추가 3. 스크립트 제작 제작 예시는 다음과 같습니다. # UI 디자인 1. UI 편집기 버튼을 클릭합니다. 2. UI 디자인을 진행할 새로운 **UIGroup**을 추가합니다. UIGroup을 추가한 적이 없다면 UIGroup이 추가됩
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 위치, 크기, 회전 조정 [question] | Rotate 함수로 엔티티를 회전시킬 때, 입력한 값이 6이라면 엔티티는 시계 방향이 아닌 반시계 방향으로 몇 도만큼 회전하게 되나요? [answer] | Rotate 함수에 6을 입력하면 엔티티는 반시계 방향으로 6도만큼 회전합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Scale**의 **X, Y**값에 **4**를 입력하면 기존 대비 비례하게 4배 커집니다. # 회전 **WorldZRotation**과 **ZRotaion**은 값을 상호 교환합니다. #### 방법 1 **TransformComponent**의 **ZRotation** 값을 **45**로 변경합니다. 엔티티가 반시계 방향으로 45도 회전된 것을 확인합니다. #### 방법 2 1. **Scene**에서 엔티티를 선택, 핸들러를 활성화합니다. 2. 핸들러 박스의 모서리 쪽으로 마우스를 움직입니다. 3. 커서가 모양으로