[task] | code [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | PhysicsRigidbodyComponent가 Static 타입인 엔티티와 Dynamic 타입인 엔티티가 충돌했을 때, Dynamic 엔티티가 받는 충격량에 따라 해당 엔티티의 색상이나 크기를 일시적으로 변경하는 시각적 피드백을 제공하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `PhysicsRigidbodyComponent`의 Static, Dynamic, Kinematic 타입의 정의와 `PhysicsColliderComponent`, `TileMapComponent` 등의 프로퍼티, 그리고 `Sleep()`, `ApplyLinearImpulse()` 메서드와 `TriggerEnterEvent` 핸들러의 예제가 포함되어 있습니다. 하지만, **충돌 시 발생하는 이벤트(예: `HandleCollisionEnterEvent`)나 충돌 정보(충격량, 충돌 상대 등)를 전달하는 API, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | Kinematic 타입의 엔티티는 질량이 무한히 크다고 설명되어 있는데, Static 타입과 마찬가지로 속도를 지정해 직접 움직일 수 있는 것이 가능한가요? [answer] | 네, 가능합니다. **Kinematic** 타입은 질량이 무한히 큰 엔티티로 취급되지만, **Static** 타입과 달리 속도를 지정하여 직접 움직일 수 있습니다. 참고로, 물리 엔티티의 타입별 특성은 다음과 같습니다. * **Static**: 질량이 무한히 크며, Dynamic 타입과 충돌할 수 있습니다. * **Dynamic**: 물리 법칙에 따라 동작하며, 다른 물리 충돌 가능한 Entity와 충돌할 수 있습니다. * **Kinematic**: 질량이 무한히 크지만, Static 타입과 다르게 속도를 지정해 움직일 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | code [pass] | ⏳ 미판정 [title] | 스크린샷 촬영 및 공유하기 [question] | `ShareBtn`의 `HandleButtonClickEvent`에서 `self._T.lastPath`가 빈 문자열이 아니면 `_MobileShareService:ShareFileAndWait(path)`를 호출하여 공유 성공 여부에 따라 `log`로 결과를 출력하는 스크립트를 작성해줘. [answer] | 요청하신 `ShareBtn`의 버튼 클릭 이벤트 핸들러 스크립트입니다. ```lua Event Handler: [entity: ShareBtn (/ui/DefaultGroup/ShareBtn)] HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client ---------------------- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모바일에서 스크린샷 공유하는 방법을 살펴봅시다. 단, PC에서는 공유할 수 없습니다. 1. **FullScreenBtn** 버튼의 콘텍스트 메뉴에서 **Duplicate**를 클릭해 버튼을 복제한 뒤 적당한 위치로 옮깁니다. 2. 복제한 버튼의 이름을 **ShareBtn**으로 변경합니다. **Text**에는 **Share**를 입력합니다. 3. 스크립트 에디터에서 **ScreenshotServiceTest**를 열고 **FullScreenBtn**에 연결한 이벤트를 찾습니다. `CaptureFullScre
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `OnUpdate` 함수에 `UpdateVelocity` 호출을 추가하는 코드를 출력하되, 함수 본문은 주석으로만 설명하고 실제 코드만 출력하세요. [answer] | ```lua Method: [client only] void OnUpdate(number delta) { -- UpdateVelocity 함수를 호출하여 속도를 제어합니다. self:UpdateVelocity(delta) } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 유저의 키 입력이 없을 때는 감속하고 키 입력이 있을 때는 가속하도록 설정해봅시다. 아래와 같이 `UpdateVelocity` 함수와 `SignOf` 함수를 추가합니다. ```lua number SignOf(number value) { if value >= 0 then return 1 else return -1 end } void UpdateVelocity(number delta)
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `UpdateVelocity` 함수에서 감속 로직이 실행되는 조건과 `vel.x` 값이 0이 되도록 강제되는 구체적인 판정 로직을 3문장 이내로 설명하세요. [answer] | `self.InputDirection.x`가 0이고 현재 `vel.x`가 0이 아닐 때 감속 로직이 실행됩니다. 감속 계산 후 `self:SignOf(vel.x)`의 부호가 감속 전 부호(`sign`)와 달라지면 속도가 0을 지나 반대 방향으로 넘어갔다는 뜻입니다. 이때 `vel.x` 값을 0으로 강제하여 정지 상태로 만듭니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 유저의 키 입력이 없을 때는 감속하고 키 입력이 있을 때는 가속하도록 설정해봅시다. 아래와 같이 `UpdateVelocity` 함수와 `SignOf` 함수를 추가합니다. ```lua number SignOf(number value) { if value >= 0 then return 1 else return -1 end } void UpdateVelocity(number delta)
[task] | single_turn [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | 기본 발판이나 타일 위에 물리 엔티티가 올라가지 않고 뚫고 지나가게 되는데, TileMapComponent나 CustomeFootholdComponent에서 어떤 설정을 변경해야 충돌이 정상적으로 일어나게 되나요? [answer] | 기본 맵에서는 물리 법칙이 기본적으로 적용되어 있지 않아, 물리 엔티티가 기본 발판이나 타일을 뚫고 지나가는 현상이 발생합니다. 이를 해결하려면 해당 맵에 `PhysicsSimulatorComponent`가 추가되어 있고, 물리 엔티티와 상호 작용할 대상인 타일 또는 발판의 **`PhysicsInteractable`** 프로퍼티를 활성화해야 합니다. 구체적인 설정 방법은 다음과 같습니다. 1. **Hierarchy**에서 `World` > `maps` > 해당 맵(예: `map01`) > `TileMap`을 선택합니다. 2. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | code [pass] | ⏳ 미판정 [title] | 스크린샷 촬영 및 공유하기 [question] | `FullScreenBtn`의 `HandleButtonClickEvent`에서 `_ScreenshotService:CaptureFullScreenAsFileAndWait("FullScreen", true)`를 호출하여 에러가 `ScreenshotError.Success`일 경우 `self._T.lastPath`에 저장하고 실패 시 `_UIToast:ShowMessage`로 에러 내용을 표시하는 스크립트를 작성해줘. [answer] | `FullScreenBtn`의 `HandleButtonClickEvent`에서 스크린샷을 파일로 저장하고, 성공 시 경로를 `self._T.lastPath`에 저장하며 실패 시 토스트 메시지로 에러 내용을 표시하는 스크립트는 다음과 같습니다. ```lua Event Handler: [entity: FullScreenBtn (/ui/DefaultGroup/FullScreenBtn)] HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event S [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모바일에서 스크린샷 공유하는 방법을 살펴봅시다. 단, PC에서는 공유할 수 없습니다. 1. **FullScreenBtn** 버튼의 콘텍스트 메뉴에서 **Duplicate**를 클릭해 버튼을 복제한 뒤 적당한 위치로 옮깁니다. 2. 복제한 버튼의 이름을 **ShareBtn**으로 변경합니다. **Text**에는 **Share**를 입력합니다. 3. 스크립트 에디터에서 **ScreenshotServiceTest**를 열고 **FullScreenBtn**에 연결한 이벤트를 찾습니다. `CaptureFullScre
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | KeyDownEvent에서 KeyboardKey.Space와 KeyboardKey.LeftAlt를 동시에 사용할 수 있는지, 그리고 입력 이벤트 핸들러의 실행 공간은 어디로 설정해야 하나요? [answer] | 제공된 참고 문서에 따르면, `KeyDownEvent` 핸들러에서 `KeyboardKey.Space`와 `KeyboardKey.LeftAlt`를 동시에(또는 선택적으로) 사용할 수 있습니다. 문서의 2단 점프 예제에서 `if key == KeyboardKey.LeftAlt or key == KeyboardKey.Space then` 조건문을 사용하여 두 키 중 어느 하나를 눌러도 동일한 동작(`TryDoubleJump` 호출)이 수행되도록 구현하고 있습니다. 입력 이벤트 핸들러의 실행 공간(Execution Space) 설정은 문 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 캐릭터의 이동은 `MoveVelocity`를 통해 제어합니다. `MoveVelocity`를 통해 간단한 2단 점프 기능을 만들어봅시다. 1. MyDesk 아래에 새 스크립트 컴포넌트 DoubleJump를 만든 뒤, DefaultPlayer에 추가합니다. 2. 아래와 같이 DoubleJump에 `IsDoubleJumping` 프로퍼티와 `TryDoubleJump` 함수를 추가합니다. ```lua Property: [None] boolean IsDoubleJumping = false
[task] | code [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | PhysicsRigidbodyComponent가 Kinematic 타입인 엔티티가 주기적으로 정해진 속도로 좌우 왕복 운동을 하도록 OnUpdate 메서드에서 위치를 조작하는 스크립트를 작성해줘 [answer] | PhysicsRigidbodyComponent의 Kinematic 타입은 질량이 무한히 큰 엔티티로 취급되지만, Static 타입과 달리 속도를 지정해 움직일 수 있는 특성입니다. 따라서 OnUpdate 메서드에서 위치를 직접 조작하여 좌우 왕복 운동을 구현할 수 있습니다. 주어진 참고 문서에는 `PhysicsRigidbodyComponent`의 Kinematic 타입에 대한 설명은 있으나, Kinematic 타입의 속도를 직접 설정하기 위한 특정 API(예: `SetVelocity` 등)는 명시되어 있지 않습니다. 또한, `On [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | 마찰력을 적용하여 미끄러운 느낌을 구현할 때 MoveVelocity 프로퍼티와 가속도 값을 어떻게 조합해야 하는지 알려주세요. [answer] | 제공된 참고 문서에는 `MoveVelocity`를 응용하여 가속도와 마찰력 개념을 추가해 미끄러운 필드에서 걷는 듯한 움직임을 만들 수 있다는 설명과, `OnBeginPlay`, `HandleKeyDownEvent`, `HandleKeyUpEvent`의 일부 코드만 포함되어 있습니다. 하지만 문서에는 **가속도 값과 마찰력 값을 `MoveVelocity` 프로퍼티에 구체적으로 어떻게 조합하고 적용하는지(예: `OnUpdate` 루프에서의 수식, 마찰력 상수 값, 가속도 상수 값 등)에 대한 실제 코드나 수식적 설명이 빠져 있습니다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | code [pass] | ⏳ 미판정 [title] | 충돌 그룹 만들기 [question] | 충돌 그룹 Player 와 Item 만 활성화된 매트릭스를 전제로, PlayerComponent 가 TriggerEnterEvent 를 수신할 때 event.TriggerBodyEntity 의 CollisionGroup 이 Player 인지 확인하여 조건이 맞을 때만 ItemComponent 를 self.Entity:Destroy() 로 삭제하는 스크립트를 작성해줘 [answer] | 충돌 그룹 매트릭스 설정과 `TriggerEnterEvent` 처리 로직을 결합하여 요청하신 스크립트를 작성했습니다. **주의사항 및 구현 포인트:** 1. **충돌 그룹 확인 방법:** 제공된 참고 문서와 mLua 기본 예제에는 `Entity` 또는 `TriggerBodyEntity`에서 `CollisionGroup` 속성을 직접 읽어오는 API(예: `entity.CollisionGroup`)가 명시되어 있지 않습니다. 따라서 **충돌 그룹을 통한 필터링은 주로 매트릭스 설정(물리 엔진 레벨)에서 처리**되며, 스크립트에서는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 충돌 그룹 매트릭스(Matrix)는 충돌 그룹끼리의 충돌을 허용할지 말지를 결정할 때 사용합니다. 충돌 그룹을 생성하면 매트릭스에 자동으로 새로운 충돌 그룹이 생성됩니다. 충돌 그룹끼리의 충돌 허용 여부는 체크 박스를 선택해서 간단하게 설정할 수 있습니다. 매트릭스에 적힌 충돌 그룹끼리의 관계를 확인하고 충돌을 허용하고 싶다면 체크 박스를 활성화합니다. 1. **Panels - Collision Groups - Matrix**를 선택합니다. 2. 가로 세로의 그룹명을 확인한 뒤 충돌을 허용하면 체크 박스를 활성화합니다.
[task] | two_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideViewRectTileMap에서 MoveVelocity를 활용하여 가속도와 마찰력을 적용한 커스텀 이동 제어를 구현하려면 어떤 프로퍼티와 생명주기 메서드가 필요한가요? [answer] | SideViewRectTileMap에서 `MoveVelocity`를 활용하여 가속도와 마찰력을 적용한 커스텀 이동 제어를 구현하려면, `DefaultPlayer`에 `CustomPlayerController` 스크립트 컴포넌트를 추가하고 아래 프로퍼티와 생명주기 메서드, 이벤트 핸들러를 구성해야 합니다. ### 1. 필요한 프로퍼티 (Property) 입력 방향, 점프 키 상태, 웅크리기 키 상태를 추적하기 위해 다음 프로퍼티를 정의합니다. ```lua Property: [None] Vector2 InputDirection = [followup] | OnBeginPlay에서 PlayerControllerComponent를 비활성화하는 이유와, KeyDownEvent에서 방향키 및 점프키 입력 상태를 기록하는 구체적인 코드 로직을 알려주세요. [followup_answer] | `OnBeginPlay`에서 `PlayerControllerComponent`를 비활성화하는 이유는 **유저 입력을 직접 처리하기 위함**입니다. 기본 플레이어 컨트롤러의 동작을 끄고, 스크립트에서 키 입력을 직접 감지하여 `MoveVelocity` 등을 제어함으로써 가속도와 마찰력 등 커스텀 이동 로직을 적용할 수 있습니다. `KeyDownEvent`에서 방향키 및 점프키 입력 상태를 기록하는 구체적인 코드 로직은 다음과 같습니다. ```lua Event Handler: [service: InputService] HandleK [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | 스페이스바와 왼쪽 알트 키를 동시에 눌렀을 때 점프 입력 상태(IsJumpKeyPressed)가 어떻게 처리되는지 궁금합니다. [answer] | 제공된 참고 문서의 코드 예제에서는 스페이스바(`KeyboardKey.Space`)와 왼쪽 알트(`KeyboardKey.LeftAlt`)를 동시에 눌렀을 때의 중복 입력 처리에 대한 로직이 없습니다. 문서에 명시된 `HandleKeyDownEvent` 이벤트 핸들러의 로직은 다음과 같습니다. ```lua if key == KeyboardKey.LeftAlt or key == KeyboardKey.Space then self.IsJumpKeyPressed = true end ``` 이 코드는 `KeyDownEvent`가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `UpdateAction` 함수에서 점프 및 다운 점프를 구별하는 조건 분기 구조를 표로 정리하세요. [answer] | `UpdateAction` 함수에서 점프 및 다운 점프를 구별하는 조건 분기 구조는 다음과 같습니다. | 조건 1 (기본) | 조건 2 (분기) | 실행 동작 | | :--- | :--- | :--- | | `self.IsJumpKeyPressed`가 `true`이고<br>`body:IsOnGround()`가 `true` | `self.IsCrouchKeyPressed`가 `true` | `controller:ActionDownJump()` | | `self.IsJumpKeyPressed`가 `true`이고<br>`body:IsO [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 유저의 키 입력이 없을 때는 감속하고 키 입력이 있을 때는 가속하도록 설정해봅시다. 아래와 같이 `UpdateVelocity` 함수와 `SignOf` 함수를 추가합니다. ```lua number SignOf(number value) { if value >= 0 then return 1 else return -1 end } void UpdateVelocity(number delta)
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | 제공된 문서의 가속도 및 마찰력 관련 프로퍼티를 표로 정리하되, 열은 '프로퍼티 이름', '기본값', '설명'으로 구성하고 행은 5개만 포함하세요. [answer] | 제공된 문서에 포함된 가속도 및 마찰력 관련 프로퍼티 5개를 정리한 표는 다음과 같습니다. | 프로퍼티 이름 | 기본값 | 설명 | | :--- | :--- | :--- | | MaxSpeed | 4 | 최대 속도 | | Accel | 10 | 가속도 | | Drag | 8 | 마찰력 | | AirAccel | 6 | 공중 가속도 | | AirDrag | 4 | 공중 마찰력 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | code [pass] | ⏳ 미판정 [title] | 스크린샷 촬영 및 공유하기 [question] | `FullScreenBtn`과 `ShareBtn` 두 버튼 모두에 `ButtonClickEvent` 이벤트 핸들러를 연결하여 각각 스크린샷 저장과 파일 공유 기능을 수행하도록 설정하는 스크립트를 작성해줘. [answer] | `FullScreenBtn`과 `ShareBtn` 두 버튼에 `ButtonClickEvent` 이벤트 핸들러를 연결하는 스크립트는 다음과 같습니다. `FullScreenBtn`은 `CaptureFullScreenAsFileAndWait()`를 호출하여 스크린샷을 파일로 저장하고, `ShareBtn`은 앞서 저장된 파일 경로를 `_MobileShareService`를 통해 공유합니다. ```lua Event Handler: [entity: FullScreenBtn (/ui/DefaultGroup/FullScreenBtn)] Hand [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모바일에서 스크린샷 공유하는 방법을 살펴봅시다. 단, PC에서는 공유할 수 없습니다. 1. **FullScreenBtn** 버튼의 콘텍스트 메뉴에서 **Duplicate**를 클릭해 버튼을 복제한 뒤 적당한 위치로 옮깁니다. 2. 복제한 버튼의 이름을 **ShareBtn**으로 변경합니다. **Text**에는 **Share**를 입력합니다. 3. 스크립트 에디터에서 **ScreenshotServiceTest**를 열고 **FullScreenBtn**에 연결한 이벤트를 찾습니다. `CaptureFullScre
[task] | code [pass] | ⏳ 미판정 [title] | 스크린샷 촬영 및 공유하기 [question] | 스크린샷 저장 시 1초에 1번만 가능하다는 제약사항을 고려하여, `CaptureFullScreenAsFileAndWait` 호출 전 최근 저장 시각을 체크하는 로직을 추가하거나, 실패 시 `_UIToast:ShowMessage`를 통해 사용자에게 재시도 안내를 하는 스크립트를 작성해줘. [answer] | 참고 문서에는 스크린샷 파일 저장이 1초에 1번만 가능하다는 제약사항이 명시되어 있습니다. 이를 해결하기 위해 최근 저장 시각을 추적하는 프로퍼티를 추가하고, `CaptureFullScreenAsFileAndWait` 호출 전에 시간을 체크하는 로직을 구성했습니다. 또한, 저장 실패 시 `_UIToast:ShowMessage`를 통해 재시도 안내를 제공하도록 하였습니다. ```lua Property: [None] number lastCaptureTime = 0 Event Handler: [entity: FullScreenBtn [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모바일에서 스크린샷 공유하는 방법을 살펴봅시다. 단, PC에서는 공유할 수 없습니다. 1. **FullScreenBtn** 버튼의 콘텍스트 메뉴에서 **Duplicate**를 클릭해 버튼을 복제한 뒤 적당한 위치로 옮깁니다. 2. 복제한 버튼의 이름을 **ShareBtn**으로 변경합니다. **Text**에는 **Share**를 입력합니다. 3. 스크립트 에디터에서 **ScreenshotServiceTest**를 열고 **FullScreenBtn**에 연결한 이벤트를 찾습니다. `CaptureFullScre
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `SideviewbodyComponent` 를 통해 지면 여부를 판별하는 로직이 포함된 두 메서드의 차이를 단계별 번호 목록으로 정리하되, 각 단계는 10자 이내로 간략하게 작성하세요. [answer] | 1. 바디 접근 2. 지면 확인 3. 지면이면 반환 4. 공중이면 반환 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | code [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | PhysicsSimulatorComponent의 Gravity 프로퍼티를 활용해 무중력 맵을 설정하고, PhysicsRigidbodyComponent가 Dynamic 타입인 엔티티가 상하좌우로 자유롭게 이동할 수 있도록 입력을 처리하는 스크립트를 작성해줘 [answer] | 무중력 맵을 설정하려면 맵에 `PhysicsSimulatorComponent`가 추가되어 있어야 하며, 해당 컴포넌트의 `Gravity` 프로퍼티를 `Vector2(0, 0)`으로 설정하면 됩니다. `PhysicsRigidbodyComponent`가 Dynamic 타입인 엔티티가 상하좌우로 자유롭게 이동하도록 하려면, 키 입력을 감지하여 해당 방향의 `Vector2` 힘을 `PhysicsRigidbodyComponent`에 적용해야 합니다. 문서에 제공된 예제에서는 `ApplyLinearImpulse` 메서드를 사용하여 힘을 가하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | KeyDownEvent에서 방향키 입력을 누적하는 방식과 KeyUpEvent에서 초기화하는 방식의 차이가 무엇인가요? [answer] | 제공된 참고 문서에는 `KeyDownEvent`에서 방향키 입력을 누적하는 방식은 설명되어 있지만, `KeyUpEvent`에서 입력을 초기화(0으로 리셋)하는 방식은 언급되지 않습니다. 문서에 제시된 예제는 `KeyDownEvent`와 `KeyUpEvent` 모두에서 **누적(증감) 방식**을 사용합니다. 1. **KeyDownEvent (누적 증가/감소):** * 오른쪽 화살표 키를 누르면 `self.InputDirection.x`에 `+1`을 합니다. * 왼쪽 화살표 키를 누르면 `self.InputD [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | two_turn [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | 맵에 PhysicsSimulatorComponent를 추가하고 Gravity 프로퍼티를 설정하는 구체적인 절차가 궁금합니다. [answer] | 맵에 물리 법칙을 적용하려면 해당 맵에 **PhysicsSimulatorComponent**를 추가해야 합니다. 기본 맵은 메이플스토리 맵의 이동 원칙을 따르기 때문에 물리 법칙이 기본 적용되어 있지 않습니다. 구체적인 절차는 다음과 같습니다. 1. **Hierarchy**에서 **World** > **maps** > 대상 맵(예: `map01`)을 선택합니다. 2. 선택된 맵에 **PhysicsSimulatorComponent**를 추가합니다. 3. 추가된 컴포넌트의 **Gravity** 프로퍼티 값을 설정합니다. [followup] | Gravity의 x, y 값을 음수, 양수, 0으로 각각 지정했을 때 중력 방향과 무중력 맵이 어떻게 달라지는지 예시를 들어 설명해 주세요. [followup_answer] | PhysicsSimulatorComponent의 Gravity 프로퍼티 x, y 값에 따라 맵의 중력 방향과 힘이 달라집니다. 각 값에 따른 구체적인 예시는 다음과 같습니다. * **x 값을 음수로 지정**: 중력이 **왼쪽 방향**으로 작용합니다. * 예: `Gravity = Vector2(-5, 0)` * **y 값을 양수로 지정**: 중력이 **위쪽 방향**으로 작용합니다. * 예: `Gravity = Vector2(0, 4)` * **x, y 값을 모두 0으로 지정**: **무중력 맵**이 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | InputService의 KeyDownEvent로 Space 또는 LeftAlt 키 입력을 감지해 PlayerControllerComponent의 Jump 메서드를 호출하는 스크립트를 작성해줘 [answer] | `InputService`의 `KeyDownEvent`를 통해 `KeyboardKey.Space` 또는 `KeyboardKey.LeftAlt` 키 입력을 감지하고, `PlayerControllerComponent`의 `Jump` 메서드를 호출하는 스크립트는 다음과 같습니다. 참고로, 기본 플레이어 컨트롤러가 활성화된 상태에서는 키 입력이 기본 동작에 의해 처리되므로, 직접 키 이벤트를 처리하려면 `PlayerControllerComponent`의 `Enable` 속성을 `false`로 설정해야 합니다. ```lua Propert [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | TryDoubleJump 함수에서 sb:IsOnGround()가 false일 때만 점프가 가능한데, 착지 직후 바로 다시 점프하지 못하는 버그가 발생하면 어떤 부분을 점검해야 하나요? [answer] | 참고 문서에 제공된 정보 범위 내에서 답변드립니다. 문서에 따르면, `IsDoubleJumping` 프로퍼티의 초기값은 `false`이며, `TryDoubleJump` 함수 실행 시점의 조건은 다음과 같습니다. 1. `self.IsDoubleJumping == false` 2. `sb:IsOnGround() == false` (공중에 있어야 함) `OnUpdate` 함수에서는 `sb:IsOnGround()`가 `true`가 되는 즉시 `self.IsDoubleJumping = false`로 리셋됩니다. **점검해야 할 부분:* [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 캐릭터의 이동은 `MoveVelocity`를 통해 제어합니다. `MoveVelocity`를 통해 간단한 2단 점프 기능을 만들어봅시다. 1. MyDesk 아래에 새 스크립트 컴포넌트 DoubleJump를 만든 뒤, DefaultPlayer에 추가합니다. 2. 아래와 같이 DoubleJump에 `IsDoubleJumping` 프로퍼티와 `TryDoubleJump` 함수를 추가합니다. ```lua Property: [None] boolean IsDoubleJumping = false
[task] | single_turn [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | PhysicsRigidbodyComponent를 추가하지 않은 엔티티와 추가한 엔티티의 물리적 특성, 특히 질량과 충돌 가능성에서 어떤 차이가 있으며 각각 Static, Dynamic, Kinematic 타입 중 어떤 것에 해당하나요? [answer] | 참고 문서에 따르면, 엔티티에 `PhysicsRigidbodyComponent`를 추가하느냐 마느냐에 따라 물리적 특성과 타입이 다음과 같이 결정됩니다. **1. `PhysicsRigidbodyComponent`를 추가하지 않은 엔티티** * **해당 타입:** **Static** * **질량:** 무한히 큰 질량을 가진 것으로 취급됩니다. * **충돌 가능성:** Dynamic 타입의 엔티티와 충돌할 수 있습니다. (Static끼리의 충돌은 언급되지 않았으며, Dynamic과의 충돌 가능성만 명시되어 있음) **2. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `UpdateAnimationState` 함수 내에서 지상 상태일 때 `IDLE`, `MOVE`, `CROUCH` 상태로 전환되는 조건부 분기 로직을 3문장 이내로 설명하세요. [answer] | 지상에 있을 때 `InputDirection.x`가 0이 아니면 `MOVE` 상태로, 0이고 `IsCrouchKeyPressed`가 참이면 `CROUCH` 상태로 전환됩니다. 반대로 `InputDirection.x`가 0이고 `IsCrouchKeyPressed`가 거짓이면 `IDLE` 상태로 전환됩니다. 이로써 지상에서의 이동, 엎드림, 대기 상태가 입력 조건에 따라 정확히 분기 처리됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. 캐릭터의 애니메이션을 제어하는 `UpdateAnimationState` 함수도 추가합니다. ```lua void UpdateAnimationState() { local body = self.Entity.SideviewbodyComponent local state = self.Entity.StateComponent if body:IsOnGround() then if self.InputDirection.x ~= 0 then
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | 2단 점프를 구현할 때 IsDoubleJumping 플래그를 왜 OnUpdate에서 착지 시 false로 초기화해야 하는지, 안 하면 어떤 문제가 발생하나요? [answer] | `IsDoubleJumping` 플래그를 `OnUpdate`에서 착지 시 `false`로 초기화해야 하는 이유는, **2단 점프를 "공중 상태에서만 한 번" 수행할 수 있도록 제한하기 위해서**입니다. ### 왜 초기화가 필요한가? 1. **상태 관리의 연속성:** * 캐릭터가 2단 점프를 수행하면 `IsDoubleJumping`이 `true`로 설정됩니다. * 만약 이 값을 초기화하지 않으면, 캐릭터가 바닥에 내려와서도 `IsDoubleJumping`이 계속 `true` 상태를 유지하게 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 캐릭터의 이동은 `MoveVelocity`를 통해 제어합니다. `MoveVelocity`를 통해 간단한 2단 점프 기능을 만들어봅시다. 1. MyDesk 아래에 새 스크립트 컴포넌트 DoubleJump를 만든 뒤, DefaultPlayer에 추가합니다. 2. 아래와 같이 DoubleJump에 `IsDoubleJumping` 프로퍼티와 `TryDoubleJump` 함수를 추가합니다. ```lua Property: [None] boolean IsDoubleJumping = false
[task] | two_turn [pass] | ⏳ 미판정 [title] | SideViewRectTile모드로 맵 만들기 [question] | SideViewRectTile 맵에서 캐릭터가 타일 위에 설 수 있도록 설정하는 방법은 무엇이며, 이동 불가 설정을 적용해야 하는 이유는 무엇인가요? [answer] | SideViewRectTile 맵에서 캐릭터가 타일 위에 설 수 있도록 설정하려면, 타일 에디터에서 해당 타일을 선택한 뒤 **이동 불가** 속성을 활성화해야 합니다. 이 설정을 적용해야 하는 이유는 SideViewRectTile 모드가 횡스크롤 방식의 이동, 점프, 그리고 **타일과의 충돌**을 지원하기 위해서입니다. 이동 불가로 설정된 타일은 캐릭터와 충돌하여 캐릭터가 그 위에 서거나, 벽처럼 막는 역할을 수행하게 됩니다. 만약 이 설정을 하지 않으면 캐릭터는 해당 타일과 충돌하지 않아 바닥을 뚫고 내려가거나, 벽을 통과하게 [followup] | 타일을 "이동 불가"로 설정하지 않았을 때 캐릭터가 어떻게 동작하는지(예: 관통, 추락 등)와, 이러한 문제를 해결하기 위해 맵 제작 단계에서 반드시 체크해야 할 항목이 무엇인지 알려주세요. [followup_answer] | 타일을 "이동 불가"로 설정하지 않을 경우, 캐릭터와 타일 간에 충돌이 발생하지 않아 캐릭터가 해당 타일 영역을 **관통**하거나 **추락**하는 동작이 나타납니다. 이는 SideViewRectTile 모드가 횡스크롤 방식의 이동, 점프, 타일과의 충돌을 지원하도록 설계되어 있음에도 불구하고, 충돌 대상이 되지 않는 타일은 물리적 장벽 역할을 하지 않기 때문에 발생합니다. 이러한 문제를 해결하기 위해 맵 제작 단계에서 반드시 체크해야 할 항목은 다음과 같습니다: 1. **모든 바닥 및 벽면 타일의 "이동 불가" 속성 활성화**: [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 RectTileMapComponent와 KinematicbodyComponent는 탑다운뷰 게임 제작에는 적합하지만 횡스크롤 게임 제작에는 적합하지 않습니다. SideViewRectTile 모드는 RectTileMap을 활용해 손쉽게 횡스크롤 게임을 제작할 수 있도록 횡스크롤 방식의 이동, 점프, 타일과의 충돌 등을 지원합니다. 이번 시간에는 SideViewRectTile 모드에 대해 알아보고 맵을 제작해봅시다. > **더 알아보기** > SideViewRectTile 모드는 RectTile 모드를 기반으로
[task] | single_turn [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | 맵에 PhysicsSimulatorComponent를 추가했는데도 엔티티가 중력을 무시하고 떠다니거나 이상한 방향으로 움직일 때, Gravity 프로퍼티의 x, y 값을 어떻게 설정해야 원하는 중력 방향을 만들 수 있나요? [answer] | `PhysicsSimulatorComponent`의 `Gravity` 프로퍼티는 `Vector2` 타입이며, `x`와 `y` 값에 따라 중력의 방향과 힘이 결정됩니다. 엔티티가 중력을 무시하거나 이상한 방향으로 움직이는 경우, 현재 `Gravity` 값이 의도한 방향과 일치하는지 확인해야 합니다. 원하는 중력 방향을 만들기 위한 설정 방법은 다음과 같습니다. 1. **아래로 작용하는 중력 (기본):** * `y` 값을 음수(`-`)로 설정합니다. * 예: `Vector2(0, -10)` 2. **위로 작 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | 지면과 공중에서 각각 적용되는 가속도와 마찰력 값을 반환하는 `GetAccel`, `GetDrag` 메서드 코드만 출력하고, 각 함수의 목적과 조건부 분기 로직을 주석으로 설명하세요. [answer] | ```lua Method: -- 지면에 있을 때와 공중에 있을 때 적절한 가속도 값을 반환해 줍니다. number GetAccel() { local body = self.Entity.SideviewbodyComponent -- 캐릭터가 지면에 닿아 있으면 일반 가속도(Accel)를 반환하고, -- 공중에 있으면 공중 가속도(AirAccel)를 반환합니다. if body:IsOnGround() then return self.Accel else return self.Ai [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `OnUpdate` 함수에서 호출되는 4개의 서브메서드 이름과 각 메서드가 담당하는 기능을 코드 블록으로만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [client only] void OnUpdate(number delta) { -- 1. UpdateVelocity: 캐릭터의 이동 속도를 제어합니다. self:UpdateVelocity(delta) -- 2. UpdateAction: 캐릭터의 동작(점프, 엎드리기 등)을 제어합니다. self:UpdateAction() -- 3. UpdateAnimationState: 현재 상태에 맞는 애니메이션(걷기, 서 있기, 낙하 등)을 변경합니다. self:Update [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. 캐릭터의 애니메이션을 제어하는 `UpdateAnimationState` 함수도 추가합니다. ```lua void UpdateAnimationState() { local body = self.Entity.SideviewbodyComponent local state = self.Entity.StateComponent if body:IsOnGround() then if self.InputDirection.x ~= 0 then