[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 월드 아이템과 아바타 아이템의 판매 후 환불 가능 기간은 동일하게 30일로 규정되어 있지만, 한국 계정과 그 외 계정의 환불 요청 처리 방식에서 어떤 차이가 있나요? [answer] | 월드 아이템과 아바타 아이템 모두 판매 후 30일까지 크리에이터가 환불을 처리할 수 있습니다. 다만, 환불 요청한 유저의 계정 유형에 따라 크리에이터가 환불 요청을 거절하거나 승인할 수 있는 조건이 다릅니다. 1. **한국 계정** * 크리에이터는 유저가 선택한 환불 사유가 타당한지 검토해야 합니다. * 검토 결과에 따라 환불 요청을 거절하거나 승인할 수 있습니다. * 환불 사유로는 상품 불일치, 잘못된 구매, 품질 문제, 단순 변심, 기타 등이 있습니다. 2. **그 외 계정** * 판매 후 30일 이내의 [followup] | [followup_answer] | [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] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | MobileAccelerometerService의 Start와 Stop 메서드를 사용하여 유저가 특정 조건을 만족할 때 센서를 시작하고, 조건이 해제될 때 센서를 중지하는 상태 전환 로직을 포함한 스크립트를 작성해줘 [answer] | `MobileAccelerometerService`의 `Start()`와 `Stop()` 메서드를 사용하여 특정 조건에 따라 센서의 상태(켜짐/꺼짐)를 전환하는 로직을 구현하는 스크립트입니다. 참고 문서에는 `IsHWSupported()`, `IsEnabled()`, `Start()`, `Stop()` 메서드가 존재함을 확인할 수 있으며, 하드웨어 지원 여부를 먼저 확인한 후 센서를 제어하는 것이 권장되는 패턴입니다. 아래 예제는 **`IsSensorActive`** 라는 프로퍼티를 조건으로 사용합니다. 이 값이 `true`가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 월드코인 수익 내역에서 특정 주문에 대한 환불을 진행하려면 공식 홈페이지의 어떤 메뉴 경로를 통해 상세보기 및 환불하기 버튼을 찾아야 하나요? [answer] | 월드코인 수익 내역에서 특정 주문에 대한 환불을 진행하기 위한 공식 홈페이지 메뉴 경로는 다음과 같습니다. 1. 메이플스토리 월드 공식 홈페이지에 로그인하여 **내 계정**의 **구매 내역** 페이지를 엽니다. 2. 구매 내역 페이지에서 **[월드코인 내역]** 버튼을 클릭합니다. 3. 월드코인 수익 내역에서 환불하려는 주문번호를 확인한 뒤 **[상세보기]** 버튼을 클릭합니다. 4. 주문 상세 정보 화면에서 수익 금액 옆의 **[환불하기]** 버튼을 클릭합니다. 5. 확인 팝업 창에서 **[확인]** 버튼을 클릭하면 환불 처리가 [followup] | [followup_answer] | [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] | two_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 스크립트 컴포넌트에서 `OnUpdate` 함수의 실행 공간을 `server only`로 설정하는 이유와, 발사체 모델에 `Projectile` 컴포넌트를 연결하는 구체적인 절차가 궁금합니다. [answer] | 발사체 스크립트 컴포넌트에서 `OnUpdate` 함수의 실행 공간을 `server only`로 설정하는 이유는 발사체의 이동 로직을 서버 측에서 일관되게 처리하기 위해서입니다. 발사체는 `OnBeginPlay`에서 초기 상태(`Fired = false`)로 설정되며, 실제 발사(`Fire()` 호출) 이후에만 `OnUpdate`에서 위치를 갱신하도록 로직이 구성되어 있습니다. 서버에서 이 로직을 실행함으로써 클라이언트 간 동기화 문제를 방지하고, 발사체의 진행 방향(`ToLeft`) 및 속도(`Speed`)에 따른 이동(`Trans [followup] | `OnUpdate`에서 `self._T.Fired`가 false일 때 return하는 로직의 역할과, `Fire()` 함수 내부에서 `_TimerService:SetTimerOnce`를 사용하여 `Explode()`를 호출하는 코드 예시를 작성해 주세요. [followup_answer] | `OnUpdate`에서 `self._T.Fired`가 `false`일 때 `return`하는 로직의 역할은 발사체가 실제로 발사되기 전까지는 이동하지 않도록 하는 것입니다. 발사체는 생성 직후(`OnBeginPlay`에서 `Fired = false`로 초기화)에는 정지 상태이며, `Fire()` 함수가 호출되어 `Fired`가 `true`로 변경된 이후에만 `OnUpdate` 루프에서 `Translate`를 통해 진행 방향으로 이동하도록 제어합니다. `Fire()` 함수 내부에서 `_TimerService:SetTimerOnce` [scores] | [judge_reason] | [source_doc] | 발사체 스크립트 컴포넌트를 작성하고 발사체 모델에 연결해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭해 새 스크립트 컴포넌트를 만듭니다. 이름으로 **Projectile**를 입력합니다. 2. 발사체 모델 **Model_Projectile_Arrow**에 **Projectile** 컴포넌트를 추가합니다. 3. **Projectile** 스크립트 컴포넌트를 열고 아래와 같이 프로퍼티를 추가합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 구매자가 '단순 변심'을 이유로 환불을 요청한 경우, 크리에이터가 이를 승인하거나 거절할 수 있는 권한은 한국 계정과 해외 계정에서 어떻게 다른가요? [answer] | 구매자가 '단순 변심'을 이유로 환불을 요청한 경우, 크리에이터의 권한은 계정 지역(한국/그 외)에 따라 다음과 같이 다릅니다. 1. **한국 계정의 경우** * 크리에이터는 유저가 선택한 환불 사유(단순 변심 포함)가 타당한지 검토할 수 있습니다. * 검토 결과에 따라 환불 요청을 **승인하거나 거절**할 수 있는 권한이 있습니다. 2. **그 외(해외) 계정의 경우** * 판매 후 **30일 이내**의 환불 요청에 대해서만 크리에이터가 환불 요청을 **거절하거나 승인**할 수 있는 권한이 [followup] | [followup_answer] | [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] | two_turn [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 상품 구매 정보 조회 기능은 메이커에서 테스트가 불가능한가요? [answer] | 네, 상품 구매 정보 조회 기능은 메이커에서 테스트할 수 없습니다. 이 기능은 월드 출시 이후에만 확인이 가능합니다. 따라서 출시 전 테스트를 위해 비공개 월드로 출시하여 조회가 정상적으로 진행되는지 확인한 뒤, 공개로 전환하는 것을 권장합니다. [followup] | 출시 후 테스트를 위해 비공개 월드로 전환하여 조회 정상화를 확인한 후 공개 전환하는 절차를 스크립트적으로 어떻게 적용하거나 UI에서 크리에이터 전용으로 제한하여 구현할 수 있는지 코드 예시를 요청합니다. [followup_answer] | 제시된 참고 문서에는 구매 정보 조회를 위한 `_LogStorageService:GetPurchaseLogPagesAsync` 호출 예제만 포함되어 있으며, **비공개/공개 월드 전환을 위한 API**, **크리에이터 권한 확인을 위한 서비스 또는 메서드**, **UI 생성 및 표시/숨김을 위한 컴포넌트 API**에 대한 정보는 제공되지 않습니다. 따라서 문서에 없는 API나 기능을 지어내어 코드 예시를 작성할 수 없습니다. 참고 문서에서 확인 가능한 내용만 정리하면 다음과 같습니다: 1. **구매 정보 조회 로직**: `_L [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] | 발사체 제거를 위해 호출되는 메서드명과 그 이전에 실행되는 이펙트 재생 로직의 순서 관계를 2문장 이내로 설명하세요. [answer] | `Explode()` 함수 안에서 먼저 `_EffectService:PlayEffect()`를 호출해 폭발 이펙트를 재생한 후, 이어서 `self.Entity:Destroy()`를 호출하여 발사체 엔티티를 제거합니다. [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] | two_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | 모바일 기기의 가속도 센서를 활용해 물리 개체를 제어하는 스크립트를 작성하려면 어떤 서비스와 메서드를 사용해야 하는가? [answer] | 모바일 기기의 가속도 센서를 활용하여 물리 개체를 제어하려면 `_MobileAccelerometerService`를 사용해야 합니다. 이 서비스를 통해 기기에서 센서 하드웨어를 지원하는지 확인하고, 가속도 측정을 시작하며, 마지막 가속도 값을 가져와서 물체에 힘을 가할 수 있습니다. 주요 메서드와 사용 순서는 다음과 같습니다. 1. **하드웨어 지원 확인 및 측정 시작**: `OnBeginPlay`에서 `_MobileAccelerometerService:IsHWSupported()`로 기기 지원 여부를 확인한 후, `_Mobi [followup] | `_MobileAccelerometerService:IsHWSupported()`가 false를 반환하는 기기에서 센서 관련 에러를 방지하고, 지원 여부를 확인한 후 `Start()`를 호출하는 `OnBeginPlay()` 로직의 정확한 코드 구성은 어떻게 되는가? [followup_answer] | `_MobileAccelerometerService:IsHWSupported()`가 false를 반환하는 기기에서 센서 관련 에러를 방지하려면, `OnBeginPlay`에서 하드웨어 지원 여부를 먼저 확인하고 true일 때만 `_MobileAccelerometerService:Start()`를 호출하는 조건 분기 로직을 구성해야 합니다. 정확한 코드 구성은 다음과 같습니다. ```lua Method: [client only] void OnBeginPlay () { if _MobileAccelerometerService:I [scores] | [judge_reason] | [source_doc] | 1. 새로운 **AccelerometerLogic**을 생성합니다. 2. Property를 아래와 같이 추가하고, BallEntityRef에 TiltBall을 지정합니다. ```lua Property: [None] EntityRef BallEntityRef = /maps/map01/TiltBall [None] number ForcePower = 100 ``` 3. `MobileAccelerometerService:IsHWSupported()`를 활용해 기기에서 가속도 센서를 지원
[task] | two_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체가 몬스터와 충돌할 때 폭발 처리를 위해 TriggerEnterEvent 핸들러에서 확인해야 하는 조건은 무엇인가요? [answer] | 발사체가 몬스터와 충돌했을 때 폭발 처리를 위해 `HandleTriggerEnterEvent` 핸들러에서 확인해야 하는 조건은 충돌한 대상이 몬스터인지 여부입니다. 구체적으로는 `event.TriggerBodyEntity.Monster` 프로퍼티가 유효한지(`isvalid`)를 확인해야 합니다. 몬스터가 아닌 경우(즉, `isvalid(TriggerBodyEntity.Monster) == false`인 경우)에는 즉시 함수를 종료(`return`)하고, 몬스터인 경우에만 폭발 메서드(`self:Explode()`)를 호출합니다. [followup] | TriggerBodyEntity.Monster 검증 실패 시 반환하는 코드 예시를 보여주세요. [followup_answer] | `TriggerBodyEntity.Monster`가 유효하지 않을 때(몬스터가 아닐 때) 즉시 반환하는 코드 예시는 다음과 같습니다. ```lua [server only] [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { -- Parameters local TriggerBodyEntity = event.TriggerBodyEntity -------------------------------------------------------- if isval [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] | mLua 스크립트에서 발사체 모델의 위치를 변경할 때 self.Entity.TransformComponent.Position을 직접 수정하면 되나요? [answer] | 네, mLua 스크립트에서 발사체 모델의 위치를 변경하려면 `self.Entity.TransformComponent.Position`을 직접 수정하는 것이 올바른 접근 방식입니다. mLua에서는 컴포넌트를 `GetComponent` 메서드를 통해 가져오지 않고, 엔티티에 직접 붙어 있는 컴포넌트 이름을 통해 접근합니다. 따라서 현재 스크립트가 붙어 있는 엔티티(발사체)의 위치를 변경하려면 `self.Entity.TransformComponent.Position`에 새로운 좌표 값을 대입하면 됩니다. 아래는 발사체 위치를 변경하는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | _LogStorageService:GetPurchaseLogPagesAsync로 구매 내역을 조회할 때 페이지를 넘기며 데이터를 모두 가져오기 위해 while 루프와 IsLastPage 프로퍼티를 어떻게 조합해서 사용해야 하나요? [answer] | `_LogStorageService:GetPurchaseLogPagesAsync`로 구매 내역을 조회할 때, 페이지를 넘기며 데이터를 모두 가져오려면 `while true` 무한 루프를 사용해야 합니다. 이 루프 내에서 `purchaseLogPages:GetCurrentPageDatas()`를 호출하여 현재 페이지의 데이터 목록을 가져오고, `ipairs`를 사용해 각 데이터를 순회합니다. 모든 데이터를 처리한 후, `purchaseLogPages.IsLastPage` 프로퍼티가 `true`인지 확인합니다. 만약 마지막 페이지라면 [followup] | [followup_answer] | [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] | `Explode()` 함수에서 폭발 이펙트 재생 시 `effectPosition` 계산에 사용되는 좌표 변수와 `options` 테이블의 키 이름 및 값을 정확히 나열하세요. [answer] | `Explode()` 함수에서 폭발 이펙트 재생 시 사용되는 좌표 변수와 `options` 테이블의 구성은 다음과 같습니다. **1. `effectPosition` 계산에 사용되는 좌표 변수** `effectPosition`은 `Vector3` 타입으로, 다음 세 가지 변수를 조합하여 계산됩니다. * `transform.Position.x` * `transform.Position.y` * `transform.Position.z` * `effectOffset.x` * `effectOffset.y` 구체적인 계산식 [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] | Workspace의 MyDesk에서 Create Model을 통해 만든 Model_Projectile_Arrow에 ScriptComponent를 추가할 때, 어떤 생명주기 메서드를 구현해야 발사체가 사라지지 않고 지속적으로 움직일 수 있나요? [answer] | 참고 문서에는 `Model_Projectile_Arrow` 모델에 `ScriptComponent`를 추가하여 발사체가 **지속적으로 움직이도록 하는** 스크립트 예제나 관련 설명이 포함되어 있지 않습니다. 문서에 제시된 발사체 스크립트 컴포넌트 예제는 다음과 같은 내용만을 다루고 있습니다: 1. `OnBeginPlay()`에서 `DamageSkinSpawnerComponent`, `TransformComponent`, `HitComponent`의 값을 초기화하거나, `PhysicsRigidbodyComponent:Sleep()`을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | two_turn [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 환불 요청 처리 시 계정 유형에 따른 주의사항이 어떻게 다른가요? [answer] | 환불 요청 처리 시 계정 유형(한국 계정, 그 외 계정)에 따라 다음과 같은 주의사항이 적용됩니다. **1. 공통 사항** * **월드 아이템, 아바타 아이템**은 판매 후 **30일 이내**에만 크리에이터가 환불을 처리할 수 있습니다. **2. 계정 유형별 차이** * **한국 계정** * 크리에이터는 유저가 선택한 **환불 사유가 타당한지 검토**해야 합니다. * 검토 결과에 따라 환불 요청을 **거절하거나 승인**할 수 있습니다. * 환불 사유로는 상품 불일치, 잘못된 구매, 품질 [followup] | 한국 계정과 그 외 계정의 환불 승인/거절 조건(30일 제한 등)을 확인하는 로직을 스크립트에 반영할 때, 계정 지역 구분 API나 관련 변수를 어떻게 접근해야 하는지 구체적인 구현 방법을 알려주세요. [followup_answer] | 제공된 참고 문서에는 계정 지역(한국/그 외)을 구분하는 API, 프로퍼티, 또는 관련 변수에 대한 정보가 포함되어 있지 않습니다. 문서에서는 환불 처리 시 계정 유형에 따라 적용되는 **정책적 차이**(한국 계정은 사유 검토, 그 외 계정은 30일 이내 제한)만 설명하고 있으며, 이를 스크립트(mLua)에서 구현하기 위해 계정 지역을 판별하는 구체적인 API나 코드 예제는 제공되지 않았습니다. 따라서 현재 문서 기준으로 계정 지역 구별 로직을 작성하는 것은 불가능하며, 해당 API가 존재하는지 확인하기 위해 추가적인 API 문 [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] | code [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | UserService, ScreenshotService를 사용하여 유저가 월드에 진입할 때 1초 대기 후 화면을 캡처하여 RawImage로 변환하고, 이를 World에 업로드한 뒤 발급받은 RUID를 이벤트 발생자에게 전송하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `UserService`의 `HandleUserEnterEvent` 이벤트 핸들러와 `ScreenshotService:CaptureFullScreenAsPixelDataAndWait()` 함수, 그리고 `_ResourceService:RequestSpriteUploadAsync()` 함수의 사용법이 명시되어 있습니다. 단, 참고 문서에는 **이벤트 발생자(유저)에게 RUID를 전송하는 API(예: 메시지 전송, 인벤토리 아이템 생성 등)가 포함되어 있지 않습니다.** 따라서 요청하신 "RUID를 이벤트 발생자 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | code [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | SpawnService, ScreenshotService를 사용하여 특정 모델 ID의 엔티티를 스폰한 후 2초 뒤에 해당 엔티티가 있는 화면을 캡처하여 RawImage로 변환하고, World에 업로드한 뒤 발급받은 RUID를 엔티티의 TransformComponent에 저장하는 스크립트를 작성해줘 [answer] | 사용자의 질문에는 **기술적으로 불가능하거나 문서에 없는 API 사용**을 포함하고 있어, 이를 먼저 지적한 후 가능한 범위 내에서 스크립트를 작성해 드리겠습니다. ### ⚠️ 중요 확인 사항 1. **`TransformComponent`에 RUID 저장 불가**: * `TransformComponent`는 엔티티의 위치(`Position`), 회전(`Rotation`), 크기(`Scale`) 등을 관리하는 컴포넌트입니다. * **RUID (Resource Unique ID)**는 스프라이트 리소스를 식별 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작할 때 스프라이트가 필요하면 메이플스토리 월드에서 제공하는 것을 선택하거나, 크리에이터가 직접 Import 한 것을 사용할 수 있습니다. 이러한 방법 외에도 월드 플레이 도중 생성된 이미지를 월드에 업로드하고 다른 유저와 공유할 수도 있습니다. 이처럼 메이플스토리 월드에서 플레이 도중 생성되는 이미지를 **동적 스프라이트**라고 합니다. **동적 스프라이트**는 **RawImage**라는 데이터 타입에 담아서 월드에 업로드하고 **RUID**를 발급받아 사용할 수 있습니다. 이번 과정에서는 [Sc
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | `_EffectService:PlayEffect` 메서드 호출 시 전달되는 인자 7개를 순서대로 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua _EffectService:PlayEffect(self.ExplodeSpriteRUID, self.Entity, effectPosition, 0, Vector3.one * self.EffectScale, false, options) -- 1. self.ExplodeSpriteRUID: 재생할 이펙트의 리소스 ID (RUID) -- 2. self.Entity: 이펙트를 표시할 대상 엔티티 -- 3. effectPosition: 이펙트가 재생될 위치 (Vector3) -- 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] | code [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | _LogStorageService에 저장된 구매 로그를 기반으로 환불 요청이 접수되었을 때, 구매일로부터 7일 이내인지 확인하여 환불 가능 여부를 반환하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `_LogStorageService`를 사용하여 구매 정보를 **기록**(`LogPurchaseInfo`)하는 방법과 상품 구매 콜백 처리에 대한 내용만 포함되어 있습니다. 문서에는 `_LogStorageService`에서 저장된 로그를 **조회**하거나, 특정 `PurchaseId` 또는 `UserId` 기준으로 구매 일자를 가져와 7일 이내 여부를 판단하는 API(메서드)가 명시되어 있지 않습니다. 또한, 환불 처리를 위한 구체적인 API(예: `_WorldShopService`의 환불 메서드 등)도 문서 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 문서에 명시된 발사체 충돌 처리 스크립트에서 실행 공간 설정과 유효성 검사 조건을 3문장 이내로 요약하세요. [answer] | 발사체 충돌 처리 이벤트 핸들러의 실행 공간은 **server only**로 설정됩니다. 충돌 대상이 몬스터인지 확인하기 위해 `isvalid(TriggerBodyEntity.Monster) == false` 조건을 검사합니다. 해당 조건이 참이면 함수를 종료하고, 거짓일 경우에만 폭발 처리를 수행합니다. [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] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 폭발 이펙트 재생을 위해 `_EffectService:PlayEf` 호출 직전에 `options` 테이블에 어떤 키와 값을 설정하는지 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua local effectPosition = Vector3(transform.Position.x + effectOffset.x, transform.Position.y + effectOffset.y, transform.Position.z) local options = { ["FlipX"] = not self.ToLeft } _EffectService:PlayEf ``` [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] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | HandleTriggerEnterEvent 이벤트 핸들러에서 몬스터 외 대상일 때의 처리 로직을 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua [server only] [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { -- Parameters local TriggerBodyEntity = event.TriggerBodyEntity -------------------------------------------------------- -- 충돌 대상이 몬스터가 아니라면 함수를 종료합니다 if isvalid(TriggerBodyEntity.Monster) == false the [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] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 중력 센서 사용하기 [question] | _MobileGyroscopeService의 IsHWSupported()와 IsEnabled() 상태를 주기적으로 확인하여, 센서가 비활성 상태이거나 하드웨어를 지원하지 않을 경우 _UIToast를 통해 사용자에게 해당 상태에 맞는 안내 메시지를 출력하는 모니터링 스크립트를 작성해줘. [answer] | `MobileGyroscopeService`는 모바일 기기에서만 테스트와 활용이 가능하며, 하드웨어 지원 여부와 현재 활성화 상태를 확인하는 메서드를 제공합니다. 사용자가 요청한 모니터링 스크립트는 `OnUpdate` 생명주기 메서드를 사용하여 매 프레임마다 상태를 체크하고, `_UIToast:ShowMessage`를 통해 상태에 맞는 메시지를 출력하도록 작성할 수 있습니다. 참고 문서를 바탕으로 작성한 mLua 스크립트는 다음과 같습니다. ```lua Property: [None] boolean IsMonitoring = t [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileGyroscopeService`를 활용해 모바일 기기에서 자이로스코프 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileGyroscopeService `MobileGyroscopeService`를 활용하면 모바일 기기의 중력, 중력 가속도, 회전 가속도 값 등을 측정해 기기가 어디서, 얼마만큼의 힘을 받아 움직였는지 알 수 있습니다. 예를 들어 핸드폰을 위로 던졌을 때 얼마나 위로 올라갔는지 측정할 때 이 서비스를 사용합니다. MobileGyroScopeService는
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | `Explode()` 함수 내에서 `positionOffset`을 계산할 때 `firstFrameSprite`의 어떤 두 속성을 나누어 사용하는지 2개만 나열하세요. [answer] | `Explode()` 함수에서 `positionOffset`을 계산할 때 `firstFrameSprite`의 다음 두 속성을 사용합니다. 1. `Width` (및 `Height`) 2. `PivotPixel` 코드 내 계산식은 `Vector2(firstFrameSprite.Width, firstFrameSprite.Height)`와 `firstFrameSprite.PivotPixel:ToVector2()`를 활용하여 오프셋을 구합니다. [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] | two_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | 가속도 센서 값을 읽어 공에 힘을 가할 때, 클라이언트와 서버 간의 데이터 전달 구조는 어떻게 되어 있는가? [answer] | 참고 문서에 제시된 가속도 센서 활용 예제에서 클라이언트와 서버 간의 데이터 전달 구조는 다음과 같이 동작합니다. **1. 클라이언트 측 (센서 데이터 읽기 및 전처리)** 클라이언트 스크립트는 모바일 기기의 가속도 센서 값을 직접 독취합니다. * `OnBeginPlay()`에서 `_MobileAccelerometerService:IsHWSupported()`로 하드웨어 지원 여부를 확인하고, 지원되는 경우 `_MobileAccelerometerService:Start()`를 호출하여 센서 측정을 시작합니다. * `OnUp [followup] | `OnUpdate`에서 `_MobileAccelerometerService:GetLastAcceleration()`으로 받은 값을 `Vector2`로 변환하여 `[server]`로 선언된 `Tilt` 메서드에 전달하고, `PhysicsRigidbodyComponent:ApplyForce`로 힘을 적용하는 전체 코드 블록은 어떻게 작성해야 하는가? [followup_answer] | 참고 문서에 제시된 가속도 센서 활용 예제를 바탕으로, `OnUpdate`에서 가속도 값을 `Vector2`로 변환하여 `[server]` 메서드에 전달하고 물리 힘으로 적용하는 전체 코드 블록은 다음과 같이 작성합니다. ```lua Property: [None] EntityRef BallEntityRef = /maps/map01/TiltBall [None] number ForcePower = 100 Method: [client only] void OnBeginPlay () { if _MobileAccelerometerS [scores] | [judge_reason] | [source_doc] | 1. 새로운 **AccelerometerLogic**을 생성합니다. 2. Property를 아래와 같이 추가하고, BallEntityRef에 TiltBall을 지정합니다. ```lua Property: [None] EntityRef BallEntityRef = /maps/map01/TiltBall [None] number ForcePower = 100 ``` 3. `MobileAccelerometerService:IsHWSupported()`를 활용해 기기에서 가속도 센서를 지원
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 모델에 TriggerComponent의 BoxSize를 X=2, Y=0.3으로 설정하는 것이 왜 중요한가요? [answer] | 발사체 모델에 `TriggerComponent`의 `BoxSize`를 **X=2, Y=0.3**으로 설정하는 것은 발사체가 실제로 물리 충돌을 감지하는 영역(히트박스)의 크기를 정의하기 위함입니다. 구체적인 중요성은 다음과 같습니다. 1. **충돌 감지 범위 정의**: `BoxSize`는 발사체 엔티티가 다른 객체(예: 몬스터)와 충돌했는지 판단하는 기준 박스의 크기를 결정합니다. X=2, Y=0.3으로 설정하면 발사체의 진행 방향(X축)으로 길이가 2, 세로 방향(Y축)으로 높이가 0.3인 직사각형 영역이 충돌 감지 영역이 됩 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | shape.Size과 shape.Position을 설정하는 코드를 포함하여, Explode() 함수의 공격 영역 계산 부분을 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void Explode() { -- 공격 영역 객체를 초기화합니다. local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 리소스를 미리 로드합니다. _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() -- 발사체를 쏜 플레이어 또는 공격 컴포넌트가 유효하지 않으면 종료합니다. if not i [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] | 폭발 이펙트 재생 및 발사체 제거 시 `Explode()` 함수에 추가해야 할 코드 구성은 어떻게 되나요? [answer] | 폭발 이펙트를 재생하고 발사체를 제거하기 위해 `Explode()` 함수에 추가해야 할 코드 구성은 다음과 같습니다. 1. **폭발 이펙트 재생**: * `transform.Position`과 `effectOffset`을 이용해 이펙트가 재생될 위치(`effectPosition`)를 계산합니다. * `options` 테이블을 생성하여 `FlipX` 값을 `not self.ToLeft`로 설정합니다. 이는 발사체 이동 방향에 따라 이펙트의 좌우 반전을 제어하기 위함입니다. * `_EffectServ [followup] | `effectPosition` 계산 시 `effectOffset`과 `self.ToLeft` 플래그가 `options["FlipX"]`에 어떻게 반영되며, `_EffectService:PlayEffect` 호출 시 `Vector3.one * self.EffectScale` 인자의 의미와 `self.Entity:Destroy()` 실행 순서를 설명해 주세요. [followup_answer] | `Explode()` 함수 내에서 `effectPosition` 계산, `_EffectService:PlayEffect` 호출 인자, 그리고 `self.Entity:Destroy()` 실행 순서에 대한 설명은 다음과 같습니다. **1. `effectOffset`과 `self.ToLeft` 플래그의 반영 방식** * **`effectPosition` 계산 시 `effectOffset` 반영:** * `effectOffset`은 발사체의 기본 위치(`transform.Position`)에 더해져 폭발 이펙트가 실제로 [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] | 발사체 모델에 Projectile 컴포넌트를 추가한 후 OnBeginPlay에서 self._T.Fired = false로 초기화했는데, 실제 발사 시점에 이 값이 true로 변경되지 않으면 발사체는 어떤 행동을 보이나요? [answer] | `OnUpdate` 함수의 코드를 보면, 함수 시작 부분에 `if not self._T.Fired then return end`라는 조건문이 있습니다. 따라서 `Fire()` 함수가 호출되어도 `self._T.Fired` 값이 `true`로 변경되지 않으면, `OnUpdate`는 매 프레임마다 이 조건문을 만나 즉시 함수를 종료(return)하게 됩니다. 결과적으로 **발사체는 아무런 움직임 없이 제자리에 정지한 상태**를 유지합니다. 발사체가 실제로 움직이려면 `Fire()` 함수 내에서 `self._T.Fired = true [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발사체 스크립트 컴포넌트를 작성하고 발사체 모델에 연결해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭해 새 스크립트 컴포넌트를 만듭니다. 이름으로 **Projectile**를 입력합니다. 2. 발사체 모델 **Model_Projectile_Arrow**에 **Projectile** 컴포넌트를 추가합니다. 3. **Projectile** 스크립트 컴포넌트를 열고 아래와 같이 프로퍼티를 추가합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | math.rad와 cos, sin을 사용하여 positionOffset을 변환하는 로직이 발사체의 ZRotation에 따라 공격 영역을 어떻게 보정하는지 설명해 주세요. [answer] | 제공된 참고 문서에는 `math.rad`, `math.cos`, `math.sin`을 사용하여 `positionOffset`을 변환하는 로직이 발사체의 `ZRotation`에 따라 공격 영역을 어떻게 보정하는지에 대한 원리나 상세한 설명이 포함되어 있지 않습니다. 문서에는 해당 수식(`offsetX`, `offsetY` 계산 부분)이 코드 예제로 제시되어 있을 뿐, 그 내부 동작 방식에 대한 텍스트 설명은 없습니다. 따라서 제공된 정보를 바탕으로 구체적인 보정 원리를 설명할 수 없습니다. [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] | 발사체가 발사된 후 지정된 시간만큼 이동하다가 사라지게 하려면 Fire 함수에서 어떤 서비스를 호출해야 하나요? [answer] | `Fire` 함수에서는 **`_TimerService`**를 호출해야 합니다. 구체적으로는 `_TimerService:SetTimerOnce(destroySelf, self.DestroyAfterSec)`를 호출하여, 지정된 시간(`DestroyAfterSec`)이 지난 시점에 발사체를 소멸(또는 폭발)시키는 함수가 실행되도록 설정합니다. 아래는 이를 포함하는 `Fire` 함수의 전체 코드입니다. ```lua void Fire() { local destroySelf = function() self:Expl [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발사체 스크립트 컴포넌트를 작성하고 발사체 모델에 연결해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭해 새 스크립트 컴포넌트를 만듭니다. 이름으로 **Projectile**를 입력합니다. 2. 발사체 모델 **Model_Projectile_Arrow**에 **Projectile** 컴포넌트를 추가합니다. 3. **Projectile** 스크립트 컴포넌트를 열고 아래와 같이 프로퍼티를 추가합니다.