[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | Fire 함수 내에서 타이머 설정과 스프라이트 방향 전환이 수행되는 순서를 단계별 번호 목록으로 정리하세요. [answer] | `Fire()` 함수 내에서 수행되는 작업은 다음과 같은 순서로 실행됩니다. 1. `destroySelf` 함수가 `self.DestroyAfterSec` 시간 후 실행되도록 `_TimerService:SetTimerOnce(destroySelf, self.DestroyAfterSec)`를 호출하여 타이머를 설정합니다. 2. `self.ToLeft` 값에 따라 `self.Entity.SpriteRendererComponent.FlipX`를 설정하여 발사체의 스프라이트 방향을 전환합니다. 3. `self._T.Fired`를 `tru [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] | PhysicsColliderComponent의 CollisionDetectionMode를 벽은 Continuous, 공은 Discrete로 설정했는데, 이 두 값의 차이는 무엇이고 빠른 속도로 이동하는 물체에서 왜 이 설정이 중요한가요? [answer] | 제공된 참고 문서에는 `PhysicsColliderComponent`의 `CollisionDetectionMode` 속성 값(`Continuous`, `Discrete`)에 대한 정의, 두 값의 정확한 차이, 또는 물체의 이동 속도와 충돌 감지 방식 간의 기술적 연관성에 대한 설명이 포함되어 있지 않습니다. 문서에서는 벽을 만들 때 `CollisionDetectionMode: Continuous`로, 공을 만들 때 `CollisionDetectionMode: Discrete`로 설정하라는 **설치 단계의 지시사항**만 제시하고 있 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 모델 생성부터 CollisionGroup 설정까지의 단계를 번호 목록으로 순서대로 나열하세요. [answer] | 발사체 모델 생성부터 CollisionGroup 설정까지의 단계는 다음과 같습니다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Model**을 클릭해 새 모델을 만들고, 이름으로 **Model_Projectile_Arrow**를 입력합니다. 2. **Model_Projectile_Arrow**의 프로퍼티 에디터에서 **SpriteRendererComponent**를 추가하고 **PlayRate**를 2.5, **SpriteRUID**를 `82013caa86844d32853f8433266ef2 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | single_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | MobileAccelerometerService의 IsHWSupported와 IsEnabled 체크를 모두 통과했는데도 실제 가속도 값이 0으로만 나오거나 반응이 없는 이유는 무엇인가요? [answer] | 제공된 참고 문서에는 `MobileAccelerometerService`가 정상적으로 지원되고 활성화(`IsHWSupported`와 `IsEnabled` 체크 통과)되었음에도 불구하고 실제 가속도 값이 0으로만 나오거나 반응이 없는 현상에 대한 구체적인 원인이나 해결 방법이 명시되어 있지 않습니다. 문서에서는 다음과 같은 사항만 안내하고 있습니다: 1. `MobileAccelerometerService`는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 2. 기기가 가속도 센서를 지원하지 않는 경우 `_UIToast:ShowMe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 월드코인 환불 절차 6단계를 순서대로 나열하되, 각 단계에서 클릭해야 하는 버튼 이름만 대괄호 `[ ]`로 감싸서 표기하세요. [answer] | 1. [메이플스토리 월드 공식 홈페이지](https://maplestoryworlds.nexon.com/) 로그인 후 내 계정의 구매 내역 페이지를 엽니다. 2. 구매 내역 페이지에서 [월드코인 내역] 버튼을 클릭합니다. 3. 월드코인 수익 내역에서 환불해 주려는 주문번호를 확인한 뒤 [상세보기] 버튼을 클릭합니다. 4. 주문 상세 정보에서 수익 금액 옆의 [환불하기] 버튼을 클릭합니다. 5. 확인 팝업 창에서 [확인] 버튼을 클릭하면 환불 처리됩니다. 6. 다시 월드코인 내역으로 돌아와 환불 완료 처리된 것을 확인합니다. [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] | _WorldShopService:SetProcessPurchaseCallback과 _LogStorageService:LogPurchaseInfo를 사용하여 상품 구매 요청 시 구매 정보를 기록하는 스크립트를 작성해줘 [answer] | 상품 구매 요청이 발생했을 때 구매 정보를 기록하는 스크립트는 `_WorldShopService:SetProcessPurchaseCallback`으로 콜백을 등록하고, 콜백 내부에서 `_LogStorageService:LogPurchaseInfo`를 호출하는 방식으로 작성합니다. ```lua Method: [server only] void OnBeginPlay() { _WorldShopService:SetProcessPurchaseCallback(self.ProcessPurchase) } [server only] bool [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 진동 기능 활용 [question] | UI 에디터에서 생성한 UIButton_Vib 엔티티에 Vibrate 컴포넌트를 추가하고, ButtonClickEvent 핸들러를 통해 진동 기능을 구현하는 스크립트를 작성해줘 [answer] | UI 에디터에서 `UIButton_Vib` 버튼을 배치하고 해당 버튼에 `Vibrate` 컴포넌트를 추가한 후, 버튼 클릭 시 진동을 발생시키는 스크립트는 다음과 같습니다. `MobileVibratorService`는 모바일 기기에서만 정상 작동하므로, 메이커에서 테스트할 때는 반응이 없을 수 있습니다. 또한, 하드웨어가 진동을 지원하는지 먼저 확인하는 것이 좋습니다. ```lua Event Handler: [entity] (/ui/DefaultGroup/UIButton_Vib) HandleButtonClickEvent (But [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 한국 계정과 그 외 계정의 환불 처리 차이점을 비교하여, '구분 기준', '환불 가능 기간', '크리에이터 권한' 3개 항목으로 구성된 표로 정리하세요. [answer] | 한국 계정과 그 외 계정의 환불 처리 차이점은 다음과 같습니다. | 구분 | 한국 계정 | 그 외 계정 | | :--- | :--- | :--- | | **구분 기준** | 가입된 지역이 **한국**인 계정 | 가입된 지역이 **한국 외**인 계정 | | **환불 가능 기간** | 판매 후 **30일** 이내 | 판매 후 **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의 GetAccelerationX와 GetAccelerationY 값을 OnUpdate에서 매 프레임마다 읽어와 TiltBall 엔티티의 TransformComponent.Position에 x축과 y축 방향으로 이동하도록 적용하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `MobileAccelerometerService`에서 `GetLastAcceleration()` 메서드를 사용해 가속도 벡터를 조회하는 방법과, `PhysicsRigidbodyComponent:ApplyForce()`를 통해 물체에 힘을 가하는 예제만 포함되어 있습니다. `GetAccelerationX`, `GetAccelerationY`라는 개별 축 조회 API는 문서에 존재하지 않으며, `TransformComponent.Position`을 직접 수정하여 이동을 제어하는 예제도 문서에 없습니다. 따라서 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | code [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | _LogStorageService를 사용하여 특정 유저의 상품 구매 이력을 조회하고 출력하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `_LogStorageService:LogPurchaseInfo` 메서드를 사용하여 구매 정보를 **기록하는** 방법만 설명되어 있습니다. 문서에는 `_LogStorageService`를 사용하여 특정 유저의 구매 이력을 **조회(읽기)하고 출력하는 메서드나 API가 명시되어 있지 않습니다.** 따라서 해당 기능을 구현하는 코드를 작성해 드릴 수 없습니다. 참고 문서에 포함된 정보에 따르면, 현재는 로그 조회 시스템이 구축 중인 상태이며, 시스템이 완성되기 전까지는 크리에이터가 직접 구매 정보를 기록하는 스 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | single_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | 벽에 PhysicsRigidbodyComponent의 BodyType을 Static으로 설정하고 Friction 값을 0.2로 조정했는데, 모바일 기기를 기울였을 때 공이 벽에 부딪혀서 완전히 멈추지 않고 미세하게 미끄러지는 현상을 방지하려면 어떤 프로퍼티를 수정해야 하나요? [answer] | 미세한 미끄러짐 현상을 방지하기 위해서는 벽에 적용된 `PhysicsRigidbodyComponent`의 **Restitution** 값을 조정해야 합니다. 문서에 따르면 벽의 `PhysicsRigidbodyComponent` 설정 예시에는 `Restitution`이 0.5로 지정되어 있습니다. `Restitution`은 반발력(바운스)을 제어하는 프로퍼티이며, 이 값이 높으면 물체가 충돌할 때 에너지를 많이 잃지 않고 튕겨 나가거나 미세하게 밀리는 현상이 발생할 수 있습니다. 공이 벽에 부딪혀 완전히 멈추게 하려면 반발력을 최 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | two_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 스크린샷을 촬영하여 Frame 안에 동적으로 표시하는 `CaptureAndUpload()` 함수의 전체 로직과 처리 과정은 무엇인가요? [answer] | `CaptureAndUpload()` 함수는 클라이언트에서 실행되며, 현재 화면을 스크린샷으로 촬영한 뒤 Frame 안에 표시되도록 처리하는 로직입니다. 전체 처리 과정은 다음과 같습니다. 1. **Frame 스프라이트 정보 확인**: `self.FrameEntity.SpriteRendererComponent.SpriteRUID`를 통해 Frame 엔티티의 스프라이트 RUID를 가져오고, `_ResourceService:LoadSpriteAndWait(frameRUID)`로 해당 스프라이트를 로드합니다. 이후 `sprite.Wi [followup] | `_ScreenshotService:CaptureFullScreenAsPixelDataAndWait()`에서 발생한 에러를 처리하거나, 업로드 요청이 실패했을 때를 대비한 예외 처리 코드 예시를 작성해 주세요. [followup_answer] | 참고 문서에 포함된 `CaptureAndUpload()` 함수의 코드 예시에는 에러 반환값을 확인하는 로직이 포함되어 있지 않으며, 업로드 실패 시 처리를 위한 예외 처리 코드도 제시되어 있지 않습니다. 문서에는 `_ScreenshotService:CaptureFullScreenAsPixelDataAndWait()` 호출 시 `error` 변수가 반환된다는 것(첫 번째 반환값)과 `_ResourceService:RequestSpriteUploadAsync`의 콜백 함수에 `error` 인자가 전달된다는 사실만 확인됩니다. 그러나 [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] | 자이로스코프 로직을 작성하고 적용한 후, 모바일 기기에서 정상적으로 동작하는지 확인하기 위한 최종 절차는 **월드를 출시한 뒤 모바일 기기에서 직접 확인**하는 것입니다. 이 과정에서 기기가 자이로스코프 센서를 지원하는지, 그리고 센서 값에 따라 물체가 의도한 대로 움직이는지를 검증할 수 있습니다. [followup] | `BallEntityRef`에 물리 컴포넌트가 없거나, `ForcePower` 프로퍼티의 값이 너무 작아 엔티티가 움직이지 않을 때 점검해야 할 구체적인 설정 항목과 디버깅 포인트는 어디인가요? [followup_answer] | 제공된 참고 문서에는 `BallEntityRef`에 물리 컴포넌트가 없거나 `ForcePower` 값이 너무 작아 엔티티가 움직이지 않을 때의 구체적인 점검 항목이나 디버깅 절차에 대한 내용이 포함되어 있지 않습니다. 문서에는 `BallEntityRef`에 `TiltBall`을 지정하고 `ForcePower`를 설정하며, `_MobileGyroscopeService`를 통해 가속도를 읽어 `PhysicsRigidbodyComponent:ApplyForce`에 힘을 가하는 기본 코드 구조와, 최종적으로 월드를 출시 후 모바일에서 확 [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] | instruction_following [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | _`_LogStorageService:GetPurchaseLogPagesAsync`를 사용하여 2022년 11월 25일부터 30일까지의 구매 로그를 페이지네이션 처리하며 조회하는 mLua 코드만 출력하고, 로직 설명은 주석으로 작성하세요. [answer] | ```lua local fromDate = DateTime(2022, 11, 25) local toDate = DateTime(2022, 11, 30) _LogStorageService:GetPurchaseLogPagesAsync(fromDate, toDate, function(purchaseLogPages) while true do -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져옵니다. local purchaseLogs = purchaseLogPages:GetCurr [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] | single_turn [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 유저에게 환불을 해줘야 하는지 판단할 때, 구매자가 정상적으로 코인을 지불했음에도 상품을 획득하지 못했는지 어떻게 확인해야 하나요? [answer] | 유저가 정상적으로 코인을 지불했음에도 상품을 획득하지 못했는지 확인하기 위해서는, 크리에이터가 직접 자신의 월드에 **상품 구매 정보를 기록하고 조회하는 스크립트**를 추가해 두어야 합니다. 현재 메이플스토리 월드에서는 구매 관련 로그 조회 시스템이 완성되지 않았기 때문에, 크리에이터가 아래 과정에 따라 구매 이력을 직접 관리해야 환불 정당성을 판단할 수 있습니다. ### 1. 구매 정보 기록하기 월드 내에서 상품 구매 요청이 발생할 때, `_WorldShopService:SetProcessPurchaseCallback`을 통해 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 진동 기능 활용 [question] | 모바일 기기에서만 작동하는 _MobileVibratorService를 사용하여 버튼 클릭 이벤트 발생 시 진동을 울리는 스크립트를 작성해줘 [answer] | `_MobileVibratorService`는 모바일 기기에서만 정상적으로 작동하며, 메이커에서 테스트할 때는 진동이 울리지 않습니다. 따라서 모바일 기기에서 직접 테스트해야 합니다. 아래는 버튼을 클릭할 때 하드웨어가 진동을 지원하는지 확인한 후 진동을 울리고 토스트 알림을 표시하는 스크립트입니다. ```lua Event Handler: [entity] (/ui/DefaultGroup/UIButton_Vib) HandleButtonClickEvent (ButtonClickEvent event) { local Entity [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 진동 기능 활용 [question] | _MobileVibratorService의 IsHWSupported() 메서드로 하드웨어 지원 여부를 확인하고, 지원될 경우에만 Vibrate() 메서드를 실행하는 로직을 포함하는 스크립트를 작성해줘 [answer] | `_MobileVibratorService`는 모바일 기기에서만 정상적으로 작동하며, 메이커(Maker) 환경에서는 테스트가 불가능합니다. 하드웨어 지원 여부를 확인하는 `IsHWSupported()`와 진동을 실행하는 `Vibrate()` 메서드를 사용하여, 버튼 클릭 시 하드웨어가 지원되는 경우에만 진동이 울리도록 구성할 수 있습니다. 아래는 버튼 클릭 이벤트(`ButtonClickEvent`)를 받아 해당 로직을 수행하는 스크립트 예시입니다. ```lua Event Handler: [entity] (/ui/DefaultGr [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C
[task] | two_turn [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | 스크린샷 이미지를 Frame에 맞게 크기 조절하기 위해 `horizontalRatio`와 `verticalRatio`를 계산할 때 각각 `0.96`과 `0.67`을 곱하는 이유는 무엇이며, 이 값들을 어떻게 변경해야 하나요? [answer] | `horizontalRatio`와 `verticalRatio`에 각각 `0.96`과 `0.67`을 곱하는 이유는 **촬영한 스크린샷이 Frame(액자) 안에 정확히 들어오도록 크기를 의도적으로 줄여 넣기** 위함입니다. 구체적인 이유는 다음과 같습니다. 1. **Frame 안으로 안전하게 배치**: 단순히 Frame의 픽셀 크기와 스크린샷의 픽셀 크기를 1:1로 나누면 스크린샷이 Frame의 가장자리에 딱 맞춰져 프레임의 테두리나 디자인 요소에 의해 일부가 잘릴 수 있습니다. `0.96`과 `0.67` 같은 **1보다 작은 값 [followup] | 스크린샷이 Frame 안에 꽉 차도록(`Scale` 1.0에 가깝게) 보이길 원한다면 비율 계산식을 어떻게 수정해야 하는지 `Vector3` Scale 적용 부분을 포함해 코드를 수정해 주세요. [followup_answer] | 스크린샷이 Frame 안에 꽉 차 보이도록 하려면 `horizontalRatio`와 `verticalRatio` 계산 시 곱하던 축소 계수(`0.96`, `0.67`)를 제거하여 Frame의 픽셀 크기와 스크린샷의 픽셀 크기를 1:1로 대응시키는 방식으로 수정해야 합니다. 단, Frame의 가로세로 비율과 스크린샷의 가로세로 비율이 다를 경우 한쪽 방향으로 넘치거나 빈 공간이 생길 수 있습니다. 단순히 "꽉 차게" 보이려면 각 축별로 Frame 크기에 맞춰 스케일을 계산하는 것이 일반적입니다. 참고 문서의 로직을 기반으로 축소 [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] | 월드 내 상품 구매 정보를 기록하는 예제 코드에서 _WorldShopService:SetProcessPurchaseCallback 함수 내부에서 무엇을 처리해야 하나요? [answer] | `_WorldShopService:SetProcessPurchaseCallback` 함수에는 상품 구매 요청이 발생했을 때 실행될 콜백 함수를 등록합니다. 이 콜백 함수 내부에서는 구매 처리가 완료된 후 다음 작업을 수행해야 합니다. 1. **구매 정보 기록**: `_LogStorageService:LogPurchaseInfo(purchaseInfo, "메시지")`를 호출하여 구매 관련 정보를 기록합니다. 이는 향후 환불 요청 시 구매 사실과 내역을 확인하기 위한 필수 절차입니다. 2. **상품 지급 처리**: `purchas [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | ToLeft 플래그가 true일 때 effectOffset.x 값이 음수(-)로 반전되는 로직이 적용되는 이유를 1문장으로 답하세요. [answer] | 발사체가 왼쪽으로 이동할 때(`self.ToLeft`가 true) 이펙트의 좌우 대칭 구조상 오프셋 방향도 반대로 적용되어야 시각적 위치와 실제 공격 영역이 일치하기 때문입니다. [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] | 모바일 기기에서 버튼을 눌렀을 때 진동은 울리는데 "Vibration On" 토스트 알림창이 안 나오면 어떤 부분을 점검해야 하나요? [answer] | 모바일 기기에서 진동은 작동하지만 토스트 알림창이 표시되지 않는다면, 아래 항목들을 순서대로 점검해야 합니다. **1. 토스트 UI 컴포넌트 존재 여부** 스크립트에서 `_UIToast:ShowMessage("Vibration On")`을 호출하려면 월드에 **ToastGroup** 컴포넌트가 존재해야 합니다. * UI 에디터에서 **ToastGroup**이是否正确하게 배치되어 있는지 확인하세요. * 문서에 따르면 토스트 UI는 `UI 에디터 - ToastGroup`에서 편집 및 관리할 수 있으므로, 해당 그룹이 비활성화되 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 진동 기능 활용 [question] | _MobileVibratorService:IsHWSupported() 체크 후 버튼 클릭 시 _MobileVibratorService:Vibrate() 호출 및 _UIToast:ShowMessage()로 토스트 알림을 표시하는 스크립트를 작성해줘 [answer] | 요청하신 기능(하드웨어 진동 지원 여부 확인 후 진동 및 토스트 알림)을 구현하는 스크립트입니다. `MobileVibratorService`는 모바일 기기에서만 정상 작동하며, 메이커(Maker) 환경에서는 테스트가 불가합니다. 따라서 모바일 기기에 배포한 후 확인해야 합니다. ```lua Event Handler: [entity] (/ui/DefaultGroup/UIButton_Vib) HandleButtonClickEvent(ButtonClickEvent event) { local Entity = event.Entit [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 중력 센서 사용하기 [question] | _MobileGyroscopeService와 _UIToast를 활용하여 모바일 기기의 자이로스코프 지원 여부를 확인하고, 지원하지 않을 경우 "Failed to start gyroscope" 메시지를 표시하며, 지원할 경우 현재 활성화 상태에 따라 StopAndWait() 또는 StartAndWait()를 호출하여 센서를 시작하거나 중지하는 토글 로직을 구현하는 스크립트를 작성해줘. [answer] | 요청하신 `_MobileGyroscopeService`와 `_UIToast`를 활용한 자이로스코프 토글 로직 스크립트는 다음과 같습니다. ```lua Method: [client only] void GyroscopeCheck(boolean onoff) { if _MobileGyroscopeService:IsHWSupported() then if _MobileGyroscopeService:IsEnabled() then _MobileGyroscopeService:StopAndWait() [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileGyroscopeService`를 활용해 모바일 기기에서 자이로스코프 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileGyroscopeService `MobileGyroscopeService`를 활용하면 모바일 기기의 중력, 중력 가속도, 회전 가속도 값 등을 측정해 기기가 어디서, 얼마만큼의 힘을 받아 움직였는지 알 수 있습니다. 예를 들어 핸드폰을 위로 던졌을 때 얼마나 위로 올라갔는지 측정할 때 이 서비스를 사용합니다. MobileGyroScopeService는
[task] | single_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | PC 환경에서 테스트할 때 모바일 가속도 센서 기능을 시뮬레이션할 수 있는 방법이 없다면, 개발 단계에서 공이 기대대로 굴러가는지 확인하기 위해 어떤 대안을 사용해야 하나요? [answer] | 제공된 참고 문서에는 PC 환경에서 모바일 가속도 센서를 시뮬레이션하는 방법이나 관련 API가 명시되어 있지 않습니다. `MobileAccelerometerService`는 가속도 센서가 있는 모바일 기기에서만 동작하며, 지원하지 않는 환경에서는 `_UIToast:ShowMessage("Failed to start Accelerometer")`와 같이 안내 메시지를 표시하도록 설계되어 있습니다. 따라서 문서에 근거할 때, PC에서 가속도 센서 값을 직접 입력하거나 시뮬레이션하는 공식적인 방법은 존재하지 않습니다. 개발 단계에서 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | Explode() 함수에서 spriteSize 변수를 계산할 때 PixelPerUnit(PPU)를 분모로 사용하는 이유를 2문장 이내로 설명하세요. [answer] | `PixelPerUnit(PPU)`는 픽셀 단위와 월드 단위 사이의 변환 비율을 나타내므로, 픽셀 단위의 스프라이트 크기를 월드 좌표계에서 사용할 수 있는 실제 크기로 변환하기 위해 분모로 나눕니다. 이를 통해 스프라이트가 씬에서 의도한 물리적 크기로 정확히 렌더링되고, 해당 크기에 맞춰 공격 영역(`shape.Size`)이 올바르게 설정됩니다. [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] | MobileAccelerometerService를 Start하고 Stop할 때 반드시 IsEnabled 상태를 확인하는 코드를 작성해야 하는 이유는 무엇이며, 이 체크를 생략하면 어떤 문제가 발생할 수 있나요? [answer] | `MobileAccelerometerService`를 `Start` 또는 `Stop` 호출 전에 `IsEnabled` 상태를 반드시 확인해야 하는 이유는, 가속도 센서 서비스의 현재 실행 상태와 일치하지 않는 명령을 중복으로 내릴 경우 의도치 않은 동작 오류가 발생할 수 있기 때문입니다. 문서에서 제시한 코드를 보면, `Start`를 호출하기 전에는 `IsEnabled()`가 `false`인지, `Stop`을 호출하기 전에는 `IsEnabled()`가 `true`인지를 명시적으로 확인하는 구조를 취하고 있습니다. ```lua i [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | two_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | 가속도 센서 기반 조작에 필요한 스크립트 컴포넌트의 Property 설정은 어떻게 해야 하는가? [answer] | 가속도 센서 기반 조작을 위한 스크립트 컴포넌트의 Property 설정은 다음과 같이 구성해야 합니다. 먼저, 가속도 센서의 값에 따라 물리 힘을 가할 대상 엔티티를 참조하기 위해 `EntityRef` 타입의 `BallEntityRef` 프로퍼티를 선언하고, 해당 프로퍼티에 실제 조작할 엔티티(예: `/maps/map01/TiltBall`)의 경로를 지정해야 합니다. 또한, 가해지는 힘의 세기를 조절하기 위해 `number` 타입의 `ForcePower` 프로퍼티를 선언합니다. ```lua Property: [None] Enti [followup] | `BallEntityRef`에 `/maps/map01/TiltBall` 경로를 지정하고, `ForcePower`를 100으로 설정하는 `Property:` 블록의 정확한 mLua 문법은 어떻게 되는가? [followup_answer] | `BallEntityRef`에 `/maps/map01/TiltBall` 경로를 지정하고 `ForcePower`를 100으로 설정하는 `Property:` 블록의 정확한 mLua 문법은 다음과 같습니다. ```lua Property: [None] EntityRef BallEntityRef = /maps/map01/TiltBall [None] number ForcePower = 100 ``` [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] | 구매 정보 조회 코드를 메이커에서 테스트해 보면 결과가 나오지 않는데, 이는 정상적인 현상이며 출시 후 비공개 월드로 먼저 전환하여 검증하는 것이 권장되는 이유인가요? [answer] | 네, 메이커에서 구매 정보 조회 코드를 테스트했을 때 결과가 나오지 않는 것은 정상적인 현상입니다. 상품 구매 정보 조회는 메이커 환경에서 테스트할 수 없으며, 월드 출시 이후에만 확인할 수 있습니다. 따라서 다음과 같은 절차로 검증하는 것이 권장됩니다. 1. **비공개 월드로 출시**: 먼저 월드를 비공개 상태로 출시합니다. 2. **검증**: 비공개 월드에서 구매 정보 조회가 정상적으로 진행되는지 확인합니다. 3. **공개 전환**: 문제가 없음을 확인한 후, 월드를 공개 상태로 전환합니다. 이 과정을 통해 출시 후 [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] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | Collision Groups 패널에서 Projectile 그룹을 추가할 때 Matrix 탭 설정을 잘못하면 발사체가 몬스터와 충돌하지 않는 원인은 무엇인가요? [answer] | 제공된 문서에는 Collision Groups 패널의 Matrix 탭에서 구체적으로 어떤 값을 설정해야 하는지나, 설정 오류 시 발생하는 기술적 원인(예: 특정 행렬 값이 충돌 판정을 비활성화하는 등)에 대한 설명이 포함되어 있지 않습니다. 문서에는 다음과 같은 절차만 안내하고 있습니다. 1. **Collision Groups** 패널에서 **[Add Collision Group]** 버튼을 클릭해 **Projectile** 그룹을 추가합니다. 2. 이후 **Matrix** 탭으로 이동해 "아래 그림과 같이 설정"합니다. 따라서 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | code [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 모델에 Projectile 컴포넌트를 연결하여 OnBeginPlay에서 Fired를 false로 초기화하고, server only 실행 공간의 OnUpdate에서 Fired가 true일 때 Speed와 ToLeft 값을 이용해 TransformComponent:Translate로 이동하며, Fire() 호출 시 _TimerService:SetTimerOnce로 DestroyAfterSec 후 Explode()가 실행되도록 설정하는 스크립트를 작성해줘. [answer] | 요청하신 발사체 스크립트 컴포넌트 **Projectile**입니다. ```lua Property: [Sync] number DestroyAfterSec = 2 [Sync] number Speed = 7.5 [Sync] string ExplodeSpriteRUID = "47a613712de34f9ba2ea25ef40894756" [Sync] Vector2 ExplodeEffectOffset = Vector2(0,0) [Sync] number EffectScale = 1 [None] boolean ToLeft = false [None [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발사체 스크립트 컴포넌트를 작성하고 발사체 모델에 연결해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scripts - Create Component**를 클릭해 새 스크립트 컴포넌트를 만듭니다. 이름으로 **Projectile**를 입력합니다. 2. 발사체 모델 **Model_Projectile_Arrow**에 **Projectile** 컴포넌트를 추가합니다. 3. **Projectile** 스크립트 컴포넌트를 열고 아래와 같이 프로퍼티를 추가합니다.