[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | ClimbableSpriteRendererComponent와 SpriteRendererComponent 모두 같은 이벤트를 발생시킬 때, 수신 측 스크립트에서 두 컴포넌트를 구분해서 처리할 수 있나요? [answer] | 제공된 문서의 예제 코드에 따르면, `HandleSpriteAnimPlayerEndFrameEvent`와 `HandleSpriteAnimPlayerChangeFrameEvent`는 `ClimbableSpriteRendererComponent`와 `SpriteRendererComponent` 모두에서 발생되는 것으로 명시되어 있습니다. 그러나 문서에 제시된 이벤트 핸들러의 파라미터(`FrameIndex`, `ReversePlaying`, `TotalFrameCount`, `AnimPlayer`) 중에는 **어떤 컴포넌트에서 이벤트가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | 사과가 튀어 오르는 효과를 위해 TweenLogic:MakeTween()을 사용할 때, 기존 SpriteRendererComponent의 Color.a 값과 충돌하지 않도록 어떻게 설정해야 하나요? [answer] | 제공된 참고 문서에는 `TweenLogic:MakeTween()`의 구체적인 사용법, 파라미터, 또는 `SpriteRendererComponent.Color.a`와의 충돌 방지 방법이 포함되어 있지 않습니다. 문서에는 사과가 튀어 오르는 느낌을 주기 위해 `Model_Apple`에 새로운 스크립트 컴포넌트를 추가하고 `TweenLogic:MakeTween()`을 **활용해 보세요**라는 제언만 있을 뿐, 해당 API의 실제 코드 작성 방법이나 다른 컴포넌트 속성(예: `Color.a`)과의 상호작용에 대한 기술적 세부사항은 없습니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | 엔티티의 회전 각도가 90도의 배수가 될 때만 다음 상태로 전이하도록 `OnConditionCheck()`를 구현하고, `StateComponent:AddCondition()`으로 상태 연결을 설정하는 스크립트를 작성해줘. [answer] | 엔티티의 회전 각도(`Rotation.z`)가 90도의 배수일 때만 상태 전이가 허용되도록 `OnConditionCheck()`를 구현하고, `StateComponent:AddCondition()`으로 상태 연결을 설정하는 스크립트는 다음과 같습니다. ```lua Method: boolean OnConditionCheck(string nextStateName) { local rotationAngle = self.Entity.TransformComponent.Rotation.z if rotationAngle ~= 0 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **MyDesk - Create Scripts - Create StateType**을 눌러 새로운 StateType을 생성하고, 상태를 정의합니다. `OnConditionCheck()`를 활용해 상태 전이 조건을 만들 수 있습니다. 아래와 같이 **MoveDown** StateType을 만들고 아래의 예시 코드처럼 활용할 수 있습니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) }
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 좌표와 스크린 좌표 [question] | 문서에 언급된 Screen 좌표를 확인하기 위해 사용할 수 있는 이벤트와 UILogic 프로퍼티 4가지를 단계별 번호 목록으로 나열하세요. [answer] | 문서에서 Screen 좌표를 확인하기 위해 사용할 수 있는 이벤트와 `UILogic` 프로퍼티 4가지는 다음과 같습니다. 1. `ScreenTouchEvent` 2. `ScreenTouchHoldEvent` 3. `UILogic.ScreenWidth` 4. `UILogic.ScreenHeight` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 월드 공간과 스크린 공간이 존재합니다. 각 공간에서는 서로 다른 좌표계를 사용합니다. 두 공간에서 사용하는 좌표계에 대해 알아봅시다. # 월드 공간 월드 공간이란 Hierarchy - world - map의 공간을 의미합니다. ## 월드 좌표 월드 좌표는 맵에서의 특정 위치 값입니다. 맵에 배치된 엔티티의`TransformComponent.WorldPosition` 값이 월드 좌표입니다. 월드 좌표의 원점은 맵의 중앙입니다. 예를 들어 아래 이미지와 같이 **분수 Entity**는 월
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 좌표와 스크린 좌표 [question] | UI 좌표의 기본 해상도와 비율을 포함하여 해상도별 UI 좌표 영역 처리 방식을 2문장 이내로 설명하세요. [answer] | UI 좌표 영역은 기본 해상도 1920 x 1080과 16:9 비율을 기준으로 설정됩니다. 기기의 해상도에 따라 월드 화면이 확대되거나 축소되더라도, 눈에 보이는 화면은 항상 동일한 모습으로 유지되도록 처리됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 월드 공간과 스크린 공간이 존재합니다. 각 공간에서는 서로 다른 좌표계를 사용합니다. 두 공간에서 사용하는 좌표계에 대해 알아봅시다. # 월드 공간 월드 공간이란 Hierarchy - world - map의 공간을 의미합니다. ## 월드 좌표 월드 좌표는 맵에서의 특정 위치 값입니다. 맵에 배치된 엔티티의`TransformComponent.WorldPosition` 값이 월드 좌표입니다. 월드 좌표의 원점은 맵의 중앙입니다. 예를 들어 아래 이미지와 같이 **분수 Entity**는 월
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 좌표와 스크린 좌표 [question] | 월드 좌표, Screen 좌표, UI 좌표의 원점 위치와 특징을 3행의 표로 정리해서 출력하세요. [answer] | | 좌표 유형 | 원점 위치 | 특징 | | :--- | :--- | :--- | | 월드 좌표 | 맵의 중앙 | 맵 상의 특정 위치 값을 나타내며, 엔티티의 `TransformComponent.WorldPosition` 값으로 확인 가능합니다. | | Screen 좌표 | 좌측 하단 | 기기의 디스플레이 해상도 픽셀 수와 동일하며, 기기마다 해상도가 다르므로 최댓값이 다릅니다. | | UI 좌표 | PC: 보이는 캔버스 중앙, Mobile: Safe Area의 중앙 | 기기에 따라 원점과 최댓값이 달라지며, 기본 해상도는 1920 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 월드 공간과 스크린 공간이 존재합니다. 각 공간에서는 서로 다른 좌표계를 사용합니다. 두 공간에서 사용하는 좌표계에 대해 알아봅시다. # 월드 공간 월드 공간이란 Hierarchy - world - map의 공간을 의미합니다. ## 월드 좌표 월드 좌표는 맵에서의 특정 위치 값입니다. 맵에 배치된 엔티티의`TransformComponent.WorldPosition` 값이 월드 좌표입니다. 월드 좌표의 원점은 맵의 중앙입니다. 예를 들어 아래 이미지와 같이 **분수 Entity**는 월
[task] | two_turn [pass] | ⏳ 미판정 [title] | 월드 좌표와 스크린 좌표 [question] | 월드 좌표와 스크린 좌표의 차이를 쉽게 설명해 주세요. [answer] | 월드 좌표와 스크린 좌표는 각각 **3차원 맵 공간**과 **2차원 화면 표시 공간**에서 위치를 나타내는 서로 다른 좌표계입니다. ### 1. 월드 좌표 (World Coordinates) * **정의**: 맵(Hierarchy - world - map) 내의 3차원 위치를 나타냅니다. * **원점**: 맵의 중앙입니다. * **차원**: 3차원 (X, Y, Z) * **확인 방법**: 엔티티의 `TransformComponent.WorldPosition` 값을 통해 확인할 수 있습니다. * **특징**: 실제 [followup] | TransformComponent.WorldPosition 값이 월드 좌표인데, 이것이 맵의 어떤 위치를 기준으로 하는지 원점이 어디인지 구체적으로 알려주세요. [followup_answer] | `TransformComponent.WorldPosition` 값인 월드 좌표의 원점은 **맵의 중앙**입니다. 즉, 맵의 정중앙이 (0, 0, 0)이 되며, 여기서부터 X, Y, Z 방향으로의 거리를 나타내는 값이 월드 좌표입니다. 예를 들어 특정 엔티티가 X = 23.91, Y = -3.37, Z = 999.953에 위치해 있다면, 이는 맵 중앙 기준 해당 좌표 값만큼 떨어진 위치에 있음을 의미합니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 월드 공간과 스크린 공간이 존재합니다. 각 공간에서는 서로 다른 좌표계를 사용합니다. 두 공간에서 사용하는 좌표계에 대해 알아봅시다. # 월드 공간 월드 공간이란 Hierarchy - world - map의 공간을 의미합니다. ## 월드 좌표 월드 좌표는 맵에서의 특정 위치 값입니다. 맵에 배치된 엔티티의`TransformComponent.WorldPosition` 값이 월드 좌표입니다. 월드 좌표의 원점은 맵의 중앙입니다. 예를 들어 아래 이미지와 같이 **분수 Entity**는 월
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | HandleTouchEvent와 HandleSpriteAnimPlayerEndFrameEvent는 각각 어떤 실행 공간(Space)에서 트리거되는 이벤트인가요? [answer] | 참고 문서에 제시된 정보에 근거하여 두 이벤트의 실행 공간(Space)을 설명하겠습니다. **1. HandleSpriteAnimPlayerEndFrameEvent** 이 이벤트는 `SpriteAnimPlayerEndFrameEvent` 타입을 가지며, 제공된 코드 예제의 Native Event Sender Info 주석에 명시된 바와 같이 실행 공간(Space)은 **Client**입니다. * **Sender:** `ClimbableSpriteRendererComponent` 또는 `SpriteRendererComponent` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------
[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | 기본적으로 IDLE과 DEAD 상태를 가지고 있는 StateComponent에서, 새로운 상태를 추가할 때 기존 기본 상태들과의 관계를 어떻게 정의해야 하는지 구체적인 코드 예시를 보여줄 수 있나요? [answer] | StateComponent는 기본적으로 `IDLE`과 `DEAD` 상태를 가지고 있으며, 크리에이터가 새로운 상태를 추가할 때는 이 두 기본 상태를 염두에 두고 상태 전이(Transition) 관계를 정의해야 합니다. 참고 문서에 따르면, StateComponent는 엔티티에 상태를 부여하고 상태 끼리의 관계를 정의하는 역할을 합니다. 새로운 상태를 추가하고 기존 기본 상태(`IDLE`, `DEAD`)와의 관계를 정의하는 구체적인 mLua 코드 예시는 제공된 문서에 포함되어 있지 않습니다. 문서에는 `AddState()` 함수를 [followup] | StateAnimationComponent를 monster나 npc에 적용하여, IDLE 상태에서 ATTACK 상태로 전이될 때 애니메이션 클립이 자연스럽게 이어지도록 하는 mLua 스크립트 코드를 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 `StateAnimationComponent`가 monster, npc에게만 적용 가능하며 상태에 맞는 애니메이션을 재생하는 용도로 사용된다는 사실과, `StateComponent`를 통해 상태를 변경하는 `ChangeState()` 메서드의 존재만 언급되어 있습니다. 그러나 **`IDLE` 상태에서 `ATTACK` 상태로 전이될 때 애니메이션 클립이 자연스럽게 이어지도록(Blending, Cross-fade 등) 설정하는 구체적인 API, 프로퍼티, 또는 메서드(예: `SetAnimationClip`, `P [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [StateComponent](/apiReference/Components/StateComponent)와 StateType의 개념을 알아보고, 엔티티의 상태에 따라 애니메이션이 재생되는 과정을 이해해봅시다. # State, StateComponent 알아보기 **State**는 어떤 엔티티가 특정한 상태에 있는 것을 말합니다. 서 있는 상태, 엎드린 상태, 공격 상태 등 크리에이터에 따라 다양한 상태를 정의할 수 있습니다. 월드에서 내 캐릭터가 가만히 서 있는 것이 당연하게 느껴질 수 있지만 이는 캐릭터의
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 좌표와 스크린 좌표 [question] | PC 창 크기 변경 시 화면 비율 유지 원리와 해상도별 캔버스 계산 방법을 3문장 이내로 설명하세요. [answer] | 창 크기가 변경되어도 화면 비율은 항상 16:9로 유지되며, 비율에 비례하여 보이는 영역이 확대 또는 축소됩니다. 모바일 기기의 경우 세로 해상도는 동일하게 유지되고, 기기 화면 비율이 16:9보다 세로가 길면 1920을 기준으로, 가로가 길면 1080을 기준으로 캔버스 크기가 조정됩니다. 이를 통해 실제 해상도와는 다른 캔버스 좌표 영역이 계산되며, UI 배치가 일관되게 유지됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | PC를 사용하는 메이플스토리 월드 유저는 창 크기를 변경할 수 있습니다. 그러나 창 크기를 변경해도 창의 화면 비율은 16:9로 유지됩니다. 비율이 유지되므로 화면의 보이는 영역이 비율에 비례해 확대/축소됩니다. 단, 창이 전체 화면인 경우 모니터의 화면 비율에 따라 가로 영역이 더 많이 보이거나 더 적게 보이게 됩니다. 예를 들어 창 크기가 1920x1080일 때와 3840x2160일 때 모두 화면은 동일하게 보입니다. | 1920x1080| 3840x2160 | | ---| --- | | ![[object Object]](h
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아틀라스 활용하기 [question] | AnimationClip에 추가 옵션을 활성화한 상태에서 업로드하면 이미지가 어디에 바로 저장되나요? [answer] | AnimationClip에 추가 옵션을 활성화한 상태에서 자른 이미지를 업로드하면, 해당 이미지는 곧바로 **AnimationClip Editor** 창에 추가됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아틀라스를 필요한 규격으로 잘라 다양하게 활용할 수 있습니다. 아틀라스 언패커의 구성과 사용 방법을 알아봅시다. # 아틀라스 언패커 소개 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 아틀라스의 이미지를 잘라 렉트타일로 사용하는 등 다양하게 활용할 수 있습니다. 아틀라스 언패커는 아틀라스를 크리에이터가 개별의 스프라이트로 자르고 편집해 저장할 수 있습니다. 자른 스프라이트 중 필요한 것만 선택해 Resource Storage에 저장한 뒤 사용하거나, 바로 TileData
[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | StateType을 생성하여 OnConditionCheck()로 상태 전이 조건을 제어하는 기본 원리가 무엇인지? [answer] | StateType을 생성하여 `OnConditionCheck()`로 상태 전이 조건을 제어하는 기본 원리는 다음과 같습니다. 1. **StateType 생성 및 상태 정의**: 먼저 `MyDesk - Create Scripts - Create StateType`을 눌러 새로운 StateType을 생성합니다. 이 StateType 내부에서 해당 상태가 유지되는 동안 수행될 로직(예: `OnUpdate()`에서의 이동 처리)과 상태 전이 조건을 정의합니다. 2. **상태 전이 조건 검사 (`OnConditionCheck`)**: [followup] | OnConditionCheck()에서 rotationAngle % 90 == 0 조건을 만족할 때만 true를 반환하는 MoveDown 상태 예시 코드를 전체적으로 보여줄 수 있는지? [followup_answer] | 아래는 `rotationAngle % 90 == 0` 조건을 만족할 때만 `true`를 반환하는 `MoveDown` StateType 예시 코드입니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) } boolean OnConditionCheck(string nextStateName) { local rotationAngle = self.ParentComponent.Entity. [scores] | [judge_reason] | [source_doc] | **MyDesk - Create Scripts - Create StateType**을 눌러 새로운 StateType을 생성하고, 상태를 정의합니다. `OnConditionCheck()`를 활용해 상태 전이 조건을 만들 수 있습니다. 아래와 같이 **MoveDown** StateType을 만들고 아래의 예시 코드처럼 활용할 수 있습니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) }
[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | StateComponent:AddState()와 AddCondition()를 통해 엔티티에 상태를 추가하고 전이 경로를 연결하는 구체적인 절차와 코드 예시는? [answer] | `StateComponent:AddState()`와 `AddCondition()`를 사용하여 엔티티에 상태를 추가하고 전이 경로를 연결하는 절차는 다음과 같습니다. ### 1. StateType 정의하기 먼저, **Create StateType**을 통해 새로운 상태 타입(예: `MoveUp`, `MoveDown`)을 생성합니다. 이 StateType 스크립트에는 상태가 활성일 때 실행될 로직(`OnUpdate`)과 다음 상태로 전이될 조건을 검사하는 `OnConditionCheck` 메서드를 정의합니다. ```lua Metho [followup] | MOVEDOWN 상태에서 MOVEUP 상태로 전이되도록 AddCondition("MOVEDOWN", "MOVEUP", false)를 호출하는 코드와, 각 파라미터의 의미를 설명해 줄 수 있는지? [followup_answer] | `MOVEDOWN` 상태에서 `MOVEUP` 상태로 전이되도록 설정하는 코드와 각 파라미터의 의미는 다음과 같습니다. ### 코드 예시 ```lua self.Entity.StateComponent:AddCondition("MOVEDOWN", "MOVEUP", false) ``` ### 파라미터 의미 `StateComponent:AddCondition(string stateName, string nextStateName, boolean reverseResult = false)` 메서드의 파라미터는 다음과 같은 의미를 가집니다. [scores] | [judge_reason] | [source_doc] | **MyDesk - Create Scripts - Create StateType**을 눌러 새로운 StateType을 생성하고, 상태를 정의합니다. `OnConditionCheck()`를 활용해 상태 전이 조건을 만들 수 있습니다. 아래와 같이 **MoveDown** StateType을 만들고 아래의 예시 코드처럼 활용할 수 있습니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) }
[task] | two_turn [pass] | ⏳ 미판정 [title] | 뒤통수가 개방된 모자 [question] | Avatar_Cap_A1과 Avatar_Cap_A2 시트의 구조적 차이는 무엇이며, 'edithere:cap_cap_34'와 'edithere:cap_backCap_92' 레이어에 이미지를 그릴 때 권장되는 최대 크기와 위치 기준은 어떻게 되나요? [answer] | 참고 문서에 기반하여 Avatar_Cap_A1과 Avatar_Cap_A2 시트의 구조적 차이 및 이미지 제작 시 권장 사항을 설명해 드립니다. **1. Avatar_Cap_A1과 Avatar_Cap_A2의 구조적 차이** 두 시트의 가장 큰 차이는 **앞모습에서 헤어와 모자의 레이어 구성 방식**에 있습니다. * **Avatar_Cap_A1**: 앞모습에서 헤어 앞에 **1개의 레이어만** 존재하는 구조입니다. * `case1.front`: 모자의 앞모습을 그리는 레이어(`edithere:cap_cap_34`)와 [followup] | 앞모습에서 헤어 앞뒤로 2개의 레이어가 있는 Avatar_Cap_A2의 경우, 앞뒤 레이어를 동시에 편집할 때 zmap 파일과 충돌을 피하기 위해 준수해야 하는 구체적인 스프라이트 높이 순서 규칙은 무엇인가요? [followup_answer] | 제공된 참고 문서에는 Avatar_Cap_A2의 앞뒤 레이어를 동시에 편집할 때 zmap 파일과 충돌을 피하기 위한 **구체적인 스프라이트 높이 순서 규칙이 명시되어 있지 않습니다.** 문서에서 zmap과 관련하여 설명하는 내용은 다음과 같습니다: * `data:use_zmap_preset1`은 아바타를 구성하는 이미지가 층층이 쌓여 만들어지는 구조를 설명합니다. * 아바타의 다양한 몸동작을 위해 **몸을 바탕으로 옷, 방패, 무기 순으로** 이미지가 층층이 위에 쌓이는 구조라고 설명하고 있습니다. * zmap은 아이템 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 뒤통수가 개방된 모자 제작 방법을 알아봅시다. 기본 모자의 색상을 변경하고, 악세사리를 그릴 수 있습니다. 모자는 복잡한 구조로 바지나 신발 아이템 제작에 익숙해진 후 작업하는 걸 권장합니다. [아바타 아이템 제작의 기본 개념](/docs?postId=588%7B%22target%22:%22_self%22%7D)을 참고해 아바타의 기본 개념을 먼저 숙지하길 바랍니다. # 사전 준비 아이템 제작을 위해선 Adobe Photoshop이 필요합니다. 해당 소프트웨어를 설치한 후 아래 파일을 받아 엽니다. $$a
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아틀라스 활용하기 [question] | 자른 스프라이트를 Resource Storage에 저장할 때 파일 이름 접두사를 입력하지 않으면 어떤 오류가 발생합니까? [answer] | 참고 문서에 따르면, 파일 이름 접두사는 자른 이미지를 저장하기 위해 반드시 입력해야 하는 항목입니다. 따라서 파일 이름 접두사를 입력하지 않으면 이미지를 Resource Storage에 저장할 수 없습니다. 다만, 문서에는 구체적인 '오류 메시지'나 '에러 코드'가 명시되어 있지 않으므로, 어떤 특정 오류가 발생하는지에 대한 상세한 기술은 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아틀라스를 필요한 규격으로 잘라 다양하게 활용할 수 있습니다. 아틀라스 언패커의 구성과 사용 방법을 알아봅시다. # 아틀라스 언패커 소개 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 아틀라스의 이미지를 잘라 렉트타일로 사용하는 등 다양하게 활용할 수 있습니다. 아틀라스 언패커는 아틀라스를 크리에이터가 개별의 스프라이트로 자르고 편집해 저장할 수 있습니다. 자른 스프라이트 중 필요한 것만 선택해 Resource Storage에 저장한 뒤 사용하거나, 바로 TileData
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 좌표와 스크린 좌표 [question] | iPad Pro 12.9와 갤럭시 S10+의 해상도, 캔버스 크기, 비율 차이를 표로 정리해서 출력하세요. [answer] | iPad Pro 12.9와 갤럭시 S10+의 해상도, 캔버스 크기, 비율 차이는 다음과 같습니다. | 기종 | 화면 해상도 | 캔버스 크기 | 비율 차이 | | :--- | :--- | :--- | :--- | | iPad Pro 12.9 | 2732 x 2048 (16:12) | 1920 x 1439 | 약 1.42배 | | 갤럭시 S10+ | 3040 x 1440 (19:9) | 2280 x 1080 | 약 1.3배 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | PC를 사용하는 메이플스토리 월드 유저는 창 크기를 변경할 수 있습니다. 그러나 창 크기를 변경해도 창의 화면 비율은 16:9로 유지됩니다. 비율이 유지되므로 화면의 보이는 영역이 비율에 비례해 확대/축소됩니다. 단, 창이 전체 화면인 경우 모니터의 화면 비율에 따라 가로 영역이 더 많이 보이거나 더 적게 보이게 됩니다. 예를 들어 창 크기가 1920x1080일 때와 3840x2160일 때 모두 화면은 동일하게 보입니다. | 1920x1080| 3840x2160 | | ---| --- | | ![[object Object]](h
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | AddCondition으로 상태를 연결한 후 RemoveCondition을 호출했는데 상태 전이가 여전히 작동하는 이유는 무엇인가요? [answer] | `RemoveCondition`을 호출했음에도 상태 전이가 계속 작동하는 주된 이유는 **상태 전이 조건(Condition)과 상태 자체(State)의 차이**를 혼동했거나, **상태 전이 조건을 삭제한 시점과 상태가 이미 전이된 시점의 순서 문제**일 가능성이 높습니다. 참고 문서에 명시된 `StateComponent`의 동작 원리 및 API를 기반으로 설명합니다. ### 1. `RemoveCondition`의 정확한 역할 `StateComponent:RemoveCondition(string stateName, string n [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **MyDesk - Create Scripts - Create StateType**을 눌러 새로운 StateType을 생성하고, 상태를 정의합니다. `OnConditionCheck()`를 활용해 상태 전이 조건을 만들 수 있습니다. 아래와 같이 **MoveDown** StateType을 만들고 아래의 예시 코드처럼 활용할 수 있습니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) }
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아틀라스 활용하기 [question] | 셀 크기와 셀 개수 방식 중 아틀라스의 여백 부분까지 포함해 자르는 것을 방지하려면 어떤 설정을 확인해야 하나요? [answer] | 아틀라스를 셀 크기나 셀 개수 방식으로 자를 때, 여백(마진)까지 포함하여 스프라이트로 저장되는 것을 방지하려면 **패딩(Padding)** 값을 조정해야 합니다. 패딩 값을 설정하면 나뉜 셀을 기준으로 X, Y 방향에 여백이 생성되며, 이 여백을 제외하고 아틀라스가 자르기 때문에 불필요한 여백이 스프라이트에 포함되지 않도록 할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아틀라스를 필요한 규격으로 잘라 다양하게 활용할 수 있습니다. 아틀라스 언패커의 구성과 사용 방법을 알아봅시다. # 아틀라스 언패커 소개 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 아틀라스의 이미지를 잘라 렉트타일로 사용하는 등 다양하게 활용할 수 있습니다. 아틀라스 언패커는 아틀라스를 크리에이터가 개별의 스프라이트로 자르고 편집해 저장할 수 있습니다. 자른 스프라이트 중 필요한 것만 선택해 Resource Storage에 저장한 뒤 사용하거나, 바로 TileData
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | HandleSpriteAnimPlayerEndFrameEvent 이벤트 핸들러에서 TotalFrameCount 변수를 직접 사용할 수 없는 이유는 무엇인가요? [answer] | 참고 문서에 제공된 `HandleSpriteAnimPlayerEndFrameEvent` 예제 코드에서 `TotalFrameCount` 변수는 `local` 선언이 주석 처리되어 있습니다. ```lua -- Parameters -- local FrameIndex = event.FrameIndex -- local ReversePlaying = event.ReversePlaying -- local TotalFrameCount = event.TotalFrameCount -- local AnimPlayer = event.AnimPlayer [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아틀라스 활용하기 [question] | 아틀라스 언패커에서 최대 2048x2048px 규격을 초과하는 큰 이미지 파일은 어떻게 처리해야 하나요? [answer] | 제공된 참고 문서에는 아틀라스 언패커에서 2048x2048px 규격을 초과하는 큰 이미지 파일을 처리하는 구체적인 방법(예: 외부 프로그램으로 미리 잘라오는 절차, 스케일 축소 권장 사항 등)이 명시되어 있지 않습니다. 문서에서는 "아틀라스 언패커에서 자를 수 있는 단일 아틀라스의 최대 크기는 2048*2048px이며, 최대 256 조각으로 자를 수 있습니다"라는 제한 사항만 언급하고 있을 뿐, 이를 초과하는 파일을 어떻게 사전 처리해야 하는지에 대한 가이드는 포함되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아틀라스를 필요한 규격으로 잘라 다양하게 활용할 수 있습니다. 아틀라스 언패커의 구성과 사용 방법을 알아봅시다. # 아틀라스 언패커 소개 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 아틀라스의 이미지를 잘라 렉트타일로 사용하는 등 다양하게 활용할 수 있습니다. 아틀라스 언패커는 아틀라스를 크리에이터가 개별의 스프라이트로 자르고 편집해 저장할 수 있습니다. 자른 스프라이트 중 필요한 것만 선택해 Resource Storage에 저장한 뒤 사용하거나, 바로 TileData
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | 실행 중 특정 이벤트 발생 시 "MOVE" 상태의 전이 조건을 `StateComponent:RemoveCondition()`으로 삭제하여 상태 전이를 일시적으로 차단하는 스크립트를 작성해줘. [answer] | 참고 문서에 `StateComponent:RemoveCondition()` API는 존재하지만, "실행 중 특정 이벤트"에 해당되는 구체적인 이벤트 핸들러(예: 터치, 충돌, 사용자 입력 등)는 문서에 명시되어 있지 않습니다. 따라서 문서에 없는 특정 이벤트 API를 지어낼 수 없으므로, **`OnUpdate()` 주기적으로 검사하여 조건이 충족되면 전이 조건을 삭제하는 방식**으로 스크립트를 작성해 드립니다. 아래 예시에서는 `Property` 블록에 전이 조건을 삭제할 수 있는 플래그(`canTransition`)를 설정하고, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **MyDesk - Create Scripts - Create StateType**을 눌러 새로운 StateType을 생성하고, 상태를 정의합니다. `OnConditionCheck()`를 활용해 상태 전이 조건을 만들 수 있습니다. 아래와 같이 **MoveDown** StateType을 만들고 아래의 예시 코드처럼 활용할 수 있습니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) }
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | `OnUpdate()`에서 엔티티를 이동시키며, `OnConditionCheck()`에서 목표 위치 도달 여부에 따라 상태 전이 조건을 반환하는 StateType 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 `OnConditionCheck()`에서 **회전 각도(Rotation)**를 기준으로 상태 전이 조건을 반환하는 예시만 포함되어 있습니다. **목표 위치 도달 여부**를 확인하는 API(예: 특정 좌표와 현재 위치 비교 함수)나 `OnConditionCheck()`에서 위치를 활용하는 구체적인 예시는 문서에 없습니다. 따라서 문서에 있는 API와 문법을 준수하되, 위치 비교 로직은 Lua 5.3의 기본 연산자를 활용하여 작성할 수 있습니다. `OnUpdate()`에서는 `TransformComponent:T [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **MyDesk - Create Scripts - Create StateType**을 눌러 새로운 StateType을 생성하고, 상태를 정의합니다. `OnConditionCheck()`를 활용해 상태 전이 조건을 만들 수 있습니다. 아래와 같이 **MoveDown** StateType을 만들고 아래의 예시 코드처럼 활용할 수 있습니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) }
[task] | single_turn [pass] | ⏳ 미판정 [title] | 아틀라스 활용하기 [question] | 패딩 값을 조절했을 때 스프라이트 자르기 위치가 어떻게 변하며, 이는 최종 이미지 크기에 어떤 영향을 주나요? [answer] | 패딩 값을 조절하면 나뉜 셀을 기준으로 X, Y 방향에 여백이 생성됩니다. 이 여백 부분은 제외된 상태로 아틀라스가 잘리므로, 실제 저장되는 스프라이트의 이미지는 설정된 패딩 크기만큼 주변이 잘린 상태가 됩니다. 결국 패딩 값이 커질수록 각 스프라이트의 최종 이미지 크기는 줄어들고, 패딩 값이 0이 되면 셀 전체가 그대로 스프라이트로 저장됩니다. 이는 오프셋 조절과 함께 사용하여 자르는 위치를 더 정밀하게 조정할 때 활용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아틀라스를 필요한 규격으로 잘라 다양하게 활용할 수 있습니다. 아틀라스 언패커의 구성과 사용 방법을 알아봅시다. # 아틀라스 언패커 소개 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 아틀라스의 이미지를 잘라 렉트타일로 사용하는 등 다양하게 활용할 수 있습니다. 아틀라스 언패커는 아틀라스를 크리에이터가 개별의 스프라이트로 자르고 편집해 저장할 수 있습니다. 자른 스프라이트 중 필요한 것만 선택해 Resource Storage에 저장한 뒤 사용하거나, 바로 TileData
[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | 상자가 재등장하는 타이밍을 조절하기 위해 `_TimerService:SetTimerOnce`를 사용하는 이유가 무엇인가요? [answer] | 상자가 재등장하는 타이밍을 조절하기 위해 `_TimerService:SetTimerOnce`를 사용하는 이유는 **특정 시간(5초)이 지난 후에만 상태 전이를 실행**해야 하기 때문입니다. 제시된 `HandleStateChangeEvent` 코드를 보면, 상자의 상태가 `DEAD`가 될 때(`CurrentStateName == "DEAD"`) `_TimerService:SetTimerOnce`를 호출합니다. 이 함수는 첫 번째 인자로 전달된 함수(여기서는 `IDLE` 상태로 변경하는 로직)를 두 번째 인자로 지정된 시간(5초) 후 [followup] | 5초 후 `IDLE`로 전환되는 타이머가 중복으로 생성되는 예외 상황을 방지하기 위해 `ClearTimer`를 호출해야 하는 구체적인 시점은 언제인가요? [followup_answer] | 제공된 참고 문서에는 `_TimerService:ClearTimer`를 호출해야 하는 구체적인 시점이나 중복 타이머 생성 방지 로직에 대한 설명이 포함되어 있지 않습니다. 참고 문서에 포함된 `OnExit()` 함수 내에 `_TimerService:ClearTimer(self.timerId)`가 존재하는 것은 확인되지만, 이 `OnExit()`이 어떤 상태(BROKEN 등)의 종료 시점에 호출되는지, 그리고 `HandleStateChangeEvent`에서 `DEAD` 상태로 진입할 때 생성되는 5초 타이머와 어떤 연관성이 있는지, [scores] | [judge_reason] | [source_doc] | ```lua boolean OnConditionCheck(string nextStateName) { return self.exitFlag } void OnExit() { self.ParentComponent.Entity.SpriteRendererComponent.SpriteRUID = "b871399ae18d41c4b76c2ae79feefa7d" --IDLE RUID _TimerService:ClearTimer(self.timerId) }
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | StateChangeEvent 핸들러에서 CurrentStateName과 PrevStateName 변수를 직접 사용할 수 없는데, 이 변수들을 선언하거나 가져오는 구체적인 코드가 문서에 없습니다. [answer] | 제공된 참고 문서에는 `StateChangeEvent` 핸들러 내에서 `CurrentStateName`과 `PrevStateName` 변수를 직접 사용할 수 없다는 명시적 경고나, 해당 변수들을 선언하거나 가져오는 구체적인 코드 예시가 포함되어 있지 않습니다. 문서에는 `HandleStateChangeEvent`의 파라미터 주석으로 `event.CurrentStateName`과 `event.PrevStateName`이 존재한다고만 언급되어 있으나, 이를 로컬 변수로 선언하거나 직접 호출하는 실제 실행 코드 블록은 제시되어 있지 않 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua boolean OnConditionCheck(string nextStateName) { return self.exitFlag } void OnExit() { self.ParentComponent.Entity.SpriteRendererComponent.SpriteRUID = "b871399ae18d41c4b76c2ae79feefa7d" --IDLE RUID _TimerService:ClearTimer(self.timerId) }
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 좌표와 스크린 좌표 [question] | 정중앙 기준의 세 가지 Anchor(정중앙, 가로 확장, 세로 확장)가 각각 어떤 값에 따라 위치와 크기가 결정되는지 3문장 이내로 요약하세요. [answer] | 정중앙 Anchor는 정중앙을 기준으로 PosX, PosY 값만큼 떨어진 위치에 UI가 배치됩니다. 가로 확장 Anchor는 정중앙 기준 Left, Right 값을 제외한 너비로 가로가 늘어나며 PosY 값으로 높이가 결정됩니다. 세로 확장 Anchor는 정중앙 기준 Top, Bottom 값을 제외한 높이로 세로가 늘어나며 PosX 값으로 가로 위치가 결정됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | Anchor | 설명 | | --- | --- | | | 상단 왼쪽 끝을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 상단 중앙을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 상단 오른쪽 끝을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 중앙 왼쪽 끝을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 정중앙을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 중
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드 좌표와 스크린 좌표 [question] | UITransformComponent의 Anchor 설정 및 PosX/PosY 기반 UI 배치 원리를 단계별 번호 목록으로 작성하세요. [answer] | UITransformComponent의 Anchor 설정 및 PosX/PosY 기반 UI 배치 원리는 다음과 같은 단계로 설명할 수 있습니다. 1. **Anchor 선택**: `UITransformComponent`의 격자 무늬 아이콘을 눌러 원하는 Anchor 위치를 선택합니다. 2. **기준점 확인**: 선택된 Anchor의 기준점은 항상 **Safe Area 영역**입니다. 3. **PosX, PosY 값 입력**: 선택한 Anchor를 기준으로 UI를 배치할 위치까지의 거리를 나타내는 `PosX`와 `PosY` 값을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | PC를 사용하는 메이플스토리 월드 유저는 창 크기를 변경할 수 있습니다. 그러나 창 크기를 변경해도 창의 화면 비율은 16:9로 유지됩니다. 비율이 유지되므로 화면의 보이는 영역이 비율에 비례해 확대/축소됩니다. 단, 창이 전체 화면인 경우 모니터의 화면 비율에 따라 가로 영역이 더 많이 보이거나 더 적게 보이게 됩니다. 예를 들어 창 크기가 1920x1080일 때와 3840x2160일 때 모두 화면은 동일하게 보입니다. | 1920x1080| 3840x2160 | | ---| --- | | ![[object Object]](h
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | StateComponent에 ATTACK 상태를 등록하고, OnUpdate에서 1초 간격으로 ATTACK 상태로 전이하며 StateAnimationComponent를 통해 공격 애니메이션이 재생되도록 하는 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 `StateComponent`의 상태 등록 및 전이, `StateAnimationComponent`의 적용 대상(monster, npc)에 대한 설명은 포함되어 있으나, `OnUpdate` 루프를 통해 1초 간격으로 상태 전이를 수행하기 위해 필요한 타이머 관리 변수나 특정 애니메이션 클립을 연결하는 구체적인 API(예: 애니메이션 ID 설정 메서드 등)는 포함되어 있지 않습니다. 문서에 명시된 정보만으로는 요청하신 "1초 간격 반복 전이" 및 "공격 애니메이션 재생"을 위한 완전한 코드 작성이 불가능합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [StateComponent](/apiReference/Components/StateComponent)와 StateType의 개념을 알아보고, 엔티티의 상태에 따라 애니메이션이 재생되는 과정을 이해해봅시다. # State, StateComponent 알아보기 **State**는 어떤 엔티티가 특정한 상태에 있는 것을 말합니다. 서 있는 상태, 엎드린 상태, 공격 상태 등 크리에이터에 따라 다양한 상태를 정의할 수 있습니다. 월드에서 내 캐릭터가 가만히 서 있는 것이 당연하게 느껴질 수 있지만 이는 캐릭터의
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | SpriteRendererComponent의 SpriteRUID를 변경하여 IDLE 상태로 복원하는 과정에서, 애니메이션 재생 종료 시점과 타이머 해제 시점의 충돌로 인해 화면이 깨지는 오류가 나는 원인은 무엇일까요? [answer] | 제시된 참고 문서에 따르면, SpriteRendererComponent의 `SpriteRUID`를 변경하여 IDLE 상태로 복원하는 과정에서 발생하는 "화면이 깨지는 오류"의 구체적인 원인이나 해당 충돌 상황(애니메이션 재생 종료 시점과 타이머 해제 시점)에 대한 기술적 설명은 존재하지 않습니다. 문서에는 `OnExit` 핸들러에서 `SpriteRendererComponent.SpriteRUID`를 IDLE RUID로 변경하고 `_TimerService:ClearTimer`를 호출하는 코드 예시와, `StateChangeEvent [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua boolean OnConditionCheck(string nextStateName) { return self.exitFlag } void OnExit() { self.ParentComponent.Entity.SpriteRendererComponent.SpriteRUID = "b871399ae18d41c4b76c2ae79feefa7d" --IDLE RUID _TimerService:ClearTimer(self.timerId) }
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 상태 제어하기 [question] | SpawnService:SpawnByModelId 호출 시 parent 인자로 self.ParentComponent.Entity.Parent를 전달해야 하는 이유와, 이 값을 생략하거나 다른 엔티티를 지정했을 때 발생하는 위치나 소속 문제점에 대해 알고 싶습니다. [answer] | 참고 문서에 `SpawnService:SpawnByModelId()` 호출 시 `parent` 인자의 역할, 생략 시 발생하는 위치나 소속 문제점에 대한 설명이 포함되어 있지 않습니다. 문서에는 `_SpawnService:SpawnByModelId("model://4ac51a4c-ecf6-4ddf-b32a-516fc66234be", "Item", self.ParentComponent.Entity.TransformComponent.Position + Vector3(0,0.12,0), self.ParentComponent.Entity [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 플레이어의 공격에 상태가 변하는 나무 상자를 만들어봅시다. 기본 상태인 IDLE, DEAD와 크리에이터가 만든 새로운 BROKEN 상태를 함께 활용합니다. 상태마다의 특정 애니메이션, 스프라이트를 추가해 상태 변화를 직관적으로 확인할 수 있습니다. 이 예시는 IDLE → BROKEN → DEAD → IDLE로 상태 전이하며, 상태마다 다른 스프라이트, 애니메이션을 연결해 재생하게 됩니다. >**Tip.** >만들기 - 새로 만들기 - **기본** 템플릿을 사용해 플레이어의 기본 공격, 피격을 구성합니다. 해당 템플릿의 D