[task] | code [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | Frame 엔티티와 Canvas 엔티티 경로를 Property 로 정의하고, 클라이언트에서 키 입력 시 서버에 스크린샷 업로드 요청을 보내며, 서버에서 _ResourceService 를 통해 업로드를 검증 및 처리하는 멀티스레드 구조의 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 스크린샷을 찍기 위한 **키 입력 이벤트 핸들러(Event Handler)** 코드나, 클라이언트에서 서버로 스크린샷 업로드 요청을 보내는 구체적인 API(메서드명)가 명시되어 있지 않습니다. 문서에서 확인 가능한 내용은 다음과 같습니다: 1. `Frame`과 `Canvas` 엔티티의 경로 정의 방법 2. 서버에서 `_ResourceService:SetSpriteUploadValidationCallback()`을 통해 업로드 허용 여부를 설정하는 방법 따라서 문서에 없는 '키 입력 처리' 및 '클라이언트에서 [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에서 IsEnabled() 확인 없이 Tilt 메서드를 호출하면 성능이나 동작에 어떤 차이가 있나요? [answer] | 제공된 참고 문서와 실제 mLua 예제에 따르면, `OnUpdate`에서 `_MobileAccelerometerService:IsEnabled()`을 확인하지 않고 `Tilt` 메서드를 호출했을 때의 구체적인 **성능 차이에 대한 수치적 데이터나 공식적인 성능 분석은 문서에 명시되어 있지 않습니다.** 따라서 문서의 내용만으로는 "성능이 얼마나 저하되는지"에 대해 단정할 수 없습니다. 다만, **동작상의 차이**에 대해서는 문서의 코드 구조를 통해 다음과 같이 설명할 수 있습니다. 1. **비활성 상태에서의 불필요한 통신 발 [followup] | [followup_answer] | [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] | 스크린샷 업로드 시 발생할 수 있는 제한 사항(용량, 동시 요청, 시간당 횟수)에는 어떤 것들이 있나요? [answer] | 스크린샷 업로드 시 다음 제한 사항이 있습니다. 1. **용량 제한**: 업로드하는 리소스는 **3MB**를 초과할 수 없습니다. 2. **동시 요청 제한**: 업로드는 **한 번에 하나만** 요청할 수 있습니다. 이전 요청이 완료되기 전에 다시 요청하면 업로드가 실패합니다. 3. **시간당 횟수 제한**: 월드 기준 **1분 당 5회**로 제한됩니다. 월드에 너무 많은 요청이 들어오면 업로드에 실패할 수 있으므로, 여러 클라이언트에서 동시에 요청을 보내지 않도록 주의해야 합니다. [followup] | 월드에 여러 클라이언트가 접속되어 있을 때, "한 번에 하나만 요청할 수 있다"는 제한을 지키기 위해 업로드 요청을 큐(Queue) 방식으로 순차적으로 처리하도록 만드는 `mLua` 코드 구조를 제안해 주세요. [followup_answer] | 참고 문서에 따르면, 스크린샷 업로드는 **월드 기준 1분 당 5회**로 제한되며, **여러 클라이언트에서 동시에 요청을 보내지 않도록 주의해야 합니다**라고 명시되어 있습니다. 하지만 문서에는 "한 번에 하나만 요청할 수 있다"는 제한을 지키기 위한 **큐(Queue) 방식 처리 코드 구조나 관련 API(예: 큐 생성 메서드, 대기열 관리 함수 등)에 대한 설명이 없습니다.** mLua API 문서에도 스크린샷 업로드 요청을 순차적으로 처리하기 위한 큐(Queue) 관련 함수나 패턴이 제공되지 않으므로, 주어진 참고 문서를 근거 [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] | _MobileGyroscopeService:IsHWSupported()와 IsEnabled()의 차이는 무엇이며, 두 함수를 모두 체크해야 하는 이유가 뭔가요? [answer] | `_MobileGyroscopeService:IsHWSupported()`와 `_MobileGyroscopeService:IsEnabled()`는 각각 **하드웨어 지원 여부**와 **서비스 실행 상태**를 확인하는 서로 다른 역할을 합니다. ### 1. 두 함수의 차이 * **`_MobileGyroscopeService:IsHWSupported()`** * **역할:** 현재 사용자가 사용하는 모바일 기기가 자이로스코프 센서 하드웨어를 지원하는지 확인합니다. * **의미:** 기기에 물리적으로 센서가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileGyroscopeService`를 활용해 모바일 기기에서 자이로스코프 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileGyroscopeService `MobileGyroscopeService`를 활용하면 모바일 기기의 중력, 중력 가속도, 회전 가속도 값 등을 측정해 기기가 어디서, 얼마만큼의 힘을 받아 움직였는지 알 수 있습니다. 예를 들어 핸드폰을 위로 던졌을 때 얼마나 위로 올라갔는지 측정할 때 이 서비스를 사용합니다. MobileGyroScopeService는
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 월드코인 환불하기 [question] | 구매 정보 기록과 조회를 위해 추가해야 할 스크립트 처리 과정을 단계별 번호 목록으로 작성해 주세요. [answer] | 구매 정보 기록과 조회를 위한 스크립트 처리 과정은 다음과 같습니다. 1. **구매 처리 콜백 함수 등록** `_WorldShopService:SetProcessPurchaseCallback` 메서드를 사용하여 상품 구매 요청이 발생했을 때 실행될 콜백 함수를 등록합니다. 이 콜백은 `OnBeginPlay` 또는 스크립트가 시작되는 시점에 설정되어야 합니다. 2. **구매 정보 검증 및 사용자 엔티티 조회** 콜백 함수(`ProcessPurchase` 등) 내부에서 `purchaseInfo` 파라미터를 받습니다. `p [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | code [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | _SpriteService 또는 _ResourceService 의 스크린샷 관련 API 를 사용하여, 유저가 키를 눌렀을 때 현재 화면을 캡처하여 Frame 엔티티의 자식인 Canvas 의 SpriteRendererComponent 에 동적으로 스프라이트를 갱신하는 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 스크린샷을 캡처하여 Canvas에 적용하는 **구체적인 스크린샷 캡처 API(예: `TakeScreenshot`, `CaptureScreen` 등)가 명시되어 있지 않습니다.** 문서에 나와 있는 정보는 다음과 같습니다: 1. `_ResourceService:SetSpriteUploadValidationCallback()` 함수는 유저가 **업로드 요청을 보냈을 때** 이를 허용(true)하거나 거부(false)하도록 설정하는 용도입니다. 2. 이 예제는 "특정 키를 눌러 스크린샷을 찍은 뒤"라는 맥락에서 시 [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] | 메이커 에디터에서 모바일 진동 스크립트를 테스트했는데 아무 반응이 없는데, 정상적인 동작인가요? [answer] | 네, 정상적인 동작입니다. `MobileVibratorService`는 모바일 기기에서만 테스트와 활용이 가능하도록 설계되어 있어, 메이커에서 테스트할 경우 정상적으로 작동하지 않습니다. 진동 기능이 실제로 작동하는지 확인하려면 월드를 비공개로 출시한 뒤 모바일 기기에서 버튼을 눌러 확인해야 합니다. 참고로, 스크립트에서 하드웨어 지원 여부를 먼저 확인한 후 진동을 실행하는 것이 좋습니다. 아래는 버튼을 눌렀을 때 진동과 함께 토스트 알림을 표시하는 예시 코드입니다. ```lua Event Handler: [entity] (/u [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C
[task] | single_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 중력 센서 사용하기 [question] | `OnUpdate`에서 `GetUserAcceleration()`으로 받은 값을 `Tilt` 메서드에 넘길 때 왜 `Vector2`로 변환해서 전달해야 하나요? [answer] | `OnUpdate`에서 `GetUserAcceleration()`으로 받은 값은 기본적으로 `Vector3` 타입의 좌표계 데이터를 반환합니다. 그러나 물리 엔진의 `ApplyForce` 메서드나 2D 기반의 힘 방향 계산에서는 `Vector2` 타입의 값이 요구되거나, 3차원 데이터를 2차원 평면(x, y)에 투영하여 사용해야 하는 경우가 많습니다. 따라서 `Vector2(userAcceleration.x, userAcceleration.y)`처럼 명시적으로 변환하는 이유는 다음과 같습니다: 1. **타입 일치성**: `Ti [followup] | [followup_answer] | [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] | _MobileVibratorService:Vibrate() 를 호출하기 전에 반드시 _MobileVibratorService:IsHWSupported() 체크를 해야 하는 이유는 무엇인가요? [answer] | `_MobileVibratorService:Vibrate()` 호출 전에 `_MobileVibratorService:IsHWSupported()` 체크를 하는 이유는 **모바일 기기의 하드웨어 진동 기능 지원 여부를 확인하기 위함**입니다. 모든 모바일 기기가 하드웨어 진동 기능을 지원하는 것은 아니며, 지원하지 않는 기기에서 `Vibrate()`를 호출하면 의도하지 않은 오류나 비정상 동작이 발생할 수 있습니다. 따라서 진동을 울리기 전에 `IsHWSupported()` 메서드로 해당 기기가 진동 하드웨어를 지원하는지 확인하고, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C
[task] | code [pass] | ⏳ 미판정 [title] | 스크린샷과 동적 스프라이트 [question] | _KeyboardService 의 키 입력 이벤트를 활용해 스크린샷을 캡처하고, _ResourceService 의 스크린샷 업로드 API 를 호출하여 Frame 엔티티의 SpriteRendererComponent 에 해당 스크린샷을 스프라이트로 설정하는 SpriteUploadTest 스크립트를 작성해줘. [answer] | 제공된 참고 문서에는 `_KeyboardService`의 키 입력 이벤트 핸들러(예: `HandleKeyInputEvent`)나 스크린샷을 직접 캡처하여 `_ResourceService`에 업로드하는 구체적인 API(예: `TakeScreenshot`, `UploadSprite` 등)가 정의되어 있지 않습니다. 문서에는 **`_ResourceService:SetSpriteUploadValidationCallback()`** 함수가 존재하며, 이 함수가 유저의 업로드 요청을 허용하는 콜백을 설정하는 용도임을 확인합니다. 또한 `Sp [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] | `Tilt` 메서드가 `[server]` 실행 공간에서 `ApplyForce`를 호출할 때 적용되는 힘의 크기를 결정하는 Property와 그 계산 수식을 표로 정리해서 설명하세요. [answer] | `Tilt` 메서드가 `[server]` 실행 공간에서 물체에 힘을 가할 때 적용되는 힘의 크기는 **`ForcePower`** 프로퍼티와 가속도 센서에서 가져온 방향 벡터(`direction`)의 곱으로 결정됩니다. ### 1. 관련 Property | Property 이름 | Type | 초기값 (예시) | 설명 | | :--- | :--- | :--- | :--- | | `ForcePower` | `number` | `100` | 가속도 방향에 가해지는 힘의 배율(크기)을 결정하는 값입니다. | ### 2. 힘 계산 수식 [followup] | [followup_answer] | [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] | `ApplyForce`에 적용하는 힘의 세기를 조절하고 싶을 때 `ForcePower` 프로퍼티 값을 어떻게 설정하고, 이 값이 클수록 구슬의 움직임은 어떻게 변하나요? [answer] | `ForcePower` 프로퍼티는 모바일 기기의 기울기나 가속도 값(`Vector2`)을 받아 물체에 힘을 가할 때 곱해지는 배율(스케일 팩터)로 작용합니다. **설정 방법** 스크립트 상단의 `Property:` 블록에서 `ForcePower`의 기본 값을 원하는 숫자로 변경하면 됩니다. 참고 문서 예시에서는 기본값이 `100`으로 설정되어 있습니다. ```lua Property: [None] EntityRef BallEntityRef = /maps/map01/TiltBall [None] number ForcePower = 1 [followup] | [followup_answer] | [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] | 클라이언트에서 받은 Vector2 방향 벡터를 서버 메서드 Tilt를 통해 전달받아 BallEntityRef의 PhysicsRigidbodyComponent에 ForcePower를 곱해 ApplyForce로 적용하는 코드를 작성해줘 [answer] | 사용자가 요청한 코드는 클라이언트에서 가속도 센서 방향을 받아 서버로 전달하고, 서버에서 해당 방향에 `ForcePower`를 곱해 물체에 힘을 가하는 로직입니다. 제공된 참고 문서의 `AccelerometerLogic` 예제와 실제 mLua 예제를 기준으로 작성합니다. 1. **Property**: `BallEntityRef` (공 엔티티 참조)와 `ForcePower` (힘의 크기)를 정의합니다. 2. **Method (Client)**: `OnBeginPlay`에서 모바일 가속도 센서 하드웨어 지원 여부를 확인하고 시작 [followup] | [followup_answer] | [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] | Vibrate 컴포넌트의 Event Handler 에서 entity 로 변경하여 UIButton_Vib 를 지정해야 하는 구체적인 이유는 무엇인가요? [answer] | Vibrate 컴포넌트의 Event Handler에서 수신 객체를 `entity`로 변경하고 `UIButton_Vib`를 지정해야 하는 구체적인 이유는 다음과 같습니다. **1. 이벤트 발생 주체와의 매칭** `ButtonClickEvent`는 버튼 엔티티(`UIButton_Vib`)가 클릭되었을 때 발생하는 이벤트입니다. 이벤트 핸들러의 수신 객체(Sender)를 `entity`로 설정하고 해당 엔티티의 경로(`/ui/DefaultGroup/UIButton_Vib`)를 지정함으로써, 스크립트 엔진은 정확히 **`UIButton_ [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 모델에 추가해야 하는 TriggerComponent의 BoxSize와 CollisionGroup 설정 값을 표로 정리하세요. [answer] | 발사체 모델에 추가해야 하는 TriggerComponent 설정 값은 다음과 같습니다. | 프로퍼티 | 설정 값 | | :--- | :--- | | **BoxSize** | X = 2, Y = 0.3 | | **CollisionGroup** | Projectile | **참고:** `Projectile` CollisionGroup은 Collision Groups 패널에서 직접 추가한 뒤, TriggerComponent의 CollisionGroup 프로퍼티에 지정해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | MobileAccelerometerService의 IsHWSupported와 IsEnabled을 확인하여 가속도 센서 미지원 시 UIToast로 안내하고, 지원 시 Start로 센서 수집을 시작하는 스크립트를 작성해줘 [answer] | `MobileAccelerometerService`의 `IsHWSupported`와 `IsEnabled` 메서드를 사용하여 하드웨어 지원 여부 및 센서 활성화 상태를 확인하는 로직을 구현할 수 있습니다. 하드웨어를 지원하지 않는 경우 `_UIToast:ShowMessage`로 사용자에게 안내하고, 지원하는 경우 현재 센서가 비활성화 상태라면 `Start`를 호출하여 수집을 시작하는 스크립트입니다. ```lua Method: [client only] void OnBeginPlay() { if _MobileAccelerome [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | MobileAccelerometerService와 PhysicsRigidbodyComponent를 활용해 기기의 기울기에 따라 공이 가속되는 스크립트를 작성해줘 [answer] | 메이플스토리 월드에서 모바일 기기의 가속도 센서를 이용해 공을 기울인 방향대로 가속시키는 스크립트는 `AccelerometerLogic` 컴포넌트 형태로 작성합니다. 클라이언트 측에서 기기가 가속도 센서를 지원하는지 확인하고 측정 시작 및 현재 가속도 값을 조회한 뒤, 서버 측으로 해당 방향을 전달하여 물리 강체(PhysicsRigidbody)에 힘을 가하는 구조입니다. 아래와 같이 `Property`, `Method` 블록을 구성하여 작성할 수 있습니다. ```lua Property: [None] EntityRef BallE [followup] | [followup_answer] | [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] | 월드코인 환불 의무가 발생하는 3가지 구체적인 상황은 무엇이며, 특히 3번 항목에 해당하는 실수 사례가 있나요? [answer] | 월드코인 환불이 의무적으로 발생하는 3가지 구체적인 상황은 다음과 같습니다. 1. **미사용 상품에 대한 환불 요청**: 이용자가 월드 내에서 구매한 유료 상품(콘텐츠, 아이템 등)을 아직 사용하지 않았고, 구매일로부터 7일이 지나지 않은 경우입니다. 2. **크리에이터의 임의 삭제 또는 변경**: 크리에이터가 임의로 유료 상품(콘텐츠, 아이템 등)을 삭제하거나 변경하여, 유저가 이미 보유하고 있는 상품에 중대한 영향을 준 경우입니다. 3. **설명/섬네일과 실제 지급 상품 불일치**: 월드 내 유료 상품(콘텐츠, 아이템 등)의 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 모델의 SpriteRendererComponent에 설정할 PlayRate와 SpriteRUID 값을 코드 주석 형식으로만 출력하세요. [answer] | ```lua -- PlayRate: 2.5 -- SpriteRUID: 82013caa86844d32853f8433266ef25e ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | MobileAccelerometerService의 IsEnabled과 GetLastAcceleration을 OnUpdate에서 호출하여 최신 가속도 값을 Vector2로 변환하는 클라이언트 로직을 작성해줘 [answer] | `MobileAccelerometerService`의 `IsEnabled()`과 `GetLastAcceleration()`을 `OnUpdate`에서 호출하여 최신 가속도 값을 `Vector2`로 변환하는 클라이언트 로직은 다음과 같이 작성할 수 있습니다. 가속도 센서 사용 가능 여부를 확인하고 센서 측정을 시작하는 `OnBeginPlay`와, 매 프레임마다 가속도 값을 가져와 `Vector2`로 변환하는 `OnUpdate` 로직을 포함했습니다. ```lua Property: [None] EntityRef BallEntityRef [followup] | [followup_answer] | [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] | `Tilt` 메서드에서 방향 벡터의 x 또는 y 값이 0.2보다 작으면 구슬이 움직이지 않는 이유는 무엇이며 이 임계값을 조정하면 어떻게 되나요? [answer] | `Tilt` 메서드에서 방향 벡터의 x 또는 y 값이 0.2보다 작으면 구슬이 움직이지 않는 이유는, 코드에 명시된 조건문(`if direction.x > 0.2 or direction.y > 0.2 then`) 때문입니다. 이 조건은 자이로스코프나 가속도 센서로부터 입력된 값이 0.2를 초과할 때만 `ApplyForce`를 호출하도록 제한하고 있습니다. 이 임계값(0.2)은 다음과 같은 목적으로 사용됩니다: 1. **잡음(Noise) 제거**: 모바일 센서는 완전히 평평하게 놓여 있더라도 미세한 흔들림이나 측정 오차로 인해 0 [followup] | [followup_answer] | [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] | 로그 조회 시스템이 아직 구축 중이라, 크리에이터가 직접 구매 정보를 기록하기 위해 어떤 서비스를 사용해야 하나요? [answer] | 크리에이터가 직접 상품 구매 정보를 기록하려면 `_LogStorageService`를 사용해야 합니다. 구체적으로 `_WorldShopService:SetProcessPurchaseCallback`을 통해 상품 구매 요청이 처리되는 콜백 함수를 등록하고, 그 안에서 `_LogStorageService:LogPurchaseInfo` 메서드를 호출하여 구매 정보를 기록합니다. 예제 코드는 다음과 같습니다. ```lua _WorldShopService:SetProcessPurchaseCallback(function(purchaseI [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | two_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | 발사체 모델에 TriggerComponent를 추가하고 CollisionGroup을 Projectile로 설정하는 구체적인 절차가 어떻게 되나요? [answer] | 발사체 모델에 `TriggerComponent`를 추가하고 `CollisionGroup`을 `Projectile`로 설정하는 절차는 다음과 같습니다. 1. **TriggerComponent 추가 및 프로퍼티 설정** * `Model_Projectile_Arrow` 모델을 선택하여 프로퍼티 에디터에서 `TriggerComponent`를 추가합니다. * 추가된 `TriggerComponent`의 프로퍼티에서 `BoxSize`를 **X = 2**, **Y = 0.3**으로 변경합니다. 2. **Collisio [followup] | TriggerComponent의 BoxSize나 SpriteRendererComponent의 PlayRate를 변경할 때 주의할 점이나, Collision Groups 패널에서 Matrix 탭을 설정하는 상세 단계는 무엇인가요? [followup_answer] | 제공된 참고 문서에는 `TriggerComponent`의 `BoxSize`나 `SpriteRendererComponent`의 `PlayRate`를 변경할 때의 주의 사항에 대한 설명이 포함되어 있지 않습니다. 문서에서는 각각의 값을 `BoxSize : X = 2, Y = 0.3`과 `PlayRate : 2.5`로 설정하라고만 지시하고 있으며, 이러한 값 변경이 미치는 영향이나 주의할 점은 언급하고 있지 않습니다. `Collision Groups` 패널의 **Matrix** 탭 설정에 대한 상세 단계는 다음과 같습니다. 1. ` [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**원거리 발사체 만들기**](/docs?postId=935) > 2편. [캐릭터가 발사체로 몬스터 공격하기](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어 보기 위한 첫 번째 과정입니다. 원거리 발사체 모델을 만들고 관련 스크립트 컴포넌트를 작성하는 예제를 살펴봅시다. # 월드 템플릿 제작 편의를 위해 "기본" 템플릿으로 월드 생성하는 것을 권장합니다. # 발사체 모델 먼저 발사체 모델
[task] | single_turn [pass] | ⏳ 미판정 [title] | 모바일 기기의 중력 센서 사용하기 [question] | 자이로스코프를 사용할 때 `IsHWSupported()`와 `StartAndWait()`를 각각 어떤 목적으로 호출해야 하나요? [answer] | `IsHWSupported()`와 `StartAndWait()`는 모바일 기기의 자이로스코프 센서를 안전하게 활용하기 위해 순서대로 호출하는 두 단계의 API입니다. **1. `IsHWSupported()`의 목적** 이 메서드는 현재 사용자가 사용하는 모바일 기기에 자이로스코프 하드웨어 센서가 실제로 존재하고 지원되는지 여부를 확인하는 데 사용됩니다. 모든 모바일 기기에 자이로스코프가 탑재되어 있지는 않기 때문에, 센서값을 읽기 전에 반드시 이 함수를 통해 하드웨어 지원 여부를 먼저 체크해야 합니다. 하드웨어를 지원하지 않는 기 [followup] | [followup_answer] | [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] | 모바일 기기에서 "Gyroscope Started!" 토스트는 뜨는데 구슬이 실제로 움직이지 않을 때 가장 먼저 확인해야 할 코드는 어디인가요? [answer] | `"Gyroscope Started!"` 토스트가 표시된다는 것은 `OnBeginPlay`에서 `_MobileGyroscopeService:StartAndWait()`가 성공적으로 실행되어 자이로스코프 서비스가 활성화(`IsEnabled()`가 `true` 반환)되었음을 의미합니다. 이 상태에서 구슬이 움직이지 않는다면, **`OnUpdate`에서 값을 읽어서 서버로 전달하는 로직**과 **서버에서 실제로 힘을 가하는 로직**을 순서대로 확인해야 합니다. 가장 먼저 확인해야 할 코드는 다음과 같습니다. ### 1. `OnUpda [followup] | [followup_answer] | [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] | 발사체 이동 로직이 적용되는 OnUpdate 함수의 핵심 처리 흐름을 3문장 이내로 설명하세요. [answer] | `self._T.Fired`가 false인 경우 함수를 즉시 종료하여 발사 전에는 이동하지 않도록 처리합니다. 발사된 상태라면 `Speed`와 프레임 시간 `delta`를 곱해 이동 거리를 계산하고, `ToLeft` 방향에 따라 X축 부호를 조정합니다. 최종적으로 `self.Entity.TransformComponent:Translate(xDelta, 0)`을 호출하여 발사체를 해당 방향으로 이동시킵니다. [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] | 상품 구매 요청이 발생했을 때 정보를 기록하도록 설정하는 콜백 함수의 정확한 등록 방법은 무엇인가요? [answer] | 상품 구매 요청이 발생했을 때 정보를 기록하도록 설정하려면 `_WorldShopService`의 `SetProcessPurchaseCallback` 메서드에 콜백 함수를 등록해야 합니다. 이 콜백 함수는 구매 처리가 완료된 후 실행되며, 매개변수로 `purchaseInfo`를 전달받습니다. 등록된 콜백 함수 내부에서는 `_LogStorageService`의 `LogPurchaseInfo` 메서드를 사용하여 구매 정보를 기록할 수 있습니다. 정확한 등록 방법은 다음과 같습니다. ```lua _WorldShopService:Set [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 크리에이터가 자신의 월드에서 상품을 제작해 판매할 수 있습니다. 하지만 여러 가지 이유로 상품을 구매한 유저에게 환불 요청을 받을 수 있습니다. 메이플스토리 월드에서는 크리에이터 편의를 위해 상품 구매 관련 로그를 제공할 예정이나 아직은 로그 조회 시스템을 구축하는 중입니다. 시스템이 완성되기 전까지는 크리에이터가 직접 자신의 월드에 구매 정보를 기록하고 조회하는 스크립트를 추가해두어야 합니다. 이번 시간에는 **월드 내 상품 구매 정보를 기록/조회하는 방법**과 이를 토대로 **유저
[task] | code [pass] | ⏳ 미판정 [title] | 모바일 기기의 가속도 센서 사용하기 [question] | MobileAccelerometerService의 IsHWSupported가 false를 반환하는 경우와 true를 반환하는 경우를 구분하여 각각 다른 로직을 수행하도록 분기 처리하는 OnBeginPlay 스크립트를 작성해줘 [answer] | `MobileAccelerometerService`의 `IsHWSupported` 메서드는 모바일 기기에 가속도 센서 하드웨어가 존재하는지 여부를 확인합니다. 이 메서드가 `true`를 반환하면 센서를 사용할 수 있으므로 센서 시작 로직(`Start`)을 수행하고, `false`를 반환하면 센서 미지원 환경이므로 센서 대신 사용할 대체 로직(예: 터치 입력, 키보드 입력 등)을 수행하거나 사용자에게 안내 메시지를 띄우는 방식으로 분기 처리할 수 있습니다. 문서에 포함된 예제에서는 센서 미지원 시 `_UIToast:ShowMessa [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 `MobileAccelerometerService` 활용해 모바일 기기에서 가속도 센서 기능을 지원하는지 확인하고, 값을 측정할 수 있습니다. # MobileAccelerometerService `MobileAccelerometerService`를 활용하면 모바일 기기의 기울기를 측정할 수 있습니다. MobileAccelerometerService는 가속도 센서가 있는 모바일 기기에서만 동작합니다. 그러므로 월드에 입장한 유저가 정상적으로 플레이할 수 있는지 확인하고 가속도 센서를 지원하지 않는 기기를 사용
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | Projectile 컴포넌트의 프로퍼티 선언부만 추출하여 코드 블록으로만 출력하세요. [answer] | ```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] Entity Firer = nil ``` [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] | Desktop 환경에서는 테스트가 불가능하다고 하는데, 모바일 기기의 진동 기능을 확인하기 위해 어떤 절차를 거쳐야 하나요? [answer] | Desktop 환경(메이커)에서는 `MobileVibratorService`가 정상적으로 작동하지 않으므로, 실제 모바일 기기에서 테스트해야 합니다. 모바일 기기의 진동 기능을 확인하기 위한 절차는 다음과 같습니다. 1. **UI 버튼 배치**: UI 에디터에서 `ui - DefaultGroup - Create Entity - Create Button`을 선택하여 진동 테스트용 버튼(예: `UIButton_Vib`)을 배치합니다. 2. **컴포넌트 추가**: 새로운 `Vibrate` 컴포넌트를 생성하여 해당 버튼(`UIButt [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모바일 기기에서 진동을 울려 월드를 이용하는 유저에게 피드백을 줄 수 있습니다. # MobileVibratorService `MobileVibratorService`를 활용하면 모바일 기능에서 진동을 울릴 수 있습니다. 이 서비스는 모바일에서만 테스트와 활용이 가능하므로 메이커에서 테스트한다면 정상적으로 작동하지 않습니다. # 활용 예제 버튼을 누를 때마다 진동과 함께 토스트 알림창이 나오게 만들어 봅시다. 1. **UI 에디터 - ui - DefaultGroup - Create Entity - C