← 목록

mLua · Nemotron SDG 질문-응답 (SFT)

총 21,567개 · 페이지 514/719
🔀 랜덤
불러오는 중…

[task] | two_turn [pass] | ⏳ 미판정 [title] | 배경 설정하기 [question] | 메이플스토리 월드에서 맵의 배경을 다양한 방식으로 설정하는 방법과 각 방식의 특징이 무엇인가요? [answer] | 메이플스토리 월드에서 맵의 배경은 **Preset List**와 **BackgroundComponent**를 활용하여 총 4가지 방식으로 설정할 수 있습니다. 각 방식의 특징과 설정 방법은 다음과 같습니다. ### 1. 템플릿 배경 (Template Background) * **설정 방법:** 메이커의 `Preset List - Background`에서 원하는 메이플스토리 배경 이미지를 선택합니다. * **특징:** * 선택된 배경의 움직이는 속도(**ScrollRate**)를 조절할 수 있습니다. * [followup] | 배경 템플릿의 ScrollRate 값을 음수로 설정했을 때의 구체적 동작이나, Gradient 타입에서 MiddleTopRatio와 MiddleBottomRatio 값을 조절할 때 색상 위치가 어떻게 변화하는지 코드나 설정 예시를 알려주세요. [followup_answer] | 참고 문서에 `ScrollRate`의 음수값 입력 시 "반대 방향으로 이동한다"는 설명과, `MiddleTopRatio` 및 `MiddleBottomRatio` 프로퍼티로 "중상단, 중하단 색상의 위치를 설정한다"는 설명만 존재합니다. 구체적인 수학적 공식(예: 0~1 범위인지, 0~100 범위인지)이나 `MiddleTopRatio`/`MiddleBottomRatio` 값을 특정 숫자로 설정했을 때의 시각적 변화 예시, 그리고 `ScrollRate`를 mLua 코드로 직접 변경하는 API(예: `SetScrollRate`)에 대한 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **Preset List**와 **BackgroundComponent**를 활용하여 맵의 배경을 설정해봅시다. # 템플릿 배경 설정 **Preset List - Background**에서 메이플스토리의 다양한 배경을 선택할 수 있습니다. 이와 같이 배경 템플릿을 선택하면 배경이 움직이는 속도, 즉 **ScrollRate**를 조절할 수 있습니다. **ScrollRate** 값이 커지면 배경이 움직이는 속도가 빨라지며, 음수를 입력하면 반대 방향으로 이동합니다. | ScrollRate | Image

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | self.Entity:SendEvent(event)를 통해 BodyActionStateChangeEvent를 전송할 때, 이벤트 객체의 ActionState 프로퍼티에 MapleAvatarBodyActionState 이외의 값을 넣으면 어떻게 되나요? [answer] | 제시된 문서에는 `BodyActionStateChangeEvent`의 `ActionState` 프로퍼티에 `MapleAvatarBodyActionState` 이외의 값을 넣었을 때의 동작이나 에러 발생 여부에 대한 정보가 없습니다. 문서에는 `ActionState`가 `MapleAvatarBodyActionState`로 애니메이션을 제어하며, 해당 상수(예: `MapleAvatarBodyActionState.Fly`)를 사용하여 이벤트를 생성하고 전송하는 예제만 명시되어 있습니다. 따라서 다른 값을 넣었을 때의 결과는 알 수 없습 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [BodyActionStateChangeEvent](/apiReference/Events/BodyActionStateChangeEvent)는 이름 그대로 아바타의 bodyActionState를 변경하는 이벤트입니다. 이 이벤트는 무기 타입에 따른 애니메이션을 별도로 지정할 필요가 없어 편리합니다. **BodyActionStateChangeEvent**는 **MapleAvatarBodyActionState**로 애니메이션을 제어합니다. **MapleAvatarBodyActionState**에는 각 상태별로 어떤 몸통 액션과 파츠 액

[task] | two_turn [pass] | ⏳ 미판정 [title] | UI 디자인 가이드 [question] | 메이플스토리 월드 UI를 디자인할 때 PC와 모바일 환경의 차이를 어떻게 고려해야 하나요? [answer] | 메이플스토리 월드 UI를 디자인할 때 PC와 모바일 환경의 차이를 고려하기 위해 다음 원칙을 적용해야 합니다. **1. 공용 UI 기반의 전략적 분기** 모든 기기에 최적화된 개별 UI를 만드는 것은 제작 부담이 크므로, **UI 대부분은 PC와 모바일에서 동일하게(공용) 제작**하는 것이 좋습니다. 대신 **사용성(편의성)에 직접적인 영향을 미치는 필수 요소만 기기별로 다르게** 디자인해야 합니다. **2. 모바일 환경 기준의 크기 설정** 공용 UI의 텍스트나 버튼 크기를 정할 때는 **화면이 작은 모바일 환경을 기준**으로 [followup] | 모바일에서 필수적인 조작 버튼(대시, 점프 등)의 표시 규칙과 공용 UI 레이아웃 설계 시 주의할 점은 무엇인가요? [followup_answer] | 모바일에서 필수적인 조작 버튼의 표시 규칙과 공용 UI 레이아웃 설계 시 주의할 점은 다음과 같습니다. **1. 모바일 필수 조작 버튼 표시 규칙** 모바일 환경에서는 키보드 조작이 불가능하므로, 게임 진행에 필수적인 조작은 사용자가 항상 확인할 수 있도록 화면에 고정 표시해야 합니다. * **항상 표시되는 조작:** 대시, 점프, E 키(상호작용)와 같이 필수적인 조작 버튼은 모바일에서는 항상 화면에 보여야 합니다. * **조이스틱 제공:** 이동 조작을 위해 조이스틱을 화면에 표시해야 합니다. * **아이템 슬롯 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 User Interface(UI)는 필수 요소입니다. UI는 유저에게 플레이 관련 정보를 명확하고 간결하게 제공해야 합니다. 점수, 체력, 남은 시간, 각종 버튼 같은 UI 요소가 잘 디자인되어 있다면 유저는 직관적으로 월드를 이해하고 재미있게 플레이할 수 있을 것입니다. 유저는 메이플스토리 월드를 PC 및 모바일 환경에서 두루 플레이할 수 있습니다. 그러므로 크리에이터는 다양한 환경에서 불편함이 없도록 UI를 디자인해야 합니다. 물론 월드 콘셉트에도 맞고, 시각적으로 눈길을 사로잡는 디자인을

[task] | code [pass] | ⏳ 미판정 [title] | UI 디자인 가이드 [question] | 월드 섬네일 이미지의 해상도가 960 X 540px인지, 비율이 16:9인지 검증하여 권장 사양을 충족하는지 확인하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 섬네일 권장 사양(16:9 비율, 960x540px)은 명시되어 있지만, **이미지 파일의 해상도나 비율을 코드로 읽어와서 검증하는 mLua API(예: 이미지 로드 후 크기 가져오기, 파일 메타데이터 읽기 등)는 존재하지 않습니다.** mLua 스크립트는 런타임(게임 실행 중)에 동작하며, 에셋(리소스)의 파일 속성을 직접 분석하거나 검증하는 기능이 제공되지 않습니다. 따라서 요청하신 "해상도/비율 검증 스크립트"는 mLua API를 사용하여 작성할 수 없습니다. 대신, 섬네일 제작 시 아래 권장 사양을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 일관성 있는 UI 디자인은 유저가 월드 플레이 방식을 보다 빠르게 이해하고 즐길 수 있도록 도와줍니다. 이러한 UI 디자인을 위해 아래 사항을 참고해 봅시다. ##### 색상 팔레트 UI에서 사용할 색상 팔레트를 결정하고 일관되게 사용해 봅시다. 너무 많은 색상을 사용하면 UI가 지저분해지고 해당 색상이 무엇을 의미하는지도 알 수 없게 됩니다. 해당 월드 UI에서 사용할 몇 가지 색상을 정하고, 비슷한 기능을 하는 요소는 같은 색상을 사용하여 일관성을 유지하는 것이 좋습니다. 예를 들어, [예] 또는 [확인] 버튼에 파란색을 사용

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | 아바타 애니메이션 프레임 이벤트를 Body 또는 Face에 연결하는 ConnectEvent 사용 예제를 코드만 출력하고 설명은 주석으로 [answer] | ```lua Property: [None] Entity TargetEntity = nil Method: [client only] void OnBeginPlay() { -- Body 또는 Face에 ConnectEvent를 사용하여 애니메이션 프레임 이벤트를 연결합니다. -- 대상 Entity가 설정되지 않으면 초기화를 중단합니다. if self.TargetEntity == nil then log("TargetEntity가 설정되지 않았습니다.") return end [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 애니메이션 변경 과정을 정리하면 다음과 같습니다. 위에서 알아본 3가지 아바타 애니메이션 제어 방법의 장단점을 정리하면 아래 표와 같습니다. 각 방법은 장단점이 명확하므로 크리에이터의 의도에 맞는 방법을 적절히 선택하면 됩니다. | 아바타 애니메이션 제어 방법 | 장점 | 단점 | | :---: | --- | --- | | ActionStateChangedEvent | <ul> <li>몸통과 파츠 애니메이션을 각각 다르게 조절할 수 있습니다.</li> <li>재생 속도, 재생 타입, 애니메이션 시작/종료 프레임을 세밀하게 설

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | ActionStateChangedEvent, BodyActionStateChangeEvent, ActionSheet와 StateComponent의 장단점을 표로 정리해서 [answer] | 아바타 애니메이션 제어 방법 3가지의 장단점은 다음과 같습니다. | 아바타 애니메이션 제어 방법 | 장점 | 단점 | | :--- | :--- | :--- | | **ActionStateChangedEvent** | • 몸통과 파츠 애니메이션을 각각 다르게 조절할 수 있습니다.<br>• 재생 속도, 재생 타입, 애니메이션 시작/종료 프레임을 세밀하게 설정할 수 있습니다. | • 자주 사용하는 액션을 매번 이렇게 설정하기는 번거롭습니다.<br>• 무기에 따라 달라지는 애니메이션을 별도로 지정해야 합니다. | | **BodyActio [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 애니메이션 변경 과정을 정리하면 다음과 같습니다. 위에서 알아본 3가지 아바타 애니메이션 제어 방법의 장단점을 정리하면 아래 표와 같습니다. 각 방법은 장단점이 명확하므로 크리에이터의 의도에 맞는 방법을 적절히 선택하면 됩니다. | 아바타 애니메이션 제어 방법 | 장점 | 단점 | | :---: | --- | --- | | ActionStateChangedEvent | <ul> <li>몸통과 파츠 애니메이션을 각각 다르게 조절할 수 있습니다.</li> <li>재생 속도, 재생 타입, 애니메이션 시작/종료 프레임을 세밀하게 설

[task] | two_turn [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | PlayType 에 OneTime, Loop, ZigzagLoop 가 존재하는데 각각의 재생 방식 차이를 설명해 주세요. [answer] | `PlayType`은 애니메이션이 어떻게 재생될지를 결정하는 설정입니다. 각 타입의 차이는 다음과 같습니다. * **OneTime**: 애니메이션을 한 번만 재생합니다. * **Loop**: 애니메이션을 처음부터 끝까지 순서대로 재생한 뒤, 다시 처음으로 돌아와 반복 재생합니다. * **ZigzagLoop**: 애니메이션을 처음부터 끝까지 순서대로 재생한 뒤, 끝에서 처음으로 역순으로 재생하는 방식으로 반복합니다. 이 설정은 `ActionStateChangedEvent`를 생성할 때 재생 타입 인자로 지정하여 사용할 [followup] | PlayRate 값을 키웠을 때 애니메이션의 재생 속도 변화는 어떤 원리로 이루어지나요? [followup_answer] | PlayRate 값은 애니메이션의 재생 속도를 제어하며, 값이 커질수록 재생 속도가 빨라집니다. 즉, PlayRate를 증가시키면 동일한 시간 동안 더 많은 프레임이 재생되어 애니메이션이 빠르게 진행되는 원리로 동작합니다. 예를 들어 기본 속도(1.0)보다 큰 값을 설정하면 애니메이션이 원래보다 빠르게 재생됩니다. ```lua local body = self.Entity.AvatarRendererComponent:GetBodyEntity() -- PlayRate를 2.0으로 설정하여 애니메이션을 2배 빠르게 재생 local e [scores] | [judge_reason] | [source_doc] | **ActionStateChangedEvent**는 **ActionName**으로 어떤 애니메이션을 재생할지 결정합니다. 아래는 **ActionName**의 목록입니다. |@cols=4:@rows=1:ActionName| |:---:|:---:|:---:|:---:| | stand1 | swingO1 | stabO1 | shoot1 | | stand2 | swingO2 | stabO2 | shoot2 | | walk1 | swingO3 | stabOF | shootF | | walk2 | swingOF | stabT1 | | |

[task] | code [pass] | ⏳ 미판정 [title] | UI 디자인 가이드 [question] | 텍스트 가독성을 위해 UI 텍스트의 폰트 크기를 최소 18pt 이상으로 강제 적용하고, 배경 대비를 위해 텍스트 색상을 흰색으로 고정하는 스크립트를 작성해줘 [answer] | 메이플스토리 월드의 mLua 스크립트에서는 UI 요소의 폰트 크기나 색상과 같은 **시각적 속성을 직접 코드(스크립트)로 제어하는 API가 제공되지 않습니다.** 제시된 참고 문서와 mLua API 문서에는 UI의 레이아웃, 색상, 폰트 크기 등을 설정하는 메서드나 프로퍼티가 존재하지 않습니다. UI 디자인(폰트 크기, 색상 대비 등)은 스크립트가 아닌 **에디터의 UI 컴포넌트 속성 설정** 또는 **디자인 가이드 준수**를 통해 이루어져야 합니다. 따라서 요청하신 "스크립트로 폰트 크기를 18pt 이상으로 강제하고 색상을 흰 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 User Interface(UI)는 필수 요소입니다. UI는 유저에게 플레이 관련 정보를 명확하고 간결하게 제공해야 합니다. 점수, 체력, 남은 시간, 각종 버튼 같은 UI 요소가 잘 디자인되어 있다면 유저는 직관적으로 월드를 이해하고 재미있게 플레이할 수 있을 것입니다. 유저는 메이플스토리 월드를 PC 및 모바일 환경에서 두루 플레이할 수 있습니다. 그러므로 크리에이터는 다양한 환경에서 불편함이 없도록 UI를 디자인해야 합니다. 물론 월드 콘셉트에도 맞고, 시각적으로 눈길을 사로잡는 디자인을

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | BodyActionStateChangeEvent를 사용할 때 startFrameIndex와 endFrameIndex 값을 잘못 지정해도 애니메이션이 정상적으로 재생되는 이유는 무엇인가요? [answer] | BodyActionStateChangeEvent에서 startFrameIndex와 endFrameIndex 값을 잘못 지정해도 애니메이션이 정상적으로 재생되는 이유는, 이 이벤트가 내부적으로 실제 애니메이션 클립의 범위를 파악하여 잘못된 값을 자동으로 보정하기 때문입니다. 문서에 명시된 대로, BodyActionStateChangeEvent에서 시작/종료 프레임을 잘못 입력하더라도 최종적으로 실행되는 ActionStateChangedEvent 단계에서 값이 보정됩니다. 구체적인 보정 규칙은 다음과 같습니다. 1. **음수 처리 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [BodyActionStateChangeEvent](/apiReference/Events/BodyActionStateChangeEvent)는 이름 그대로 아바타의 bodyActionState를 변경하는 이벤트입니다. 이 이벤트는 무기 타입에 따른 애니메이션을 별도로 지정할 필요가 없어 편리합니다. **BodyActionStateChangeEvent**는 **MapleAvatarBodyActionState**로 애니메이션을 제어합니다. **MapleAvatarBodyActionState**에는 각 상태별로 어떤 몸통 액션과 파츠 액

[task] | code [pass] | ⏳ 미판정 [title] | UI 디자인 가이드 [question] | UI 리소스에 Point 또는 Bilinear 필터 모드 중 하나를 적용할 때, 해당 모드의 특징(선명함/부드러움)에 따라 적합한 이미지를 선택하도록 판단하는 로직을 포함하는 스크립트를 작성해줘 [answer] | 메이플스토리 월드의 mLua 스크립트 언어와 제공된 문서에는 UI 리소스의 필터 모드(Point 또는 Bilinear)를 코드 로직으로 동적으로 선택하거나 판단하는 API(예: `SetFilterMode`, `CheckImageQuality` 등)가 존재하지 않습니다. 문서에 따르면, 필터 모드는 크리에이터가 **Resource Storage에 리소스를 등록할 때 세부 정보에서 수동으로 설정**하는 사항이며, 게임 런타임 시점에 스크립트 코드를 통해 이미지의 특징(선명함/부드러움)을 판별하여 필터를 변경하는 기능은 제공되지 않습니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 일관성 있는 UI 디자인은 유저가 월드 플레이 방식을 보다 빠르게 이해하고 즐길 수 있도록 도와줍니다. 이러한 UI 디자인을 위해 아래 사항을 참고해 봅시다. ##### 색상 팔레트 UI에서 사용할 색상 팔레트를 결정하고 일관되게 사용해 봅시다. 너무 많은 색상을 사용하면 UI가 지저분해지고 해당 색상이 무엇을 의미하는지도 알 수 없게 됩니다. 해당 월드 UI에서 사용할 몇 가지 색상을 정하고, 비슷한 기능을 하는 요소는 같은 색상을 사용하여 일관성을 유지하는 것이 좋습니다. 예를 들어, [예] 또는 [확인] 버튼에 파란색을 사용

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | ActionStateChangedEvent에서 StartFrameIndex와 EndFrameIndex를 설정하여 애니메이션의 일부 구간만 재생하는 방식이 실제 스크립트에서 어떻게 적용되는지 알고 싶어요. [answer] | `ActionStateChangedEvent`는 아바타의 `Body` 또는 `Face` 엔티티에 보내어 애니메이션을 제어하는 이벤트입니다. 이 이벤트의 `StartFrameIndex`와 `EndFrameIndex` 프로퍼티를 설정하면, 해당 애니메이션 클립의 특정 프레임 구간만 재생하도록 지정할 수 있습니다. 문서에 제시된 실제 스크립트 적용 예시는 다음과 같습니다. 1. **타겟 엔티티 획득**: `self.Entity.AvatarRendererComponent:GetBodyEntity()`를 호출하여 아바타의 몸통(`Bod [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 아바타 애니메이션을 제어하는 3가지 방법을 살펴봅니다. 본 과정을 통해 크리에이터가 원하는 기능에 맞게 아바타 애니메이션을 제어해 봅시다. # ActionStateChangedEvent로 제어 아바타는 **AvatarRoot**에 **Body**와 **Face**로 나뉘어 있습니다. **Body**는 말 그대로 아바타의 몸통이며 **Face**는 아바타의 얼굴을 뜻합니다. 아바타의 **Body**와 **Face**에 어떤 애니메이션을 재생할지는 [ActionStateChangedEvent](/apiRefer

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | SpriteAnimPlayerChangeFrameEvent 구독 취소 시 필요한 코드만 출력하고, 설명은 주석으로만 작성하세요. [answer] | ```lua -- SpriteAnimPlayerChangeFrameEvent 구독 취소 -- self.handler는 이벤트 구독 시 반환된 핸들러를 참조해야 합니다. body:DisconnectEvent("SpriteAnimPlayerChangeFrameEvent", self.handler) ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 3. 아까 저장한 **handler**를 통해 **SpriteAnimPlayerChangeFrameEvent** 구독을 취소합니다. `ChangeFrameEvent` 함수를 수정해 봅시다. ```lua [client] void ChangeFrameEvent(any event) { if event.FrameIndex == 2 then local body = self.Entity.AvatarRendererComponent:GetBodyEntity()

[task] | code [pass] | ⏳ 미판정 [title] | UI 디자인 가이드 [question] | 메이플스토리 월드에서 제공되는 네 가지 폰트(Default, Maple, Bazzi, Football) 중 텍스트 내용이 한글/영어 외 언어를 포함할 경우 Default(Noto Sans)를, 그렇지 않으면 다른 폰트를 선택할 수 있도록 하는 스크립트를 작성해줘 [answer] | 메이플스토리 월드에서 제공되는 폰트는 `Default (Noto Sans)`, `Maple`, `Bazzi`, `Football` 총 4가지입니다. 문서에 명시된 정보에 따르면, **mLua 스크립트 API 문서에는 텍스트의 언어(한글/영어 여부)를 감지하여 폰트를 자동으로 전환하는 함수나 메서드가 제공되지 않습니다.** 또한 UI 컴포넌트의 폰트를 변경하는 구체적인 API(예: `SetFont` 등)에 대한 설명도 주어진 문서에 포함되어 있지 않습니다. 따라서, 주어진 참고 문서와 mLua API 범위 내에서 **텍스트 내용을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 일관성 있는 UI 디자인은 유저가 월드 플레이 방식을 보다 빠르게 이해하고 즐길 수 있도록 도와줍니다. 이러한 UI 디자인을 위해 아래 사항을 참고해 봅시다. ##### 색상 팔레트 UI에서 사용할 색상 팔레트를 결정하고 일관되게 사용해 봅시다. 너무 많은 색상을 사용하면 UI가 지저분해지고 해당 색상이 무엇을 의미하는지도 알 수 없게 됩니다. 해당 월드 UI에서 사용할 몇 가지 색상을 정하고, 비슷한 기능을 하는 요소는 같은 색상을 사용하여 일관성을 유지하는 것이 좋습니다. 예를 들어, [예] 또는 [확인] 버튼에 파란색을 사용

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | SpriteAnimPlayerChangeFrameEvent 구독 시 핸들러를 프로퍼티로 유지해야 하는 이유를 3문장 이내로 설명하세요. [answer] | 스프레드시트에서 이벤트 연결 시 반환되는 핸들러를 프로퍼티에 저장해야 나중에 구독을 취소할 수 있습니다. 핸들러를 프로퍼티로 유지하지 않으면 `DisconnectEvent` 호출에 필요한 참조를 잃어버려 구독을 해제할 수 없습니다. 이는 애니메이션 변경 후에도 이벤트가 반복적으로 발생하여 원하지 않는 로직이 계속 실행되는 문제를 방지하기 위한 필수 절차입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다음의 예제 코드를 보면서 **FrameEvent**의 사용법을 알아봅시다. 1. 어떤 아바타 애니메이션의 2번째 프레임이 재생될 때 다른 애니메이션으로 변경하고 싶다고 가정합니다. 그렇다면 **SpriteAnimPlayerChangeFrameEvent**를 활용할 수 있을 것입니다. `OnBeginPlay` 함수를 추가하고, 위에서 설명한 대로 이벤트를 **Body**와 연결합니다. 구독 취소를 대비해 연결한 이벤트의 핸들러는 프로퍼티로 가지고 있도록 합니다. ```lua Property: [None]

[task] | two_turn [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | `SpriteAnimPlayerChangeFrameEvent` 구독 취소 시 `self.handler` 대신 다른 변수를 사용하면 어떤 문제가 발생하나요? [answer] | `SpriteAnimPlayerChangeFrameEvent` 구독을 취소할 때 `self.handler` 대신 다른 변수(또는 새로 만든 핸들러)를 사용하면, 실제로 이벤트를 구독한 핸들러와 취소하려는 핸들러가 일치하지 않아 **구독이 정상적으로 해제되지 않는 문제**가 발생합니다. 구독과 해제는 반드시 **동일한 핸들러 인스턴스**를 사용하여 일대일 대응으로 처리되어야 합니다. `self.handler`에 저장된 핸들러를 구독(`ConnectEvent`)과 해제(`DisconnectEvent`) 양쪽에 모두 사용해야 시스템이 [followup] | 구독 취소 실패로 인한 메모리 누수 방지 및 이벤트 리스너 정리 코드 예시를 보여주세요. [followup_answer] | 참고 문서에 제공된 코드 예시와 API 정보만으로 메모리 누수 방지 및 이벤트 리스너 정리를 위한 완전한 패턴을 구성할 수 없습니다. 문서에는 `SpriteAnimPlayerChangeFrameEvent`를 구독 취소하는 방법(`body:DisconnectEvent("SpriteAnimPlayerChangeFrameEvent", self.handler)`)과 이를 수행하는 시점(특정 프레임 도달 시)에 대한 예시만 포함되어 있으며, 이벤트 구독을 시작하는 코드(`ConnectEvent` 호출 부분), `self.handler`를 [scores] | [judge_reason] | [source_doc] | 3. 아까 저장한 **handler**를 통해 **SpriteAnimPlayerChangeFrameEvent** 구독을 취소합니다. `ChangeFrameEvent` 함수를 수정해 봅시다. ```lua [client] void ChangeFrameEvent(any event) { if event.FrameIndex == 2 then local body = self.Entity.AvatarRendererComponent:GetBodyEntity()

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | SpriteAnimPlayerStartFrameEvent와 SpriteAnimPlayerEndFrameEvent의 공통 사용법을 3문장 이내로 요약하세요. [answer] | SpriteAnimPlayerStartFrameEvent와 SpriteAnimPlayerEndFrameEvent는 SpriteAnimPlayerChangeFrameEvent와 동일한 방식으로 사용합니다. 아바타 애니메이션은 클라이언트에서 재생되므로 해당 이벤트를 처리하는 스크립트나 메서드에는 [client] 속성을 붙여야 합니다. 이벤트 핸들러에서 특정 조건이 충족되면 ActionStateChangedEvent를 생성하여 body:SendEvent()로 전송해 원하는 애니메이션으로 전환할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 3. 아까 저장한 **handler**를 통해 **SpriteAnimPlayerChangeFrameEvent** 구독을 취소합니다. `ChangeFrameEvent` 함수를 수정해 봅시다. ```lua [client] void ChangeFrameEvent(any event) { if event.FrameIndex == 2 then local body = self.Entity.AvatarRendererComponent:GetBodyEntity()

[task] | code [pass] | ⏳ 미판정 [title] | UI 디자인 가이드 [question] | Resource Storage에 등록할 스프라이트의 가로 및 세로 길이가 4의 배수인지 확인하여 최적화 조건을 만족하는지 검증하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 Resource Storage에 스프라이트를 등록할 때 가로, 세로 길이가 4의 배수여야 자동 최적화가 적용된다는 **디자인/업로드 가이드**만 명시되어 있습니다. 그러나 mLua 스크립트 API 문서나 실제 게임 런타임에서 **이미지 파일의 픽셀 크기(가로/세로)를 읽어서 4의 배수인지 검증하는 함수나 프로퍼티가 제공되는지 여부는 주어진 문서에 언급되어 있지 않습니다.** 따라서, 주어진 문서의 정보만으로는 스프라이트의 실제 해상도를 코드에서 읽어와 검증하는 스크립트를 작성할 수 없습니다. 대신, 개발자 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 일관성 있는 UI 디자인은 유저가 월드 플레이 방식을 보다 빠르게 이해하고 즐길 수 있도록 도와줍니다. 이러한 UI 디자인을 위해 아래 사항을 참고해 봅시다. ##### 색상 팔레트 UI에서 사용할 색상 팔레트를 결정하고 일관되게 사용해 봅시다. 너무 많은 색상을 사용하면 UI가 지저분해지고 해당 색상이 무엇을 의미하는지도 알 수 없게 됩니다. 해당 월드 UI에서 사용할 몇 가지 색상을 정하고, 비슷한 기능을 하는 요소는 같은 색상을 사용하여 일관성을 유지하는 것이 좋습니다. 예를 들어, [예] 또는 [확인] 버튼에 파란색을 사용

[task] | code [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | _OnUpdate 주기적으로 5초마다 MapleAvatarBodyActionState.Blink과 MapleAvatarBodyActionState.Heal 상태를 교대로 트리거하는 스크립트를 작성해줘 [answer] | 요청하신 `OnUpdate`를 사용하여 5초마다 `Blink`와 `Heal` 상태를 교대로 트리거하는 스크립트입니다. ```lua Property: [None] number Timer = 0 [None] boolean IsBlink = true Method: [server only] void OnUpdate(number delta) { self.Timer = self.Timer + delta if self.Timer >= 5 then self.Timer = 0 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [BodyActionStateChangeEvent](/apiReference/Events/BodyActionStateChangeEvent)는 이름 그대로 아바타의 bodyActionState를 변경하는 이벤트입니다. 이 이벤트는 무기 타입에 따른 애니메이션을 별도로 지정할 필요가 없어 편리합니다. **BodyActionStateChangeEvent**는 **MapleAvatarBodyActionState**로 애니메이션을 제어합니다. **MapleAvatarBodyActionState**에는 각 상태별로 어떤 몸통 액션과 파츠 액

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | 예제 코드에서 이벤트 구독을 취소하지 않으면 발생하는 문제를 단계별 번호 목록으로 3단계 이내로 작성하세요. [answer] | 1. `SpriteAnimPlayerChangeFrameEvent`가 계속 구독 상태이므로, 새로운 애니메이션(`swingOF`)이 재생되는 동안에도 프레임 변경 이벤트가 지속적으로 발생합니다. 2. 새로운 애니메이션의 재생 시작 시점(또는 특정 프레임 도달 시)에 `ChangeFrameEvent` 함수가 다시 호출되어, 동일한 조건(`FrameIndex == 2`)이 충족되면 `ActionStateChangedEvent`가 반복적으로 전송됩니다. 3. 이로 인해 애니메이션이 시작되자마자 다시 새로운 애니메이션 이벤트가 보내지는 과 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다음의 예제 코드를 보면서 **FrameEvent**의 사용법을 알아봅시다. 1. 어떤 아바타 애니메이션의 2번째 프레임이 재생될 때 다른 애니메이션으로 변경하고 싶다고 가정합니다. 그렇다면 **SpriteAnimPlayerChangeFrameEvent**를 활용할 수 있을 것입니다. `OnBeginPlay` 함수를 추가하고, 위에서 설명한 대로 이벤트를 **Body**와 연결합니다. 구독 취소를 대비해 연결한 이벤트의 핸들러는 프로퍼티로 가지고 있도록 합니다. ```lua Property: [None]

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 타이머 만들기 [question] | PlayTime과 RemainingTime 프로퍼티를 추가하는 코드 블록만 출력하세요. [answer] | ```lua Property: [None] number PlayTime = 60 [None] number RemainingTime = 0 ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 타이머 만들기 게임을 시작하면 1초씩 감소하는 타이머를 만들어봅시다. 1. **CardPairGameLogic** 로직에 게임 제한 시간으로 사용할 **PlayTime** 프로퍼티와 시간을 줄이기 위해 사용할 **RemainingTime** 프로퍼티를 추가합니다. PlayTime 초깃값은 **60**으로 설정합니다. ```lua Property: [None] number PlayTime = 60 [None] number RemainingTime = 0 ``` > **

[task] | code [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | 아바타가 특정 좌표에 도달했을 때 MapleAvatarBodyActionState.Fly 상태로 전환하는 스크립트를 작성해줘 [answer] | 아바타의 위치를 매 프레임마다 확인하여 특정 좌표와 거리가 가까워졌을 때 `BodyActionStateChangeEvent`를 통해 `Fly` 상태로 전환하는 스크립트입니다. 아바타의 위치는 `self.Entity.TransformComponent.Position`으로 접근하며, 이벤트는 `self.Entity:SendEvent(event)`를 사용하여 전송합니다. ```lua Property: [None] Vector3 TargetPosition = Vector3(0, 0, 0) [None] number DistanceThre [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [BodyActionStateChangeEvent](/apiReference/Events/BodyActionStateChangeEvent)는 이름 그대로 아바타의 bodyActionState를 변경하는 이벤트입니다. 이 이벤트는 무기 타입에 따른 애니메이션을 별도로 지정할 필요가 없어 편리합니다. **BodyActionStateChangeEvent**는 **MapleAvatarBodyActionState**로 애니메이션을 제어합니다. **MapleAvatarBodyActionState**에는 각 상태별로 어떤 몸통 액션과 파츠 액

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | ChangeFrameEvent 함수에서 FrameIndex가 2일 때 발생하는 ActionStateChangedEvent 인자 6가지를 표로 정리하세요. [answer] | `ChangeFrameEvent` 함수에서 `event.FrameIndex == 2`일 때 생성되는 `ActionStateChangedEvent`의 인자 6개는 다음과 같습니다. | 순서 | 인자 값 | 설명 (문서 근거) | | :--- | :--- | :--- | | 1 | `"swingOF"` | 애니메이션 이름 | | 2 | `"swingOF"` | 애니메이션 이름 (두 번째 인자도 동일하게 지정) | | 3 | `0.5` | 재생 속도 | | 4 | `SpriteAnimClipPlayType.Loop` | 재생 방식 (반 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다음의 예제 코드를 보면서 **FrameEvent**의 사용법을 알아봅시다. 1. 어떤 아바타 애니메이션의 2번째 프레임이 재생될 때 다른 애니메이션으로 변경하고 싶다고 가정합니다. 그렇다면 **SpriteAnimPlayerChangeFrameEvent**를 활용할 수 있을 것입니다. `OnBeginPlay` 함수를 추가하고, 위에서 설명한 대로 이벤트를 **Body**와 연결합니다. 구독 취소를 대비해 연결한 이벤트의 핸들러는 프로퍼티로 가지고 있도록 합니다. ```lua Property: [None]

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | 기본 제공되는 ActionSheet에서 JUMP 상태는 어떤 MapleAvatarBodyActionState에 매칭되며, IDLE 상태를 walk 애니메이션으로 변경하려면 어떻게 해야 하나요? [answer] | 기본 제공되는 ActionSheet에서 **JUMP** 상태는 **fall** 값에 매칭되며, 이는 **MapleAvatarBodyActionState**의 **Fall**을 의미합니다. IDLE 상태를 walk 애니메이션으로 변경하려면 **AvatarStateAnimationComponent**의 **ActionSheet**에서 **IDLE** 키에 해당하는 **Value**를 **walk**로 변경하면 됩니다. 이렇게 설정하면 아바타의 상태가 IDLE로 바뀔 때 walk 애니메이션이 재생됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이미 정의된, 혹은 새로 정의할 아바타의 상태가 바뀔 때마다 매번 이벤트를 보내서 애니메이션을 변경하는 것도 번거로울 수 있습니다. 이벤트를 보내지 않고도 아바타 상태가 바뀔 때마다 애니메이션도 함께 변경되면 매우 편리할 것입니다. [AvatarStateAnimationComponent](/apiReference/Components/AvatarStateAnimationComponent)의 **ActionSheet**에 아바타 상태와 연결될 애니메이션을 설정하고 [StateComponent](/apiReference/Component

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | ActionStateChangedEvent를 직접 호출하는 것과 BodyActionStateChangeEvent를 사용하는 것의 가장 큰 차이점은 무엇인가요? [answer] | ActionStateChangedEvent를 직접 호출하는 것과 BodyActionStateChangeEvent를 사용하는 것의 가장 큰 차이점은 **애니메이션 매핑의 자동화 여부**입니다. **BodyActionStateChangeEvent**는 `MapleAvatarBodyActionState` enum 값(예: `Fly`, `Walk`, `Stand` 등)만 지정하면, 시스템이 내부적으로 정의된 프리셋에 따라 해당 상태에 맞는 `CoreActionName`, `PartsActionName`, `PlayRate`, `PlayT [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [BodyActionStateChangeEvent](/apiReference/Events/BodyActionStateChangeEvent)는 이름 그대로 아바타의 bodyActionState를 변경하는 이벤트입니다. 이 이벤트는 무기 타입에 따른 애니메이션을 별도로 지정할 필요가 없어 편리합니다. **BodyActionStateChangeEvent**는 **MapleAvatarBodyActionState**로 애니메이션을 제어합니다. **MapleAvatarBodyActionState**에는 각 상태별로 어떤 몸통 액션과 파츠 액

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 타이머 만들기 [question] | CardBoard 컴포넌트의 TimeText 프로퍼티 경로와 UpdateText 함수 내 문자열 변환 로직을 3문장 이내로 설명하세요. [answer] | CardBoard 컴포넌트의 TimeText 프로퍼티는 "/ui/CardPairGameUI/UI_Board/Background/Title/Timer_Background/UI_Time/UI_Time_Text" 경로에 설정됩니다. UpdateText 함수는 _CardPairGameLogic.RemainingTime 값을 가져와 math.floor로 소수점을 버린 후 tostring으로 변환합니다. 변환된 문자열을 self.TimeText.TextComponent.Text 에 대입하여 UI에 시간을 표시합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 타이머 만들기 게임을 시작하면 1초씩 감소하는 타이머를 만들어봅시다. 1. **CardPairGameLogic** 로직에 게임 제한 시간으로 사용할 **PlayTime** 프로퍼티와 시간을 줄이기 위해 사용할 **RemainingTime** 프로퍼티를 추가합니다. PlayTime 초깃값은 **60**으로 설정합니다. ```lua Property: [None] number PlayTime = 60 [None] number RemainingTime = 0 ``` > **

[task] | two_turn [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | ActionStateChangedEvent 에서 ActionName 으로 재생할 애니메이션을 선택하는 방식과 CoreActionName, PartsActionName 의 차이점이 무엇인가요? [answer] | `ActionStateChangedEvent`는 아바타의 애니메이션을 제어하는 이벤트로, `ActionName` 인자를 통해 재생할 애니메이션 종류를 결정합니다. `ActionName`에는 `stand1`, `walk1`, `jump`, `dead` 등 아바타가 수행할 수 있는 다양한 동작 이름이 포함되어 있으며, 이 값에 따라 아바타가 해당 동작의 애니메이션을 재생합니다. `CoreActionName`과 `PartsActionName`의 차이는 다음과 같습니다: 1. **CoreActionName**: 아바타의 **맨몸 액션 [followup] | CoreActionName 을 walk1 로, PartsActionName 을 stand1 로 설정했을 때 아바타의 몸통과 장착 아이템의 움직임이 어떻게 달라지나요? [followup_answer] | `CoreActionName`을 `walk1`로, `PartsActionName`을 `stand1`으로 설정하면 다음과 같은 움직임이 나타납니다. * **아바타의 몸통(Core)**: `walk1` 액션이 적용되어 **걷는 움직임**을 합니다. * **아바타 장착 아이템(Parts)**: `stand1` 액션이 적용되어 **가만히 서 있는 움직임**을 합니다. 즉, 아바타의 몸통은 걷고 있지만 옷이나 신발 등 장착된 아이템은 제자리에 멈춰 있는 상태로, 두 부분이 서로 다른 동작을 수행하므로 시각적으로 어색한 모습이 연출 [scores] | [judge_reason] | [source_doc] | **ActionStateChangedEvent**는 **ActionName**으로 어떤 애니메이션을 재생할지 결정합니다. 아래는 **ActionName**의 목록입니다. |@cols=4:@rows=1:ActionName| |:---:|:---:|:---:|:---:| | stand1 | swingO1 | stabO1 | shoot1 | | stand2 | swingO2 | stabO2 | shoot2 | | walk1 | swingO3 | stabOF | shootF | | walk2 | swingOF | stabT1 | | |

[task] | code [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | 아바타의 현재 BodyActionState가 MapleAvatarBodyActionState.Dead일 때만 _UserService의 유저 퇴장 이벤트를 감지하여 로그를 출력하는 스크립트를 작성해줘 [answer] | 아바타의 현재 `BodyActionState`가 `MapleAvatarBodyActionState.Dead`인지 확인하기 위해 `MapleAvatarBodyActionState`와 `BodyActionStateChangeEvent`의 매칭 표를 참고해야 합니다. 제공된 문서에는 `BodyActionStateChangeEvent`를 통해 상태를 *설정*하는 방법과 `ActionStateChangedEvent`와의 매칭 관계는 설명되어 있지만, **아바타의 현재 상태를 직접 조회하기 위한 프로퍼티나 메서드(예: `GetBodyActio [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [BodyActionStateChangeEvent](/apiReference/Events/BodyActionStateChangeEvent)는 이름 그대로 아바타의 bodyActionState를 변경하는 이벤트입니다. 이 이벤트는 무기 타입에 따른 애니메이션을 별도로 지정할 필요가 없어 편리합니다. **BodyActionStateChangeEvent**는 **MapleAvatarBodyActionState**로 애니메이션을 제어합니다. **MapleAvatarBodyActionState**에는 각 상태별로 어떤 몸통 액션과 파츠 액

[task] | code [pass] | ⏳ 미판정 [title] | UI 디자인 가이드 [question] | 모바일 터치 환경에 대응하여 버튼 컴포넌트의 크기를 최소 80 X 80px으로 설정하고, 버튼 간 간섭을 방지하기 위해 간격을 10px 이상 유지하도록 레이아웃을 조정하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 UI 디자인 시 버튼 크기를 80x80px 이상으로, 간격을 적절히 유지해야 한다는 **디자인 가이드(권장 사항)** 만 포함되어 있습니다. mLua 스크립트 언어와 API 문서에는 UI 버튼의 **크기(Size)나 위치(Position)를 코드(스크립트)로 직접 조작하는 API(예: `SetSize`, `SetPosition` 등)가 정의되어 있지 않습니다.** mLua는 주로 게임 로직(스폰, 타이머, 사용자 이벤트 처리 등)을 제어하는 언어이며, UI의 시각적 레이아웃(버튼 크기, 간격, 위치)은 에디터 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 User Interface(UI)는 필수 요소입니다. UI는 유저에게 플레이 관련 정보를 명확하고 간결하게 제공해야 합니다. 점수, 체력, 남은 시간, 각종 버튼 같은 UI 요소가 잘 디자인되어 있다면 유저는 직관적으로 월드를 이해하고 재미있게 플레이할 수 있을 것입니다. 유저는 메이플스토리 월드를 PC 및 모바일 환경에서 두루 플레이할 수 있습니다. 그러므로 크리에이터는 다양한 환경에서 불편함이 없도록 UI를 디자인해야 합니다. 물론 월드 콘셉트에도 맞고, 시각적으로 눈길을 사로잡는 디자인을

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 타이머 만들기 [question] | `OnUpdate`에서 0초 도달 시 `EndGame`을 호출하는 조건문 코드만 출력하세요. [answer] | ```lua if self.RemainingTime <= 0 then self:EndGame() end ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 타이머를 완성했지만 이번에도 한 가지 추가하면 좋겠습니다 타이머가 0초가 된 이후에 수가 음수로 계속해서 감소하고 있습니다. 일반적으로 수가 줄어드는 모습을 보면, 0초가 되었을 때 게임이 종료될 거라 기대합니다. 그러나 지금은 0초 이후 수가 음수로 줄어들고 있습니다. 0초가 되면 ui가 꺼지게 만들어 봅시다. 1. **CardPairGameLogic** 로직의 `EndGame` 함수에 아래와 같이 작성합니다. ```lua [client only] void EndGame () {

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 애니메이션 제어하기 [question] | 아바타 애니메이션 제어가 클라이언트에서만 가능한 이유를 표로 정리하세요. [answer] | 아바타 애니메이션은 클라이언트(플레이어의 기기)를 통해 화면에 표시되는 그래픽 요소이므로, 이를 제어하는 로직 역시 클라이언트 공간에서 실행되어야 합니다. 서버에서는 화면에 직접 렌더링되는 애니메이션 프레임을 직접 조작할 수 없기 때문에, 애니메이션 변경이나 프레임 이벤트 처리는 `[client]` 또는 `[client only]` 실행 공간에서 이루어져야 합니다. | 구분 | 내용 | | :--- | :--- | | **제어 대상의 위치** | 아바타 애니메이션은 플레이어가 보는 화면(클라이언트)에 렌더링되는 시각적 요소입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 3. 아까 저장한 **handler**를 통해 **SpriteAnimPlayerChangeFrameEvent** 구독을 취소합니다. `ChangeFrameEvent` 함수를 수정해 봅시다. ```lua [client] void ChangeFrameEvent(any event) { if event.FrameIndex == 2 then local body = self.Entity.AvatarRendererComponent:GetBodyEntity()

← → 방향키로 페이지 이동 · 숫자 입력 후 Enter로 점프