[task] | single_turn [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | Vignette 효과를 적용하려고 하는데 CameraComponent가 아닌 다른 객체에 적용하면 왜 에러가 발생하나요? [answer] | Vignette(비네트) 효과는 스크린 전체에 영향을 주는 화면 포스트 프로세싱(Post-Processing) 효과이기 때문에, 카메라 렌더링 파이프라인의 최종 단계에서만 적용할 수 있습니다. 참고 문서의 정의에 따르면, Screen 카테고리( LensDistortion, Vignette)의 효과는 **CameraComponent에만 적용할 수 있습니다**. 따라서 다른 객체(예: 일반 Entity의 SpriteRendererComponent 등)에 이 효과를 적용하려고 하면 해당 효과가 카메라 렌더링 컨텍스트가 아니기 때문에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스프라이트의 색상이 적용되는 방식을 다양한 형태로 변형하는 효과입니다. | @cols=2:@rows=1:셰이더 | 설명 | | :---: | --- | --- | | BlendDarken| | 각 RGB 채널에서 더 작은 값을 사용해 어둡게 만듭니다.| | BlendMultiply| | 두 색상을 곱한 결과물을 표현합니다. | | BlendColorBurn| | 채도는 높이고 대비를 증대시키며 기본 색상을 어둡게 합니다. | | BlendLinearBurn| | 원본 스프라이트의 색상 대비는 유지하되 색상을
[task] | single_turn [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | ColorEffect 셰이더에서 LineGradient와 VertexGradient는 각각 어떤 기준을 따라 색상을 블렌딩하는 차이점이 있나요? [answer] | ColorEffect 셰이더에서 `LineGradient`와 `VertexGradient`의 색상 블렌딩 기준은 다음과 같습니다. * **LineGradient**: **Y 축**을 기준으로 4개 색상을 점차적으로 블렌딩합니다. * **VertexGradient**: **꼭짓점**의 색상 4개를 기준으로 점차적으로 블렌딩합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 머티리얼(Material)은 다양한 프로퍼티를 통해 엔티티가 렌더링될 방법을 나타내는 객체입니다. 엔티티의 프로퍼티는 엔티티를 렌더링하는 코드에 따라 변경됩니다. 셰이더(Shader)란 물체를 렌더링할 때 사용할 코드(또는 스크립트)입니다. 셰이더의 프로퍼티 및 코드는 동적으로 변경될 수 없기 때문에, 셰이더마다 표현하는 효과가 다르게 나타납니다. 메이플스토리 월드에서는 다양한 셰이더를 제공합니다. 크리에이터는 머티리얼을 생성하고 원하는 의도에 맞게 셰이더 프로퍼티를 조절할 수 있습니다. # 머티리얼 생성하기
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | 단일 Entity 타입만 반환하는 함수에 Return Annotation을 적용하면, 호출 측에서 어떤 형태의 코드 자동완성이나 타입 체크를 기대할 수 있나요? [answer] | Return Annotation을 적용하면, 해당 함수가 특정 타입(예: `Entity`)을 반환한다는 정보가 스크립트 어시스트에 전달됩니다. 이를 통해 호출 측에서 다음과 같은 자동완성 및 타입 체크를 기대할 수 있습니다. 1. **자동완성(Autocomplete) 지원**: * 함수의 반환 값으로 받은 변수에 대해 해당 타입(`Entity`)이 가진 프로퍼티나 메서드 목록을 자동완성으로 확인할 수 있습니다. * 예시: `local myEntity = GetMyEntity()` 이후 `myEntity.` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Param Annotation**을 사용해 대상이 되는 함수의 매개 변수 타입을 지정하여 스크립트 어시스트의 도움을 받을 수 있습니다. **Param Annotation**은 함수 정의문에 사용합니다. 아래와 같은 문법으로 **Param Annotation**을 사용합니다. ```lua ---@param param_name PARAM_TYPE ``` ##### 사용 예시 ```lua ---@param testParamA Entity local function TestFunction(testParamA) end ``` ```
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 동적 스프라이트의 정의와 RawImage, RUID와의 관계에 대해 3문장 이내로 설명하세요. [answer] | 동적 스프라이트는 월드 플레이 도중 생성된 이미지를 월드에 업로드하여 다른 유저와 공유할 수 있도록 하는 것을 의미합니다. 이러한 이미지는 RawImage 데이터 타입에 담겨 월드에 업로드됩니다. 업로드가 완료되면 RUID가 발급되며, 이 RUID를 통해 해당 동적 스프라이트를 월드에서 사용할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | single_turn [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | cardboard:IsEmpty()가 참일 때 _SoundService:PlaySound에 볼륨 1을 전달하는 이유는 다른 소리들보다 크게 재생하려는 의도인가요? [answer] | 제공된 참고 문서에는 `_SoundService:PlaySound` 호출 시 볼륨 파라미터의 값(0.7 또는 1)을 특정 의도로 설정한 배경이나 설계 취지에 대한 설명이 포함되어 있지 않습니다. 따라서 문서의 내용만으로는 `cardboard:IsEmpty()`가 참일 때 볼륨 1을 전달하는 것이 다른 소리들보다 크게 재생하려는 의도인지에 대해 답변할 수 없습니다. [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] | _SoundService:PlaySound 함수를 사용할 때 두 번째 매개변수로 입력하는 값이 무엇이며, 배경음악과 효과음의 볼륨을 어떻게 조절하나요? [answer] | `_SoundService:PlaySound` 함수의 두 번째 매개변수는 **음량(Volume)** 입니다. 참고 문서에 제공된 예제 코드에서는 이 값으로 `0.7` 또는 `1`을 입력하고 있습니다. * 카드 선택/해제, 짝 맞추기 효과음: `0.7` * 새로운 카드판 등장 효과음: `1` **볼륨 조절 방법** 1. **효과음 볼륨 조절**: `_SoundService:PlaySound` 함수 호출 시 두 번째 매개변수의 숫자 값을 변경하여 조절합니다. ```lua _SoundService:PlaySo [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] | 스프라이트 좌표를 왜곡하는 셰이더 중 Noise와 Wave의 차이점은 무엇인가요? [answer] | Noise 셰이더는 엔티티가 지속적으로 흔들리는 효과를 만들어 줍니다. 반면 Wave 셰이더는 특정 지점을 중심으로 원형 파동이 그려지는 효과를 적용합니다. 즉, Noise는 전체적인 흔들림에 초점을 맞춘 반면, Wave는 지정된 지점에서의 파동 확산 효과를 나타냅니다. [followup] | Glitch 셰이더와 Noise 셰이더를 동시에 적용할 때 발생할 수 있는 시각적 충돌 예외 상황은 무엇이며, 이를 방지하기 위한 mLua 스크립트 로직은 어떻게 작성하나요? [followup_answer] | Glitch 셰이더와 Noise 셰이더를 동시에 적용할 때 발생할 수 있는 시각적 충돌 예외 상황은 참고 문서에 명시되어 있지 않습니다. 또한, 이러한 충돌을 방지하기 위한 mLua 스크립트 로직에 대한 정보도 문서에 포함되어 있지 않습니다. 문서에는 Glitch 셰이더가 "무작위로 스프라이트의 다른 구역을 샘플링"하고, Noise 셰이더가 "지속적으로 엔티티가 흔들리는" 효과를 가진다는 설명만 있을 뿐, 두 셰이더의 병행 적용 시 부작용이나 방지 로직에 관한 내용은 없습니다. [scores] | [judge_reason] | [source_doc] | 스프라이트 좌표를 왜곡하는 효과입니다. | @cols=2:@rows=1:셰이더 | 설명 | | :---: | --- | --- | | Noise | | 지속적으로 엔티티가 흔들립니다.| | RoundWave| | 중심 기준으로 동심원 파동을 그립니다. | | UVScroll| | 스프라이트 렌더링할 때 UV 좌표를 이동시킵니다. | | Wave| | 특정 지점에서 원형 파동을 그립니다. | | Glitch| | 무작위로 스프라이트의 다른 구역을 샘플링합니다. | | GrassMovement| | 풀이 흔들리는
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | AlphaBlend와 Screen 카테고리에서 사용할 수 있는 모든 셰이더 이름과 그 효과를 표로 정리하세요. [answer] | AlphaBlend와 Screen 카테고리에서 사용할 수 있는 셰이더와 그 효과는 다음과 같습니다. **AlphaBlend** (셰이더의 투명도를 변경하는 효과) | 셰이더 이름 | 효과 설명 | | :--- | :--- | | Additive | 물체 앞에 렌더링할 때 Additive 효과를 적용합니다. | | SoftAdditive | 물체 앞에 렌더링할 때 SoftAdditive 효과를 적용합니다. | **Screen** (스크린 전체에 적용하는 효과. **CameraComponent**에만 적용 가능) | 셰이더 이름 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스프라이트의 색상이 적용되는 방식을 다양한 형태로 변형하는 효과입니다. | @cols=2:@rows=1:셰이더 | 설명 | | :---: | --- | --- | | BlendDarken| | 각 RGB 채널에서 더 작은 값을 사용해 어둡게 만듭니다.| | BlendMultiply| | 두 색상을 곱한 결과물을 표현합니다. | | BlendColorBurn| | 채도는 높이고 대비를 증대시키며 기본 색상을 어둡게 합니다. | | BlendLinearBurn| | 원본 스프라이트의 색상 대비는 유지하되 색상을
[task] | single_turn [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | OnCardClicked 이벤트 핸들러에서 _SoundService:PlaySound 메서드의 두 번째 인자로 전달하는 숫자 0.7의 구체적인 의미와 역할이 무엇인가요? [answer] | 제공된 참고 문서에는 `_SoundService:PlaySound` 메서드의 두 번째 인자 `0.7`이 **음량(Volume)**을 나타낸다는 명시적인 설명이 포함되어 있지 않습니다. 문서에서는 카드 선택 시(`cardboard:SelectCard`), 매칭 성공 시(`oldCard:SetDestroyed` 등), 그리고 보드 리셋 시(`cardboard:SetCards`)에 해당 메서드를 호출하는 코드 예제만 제시하고 있을 뿐, 파라미터의 구체적인 의미(음량, 지연 시간 등)에 대한 기술적 정의가 없습니다. 따라서 주어진 문서 [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] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 스프린샷 업로드 검증 콜백이 서버에서만 실행되도록 OnBeginPlay() 함수 내부의 조건문과 로직을 3문장 이내로 설명하세요. [answer] | `OnBeginPlay()` 함수에서 `self:IsServer()`를 확인하여 현재 실행 공간이 서버인지 판별합니다. 서버인 경우에만 `_ResourceService:SetSpriteUploadValidationCallback`을 등록하여 스크린샷 업로드 요청을 허용하는 `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] | code [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | 여러 값을 반환하는 함수와 함께 Entity 타입의 값을 동시에 초기화할 때, 괄호를 사용하여 (function(paramA:string, paramB:Entity):AttackComponent, string), Entity 형태의 복합 타입을 지정하는 스크립트를 작성해줘 [answer] | 요청하신 형식인 `(function(paramA:string, paramB:Entity):AttackComponent, string), Entity` 복합 타입을 사용하여 함수와 Entity를 동시에 초기화하는 mLua 스크립트 예제는 다음과 같습니다. ```lua Method: [server only] void InitializeComplexType() { ---@type (function(paramA:string, paramB:Entity):AttackComponent, string), Entity local t [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Function은 아래와 같은 문법으로 타입을 지정합니다. ```lua ---@type function(param_name: PARAM_TYPE):RETURN_TYPE ``` ##### 사용 예시 ```lua ---@type function() local testFunction = function() end ``` ```lua ---@type function(testParamA:string, testParamB:Entity) local testFunction = function(testParamA, testParamB) end
[task] | single_turn [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | Hologram 셰이더와 LimLight 셰이더 모두 빛 효과를 출력하는데, 두 셰이더가 표현하는 빛의 방향性或 성격이 어떻게 다른가요? [answer] | Hologram 셰이더와 LimLight 셰이더는 모두 빛 효과를 표현하지만, 빛의 방향성과 성격에서 명확한 차이가 있습니다. **Hologram** 셰이더는 **일정한 방향**으로 색상 있는 빛 효과를 출력합니다. 즉, 특정 방향성을 가진 빛의 흐름이나 반사 효과를 강조하여 표현합니다. **LimLight** 셰이더는 **밝은 빛 효과**를 출력합니다. 방향성보다는 빛 자체의 밝기나 발광 효과를 중심으로 표현하며, 특정 방향을 지향하기보다는 광범위하게 밝은 빛을 나타내는 데 초점이 맞춰져 있습니다. 따라서, 특정 방향으로 빛 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 머티리얼(Material)은 다양한 프로퍼티를 통해 엔티티가 렌더링될 방법을 나타내는 객체입니다. 엔티티의 프로퍼티는 엔티티를 렌더링하는 코드에 따라 변경됩니다. 셰이더(Shader)란 물체를 렌더링할 때 사용할 코드(또는 스크립트)입니다. 셰이더의 프로퍼티 및 코드는 동적으로 변경될 수 없기 때문에, 셰이더마다 표현하는 효과가 다르게 나타납니다. 메이플스토리 월드에서는 다양한 셰이더를 제공합니다. 크리에이터는 머티리얼을 생성하고 원하는 의도에 맞게 셰이더 프로퍼티를 조절할 수 있습니다. # 머티리얼 생성하기
[task] | single_turn [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | PlaySound 메서드에 전달하는 첫 번째 인자(예: "0c57ceb6897c4955b1a4e860c6895868")가 어떤 형식의 식별자이며, 이 값을 직접 수정하거나 생성하는 과정은 어떻게 되나요? [answer] | 참고 문서에 `_SoundService:PlaySound` 메서드의 첫 번째 인자가 어떤 형식의 식별자인지(예: UUID, 파일 경로 등)에 대한 설명이 없습니다. 또한 해당 값을 직접 수정하거나 생성하는 과정에 대한 정보도 문서에 포함되어 있지 않습니다. 문서에 나와 있는 것은 `_SoundService:PlaySound("0c57ceb6897c4955b1a4e860c6895868", 0.7)`과 같이 문자열 인자를 전달하여 소리를 재생하는 코드 예시뿐이며, 이 문자열이 어떻게 생성되었는지나 그 의미를 설명하는 내용은 없습니다. [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] | Type Annotation 문법을 사용하여 매개변수 타입이 string, Entity, AttackComponent로 지정된 함수를 정의하고, 이 함수를 호출하여 string과 boolean을 반환받기 위한 스크립트를 작성해줘 [answer] | 요청하신 조건(매개변수 `string`, `Entity`, `AttackComponent` / 반환값 `string`, `boolean`)에 맞는 Type Annotation을 적용한 스크립트입니다. mLua에서 함수의 매개변수 타입과 반환 타입을 지정하기 위해서는 `---@type function(...):...` 문법을 사용합니다. 매개변수는 쉼표(,)로 구분하고, 반환 타입도 쉼표로 구분하여 지정합니다. ```lua Method: [server only] void OnBeginPlay() { -- 매개변수: stri [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Function은 아래와 같은 문법으로 타입을 지정합니다. ```lua ---@type function(param_name: PARAM_TYPE):RETURN_TYPE ``` ##### 사용 예시 ```lua ---@type function() local testFunction = function() end ``` ```lua ---@type function(testParamA:string, testParamB:Entity) local testFunction = function(testParamA, testParamB) end
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | Frame과 Canvas 엔티티의 구조 및 각 엔티티에 추가해야 하는 컴포넌트 목록을 표로 정리하세요. [answer] | Frame과 Canvas 엔티티의 구조 및 각 엔티티에 추가해야 하는 컴포넌트는 다음과 같습니다. | 엔티티 이름 | 부모 엔티티 | 추가 컴포넌트 | | :--- | :--- | :--- | | **Frame** | (없음) | `TransformComponent`, `SpriteRendererComponent` | | **Canvas** | **Frame** | `TransformComponent`, `SpriteRendererComponent` | [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] | OnUpdate에서 self.RemainingTime이 0 이하가 되면 EndGame이 호출되는데, 이 과정에서 게임 로직이 서버와 클라이언트 간에 동기화되는지 확인하는 방법이 궁금합니다. [answer] | 제시된 참고 문서의 예제 코드에서 `OnUpdate`와 `EndGame` 메서드는 모두 `[client only]` 태그가 붙어 있어, 이 로직은 클라이언트에서만 실행됩니다. 문서에는 `EndGame` 호출 시 서버와 클라이언트 간에 게임 로직(예: 점수, 게임 종료 상태 등)이 어떻게 동기화되는지에 대한 메서드나 API가 명시되어 있지 않습니다. 참고 문서에 포함된 `_UserService`와 `PlayerStats:AddScore`는 점수 업데이트를 위한 것이지만, 이것이 서버로 동기화되는 메커니즘이나 `EndGame` 상태의 [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] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | SpriteUploadTest 스크립트 컴포넌트의 Property 블록과 OnBeginPlay() 함수 코드를 출력하되, 설명은 주석으로만 작성하세요. [answer] | ```lua Property: [None] Entity FrameEntity = /maps/map01/Frame [None] Entity CanvasEntity = /maps/map01/Frame/Canvas Method: void OnBeginPlay() { if self:IsServer() then -- 유저가 업로드 요청을 보냈을 때 이를 허용하기 위해 true로 설정합니다. _ResourceService:SetSpriteUploadValidationCallback(function(user [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] | 엔티티에 머티리얼을 적용할 때 SpriteRendererComponent의 MaterialID 설정 후 Reference 창에서 셰이더 타입을 지정하는 순서와 필터 기능을 활용한 선택 방법은 어떻게 되나요? [answer] | 엔티티에 머티리얼을 적용하는 과정은 다음과 같은 순서로 진행됩니다. 1. **엔티티 선택 및 MaterialID 설정** * 대상 엔티티를 선택합니다. * **프로퍼티 에디터**에서 `SpriteRendererComponent`를 찾은 후, `MaterialID` 옆의 버튼을 클릭합니다. 2. **Reference 창에서 머티리얼 선택** * 열릴 **Reference** 창에서 적용할 머티리얼을 선택합니다. 3. **셰이더 타입 지정** * 선택한 머티리얼에 사용할 **Shad [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 머티리얼(Material)은 다양한 프로퍼티를 통해 엔티티가 렌더링될 방법을 나타내는 객체입니다. 엔티티의 프로퍼티는 엔티티를 렌더링하는 코드에 따라 변경됩니다. 셰이더(Shader)란 물체를 렌더링할 때 사용할 코드(또는 스크립트)입니다. 셰이더의 프로퍼티 및 코드는 동적으로 변경될 수 없기 때문에, 셰이더마다 표현하는 효과가 다르게 나타납니다. 메이플스토리 월드에서는 다양한 셰이더를 제공합니다. 크리에이터는 머티리얼을 생성하고 원하는 의도에 맞게 셰이더 프로퍼티를 조절할 수 있습니다. # 머티리얼 생성하기
[task] | single_turn [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | isvalid 함수를 사용해서 card와 cardboard의 유효성을 체크하는 방식이 mLua의 표준적인 객체 존재 확인 방법인가요? [answer] | 제공된 참고 문서 내에서 `isvalid` 함수는 `card`와 `cardboard` 객체가 유효한지(존재하는지) 확인하는 데 사용되었습니다. 문서에 따르면, `isvalid` 함수는 객체의 유효성을 체크하는 표준적인 방법으로 사용되며, 아래 예시처럼 함수 인자로 객체를 전달하여 `true` 또는 `false`를 반환하도록 호출합니다. ```lua if isvalid(card) == false then return end local cardboard = self.CardPairGameUI.CardBoard if isv [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] | Blurry 카테고리에서 KuwaharaFilter 셰이더의 Intensity 값을 조절할 때 수채화 느낌이 가장 잘 살아나는 수치 범위는 어디까지이며, 도트 이미지에서 효과가 미미한 경우를 보완하기 위한 코드 예제는 어떻게 작성하나요? [answer] | 제공된 문서에는 KuwaharaFilter 셰이더의 `Intensity` 값에 대한 구체적인 수치 범위(예: 0.5~2.0 등)가 명시되어 있지 않습니다. 문서에는 "Intensity를 조절하면 수채화 느낌을 표현할 수 있습니다"라는 설명만 존재할 뿐, 최적의 수치를 찾을 수 있는 가이드라인은 없습니다. 또한, 도트 이미지에서 효과가 미미한 경우를 보완하기 위한 구체적인 **mLua 스크립트 코드 예제**도 문서에 포함되어 있지 않습니다. 문서에는 도트 이미지 사용 시 큰 차이를 느끼기 어렵다는 사실만 언급되어 있을 뿐, 이를 극 [followup] | AlphaMask 카테고리의 Mask 셰이더를 사용하여 특정 영역만 마스킹하려면 MaskTexture 인수를 어떻게 설정해야 하며, mLua에서 런타임에 MaskTexture 값을 동적으로 변경하는 코드는 어떻게 작성하나요? [followup_answer] | AlphaMask 카테고리의 Mask 셰이더를 사용할 때, 특정 영역을 마스킹하려면 `MaskTexture` 인수로 텍스처 ID를 설정해야 합니다. 참고 문서에 제시된 예시에서는 `MaskTexture` 값으로 `0005fdee112f4ab8a59764021ac1dda0`을 적용하는 것이 언급되어 있습니다. 그러나 제공된 문서에는 mLua를 통해 런타임에 `MaskTexture` 값을 동적으로 변경하는 방법이나 관련 API, 프로퍼티, 코드 예제가 포함되어 있지 않습니다. 따라서 mLua 코드를 작성하여 런타임에 MaskTextu [scores] | [judge_reason] | [source_doc] | 스프라이트 좌표를 왜곡하는 효과입니다. | @cols=2:@rows=1:셰이더 | 설명 | | :---: | --- | --- | | Noise | | 지속적으로 엔티티가 흔들립니다.| | RoundWave| | 중심 기준으로 동심원 파동을 그립니다. | | UVScroll| | 스프라이트 렌더링할 때 UV 좌표를 이동시킵니다. | | Wave| | 특정 지점에서 원형 파동을 그립니다. | | Glitch| | 무작위로 스프라이트의 다른 구역을 샘플링합니다. | | GrassMovement| | 풀이 흔들리는
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | CaptureFullScreenAsPixelDataAndWait() 함수를 호출할 때 캡처 결과가 어떤 데이터 타입으로 반환되는지 알고 싶습니다. [answer] | `CaptureFullScreenAsPixelDataAndWait()` 함수를 호출하면 캡처 결과가 **RawImage** 데이터 타입으로 반환됩니다. 참고로, 이 RawImage 데이터는 `_ResourceService:RequestSpriteUploadAsync()`를 통해 월드에 업로드하여 스프라이트 리소스로 만들 수 있으며, 업로드가 완료되면 스프라이트를 식별하기 위한 **RUID**가 발급됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | single_turn [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 배경음악은 Hierarchy의 map01에 SoundComponent를 추가하는 방식인데, 효과음은 왜 특정 스크립트 함수 안에서 직접 호출해야 하나요? [answer] | 배경음악과 효과음이 다른 방식으로 구현되는 이유는 두 사운드의 **재생 시점과 목적**이 다르기 때문입니다. **1. 배경음악 (BGM): 자동 재생** 배경음악은 월드에 입장하는 순간부터 끝까지 계속 재생되어야 하는 지속적 사운드입니다. * **구현 방식:** Hierarchy에서 `maps/map01`을 선택했을 때 자동으로 추가되는 `SoundComponent`를 사용합니다. * **원리:** `SoundComponent`의 `BGM`과 `PlayOnEnable` 프로퍼티가 활성화되어 있으면, 해당 엔티티(map01) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임을 다 만들었지만 어쩐지 심심한 느낌이 들지 않나요? 마지막으로 배경음악과 효과음을 추가해서 게임을 완성해봅시다. # 배경음악 설정하기 1. **Preset List - Background Music**을 선택합니다. 2. 원하는 BGM을 선택한 뒤, **Hierarchy - maps - map01**을 선택합니다. 프로퍼티 창에서 **SoundComponent**가 추가된 걸 확인할 수 있습니다. **Audio Play**를 눌러 음악을 확인합니다. **BGM, PlayOnEnable** 프로퍼티가 활성화 되어있는지
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 머티리얼 활용하기 [question] | 셰이더 타입별 제공되는 구체적인 효과 이름을 3개 이상씩 나열하고, 각 효과의 핵심 동작을 한 문장으로 설명하는 표로 정리하세요. [answer] | 제공된 문서에 따르면, 셰이더 타입별로 제공되는 구체적인 효과 이름과 핵심 동작은 다음과 같습니다. **Outline** | 효과 이름 | 핵심 동작 | | :--- | :--- | | Outline | 스프라이트 바깥쪽으로 외곽선을 그립니다. | | InnerOutline | 스프라이트 안쪽으로 외곽선을 그립니다. | | ColorDiffOutline | 스프라이트 색상 차이를 이용해 외곽선을 그립니다. | **ColorEffect** | 효과 이름 | 핵심 동작 | | :--- | :--- | | Rainbow | 무지개 색 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 머티리얼(Material)은 다양한 프로퍼티를 통해 엔티티가 렌더링될 방법을 나타내는 객체입니다. 엔티티의 프로퍼티는 엔티티를 렌더링하는 코드에 따라 변경됩니다. 셰이더(Shader)란 물체를 렌더링할 때 사용할 코드(또는 스크립트)입니다. 셰이더의 프로퍼티 및 코드는 동적으로 변경될 수 없기 때문에, 셰이더마다 표현하는 효과가 다르게 나타납니다. 메이플스토리 월드에서는 다양한 셰이더를 제공합니다. 크리에이터는 머티리얼을 생성하고 원하는 의도에 맞게 셰이더 프로퍼티를 조절할 수 있습니다. # 머티리얼 생성하기
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | SetSpriteUploadValidationCallback 함수에서 false를 반환하면 어떤 현상이 발생합니까? [answer] | `SetSpriteUploadValidationCallback` 함수에서 콜백 함수가 `false`를 반환하면, 해당 유저의 스크린샷 업로드 요청이 **허용되지 않습니다**. 즉, 유저가 스크린샷을 찍어 월드에 표시하려는 요청을 보내도 서버가 이를 거부하여 스크린샷이 월드에 올라오지 않습니다. 반대로 `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] | 스크린샷을 월드에 업로드하는 과정에서 RawImage 데이터 타입을 사용하는 이유는 무엇인가요? [answer] | 스크린샷을 월드에 업로드하는 과정에서 `RawImage` 데이터 타입을 사용하는 이유는, 플레이 도중 생성된 이미지(동적 스프라이트)를 월드에 업로드하고 `RUID`를 발급받아 사용하려면 **`RawImage`라는 데이터 타입에 담아야 하기 때문**입니다. `ScreenshotService`의 `CaptureFullScreenAsPixelDataAndWait()` 함수를 호출하면 캡처 결과가 `RawImage` 형태의 픽셀 데이터(`pixelData`)로 반환되며, 이 데이터를 `_ResourceService:RequestSpri [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | code [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 남은 시간이 0 이하가 되면 CardPairGameUI 컴포넌트의 Enable 속성을 false 로 설정하여 게임을 종료하는 OnUpdate 메서드를 구현하는 스크립트를 작성해줘 [answer] | 남은 시간이 0 이하가 되면 `CardPairGameUI` 컴포넌트의 `Enable` 속성을 `false`로 설정하여 게임을 종료하는 스크립트는 다음과 같습니다. ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] [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] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 스크린샷을 월드에 업로드하고 다른 유저와 공유하는 과정의 핵심 키워드를 표로 정리해서 출력하세요. [answer] | 스크린샷을 월드에 업로드하고 다른 유저와 공유하는 과정의 핵심 키워드는 다음과 같습니다. | 구분 | 키워드 | 설명 | | :--- | :--- | :--- | | **데이터 타입** | `RawImage` | 플레이 도중 생성된 이미지(스크린샷)를 담는 데이터 타입입니다. | | **식별자** | `RUID` | 업로드된 스프라이트 리소스를 월드 내에서 식별하고 참조하기 위해 발급되는 고유 ID입니다. | | **캡처 API** | `CaptureFullScreenAsPixelDataAndWait()` | `_Screensho [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | ScreenshotService의 CaptureFullScreenAsPixelDataAndWait() 함수를 사용해 캡처 결과를 RawImage 형태로 반환하는 예제 코드를 주석으로만 작성하여 출력하세요. [answer] | ```lua [client only] void CaptureScreenshotAndUpload() { -- 스크린샷을 찍어 데이터화합니다. local screenshotError, pixelData = _ScreenshotService:CaptureFullScreenAsPixelDataAndWait() -- 스크린샷을 찍는 과정에서 오류가 발생했는지 확인합니다. if screenshotError ~= ScreenshotError.Success then log_error("Failed to capture screen [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 스크립트에서 FrameEntity와 CanvasEntity를 참조할 때 왜 /maps/map01/Frame 같은 경로 문자열을 직접 입력해야 하는가요? [answer] | 제시된 참고 문서에는 `FrameEntity`와 `CanvasEntity` 프로퍼티에 `/maps/map01/Frame`과 같은 경로 문자열을 직접 입력해야 하는 **기술적인 이유나 내부 동작 원리**에 대한 설명이 포함되어 있지 않습니다. 문서에서는 해당 값이 어떻게 설정되는지(9번 단계)와 `OnBeginPlay()`에서 `_ResourceService:SetSpriteUploadValidationCallback`을 통해 업로드를 허용하는 로직(10번 단계)만 안내하고 있을 뿐, 경로 문자열을 사용해야 하는 근본적인 이유는 언 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 키를 눌러 스크린샷을 찍은 뒤 월드의 특정 위치에 보이도록 하는 예제를 살펴봅시다. 1. **Hierarchy - Create Entity - Create Empty**를 클릭해 **EmptyEntity**를 생성합니다. **EmptyEntity**의 이름을 **Frame**으로 지정합니다. 2. **Frame** 엔티티의 프로퍼티 에디터에서 **TransformComponent, SpriteRendererComponent**를 추가합니다. 3. **Frame** 엔티티의 프로퍼티
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 아바타 상품 만들기 [question] | 아바타 상품 등록 과정에서 등록비 결제 전의 상태를 1문장 이내로 설명하세요. [answer] | 상품 등록 후 등록비를 결제하기 전 단계로 '결제 대기' 상태입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 크리에이터는 직접 제작한 아바타 아이템을 판매할 수 있습니다. 이번 가이드에서는 제작한 아바타 아이템 판매 방법을 알아봅니다. 판매하기 전에 아바타 아이템을 제작하고 등록하는 방법은 아래 가이드를 참고해 봅시다. ##### 참고 가이드 * [아바타 아이템 제작](/docs/?postId=582) > **더 알아보기** > 아이템 제작, 판매할 때는 [메이플스토리 월드 크리에이터 운영정책](https://maplestoryworlds.nexon.com/legal/policy/699)을