[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | SpriteRendererComponent의 SpriteRUID를 임의로 변경할 경우 화살 스프라이트가 안 보일 수 있는데, 이 값을 찾을 수 있는 방법은 무엇인가요? [answer] | SpriteRendererComponent의 `SpriteRUID` 값을 찾으려면 **SpriteRUID를 직접 생성하거나 임의로 입력하는 것이 아니라, 에디터에서 제공되는 스프라이트 리소스를 선택하는 과정**을 거쳐야 합니다. 참고 문서에 따르면, `SpriteRUID`는 원하는 것을 사용해도 무방하지만, 특정 값(예: `82013caa86844d32853f8433266ef25e`)이 예제로 제시되어 있습니다. 이 값은 화살 형태의 스프라이트를 가리키는 고유 식별자입니다. **SpriteRUID 값을 찾을 수 있는 방법:** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | two_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 중력 센서 사용하기 [question] | 자이로스코프에서 측정된 가속도 값을 실제 물리 힘으로 변환하여 엔티티에 적용하는 과정은 어떻게 이루어지나요? [answer] | 자이로스코프에서 측정된 값을 물리 힘으로 변환하여 엔티티에 적용하는 과정은 **클라이언트 측에서 센서 값을 읽어 서버로 전달하고, 서버 측에서 물리 엔진에 힘을 가하는** 두 단계로 이루어집니다. ### 1. 클라이언트 측: 센서 값 측정 및 전송 모바일 기기의 자이로스코프 센서에서 가속도 값을 읽어옵니다. `OnUpdate` 루프에서 매 프레임마다 `_MobileGyroscopeService:GetUserAcceleration()`을 호출하여 현재 가속도 벡터를 획득합니다. 이 값을 `Vector2`로 변환하여 서버 메서드로 보 [followup] | `OnUpdate`에서 `GetUserAcceleration()`으로 값을 받아 `Tilt` 메서드에 전달할 때, 방향 벡터의 크기가 임계값(0.2)을 초과할 때만 힘을 가하도록 하는 조건문과 `ApplyForce` 호출 코드를 상세히 보여주세요. [followup_answer] | `OnUpdate`에서 `GetUserAcceleration()`으로 측정된 가속도 값을 `Vector2`로 변환하여 서버 메서드 `Tilt`로 전달합니다. 서버 측 `Tilt` 메서드에서는 전달받은 방향 벡터의 x 또는 y 성분이 임계값 0.2를 초과할 때에만 `PhysicsRigidbodyComponent:ApplyForce`를 호출하여 힘의 세기(`ForcePower`)를 곱한 값을 엔티티에 적용합니다. 아래는 해당 로직을 구현한 mLua 코드입니다. ```lua Property: [None] EntityRef BallEn [scores] | [judge_reason] | [source_doc] | 1. 새로운 **GyroscopeLogic**을 생성합니다. 2. Property를 추가하고, BallEntityRef에 TiltBall을 지정합니다. ```lua Property: [None] EntityRef BallEntityRef = /maps/map01/TiltBall [None] number ForcePower = 100 ``` 3. `MobileGyroscopeService:IsHWSupported()`를 활용해 기기에서 자이로스코프 센서를 지원하는지 확인한 후, 값
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | Fire 함수 내에서 _TimerService:SetTimerOnce를 호출할 때 self:Explode()를 직접 인수로 전달하면 안 되고, destroySelf 함수를 정의해서 전달해야 하는 이유는 무엇인가요? [answer] | `_TimerService:SetTimerOnce`는 타이머가 만료된 시점에 실행할 **함수(function)**를 인수로 받습니다. `self:Explode()`은 함수를 참조하는 것이 아니라, 해당 시점에 즉시 실행되어 그 **결과값**(보통 nil)을 반환하는 표현식입니다. 따라서 `self:Explode()`를 직접 인수로 전달하면 타이머가 만료되기 전에 `Explode` 함수가 즉시 실행되고, 타이머에는 `nil`이 전달되어 아무 일도 일어나지 않습니다. 이 문제를 해결하기 위해 `local destroySelf = f [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발사체 스크립트 컴포넌트를 작성하고 발사체 모델에 연결해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭해 새 스크립트 컴포넌트를 만듭니다. 이름으로 **Projectile**를 입력합니다. 2. 발사체 모델 **Model_Projectile_Arrow**에 **Projectile** 컴포넌트를 추가합니다. 3. **Projectile** 스크립트 컴포넌트를 열고 아래와 같이 프로퍼티를 추가합니다.
[task] | code [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | _WorldShopService:SetProcessPurchaseCallback에서 구매 정보를 받아 _LogStorageService:LogPurchaseInfo에 기록할 때, 구매자가 미사용 상태인지 7일 이내인지를 판단하기 위한 데이터 구조를 설계하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `_WorldShopService:SetProcessPurchaseCallback`과 `_LogStorageService:LogPurchaseInfo`를 통해 구매 정보를 기록하는 기본 형식만 포함되어 있습니다. 문서에 명시되지 않은 중요한 사실들이 있습니다: 1. **미사용 상태 판단 API**: 구매한 상품이 현재 "미사용" 상태인지 확인하는 API(예: `IsUsed`, `CheckItemState` 등)는 문서에 없습니다. 2. **7일 이내 판단 API**: 구매 시각(`PurchaseTime` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | `ToLeft` 변수가 `true`일 때와 `false`일 때 `offsetX` 값이 어떻게 달라지는지 표로 정리하세요. [answer] | 제공된 `Explode()` 함수 코드에서 `offsetX` 계산 로직을 분석하면 다음과 같습니다. 먼저 `offsetX`는 아래 식으로 계산됩니다. ```lua local offsetX = math.cos(radian) * positionOffset.x * scale - math.sin(radian) * positionOffset.y * scale ``` 이후 `self.ToLeft`의 값에 따라 다음과 같이 수정됩니다. ```lua if not self.ToLeft then offsetX = -offsetX end ` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 완성된 `Explode()` 함수 전체는 아래와 같습니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not isvalid(self.Firer) and n
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 중력 센서 사용하기 [question] | _MobileGyroscopeService의 중력 가속도(GyroscopeGravity) 값을 OnUpdate에서 실시간으로 조회하여, x축과 y축의 기울기 값에 비례하도록 TiltBall 엔티티의 PhysicsRigidbodyComponent에 힘을 가하는 물리 시뮬레이션 스크립트를 작성해줘. [answer] | ## 중력 가속도 기반 물리 시뮬레이션 스크립트 `_MobileGyroscopeService`의 중력 가속도 값을 조회하는 구체적인 API(예: `GetGravity()`)가 제공된 문서에 포함되어 있지 않습니다. 문서에 명시된 `_MobileGyroscopeService` API는 다음과 같습니다. 1. `IsHWSupported()`: 하드웨어 지원 여부 확인 2. `IsEnabled()`: 서비스 활성화 여부 확인 3. `StartAndWait()`: 서비스 시작 및 대기 4. `StopAndWait()`: 서비스 중지 및 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileGyroscopeService`를 활용해 모바일 기기에서 자이로스코프 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileGyroscopeService `MobileGyroscopeService`를 활용하면 모바일 기기의 중력, 중력 가속도, 회전 가속도 값 등을 측정해 기기가 어디서, 얼마만큼의 힘을 받아 움직였는지 알 수 있습니다. 예를 들어 핸드폰을 위로 던졌을 때 얼마나 위로 올라갔는지 측정할 때 이 서비스를 사용합니다. MobileGyroScopeService는
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | 문서에 언급된 'MSW 리소스 조회 페이지'의 구체적인 URL이나 접속 방법을 3문장 이내로 설명해. [answer] | 제공된 문서에는 'MSW 리소스 조회 페이지'가 리소스 사용처 중 하나로 언급되어 있을 뿐, 구체적인 URL이나 접속 방법은 명시되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록
[task] | two_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 중력 센서 사용하기 [question] | 모바일 기기의 자이로스코프 센서를 활용하여 특정 엔티티를 제어하는 전체적인 스크립트 구조와 핵심 서비스는 무엇인가요? [answer] | 모바일 기기의 자이로스코프 센서를 활용하여 엔티티를 제어하는 스크립트는 **`_MobileGyroscopeService`**를 핵심으로 하며, 클라이언트에서 센서 값을 읽어 서버로 전달하고 서버에서 물리 힘(`PhysicsRigidbodyComponent`)을 가하는 구조로 이루어집니다. ### 1. 핵심 서비스 및 메서드 * **`_MobileGyroscopeService`**: 모바일 자이로스코프 데이터를 처리하는 서비스입니다. * `IsHWSupported()`: 하드웨어가 자이로스코프를 지원하는지 확인합니다. [followup] | `MobileGyroscopeService`의 하드웨어 지원 확인 및 초기화 과정에서 `StartAndWait()` 호출 후 실패 시 처리하는 구체적인 예외 로직은 어떻게 작성해야 하나요? [followup_answer] | `_MobileGyroscopeService:StartAndWait()` 호출 후 실패 시 처리하는 로직은 반환값이 `false`인 경우를 확인하여 오류를 기록하는 방식으로 작성합니다. 참고 문서에 제시된 `OnBeginPlay` 메서드에서 이 처리를 확인할 수 있습니다. `_MobileGyroscopeService:StartAndWait()`의 반환값을 `enabled` 변수에 저장한 후, `if enabled then` 블록에서 성공 시 `_UIToost:ShowMessage`로 메시지를 표시하고, `else` 블록에서 실패 [scores] | [judge_reason] | [source_doc] | 1. 새로운 **GyroscopeLogic**을 생성합니다. 2. Property를 추가하고, BallEntityRef에 TiltBall을 지정합니다. ```lua Property: [None] EntityRef BallEntityRef = /maps/map01/TiltBall [None] number ForcePower = 100 ``` 3. `MobileGyroscopeService:IsHWSupported()`를 활용해 기기에서 자이로스코프 센서를 지원하는지 확인한 후, 값
[task] | code [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체가 `HandleTriggerExitEvent`를 통해 충돌 범위에서 벗어날 경우 `wait` 함수를 사용하여 짧은 시간 대기 후 `_EntityService`를 통해 엔티티를 제거하는 로직을 포함하는 스크립트를 작성해줘 [answer] | 참고 문서에는 `HandleTriggerExitEvent` 이벤트 핸들러에 대한 설명이 포함되어 있지 않습니다. 문서에 명시된 트리거 관련 이벤트는 `HandleTriggerEnterEvent`뿐입니다. 따라서 요청하신 `HandleTriggerExitEvent`를 이용한 로직은 문서에 근거하여 작성할 수 없습니다. 문서에 없는 API나 이벤트를 지어내지 않는 원칙에 따라, 해당 이벤트 핸들러가 mLua에서 지원되는지 여부는 확인이 불가하며, 문서 기반의 답변은 제공할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | AttackFast 메서드의 마지막 파라미터로 CollisionGroups.Monster를 지정하는 것이 발사체와 몬스터 간의 충돌 판정에 어떤 영향을 미치나요? [answer] | `AttackFast` 메서드의 마지막 파라미터로 `CollisionGroups.Monster`를 지정하면, 해당 공격 판정(히트박스)이 **몬스터 그룹(Collision Groups)에 속한 엔티티와만 충돌 및 대미지 판정을 수행하도록** 제한됩니다. 구체적인 영향은 다음과 같습니다: 1. **타겟 제한**: 발사체가 폭발하거나 공격 판정 영역(`shape`)이 생성될 때, 그 영역 안에 들어오는 엔티티 중 `CollisionGroups.Monster` 그룹으로 분류된 몬스터만 대미지를 입습니다. 2. **불필요한 판정 방 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 발사체의 공격 영역을 설정하고 폭발 이펙트를 재생하기 위해 `Explode()` 함수를 추가합니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not
[task] | code [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | `Explode()` 함수 내에서 `_ResourceService`를 이용해 `ExplodeSpriteRUID` 리소스를 로드하고, 첫 프레임 스프라이트의 픽셀 사이즈와 `PixelPerUnit`을 바탕으로 실제 월드 단위 사이즈(`spriteSize`)와 오프셋(`positionOffset`)을 계산하며, `ToLeft` 속성에 따라 `effectOffset`의 x값을 반전시켜 `BoxShape`의 `Size`, `Position`, `Angle`을 설정한 뒤 `self.Firer.PlayerAttack:AttackFast`를 호 [answer] | ```lua Property: [None] string ExplodeSpriteRUID = "" [None] Vector2 ExplodeEffectOffset = Vector2(0, 0) [None] boolean ToLeft = false [None] number EffectScale = 1 [None] any Firer = nil Method: [server only] void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 발사체의 공격 영역을 설정하고 폭발 이펙트를 재생하기 위해 `Explode()` 함수를 추가합니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | 메이플스토리 월드에서 리소스를 찾을 수 있는 3가지 경로를 표로 정리해서 알려줘. [answer] | 메이플스토리 월드에서 리소스를 찾을 수 있는 3가지 경로는 다음과 같습니다. | 경로 | 설명 | | :--- | :--- | | **Preset List** | 메이플스토리 월드에서 제공하는 원작의 풍부한 리소스를 확인할 수 있는 목록입니다. | | **리소스 스토리지** | 다양한 리소스를 저장하고 관리할 수 있는 공간으로, 여기서 리소스를 사용할 수 있습니다. | | **MSW 리소스 조회 페이지** | 원하는 리소스를 검색하고 조회할 수 있는 페이지입니다. | 원작 리소스의 양이 방대하여 원하는 리소스를 찾기 어려울 수 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록
[task] | code [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | `_SpawnService:SpawnByModelId`를 호출하여 지정된 `Vector3` 위치에 `Model_Projectile_Arrow` 모델을 생성하고, 생성된 엔티티의 `TransformComponent`를 통해 초기 방향을 설정하는 스크립트를 작성해줘 [answer] | `_SpawnService:SpawnByModelId`를 사용하여 `Model_Projectile_Arrow` 모델을 생성하고, 생성된 엔티티의 `TransformComponent`를 통해 초기 방향(회전)을 설정하는 스크립트는 다음과 같습니다. 참고로 `TransformComponent`의 방향 설정을 위해 `Rotation` 프로퍼티를 사용하며, `Vector3` 타입의 값을 대입하여 X, Y, Z 축의 각도를 지정합니다. ```lua Property: [None] string ProjectileModelId = "Model [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | ToLeft 변수가 true일 때 effectOffset.x와 offsetX의 부호가 왜 반대로 처리되는지 그 수학적 이유를 설명해 주세요. [answer] | 제공된 참고 문서에는 `ToLeft` 변수가 `true`일 때 `effectOffset.x`와 `offsetX`의 부호가 반대로 처리되는 코드만 제시되어 있으며, 이에 대한 수학적 이유나 원리에 대한 설명은 포함되어 있지 않습니다. 따라서 문서 근거만으로 그 수학적 이유를 설명할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 완성된 `Explode()` 함수 전체는 아래와 같습니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not isvalid(self.Firer) and n
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 중력 센서 사용하기 [question] | _MobileGyroscopeService의 StartAndWait()와 StopAndWait()를 호출할 때 발생할 수 있는 비동기 처리를 고려하여, 센서 시작 및 중지 상태를 관리하는 변수를 Property로 선언하고, 해당 상태에 따라 OnUpdate에서 공의 물리 동작을 활성화하거나 비활성화하는 제어 스크립트를 작성해줘. [answer] | `MobileGyroscopeService`의 `StartAndWait()`와 `StopAndWait()`는 비동기적으로 실행되며, 호출 직후 센서가 실제로 활성화되었는지 여부는 반환 값 또는 상태 확인을 통해 알아야 합니다. 따라서 센서의 실제 작동 상태(`IsEnabled()`)를 직접 참조하거나, 시작/중지 요청을 보낸 후 상태가 변경될 때까지 대기하는 로직이 필요합니다. 요청하신 대로 센서 시작/중지 상태를 관리하는 변수를 `Property`로 선언하고, `OnUpdate`에서 해당 상태와 센서의 실제 활성화 여부를 확인하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileGyroscopeService`를 활용해 모바일 기기에서 자이로스코프 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileGyroscopeService `MobileGyroscopeService`를 활용하면 모바일 기기의 중력, 중력 가속도, 회전 가속도 값 등을 측정해 기기가 어디서, 얼마만큼의 힘을 받아 움직였는지 알 수 있습니다. 예를 들어 핸드폰을 위로 던졌을 때 얼마나 위로 올라갔는지 측정할 때 이 서비스를 사용합니다. MobileGyroScopeService는
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | shape.Size를 설정할 때 scale 값에 math.abs()를 적용하는 이유는 무엇이며, 음수 스케일 값이 들어가면 어떤 문제가 발생하는지 알고 싶습니다. [answer] | 제공된 참고 문서에는 `shape.Size` 설정 시 `math.abs(scale)`을 적용하는 구체적인 이유나 음수 스케일 값이 들어갈 경우 발생하는 기술적 문제에 대한 설명이 포함되어 있지 않습니다. 문서에는 단순히 `shape.Size = Vector2(spriteSize.x * math.abs(scale), spriteSize.y * math.abs(scale))`라는 코드 예제만 제시되어 있을 뿐, 그 배경이나 문제점에 대한 정보가 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 완성된 `Explode()` 함수 전체는 아래와 같습니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not isvalid(self.Firer) and n
[task] | single_turn [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | 제공된 문서에는 특정 효과음이나 아바타 리소스의 RUID만 나열되어 있어, 이 리소스를 스크립트에서 어떻게 호출하는지, 혹은 파일 형식 제한에 대한 정보가 없습니다. 따라서 문서의 내용만으로 답변 가능한 기술적 질문은 만들 수 없으며, 문서에 없는 정보(구체적인 사용법, 오류 원인 등)를 지어내지 않기 위해 질문을 생성하지 않습니다. [answer] | 제공된 문서에는 요청하신 정보(리소스 호출 방법, 파일 형식 제한)가 포함되어 있지 않습니다. 문서에 포함된 정보는 다음과 같습니다: 1. **범용 리소스 모음 목록**: 점프, 버튼, 카운트다운, 레벨업, Win/Lose/Draw/Start/Game Over, 획득, 동전, 사망 효과음 및 로그인 BGM의 RUID(RUID만 나열됨). 2. **아바타 리소스**: 기본 대미지 스킨의 RUID. mLua 스크립트에서 특정 RUID를 가진 효과음이나 이미지를 어떻게 로드하고 재생하는지(예: `AudioComponent` 사용법 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | 항목 | 설명 | RUID | | --- | --- | --- | | @cols=1:@rows=2:점프 효과음 | 기본 점프 효과음 |d881a73a0700404a91bcf753474274c3 | | 귀여운 기본 점프 효과음 |dfca55f443464fd5801952efeb50d819 | | @cols=1:@rows=4:버튼 효과음 | 기본 버튼 효과음 | 7eda004ded944e459f1fbb16c7f0f3f4 | | 기본 버튼 효과음2 | cd0bd46d7f454640b82c9dfff0c6677b | | 버튼 클릭
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | ResourceService:PreloadAsync 콜백 내에서 self.Firer의 유효성을 검사하는 이유는 무엇이며, 이 검사를 생략하면 어떤 문제가 발생합니까? [answer] | `ResourceService:PreloadAsync`는 비동기(Asynchronous) 방식으로 리소스를 로드합니다. 이는 리소스 로드가 즉시 완료되지 않고, 백그라운드에서 처리된 후 콜백 함수가 나중에 실행됨을 의미합니다. `Explode()` 함수가 호출된 시점과 콜백 함수가 실제로 실행되는 시점 사이에 시간이 경과합니다. 이 짧은 시간 동안 발사체(Entity)가 소멸하거나, 발사체를 쏜 플레이어(`self.Firer`)가 로그아웃하거나, 다른 이유로 인해 `self.Firer` 참조가 더 이상 유효하지 않게 될 수 있습니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 발사체의 공격 영역을 설정하고 폭발 이펙트를 재생하기 위해 `Explode()` 함수를 추가합니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | ToLeft 변수가 true일 때 effectOffset.x와 offsetX의 부호가 각각 어떻게 반전되고, 이것이 공격 판정 위치와 어떤 관련이 있나요? [answer] | ToLeft 변수가 true일 때, effectOffset.x와 offsetX의 부호는 다음과 같이 각각 반전됩니다. 1. **effectOffset.x의 반전** `Explode()` 함수 내에서 이펙트 오프셋 보정을 위해 `self.ExplodeEffectOffset`을 `effectOffset` 변수에 대입한 후, `self.ToLeft`이 true인 경우 `effectOffset.x = -effectOffset.x`로 처리됩니다. 이는 기본 방향으로 설정된 이펙트 오프셋의 X축 성분을 음수로 바꿔 좌측 방향으로 발사하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 발사체의 공격 영역을 설정하고 폭발 이펙트를 재생하기 위해 `Explode()` 함수를 추가합니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not
[task] | two_turn [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 월드코인 구매 내역을 스크립트로 조회하는 예제 코드가 어떻게 동작하는지 알려주세요. [answer] | 월드코인 구매 내역을 스크립트로 조회하는 예제 코드의 동작 원리는 다음과 같습니다. ### 1. 조회 기간 설정 먼저 조회할 구매 내역의 시작 날짜와 종료 날짜를 `DateTime` 객체로 생성합니다. ```lua local fromDate = DateTime(2022, 11, 25) local toDate = DateTime(2022, 11, 30) ``` 위 예시에서는 협정 세계시 기준으로 2022년 11월 25일부터 11월 30일 사이의 구매 정보를 조회하도록 설정되어 있습니다. ### 2. 비동기 조회 요청 (`_LogS [followup] | _LogStorageService:GetPurchaseLogPagesAsync()에서 반환되는 purchaseLogPages 객체의 IsLastPage 프로퍼티와 MoveToNextPageAndWait() 메서드가 페이징 처리에 어떻게 활용되는지 구체적으로 설명해 주세요. [followup_answer] | `_LogStorageService:GetPurchaseLogPagesAsync()` 콜백을 통해 전달되는 `purchaseLogPages` 객체는 구매 로그 데이터를 **페이지 단위로 나누어** 처리할 수 있게 하는 페이징(Pagination) 구조를 가지고 있습니다. `IsLastPage` 프로퍼티와 `MoveToNextPageAndWait()` 메서드는 이 페이지 기반 데이터 처리에서 각각 **"처리 종료 조건 확인"**과 **"데이터 로드 및 대기"** 역할을 수행합니다. 구체적인 활용 방식은 다음과 같습니다. ### 1 [scores] | [judge_reason] | [source_doc] | 기록한 구매 정보를 조회하는 예제 코드를 살펴봅시다. ```lua -- 협정 세계시 기준으로 11월 25일부터 11월 30일 사이에 기록된 구매 정보를 조회합니다. local fromDate = DateTime(2022, 11, 25) local toDate = DateTime(2022, 11, 30) _LogStorageService:GetPurchaseLogPagesAsync(fromDate, toDate, function(purchaseLogPages) while true do -- GetCurrent
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 제거 및 폭발 효과를 위한 코드를 단계별 번호 목록으로 정리하세요. [answer] | 발사체가 몬스터와 충돌했을 때 폭발 효과를 표시하고 발사체를 제거하는 로직은 다음 단계로 구성됩니다. 1. **충돌 감지 이벤트 핸들러 정의** 발사체와 몬스터의 충돌을 감지하기 위해 `TriggerEnterEvent`를 처리하는 이벤트 핸들러를 추가합니다. 이 핸들러는 서버에서만 실행되도록 `[server only]` 실행 공간으로 설정합니다. ```lua Event Handler: [server only] [self] HandleTriggerEnterEvent(TriggerEnterEve [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | fect(self.ExplodeSpriteRUID, self.Entity, effectPosition, 0, Vector3.one * self.EffectScale, false, options) -- 발사체 제거 self.Entity:Destroy() end) } ``` 10. 발사체가 몬스터에 충돌하면 폭발하도록 처리하기 위해 이벤트 핸들러에 **TriggerEnterEvent**를 추가합니다. 실행 공간은 **server only**로
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | `effectPosition`을 계산할 때 `Vector3`의 x, y, z 좌표를 개별적으로 더해주는 방식이 `Vector3` 연산자를 직접 사용하는 경우와 비교했을 때 어떤 이점이 있나요? [answer] | 제공된 참고 문서에는 `Vector3`의 개별 좌표 연산(`transform.Position.x + effectOffset.x` 등)과 `Vector3` 연산자(예: `+` 연산)를 직접 사용한 경우를 비교하거나, 개별 좌표 연산 방식이 가진 특정 이점에 대한 설명이 포함되어 있지 않습니다. 따라서 해당 두 방식의 비교 및 이점에 대해 답변할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 9. 폭발 이펙트를 재생하고 발사체를 없애기 위해 `Explode()` 함수의 위 내용에 이어서 아래 내용을 작성합니다. ```lua -- 폭발 이펙트 재생 local effectPosition = Vector3(transform.Position.x + effectOffset.x, transform.Position.y + effectOffset.y, transform.Position.z) local options = { ["FlipX"] = not self.ToLeft } _EffectService:PlayEff
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | isvalid(self.Firer)와 isvalid(self.Firer.PlayerAttack) 검사가 실패하여 함수가 종료되면 이후 코드들은 어떤 식으로 스킵되는지 확인하고 싶습니다. [answer] | `isvalid(self.Firer) and not isvalid(self.Firer.PlayerAttack)` 조건이 참이 되어 `return`문이 실행되면, 해당 함수(`Explode`)는 즉시 종료됩니다. mLua(Lua 5.3)에서 `return`은 현재 실행 중인 함수의 흐름을 중단시키고 호출자(call site)로 즉시 반환합니다. 따라서 `return`문 이후에 작성된 모든 코드(자원을 로드하는 `clip` 생성, 스프라이트 크기 계산, 오프셋 보정, `shape` 설정, `AttackFast` 호출, 이펙트 재생 등 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 완성된 `Explode()` 함수 전체는 아래와 같습니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not isvalid(self.Firer) and n
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | `_EffectService:PlayEffect` 호출 시 4번째 인자로 0을 전달하는 것이 어떤 의미를 가지며, 이 값이 이펙트 재생에 미치는 영향은 무엇인가요? [answer] | 제공된 참고 문서에는 `_EffectService:PlayEffect` 메서드의 시그니처(파라미터 목록)나 각 인자의 정의가 포함되어 있지 않습니다. 문서에는 `Explode()` 함수 내에서 `_EffectService:PlayEffect`를 호출하는 코드 예시와, 이벤트 핸들러 예제에서 4번째 인자로 `0`을 전달하는 부분만 보여줄 뿐, 이 `0` 값이 구체적으로 어떤 의미(예: 지연 시간, 재생 시간, 좌표 등)를 가지는지 설명하는 내용이 없습니다. 따라서 주어진 문서만으로는 4번째 인자 `0`의 정확한 의미와 이펙트 재생 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 9. 폭발 이펙트를 재생하고 발사체를 없애기 위해 `Explode()` 함수의 위 내용에 이어서 아래 내용을 작성합니다. ```lua -- 폭발 이펙트 재생 local effectPosition = Vector3(transform.Position.x + effectOffset.x, transform.Position.y + effectOffset.y, transform.Position.z) local options = { ["FlipX"] = not self.ToLeft } _EffectService:PlayEff
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 스크립트에서 `Explode()` 함수 내부에 `wait()`을 사용하여 이펙트 재생 후 지연시켜서 `Destroy()`를 호출하면 어떤 문제가 발생할 수 있나요? [answer] | 제공된 참고 문서에는 `Explode()` 함수 내부에서 `wait()`을 사용하는 것에 대한 언급이나, 그로 인해 발생할 수 있는 문제에 대한 정보가 포함되어 있지 않습니다. 문서에는 `Explode()` 함수의 마지막 부분으로 폭발 이펙트 재생(`_EffectService:PlayEffect`)을 수행한 직후 바로 `self.Entity:Destroy()`를 호출하는 코드 예제만 제시되어 있을 뿐, `wait()` 함수를 사용하여 지연을 넣는 경우의 동작이나 잠재적 문제에 대해 설명하고 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 9. 폭발 이펙트를 재생하고 발사체를 없애기 위해 `Explode()` 함수의 위 내용에 이어서 아래 내용을 작성합니다. ```lua -- 폭발 이펙트 재생 local effectPosition = Vector3(transform.Position.x + effectOffset.x, transform.Position.y + effectOffset.y, transform.Position.z) local options = { ["FlipX"] = not self.ToLeft } _EffectService:PlayEff
[task] | single_turn [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | Preset List, 리소스 스토리지, MSW 리소스 조회 페이지 세 가지 중 원작 리소스를 찾을 때 각각 어떤 차이가 있나요? [answer] | 제시된 문서에는 Preset List, 리소스 스토리지, MSW 리소스 조회 페이지의 구체적인 기능적 차이점에 대한 설명이 포함되어 있지 않습니다. 문서에 따르면 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하며, 크리에이터는 **Preset List**, **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있다고만 명시되어 있습니다. 각 채널의 구체적인 차이점이나 사용 방법의 차이는 문서에 언급되지 않았습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록
[task] | two_turn [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | 인벤토리 스크립트에서 DB에 아이템 정보를 저장하는 구체적인 처리 방식이 궁금합니다 [answer] | 제공된 참고 문서에는 인벤토리 스크립트에서 DB에 아이템 정보를 저장하는 구체적인 코드나 API에 대한 내용이 포함되어 있지 않습니다. 문서에서는 인벤토리 스크립트의 역할로 "인벤토리의 동작을 제어", "인벤토리 UI에 변경되는 아이템 정보를 전달", "DB에 아이템 정보를 저장"을 언급하고 있으나, 실제 DB 저장 로직을 구현하는 mLua 코드 예시나 관련 서비스/메서드 명세는 제시되어 있지 않습니다. 따라서 문서의 내용만으로는 DB 저장 처리 방식을 설명할 수 없습니다. [followup] | 저장 시 사용하는 특정 서비스나 메서드 예시가 있나요? [followup_answer] | 제공된 참고 문서에는 DB에 아이템 정보를 저장할 때 사용하는 특정 서비스나 메서드 예시가 포함되어 있지 않습니다. 문서에는 `_EntityService` (몬스터 생성/파괴), `_TimerService` (타이머 설정) 등이 코드 예시로 등장하지만, DB 저장과 관련된 서비스(예: `_DatabaseService` 등)나 메서드에 대한 언급이나 코드는 존재하지 않습니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > 2편. [몬스터 드롭 아이템과 인벤토리 UI 만들기](/docs?postId=943) > **▶ 3편.** [**인벤토리 스크립트 작성하기**](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 인벤토리 스크립트를 작성해 보겠
[task] | single_turn [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | MSW 리소스 조회 페이지에서 원하는 리소스를 검색하는 기능이 아직 제한적인 이유는 무엇인가요? [answer] | 메이플스토리 월드에서 제공되는 원작 리소스의 양이 워낙 방대하기 때문에, 기존 검색 방식으로는 원하는 리소스를 찾기 어려운 경우가 많았습니다. 이를 해결하기 위해 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있으며, 앞으로는 소개된 리소스들이 손쉽게 검색될 수 있도록 개선될 예정입니다. 현재는 개선 작업이 완료되기 전까지 기본 제작 가이드에 소개된 범용 리소스 모음을 참고하여 사용해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록
[task] | code [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 모델에 부착하여 `_TimerService`를 이용해 생성 후 지정된 시간만큼 이동한 뒤 `_EntityService`로 자신을 파괴하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `_TimerService`와 `_EntityService:Destroy`의 사용 예제는 포함되어 있으나, **발사체가 지정된 시간만큼 이동하도록 하는 로직(예: `OnUpdate`에서 위치를 변경하거나 속도 프로퍼티를 설정하는 코드)** 에 대한 설명은 없습니다. 문서 내 예제에서 `_TimerService`는 `DropItem`과 같은 특정 동작을 일정 시간 후 실행하기 위해 사용되었을 뿐, 이동 제어 용도로 사용된 예시는 찾을 수 없습니다. 또한, 발사체의 이동 방식을 정의하는 구체적인 API(예: `V [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | single_turn [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | 화살표 및 안내 카테고리에서 위, 아래, 왼쪽 화살표의 RUID가 각각 무엇인가요? [answer] | 화살표 및 안내 카테고리에서 각 화살표의 RUID는 다음과 같습니다. * **위 화살표**: `621d0abe16e84a79a4e2cd3df1fad1a0` * **아래 화살표**: `69701c2acf63415ea922119c25f40982` * **왼쪽 화살표**: `cdfde5ae11d34639b727210bac3ec56f` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록