[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 상품 만들기 [question] | 아바타 상품 수정 시 변경 가능한 항목을 단계별 번호 목록으로 4개 이내로 나열하세요. [answer] | 아바타 상품 수정 시 변경 가능한 항목은 다음과 같습니다. 1. 상품 가격 2. 판매 기간 3. 출시 여부 4. 상품 설명 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 크리에이터는 직접 제작한 아바타 아이템을 판매할 수 있습니다. 이번 가이드에서는 제작한 아바타 아이템 판매 방법을 알아봅니다. 판매하기 전에 아바타 아이템을 제작하고 등록하는 방법은 아래 가이드를 참고해 봅시다. ##### 참고 가이드 * [아바타 아이템 제작](/docs/?postId=582) > **더 알아보기** > 아이템 제작, 판매할 때는 [메이플스토리 월드 크리에이터 운영정책](https://maplestoryworlds.nexon.com/legal/policy/699)을
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 메이플스토리 월드에서 제공하는 스프라이트와 크리에이터가 직접 Import한 스프라이트, 그리고 플레이 도중 생성되는 동적 스프라이트의 차이는 무엇인가요? [answer] | 메이플스토리 월드에서 사용하는 스프라이트는 출처와 생성 시점에 따라 세 가지로 나뉩니다. 1. **메이플스토리 월드 제공 스프라이트**: 게임 플랫폼 자체에서 기본으로 제공하는 이미지 리소스입니다. 2. **크리에이터 Import 스프라이트**: 월드 제작자가 외부에서 준비한 이미지 파일을 직접 게임 에디터에 가져와서 사용하는 리소스입니다. 3. **동적 스프라이트**: 월드 플레이 도중 실제로 생성된 이미지(예: 스크린샷)를 월드에 업로드하여 다른 유저와 공유할 수 있게 만든 스프라이트입니다. 동적 스프라이트는 플레이 중 생성 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | code [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 카드 짝 맞추기 게임에서 카드 선택 시 효과음 ID "0c57ceb6897c4955b1a4e860c6895868" 을 볼륨 0.7 로 재생하는 로직을 포함해 카드 클릭 이벤트를 처리하는 스크립트를 작성해줘 [answer] | 카드가 선택될 때(`oldCard`가 `nil`인 경우) 효과음 ID `0c57ceb6897c4955b1a4e860c6895868`을 볼륨 0.7로 재생하는 로직을 포함하여 카드 클릭 이벤트를 처리하는 스크립트는 다음과 같습니다. ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI Method: [client only] void OnCardClicked (Card card) { if isvalid(card) == false then return [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true self.RemainingTime = self
[task] | two_turn [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | ColorEffect 셰이더 타입에서 제공하는 다양한 색상 효과 중, 시간 경과에 따라 단일 색상으로 블렌딩하거나 목표 색상과 반대 색상으로 출력하는 효과는 각각 무엇이며, 이들을 구분하여 사용할 수 있는 구체적인 셰이더 이름과 동작 원리는 어떻게 되나요? [answer] | ColorEffect 셰이더 타입에서 시간 경과에 따라 단일 색상으로 블렌딩하는 효과는 **Gradient** 셰이더이며, 목표 색상과 반대 색상으로 출력하는 효과는 **Reverse** 셰이더입니다. 두 셰이더의 구체적인 이름과 동작 원리는 다음과 같습니다. * **Gradient** * **동작 원리**: 시간이 지남에 따라 지정된 단일 색상으로 점진적으로 블렌딩되는 효과를 생성합니다. * **Reverse** * **동작 원리**: 지정된 목표 색상과 반대되는 색상(보색)으로 엔티티를 렌더링하여 [followup] | Gradient 셰이더와 Reverse 셰이더의 설명을 바탕으로, 각 셰이더가 적용될 때 나타나는 시각적 차이점을 설명하고, 만약 회색 조로 출력하는 GrayScale 효과와 렌더링 색상 개수를 제한하는 Posterize 효과를 동시에 적용할 수 있는지 문서에 근거하여 확인해 주세요. [followup_answer] | **1. Gradient 셰이더와 Reverse 셰이더의 시각적 차이점** 두 셰이더는 모두 `ColorEffect` 타입에 속하지만, 색상 변환 방식에서 명확한 차이를 보입니다. * **Gradient**: 시간이 지남에 따라 **단일 색상**으로 점진적으로 블렌딩됩니다. 즉, 초기 색상에서 목표 색상으로 천천히 변해가는 시간 기반의 색상 변화 효과를 나타냅니다. * **Reverse**: 시간 변화나 블렌딩 과정이 아니라, 지정된 **목표 색상과 반대되는 색상(보색)**으로 즉시 출력됩니다. 예를 들어, 특정 색상을 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 머티리얼(Material)은 다양한 프로퍼티를 통해 엔티티가 렌더링될 방법을 나타내는 객체입니다. 엔티티의 프로퍼티는 엔티티를 렌더링하는 코드에 따라 변경됩니다. 셰이더(Shader)란 물체를 렌더링할 때 사용할 코드(또는 스크립트)입니다. 셰이더의 프로퍼티 및 코드는 동적으로 변경될 수 없기 때문에, 셰이더마다 표현하는 효과가 다르게 나타납니다. 메이플스토리 월드에서는 다양한 셰이더를 제공합니다. 크리에이터는 머티리얼을 생성하고 원하는 의도에 맞게 셰이더 프로퍼티를 조절할 수 있습니다. # 머티리얼 생성하기
[task] | code [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 두 카드가 짝이 맞으면 각 카드의 SetDestroyed 메서드를 호출하고, 카드 보드가 비어있으면 카드 보드의 SetCards 메서드로 카드를 재설정하는 로직을 구현하는 스크립트를 작성해줘 [answer] | 두 카드가 짝으로 판정되면 `SetDestroyed` 메서드를 호출하여 카드를 제거하고, 카드 보드가 비어 있는지 확인한 후 `IsEmpty`가 참이면 `SetCards` 메서드로 카드를 재설정하는 로직을 구현하는 스크립트는 다음과 같습니다. ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI Method: [client only] void OnBeginPlay() { self.CardPairGameUI.Enable = true local card [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true self.RemainingTime = self
[task] | code [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | 스프라이트 머티리얼의 셰이더를 BlendColorDodge 로 설정하여 스프라이트의 채도와 대비를 높여 밝게 표현하는 스크립트를 작성해줘 [answer] | 스프라이트 렌더러에 `BlendColorDodge` 셰이더를 적용하는 방법은 참고 문서에 명시된 API가 없습니다. 참고 문서에는 `BlendColorDodge`가 스프라이트의 채도를 높이고 대비를 증대시키며 밝게 만드는 효과라는 설명만 있고, 이를 스크립트로 설정하는 구체적인 메서드(예: `SetShader`, `Material` 조작 API 등)나 프로퍼티에 대한 설명이 포함되어 있지 않습니다. 따라서 제공된 문서를 근거로 `BlendColorDodge`를 직접 설정하는 mLua 스크립트를 작성할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스프라이트의 색상이 적용되는 방식을 다양한 형태로 변형하는 효과입니다. | @cols=2:@rows=1:셰이더 | 설명 | | :---: | --- | --- | | BlendDarken| | 각 RGB 채널에서 더 작은 값을 사용해 어둡게 만듭니다.| | BlendMultiply| | 두 색상을 곱한 결과물을 표현합니다. | | BlendColorBurn| | 채도는 높이고 대비를 증대시키며 기본 색상을 어둡게 합니다. | | BlendLinearBurn| | 원본 스프라이트의 색상 대비는 유지하되 색상을
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | Hierarchy에서 Canvas를 Frame의 자식으로 생성한 뒤 Scene 뷰에서 Frame 중앙으로 옮기는 작업은 왜 필수적인가요? [answer] | Canvas를 Frame의 자식으로 생성한 뒤 Scene 뷰에서 Frame의 중앙으로 옮기는 작업은 스크린샷 결과물이 Frame의 스프라이트(테두리나 배경) 안에 정확하게 위치하도록 하기 위함입니다. Frame 엔티티는 SpriteRendererComponent를 통해 프레임 스프라이트를 표시하며, Canvas는 이 프레임 안에 들어갈 스크린샷 콘텐츠가 표시되는 위치입니다. Canvas가 Frame의 자식으로 있어야 Frame의 TransformComponent(위치, 회전, 스케일 등)에 따라 Canvas의 상대 위치가 함께 이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 키를 눌러 스크린샷을 찍은 뒤 월드의 특정 위치에 보이도록 하는 예제를 살펴봅시다. 1. **Hierarchy - Create Entity - Create Empty**를 클릭해 **EmptyEntity**를 생성합니다. **EmptyEntity**의 이름을 **Frame**으로 지정합니다. 2. **Frame** 엔티티의 프로퍼티 에디터에서 **TransformComponent, SpriteRendererComponent**를 추가합니다. 3. **Frame** 엔티티의 프로퍼티
[task] | code [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 카드 짝이 완성될 때 _UserService.LocalPlayer 의 PlayerStats 에 10 점을 추가하는 AddScore 메서드 호출을 포함하는 스크립트를 작성해줘 [answer] | 카드가 쌍으로 완성될 때 `_UserService.LocalPlayer` 의 `PlayerStats` 에 10점을 추가하는 `AddScore` 메서드 호출은 카드가 매칭된(`IsPairOf`) 경우의 분기에서 처리합니다. 아래 스크립트는 카드 선택 로직과 함께 매칭 성공 시 점수를 추가하는 구조를 포함합니다. ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI Method: [client only] void OnBeginPlay() { self.CardP [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true self.RemainingTime = self
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | OnBeginPlay 함수 내부에서 self:IsServer() 조건이 참일 때만 실행되는 코드가 있는 이유는 무엇인가요? [answer] | `OnBeginPlay` 함수 내부에서 `self:IsServer()` 조건을 확인하는 이유는 **`_ResourceService:SetSpriteUploadValidationCallback`** 함수가 서버에서만 실행될 수 있는 API이기 때문입니다. 스크립트는 기본적으로 서버와 클라이언트 양쪽에서 모두 실행됩니다. 그러나 스크린샷 업로드 요청을 검증하고 허용하는 로직은 월드의 중앙 서버에서 처리되어야 합니다. 따라서 `self:IsServer()`가 참(true)인 경우, 즉 현재 코드가 서버에서 실행되고 있을 때만 업로드 검 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 키를 눌러 스크린샷을 찍은 뒤 월드의 특정 위치에 보이도록 하는 예제를 살펴봅시다. 1. **Hierarchy - Create Entity - Create Empty**를 클릭해 **EmptyEntity**를 생성합니다. **EmptyEntity**의 이름을 **Frame**으로 지정합니다. 2. **Frame** 엔티티의 프로퍼티 에디터에서 **TransformComponent, SpriteRendererComponent**를 추가합니다. 3. **Frame** 엔티티의 프로퍼티
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 동적 슔�라이트를 생성한 후 다른 유저와 공유하기 위해 발급받는 식별자 RUID는 어떤 역할을 하나요? [answer] | 동적 스프라이트는 플레이 도중 생성된 이미지를 `RawImage` 데이터 타입으로 처리하여 월드에 업로드하고, 이 과정에서 발급되는 고유 식별자인 **RUID(Resource Unique ID)** 를 얻습니다. RUID의 주요 역할은 다음과 같습니다: 1. **스프라이트 리소스 참조**: 업로드된 스크린샷이 스프라이트 리소스로 변환된 후, 해당 리소스를 월드 내에서 유일하게 식별하는 ID로 작용합니다. 2. **컴포넌트 적용**: `SpriteRendererComponent`의 `SpriteRUID` 프로퍼티에 RUID 문 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | `CaptureAndUpload()` 함수에서 스크린샷을 Frame 크기에 맞춰 조절하기 위해 적용하는 가로 및 세로 비율 계산 수식을 주석 없이 코드 블록으로만 출력하세요. [answer] | ```lua local horizontalRatio = frameWidth / screenshotWidth * 0.96 local verticalRatio = frameHeight / screenshotHeight * 0.67 ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. `CaptureAndUpload()` 함수를 추가하고 아래와 같이 작성합니다. ```lua [client only] void CaptureAndUpload() { local frameRUID = self.FrameEntity.SpriteRendererComponent.SpriteRUID local sprite = _ResourceService:LoadSpriteAndWait(frameRUID) -- frame 엔티티 스프라이트의 가로, 세
[task] | code [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | 스프라이트 머티리얼의 셰이더를 BlendMultiply 로 설정하여 스프라이트 색상을 어둡게 표현하는 스크립트를 작성해줘 [answer] | 스프라이트 머티리얼의 셰이더를 `BlendMultiply`로 설정하는 방법은 제공된 문서에 구체적인 API 이름이나 사용법이 명시되어 있지 않습니다. 문서에는 `BlendMultiply` 셰이더가 "두 색상을 곱한 결과물을 표현"한다는 설명만 있을 뿐, 이를 스크립트로 설정하기 위한 특정 메서드(예: `SetShader`, `SetMaterial` 등)나 프로퍼티가 어떻게 사용되는지에 대한 정보는 없습니다. 또한, `SpriteRendererComponent`나 `SpriteGUIRendererComponent`에 셰이더를 직접 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스프라이트의 색상이 적용되는 방식을 다양한 형태로 변형하는 효과입니다. | @cols=2:@rows=1:셰이더 | 설명 | | :---: | --- | --- | | BlendDarken| | 각 RGB 채널에서 더 작은 값을 사용해 어둡게 만듭니다.| | BlendMultiply| | 두 색상을 곱한 결과물을 표현합니다. | | BlendColorBurn| | 채도는 높이고 대비를 증대시키며 기본 색상을 어둡게 합니다. | | BlendLinearBurn| | 원본 스프라이트의 색상 대비는 유지하되 색상을
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 상품 만들기 [question] | 아바타 상품의 판매 상태 6가지와 그 설명을 표로 정리해서 출력하세요. [answer] | 아바타 상품의 판매 상태 6가지와 그 설명은 다음과 같습니다. | 판매 상태 | 설명 | | :---: | --- | | 미출시 | 출시 여부를 '미출시'로 설정한 상태이며, 판매 기간이 되어도 상점에 노출되지 않고 판매도 불가합니다. 플레이어가 이미 보유하고 있는 상품도 확인 불가합니다. | | 결제 대기 | 상품 등록 후 등록비를 결제하기 전 단계입니다. | | 판매 대기 | 판매 시작일 이전에 등록이 완료된 상태로 상품의 판매 시작일에 맞춰 판매 중 상태로 변경됩니다. | | 판매 중 | 판매가 시작된 상태로 판매 종료일이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 크리에이터는 직접 제작한 아바타 아이템을 판매할 수 있습니다. 이번 가이드에서는 제작한 아바타 아이템 판매 방법을 알아봅니다. 판매하기 전에 아바타 아이템을 제작하고 등록하는 방법은 아래 가이드를 참고해 봅시다. ##### 참고 가이드 * [아바타 아이템 제작](/docs/?postId=582) > **더 알아보기** > 아이템 제작, 판매할 때는 [메이플스토리 월드 크리에이터 운영정책](https://maplestoryworlds.nexon.com/legal/policy/699)을
[task] | code [pass] | ⏳ 미판정 [title] | 아바타 상품 만들기 [question] | 따라서 주어진 문서 정보만으로 mLua 코딩 과제를 만들 수 없습니다. [answer] | 제시된 참고 문서는 '유료화 아바타 상품 만들기'에 관한 **UI/운영 가이드**(상품 등록, 수정, 판매 상태 등)만을 다루고 있으며, mLua 스크립트 API, 이벤트, 또는 코드 예제는 포함되어 있지 않습니다. 따라서 제공된 문서 정보만으로는 mLua 코딩 과제를 만들 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 크리에이터는 직접 제작한 아바타 아이템을 판매할 수 있습니다. 이번 가이드에서는 제작한 아바타 아이템 판매 방법을 알아봅니다. 판매하기 전에 아바타 아이템을 제작하고 등록하는 방법은 아래 가이드를 참고해 봅시다. ##### 참고 가이드 * [아바타 아이템 제작](/docs/?postId=582) > **더 알아보기** > 아이템 제작, 판매할 때는 [메이플스토리 월드 크리에이터 운영정책](https://maplestoryworlds.nexon.com/legal/policy/699)을
[task] | code [pass] | ⏳ 미판정 [title] | 아바타 상품 만들기 [question] | 제시된 문서는 메이플스토리 월드 공식 홈페이지의 UI를 통한 아바타 상품 등록, 수정, 판매 상태 관리 과정에 대한 안내일 뿐, mLua 스크립트에서 사용할 수 있는 API, 컴포넌트, 서비스 이름, 또는 코드 예제가 전혀 포함되어 있지 않습니다. [answer] | 제시된 참고 문서는 메이플스토리 월드 공식 홈페이지의 웹 UI를 통해 아바타 상품을 등록, 수정하고 판매 상태를 관리하는 절차에 대한 안내일 뿐입니다. 문서에는 mLua 스크립트에서 사용할 수 있는 API, 컴포넌트, 서비스 이름(예: `_UserService`, `_EntityService` 등), 또는 관련 코드 예제가 포함되어 있지 않습니다. 따라서 해당 문서에 근거하여 mLua 스크립트를 작성하거나 관련 API를 설명할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 크리에이터는 직접 제작한 아바타 아이템을 판매할 수 있습니다. 이번 가이드에서는 제작한 아바타 아이템 판매 방법을 알아봅니다. 판매하기 전에 아바타 아이템을 제작하고 등록하는 방법은 아래 가이드를 참고해 봅시다. ##### 참고 가이드 * [아바타 아이템 제작](/docs/?postId=582) > **더 알아보기** > 아이템 제작, 판매할 때는 [메이플스토리 월드 크리에이터 운영정책](https://maplestoryworlds.nexon.com/legal/policy/699)을
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 키보드 입력을 통해 스크린샷 촬영 기능을 활성화하는 `HandleKeyDownEvent` 처리 로직만 추출하여, 설명 문장 없이 코드 블록으로만 출력하세요. [answer] | ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { -- Parameters local key = event.key -------------------------------------------------------- if key == KeyboardKey.Alpha1 then self:CaptureAndUpload() end } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. `CaptureAndUpload()` 함수를 추가하고 아래와 같이 작성합니다. ```lua [client only] void CaptureAndUpload() { local frameRUID = self.FrameEntity.SpriteRendererComponent.SpriteRUID local sprite = _ResourceService:LoadSpriteAndWait(frameRUID) -- frame 엔티티 스프라이트의 가로, 세
[task] | code [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | `_DataService:GetRowCount("CardSet")`으로 조회한 카드 수가 10개를 초과하면 `_UtilLogic:RandomIntegerRange`를 사용하여 10개만 추출한 뒤 `SetCards()` 로직과 동일하게 섞어서 `CreateCardEntities`에 전달하는 `LimitDeckSize()` 메서드를 포함하는 스크립트를 작성해줘. [answer] | 사용자가 요청한 `LimitDeckSize()` 메서드를 포함하여, 카드 수가 10개를 초과할 경우 10개만 무작위로 추출하고 섞은 뒤 엔티티를 생성하는 전체 스크립트를 작성합니다. 참고 문서에 있는 `SetCards()`, `CreateCardEntities()` 로직을 기반으로 하며, `LimitDeckSize()`는 `deckTable`에서 10개를 추출하는 로직을 포함합니다. ```lua Property: [None] Entity CardSpawnRoot = /ui/CardPairGameUI/UI_Board/UI_Bloc [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardSpawnRoot = /ui/CardPairGameUI/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil [None] Entity TimeText = /ui/CardPairGameUI/UI_Board/Background/Title/Timer_Background/UI_Time/UI_Time_Text [None] Entity ScoreText = /ui/CardPairGameUI/UI_Board/Backgro
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | Frame과 Canvas 엔티티를 생성할 때 SpriteRendererComponent의 SpriteRUID 값은 각각 어떻게 설정해야 하나요? [answer] | Frame 엔티티와 Canvas 엔티티의 SpriteRendererComponent에서 SpriteRUID 값을 설정하는 방법은 다음과 같습니다. 1. **Frame 엔티티** * Frame 엔티티에 **SpriteRendererComponent**를 추가한 후, 해당 컴포넌트의 **SpriteRUID** 프로퍼티에 원하는 스프라이트(예: 사진 테두리용 스프라이트)의 RUID 값을 직접 입력하여 설정해야 합니다. * 참고 문서의 예시에서는 `93c2673261874c76b55459a4add2c382`라는 값 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 키를 눌러 스크린샷을 찍은 뒤 월드의 특정 위치에 보이도록 하는 예제를 살펴봅시다. 1. **Hierarchy - Create Entity - Create Empty**를 클릭해 **EmptyEntity**를 생성합니다. **EmptyEntity**의 이름을 **Frame**으로 지정합니다. 2. **Frame** 엔티티의 프로퍼티 에디터에서 **TransformComponent, SpriteRendererComponent**를 추가합니다. 3. **Frame** 엔티티의 프로퍼티
[task] | two_turn [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | `_SoundService:PlaySound` 메서드의 두 번째 인자인 볼륨 값(예: 0.7, 1)이 0.0에서 1.0 범위로 제한되는지, 또는 다른 범위로 지정될 수 있는지 궁금합니다. [answer] | 제공된 참고 문서에는 `_SoundService:PlaySound` 메서드의 두 번째 인자인 볼륨 값의 허용 범위(0.0~1.0 여부 등)에 대한 설명이 포함되어 있지 않습니다. 문서에서는 `0.7`과 `1`과 같은 값이 사용된 예시만 제시되어 있을 뿐, 이 값이 어떤 범위 내에서 제한되거나 다른 범위로 지정될 수 있는지에 대한 기술적 명세는 찾을 수 없습니다. [followup] | 볼륨 값이 1.0을 초과하거나 음수일 경우 어떻게 동작하는지, 그리고 특정 사운드 ID에 대해 볼륨을 동적으로 조절하는 코드는 어떻게 작성해야 하는지 알려주세요. [followup_answer] | 제공된 참고 문서에는 볼륨 값이 1.0을 초과하거나 음수일 경우의 동작 방식에 대한 정보가 포함되어 있지 않습니다. 문서에서는 `0.7`과 `1`과 같은 값만 사용 예시로 제시되어 있을 뿐, 값의 유효 범위나 초과/음수 입력 시의 처리 로직에 대한 설명은 없습니다. 특정 사운드 ID에 대해 볼륨을 동적으로 조절하는 코드 작성법도 문서에 명시되어 있지 않습니다. 다만, 문서에 포함된 `_SoundService:PlaySound` 메서드의 호출 형태를 참고하여, 볼륨 값을 변수로 받아 사용하는 일반적인 스크립트 구조는 다음과 같이 작 [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true self.RemainingTime = self
[task] | two_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | `ScreenshotService`의 `CaptureFullScreenAsPixelDataAndWait()` 함수를 사용해 캡처 결과를 `RawImage` 형태로 반환하는 예제 코드를 작성해 주세요. [answer] | `ScreenshotService`의 `CaptureFullScreenAsPixelDataAndWait()` 함수를 사용하여 전체 화면을 캡처하고, 그 결과를 `RawImage` 형태의 데이터로 업로드하는 예제입니다. 이 과정은 1) 스크린샷 데이터 획득, 2) 데이터 업로드 요청, 3) 업로드 완료 후 발급받은 RUID를 스프라이트 렌더러에 적용하는 3단계로 이루어집니다. ```lua Property: [None] string ScreenshotRUID = "" Method: [client only] void CaptureS [followup] | `RawImage` 데이터를 월드에 업로드하고 `RUID`를 발급받아 실제 월드에서 스크린샷을 표시하는까지의 전체 코드 흐름을 알려주세요. [followup_answer] | `RawImage` 데이터를 월드에 업로드하여 `RUID`를 발급받고, 이를 통해 실제 월드에서 스크린샷을 표시하는 전체 코드 흐름은 다음과 같습니다. 이 과정은 클라이언트에서 캡처 및 업로드 요청을 수행하고, 서버에서 업로드 완료 이벤트를 처리하는 구조로 이루어집니다. ### 1. 클라이언트: 스크린샷 캡처 및 업로드 요청 클라이언트에서는 `ScreenshotService`를 사용하여 화면을 캡처하고, 그 결과를 `RawImage` 형태의 `pixelData`로 변환합니다. 이후 `ResourceService`의 비동기 업로드 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 스크린샷 업로드 시 발생할 수 있는 제한 사항(크기, 동시 요청, 빈도 등)을 '제한 항목'과 '상세 내용' 열로 구성된 표로 정리하세요. [answer] | 참고 문서에 명시된 스크린샷 업로드 제한 사항은 다음과 같습니다. | 제한 항목 | 상세 내용 | | :--- | :--- | | 파일 크기 | 업로드하는 리소스는 3MB를 초과할 수 없습니다. | | 동시 요청 | 업로드는 한 번에 하나만 요청할 수 있습니다. 이전 요청이 완료되기 전에 다시 요청하면 업로드가 실패합니다. | | 요청 빈도 | 월드 기준 1분 당 5회로 제한됩니다. 월드에 너무 많은 요청이 들어오면 업로드에 실패할 수 있으며, 여러 클라이언트에서 동시에 요청을 보내지 않도록 주의해야 합니다. | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. `CaptureAndUpload()` 함수를 추가하고 아래와 같이 작성합니다. ```lua [client only] void CaptureAndUpload() { local frameRUID = self.FrameEntity.SpriteRendererComponent.SpriteRUID local sprite = _ResourceService:LoadSpriteAndWait(frameRUID) -- frame 엔티티 스프라이트의 가로, 세
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 스크린샷을 RawImage 타입으로 변환해서 월드에 업로드하려면 어떤 서비스와 함수를 호출해야 하나요? [answer] | 스크린샷을 RawImage 타입으로 변환하여 월드에 업로드하려면 `ScreenshotService`와 `ResourceService`를 사용합니다. 1. **스크린샷 데이터 획득**: `_ScreenshotService:CaptureFullScreenAsPixelDataAndWait()` 함수를 호출하여 스크린샷을 `RawImage` 타입의 `pixelData`로 변환합니다. 2. **업로드 요청**: `_ResourceService:RequestSpriteUploadAsync(pixelData, callback)` 함수를 호 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 메이커에서 테스트할 때 스크린샷이 보이지 않지만 실제 출시 게임에서는 정상적으로 보이는 이유는 무엇인가요? [answer] | 메이커에서 테스트할 때 스크린샷이 보이지 않는 이유는 메이커 플레이 중 생성된 스프라이트가 임시 리소스이기 때문입니다. 이 임시 리소스는 플레이를 종료하면 사라집니다. 특히 가상의 플레이어를 추가하거나 인스턴스 룸을 이동해 오면 경우에 따라 업로드한 스크린샷이 보이지 않을 수 있습니다. 하지만 실제 출시된 게임에서는 이러한 문제가 발생하지 않아 정상적으로 표시됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. `CaptureAndUpload()` 함수를 추가하고 아래와 같이 작성합니다. ```lua [client only] void CaptureAndUpload() { local frameRUID = self.FrameEntity.SpriteRendererComponent.SpriteRUID local sprite = _ResourceService:LoadSpriteAndWait(frameRUID) -- frame 엔티티 스프라이트의 가로, 세
[task] | two_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | _SetSpriteUploadValidationCallback_ 함수에서 업로드 허용 여부를 제어하는 로직을 변경하여 특정 유저만 스크린샷 업로드를 허용하도록 수정하려면 어떤 코드가 필요할까요? [answer] | 제공된 참고 문서에는 `_ResourceService:SetSpriteUploadValidationCallback` 함수가 유저가 업로드 요청을 보냈을 때 **true** 또는 **false**를 반환하도록 콜백 함수를 설정하는 용도로 사용된다는 정보만 포함되어 있습니다. 문서에 명시된 예제는 모든 유저에게 `true`를 반환하도록 되어 있으며, **특정 유저 ID를 비교하여 조건부로 허용하는 로직이나, 유저 ID를 가져오는 구체적인 API/속성에 대한 설명은 문서에 없습니다.** 따라서 문서에 근거하여 "특정 유저만 허용"하는 [followup] | userId를 기준으로 허용 리스트를 검사하여 true 또는 false를 반환하는 Lua 5.3 코드 예제를 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 `_ResourceService:SetSpriteUploadValidationCallback` 함수가 `userId` 매개변수를 받는 콜백 함수를 등록하며, 해당 함수가 `true` 또는 `false`를 반환하여 업로드 허용 여부를 결정한다는 정보만 포함되어 있습니다. 문서에는 **허용 목록(allow list)을 저장하거나 관리하는 프로퍼티, 특정 유저 ID를 하드코딩하거나 동적으로 가져오는 API, 또는 유저 ID를 비교하는 로직에 대한 구체적인 가이드가 없습니다.** 따라서 문서에 명시된 `userId [scores] | [judge_reason] | [source_doc] | 특정 키를 눌러 스크린샷을 찍은 뒤 월드의 특정 위치에 보이도록 하는 예제를 살펴봅시다. 1. **Hierarchy - Create Entity - Create Empty**를 클릭해 **EmptyEntity**를 생성합니다. **EmptyEntity**의 이름을 **Frame**으로 지정합니다. 2. **Frame** 엔티티의 프로퍼티 에디터에서 **TransformComponent, SpriteRendererComponent**를 추가합니다. 3. **Frame** 엔티티의 프로퍼티
[task] | single_turn [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 카드를 클릭할 때와 짝이 맞아서 사라질 때 각각 다른 효과음을 재생하려면 OnCardClicked 함수 안에서 어떤 위치에 코드를 추가해야 하나요? [answer] | 카드를 클릭할 때와 짝이 맞아서 사라질 때 각각 다른 효과음을 재생하려면 `OnCardClicked` 함수 내부에서 두 가지 다른 상황에 따라 `_SoundService:PlaySound`를 호출하는 코드를 추가해야 합니다. **1. 카드를 클릭할 때 (선택/해제)** 카드가 선택되거나 해제될 때 재생할 효과음(예: `0c57ceb6897c4955b1a4e860c6895868`)은 `cardboard:SelectCard(newCard)` 또는 `cardboard:DeselectCard()` 호출 직후에 추가합니다. **2. 짝이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임을 다 만들었지만 어쩐지 심심한 느낌이 들지 않나요? 마지막으로 배경음악과 효과음을 추가해서 게임을 완성해봅시다. # 배경음악 설정하기 1. **Preset List - Background Music**을 선택합니다. 2. 원하는 BGM을 선택한 뒤, **Hierarchy - maps - map01**을 선택합니다. 프로퍼티 창에서 **SoundComponent**가 추가된 걸 확인할 수 있습니다. **Audio Play**를 눌러 음악을 확인합니다. **BGM, PlayOnEnable** 프로퍼티가 활성화 되어있는지
[task] | two_turn [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 카드가 매칭되어 소거될 때 `oldCard:SetDestroyed()`와 `newCard:SetDestroyed()`가 호출된 후, 해당 카드 객체에 대한 참조가 어떻게 처리되는지 궁금합니다. [answer] | 제공된 참고 문서에는 `oldCard:SetDestroyed()`와 `newCard:SetDestroyed()` 호출 후 해당 카드 객체의 참조가 어떻게 처리되는지(예: 메모리 해제, 참조 무효화, `nil` 대입 여부 등)에 대한 설명이 없습니다. 문서에는 매칭 성공 시 다음 순서로 동작한다는 것만 확인됩니다. 1. `cardboard:DeselectCard()` 호출 2. 효과음 재생 3. `oldCard:SetDestroyed()` 및 `newCard:SetDestroyed()` 호출 4. 추가 효과음 재생 5. 점수 추가 [followup] | `SetDestroyed()`가 호출된 카드 객체는 즉시 메모리에서 해제되는지, 아니면 GC에 의해 나중에 해제되는지, 그리고 소거된 카드가 다시 선택되지 않도록 `cardboard` 내부에서 어떤 방식으로 관리되는지 설명해 주세요. [followup_answer] | 제공된 참고 문서에는 `SetDestroyed()` 호출 후 카드 객체의 메모리 해제 방식(즉시 해제 또는 GC에 의한 지연 해제)에 대한 기술이 없으며, `cardboard` 내부에서 소거된 카드가 다시 선택되지 않도록 관리되는 구체적인 방식(데이터 구조 변경, 플래그 설정 등)에 대한 설명도 없습니다. 문서에서 확인할 수 있는 내용만으로는 해당 메커니즘을 설명할 수 없습니다. [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true self.RemainingTime = self
[task] | two_turn [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | 메이플스토리 월드에서 엔티티에 머티리얼을 적용하여 스프라이트 렌더링 효과를 변경하는 일반적인 절차는 무엇인가요? [answer] | 메이플스토리 월드에서 엔티티에 머티리얼을 적용하여 스프라이트 렌더링 효과를 변경하는 일반적인 절차는 다음과 같습니다. 1. **머티리얼 생성** - Workspace의 `[+]` 버튼, Workspace 콘텍스트 메뉴, 또는 Create 메뉴를 통해 새로운 머티리얼을 생성합니다. - 생성한 머티리얼에 이름을 지정합니다. 2. **엔티티에 머티리얼 적용 (에디터 설정)** - 대상 엔티티를 선택합니다. - 프로퍼티 에디터에서 `SpriteRendererComponent`를 찾은 후 `MaterialID` 항목 [followup] | 특정 엔티티의 SpriteRendererComponent에 MaterialID를 설정하고, Reference 창에서 원하는 머티리얼을 선택한 후 Shader 타입을 지정하는 구체적인 UI操作步骤와, Shader 필터 기능을 활용하여 컴포넌트에서 사용할 수 있는 셰이더만 추려보는 방법은 무엇인가요? [followup_answer] | 참고 문서에 제공된 정보에 따르면, SpriteRendererComponent의 MaterialID 설정 및 Shader 필터 활용에 대한 구체적인 UI操作步骤(단계)는 다음과 같습니다. **1. MaterialID 설정 및 머티리얼 선택** 1. 대상 엔티티를 선택합니다. 2. 프로퍼티 에디터에서 `SpriteRendererComponent`를 찾습니다. 3. `MaterialID` 항목 옆의 버튼을 클릭합니다. 4. 자동으로 열리는 **Reference** 창에서 적용할 머티리얼을 선택합니다. **2. Shader 타 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 머티리얼(Material)은 다양한 프로퍼티를 통해 엔티티가 렌더링될 방법을 나타내는 객체입니다. 엔티티의 프로퍼티는 엔티티를 렌더링하는 코드에 따라 변경됩니다. 셰이더(Shader)란 물체를 렌더링할 때 사용할 코드(또는 스크립트)입니다. 셰이더의 프로퍼티 및 코드는 동적으로 변경될 수 없기 때문에, 셰이더마다 표현하는 효과가 다르게 나타납니다. 메이플스토리 월드에서는 다양한 셰이더를 제공합니다. 크리에이터는 머티리얼을 생성하고 원하는 의도에 맞게 셰이더 프로퍼티를 조절할 수 있습니다. # 머티리얼 생성하기
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | KeyDownEvent 핸들러에서 KeyboardKey.Alpha1 키 입력을 감지하여 스크린샷 촬영을 트리거하는 코드는 어떻게 작성하나요? [answer] | KeyDownEvent 핸들러에서 `KeyboardKey.Alpha1`을 감지하여 스크린샷 촬영을 트리거하는 코드는 아래와 같이 작성합니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { -- Parameters local key = event.key -------------------------------------------------------- -- 키보드에서 1을 누르면 스크린샷을 촬영 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. `CaptureAndUpload()` 함수를 추가하고 아래와 같이 작성합니다. ```lua [client only] void CaptureAndUpload() { local frameRUID = self.FrameEntity.SpriteRendererComponent.SpriteRUID local sprite = _ResourceService:LoadSpriteAndWait(frameRUID) -- frame 엔티티 스프라이트의 가로, 세
[task] | two_turn [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | 카드 짝 맞추기 게임에서 카드 엔티티를 초기화하거나 선택 상태를 관리하는 로직을 어떻게 구현합니까? [answer] | 카드 짝 맞추기 게임에서 카드 엔티티의 초기화(스폰/소거)와 선택 상태 관리 로직은 `Card` 스크립트와 `CardPairGameLogic` 스크립트 두 가지 레벨에서 구현됩니다. ### 1. 카드 엔티티 레벨 (`Card` 스크립트) 개별 카드의 시각적 상태(선택됨/미선택)를 관리하고, 클릭 이벤트를 상위 로직으로 전달합니다. **핵심 메서드:** * **`CardOn()` / `CardOff()`**: 카드의 `SpriteGUIRendererComponent.Color`를 변경하여 선택 상태를 시각적으로 표현합니다. 선 [followup] | [client only] 환경에서 `ClearCardEntities` 메서드가 카드 스폰 루트의 자식들을 순회하며 `Destroy`를 호출하는 구조는 무엇이며, `SelectCardCard`에서 `CardOn`을 호출할 때 주의해야 할 점은 무엇입니까? [followup_answer] | 참고 문서에 근거하여 `[client only]` 환경에서의 `ClearCardEntities` 구조와 `SelectCardCard`의 `CardOn` 호출 시 주의점을 설명합니다. ### 1. `ClearCardEntities` 메서드의 구조 `ClearCardEntities`는 카드 스폰 루트(`CardSpawnRoot`)에 존재하는 모든 카드 엔티티를 초기화(제거)하기 위해 사용됩니다. 구현 구조는 다음과 같습니다. 1. **자식 엔티티 목록 조회**: `self.CardSpawnRoot.Children`을 통해 스폰 루 [scores] | [judge_reason] | [source_doc] | [client Only] void ClearCardEntities () { local cardEntities = self.CardSpawnRoot.Children for i = 1, #cardEntities do cardEntities[i]:Destroy() end } [client only] void SelectCardCard (Card card) { self.SelectedCard = card card:CardOn() } [client only] void
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | CaptureFullScreenAsPixelDataAndWait 함수 호출 시 error 변수에 값이 들어오는 경우의 원인은 무엇인가요? [answer] | `_ScreenshotService:CaptureFullScreenAsPixelDataAndWait()` 함수 호출 시 `error` 변수에 값이 들어오는 경우, 스크린샷 촬영이 실패했음을 의미합니다. 제공된 참고 문서에는 이 `error` 값의 구체적인 원인(예: 권한 부족, 메모리 부족 등)에 대한 명시적인 설명이 없습니다. 다만, 문서의 '더 알아보기' 섹션에서 스크린샷 관련 리소스 업로드 시 주의해야 할 사항을 언급하고 있으며, 이는 촬영된 이미지를 처리하는 과정과 연관이 있을 수 있습니다. 1. **업로드 제한 사항* [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. `CaptureAndUpload()` 함수를 추가하고 아래와 같이 작성합니다. ```lua [client only] void CaptureAndUpload() { local frameRUID = self.FrameEntity.SpriteRendererComponent.SpriteRUID local sprite = _ResourceService:LoadSpriteAndWait(frameRUID) -- frame 엔티티 스프라이트의 가로, 세