[task] | single_turn [pass] | ⏳ 미판정 [title] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | 클라이언트에서 키 입력을 감지하여 애니메이션을 재생할 때 InputService의 HandleKeyDownEvent와 KeyboardKey 상수를 어떻게 매칭시켜야 하나요? [answer] | 메이플스토리 월드(mLua)에서 클라이언트 키 입력을 감지하여 아바타 애니메이션을 재생하려면, 스크립트 컴포넌트의 `Event Handler` 블록에 `InputService`의 `HandleKeyDownEvent`를 등록하고, 이벤트 파라미터로 전달되는 `event.key` 값을 `KeyboardKey` 상수와 비교하는 방식으로 매칭시킵니다. 구체적인 구현 방법은 다음과 같습니다. 1. **이벤트 핸들러 등록**: `[client only] [service: InputService]` 어트리뷰트를 붙여 `HandleKeyDo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 새로운 상태(Key)를 추가하고, 애니메이션을 지정할 수 있습니다. 기존의 키를 삭제하지 않고 새로운 상태와 액션을 추가하면 두 상태 모두 동작합니다. 숫자 6, 7, 8, 9를 눌렀을 때 특정 애니메이션이 재생되게 만들어봅시다. 1. **Workspace - DefaultPlayer - AvatarStateAnimationComponent**의 **Size**를 **15**로 변경합니다. 2. 추가한 칸에 새로운 **Key**와 **AvatarBodyActionStateName**를 입력합니다. | Key |
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | Player 모델을 다른 맵이나 특정 지점으로 이동시킬 때 PlayerComponent를 기준으로 엔티티를 식별해야 하는 이유는 무엇인가요? [answer] | PlayerComponent는 다른 일반 엔티티와 달리 플레이어만이 가진 고유한 특성을 포함하고 있기 때문입니다. Player 모델에 PlayerComponent가 포함되어 있지 않으면, 그 엔티티는 플레이어로 인식되지 않습니다. 따라서 "플레이어"라는 특정 타입의 엔티티를 식별해야 하는 경우(예: 다른 맵이나 특정 지점으로 이동시키기), PlayerComponent의 존재 여부를 기준으로 삼아 해당 엔티티가 진짜 플레이어인지 판별할 수 있습니다. 이를 통해 추가적인 조건을 붙여 플레이어를 죽게 만들거나, 이동시키는 등 플레이어 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으
[task] | code [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | RigidbodyComponent가 존재하지 않을 경우 MovementComponent의 Jump 함수 호출 시 false가 반환됨을 확인하는 스크립트를 작성해줘 [answer] | RigidbodyComponent가 존재하지 않는 엔티티에서 `MovementComponent`의 `Jump` 함수를 호출하면 `false`가 반환됩니다. 이 동작을 확인하기 위한 스크립트는 다음과 같이 작성할 수 있습니다. `Jump` 함수는 일반적으로 서버 공간에서 호출하지만, 플레이어 엔티티의 경우 클라이언트에서 호출해야 하므로, 아래 예제는 **플레이어가 아닌 일반 엔티티(NPC, 오브젝트 등)** 를 대상으로 `[server only]` 공간에서 작성했습니다. ```lua Property: [None] boolean h [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | MovementComponent의 **Jump** 함수는 엔티티를 JumpForce에 입력한 힘만큼 점프시킵니다. boolean 타입으로 점프에 성공한 경우 true를 리턴합니다. 엔티티에 RigidbodyComponent가 함께 있어야 작동하며, RigidbodyComponent가 없으면 false를 리턴합니다. 동기화를 위해 일반적으로 server 공간에서 호출하는 것이 좋지만, 플레이어 엔티티의 경우에는 client에서 호출해야 합니다. ```lua [server only] void OnUpdate(number delta) {
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerComponent에 MaxHp 프로퍼티를 변경하면 UI 상태 창 모델의 HP 수치에도 자동으로 반영되는지 궁금합니다. [answer] | 네, 자동으로 반영됩니다. `PlayerComponent`의 `MaxHp` 프로퍼티는 UI 상태 창 모델의 HP와 연동되어 있습니다. 따라서 `MaxHp` 값을 변경하면 변경된 값이 UI 모델에 자동으로 반영됩니다. 기본값은 1000이며, 스크립트에서 다음과 같이 접근하여 변경할 수 있습니다. ```lua -- 예시: 엔티티의 PlayerComponent MaxHp 변경 local playerComp = self.Entity.PlayerComponent playerComp.MaxHp = 2000 ``` 위 코드에서 `play [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerControllerComponent와 StateComponent 중 하나를 삭제했을 때 정상 동작하지 않는 이유는 무엇인가요? [answer] | PlayerControllerComponent가 StateComponent를 참조하고 있기 때문에, 둘 중 하나를 삭제하면 정상 동작하지 않습니다. PlayerControllerComponent가 정상적으로 작동하려면 Player 모델에 StateComponent가 함께 존재해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PVPMode를 활성화하면 플레이어끼리 타격이 가능해지는데, 이 기능이 활성화된 상태에서 PlayerComponent의 Enable 프로퍼티를 false로 설정하면 어떻게 되나요? [answer] | 제공된 문서에는 `PVPMode` 프로퍼티가 활성화된 상태에서 `Enable` 프로퍼티를 `false`로 설정했을 때의 구체적인 동작이나 상호작용에 대한 설명이 포함되어 있지 않습니다. 문서에는 각각의 프로퍼티에 대해 다음과 같이만 설명하고 있습니다. - **PVPMode**: 활성화 시 플레이어끼리 타격을 줄 수 있습니다. - **Enable**: 컴포넌트의 활성/비활성 상태를 설정할 수 있습니다. 따라서 `Enable`을 `false`로 설정했을 때 `PVPMode` 기능이 어떻게 처리되는지(예: PVP 타격이 즉시 비활성화 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | AlwaysMovingState 프로퍼티를 활성화하면 캐릭터의 이동 애니메이션에 어떤 변화가 생기나요? [answer] | AlwaysMovingState 프로퍼티를 활성화하면, 캐릭터가 가만히 있더라도 이동 애니메이션이 계속 재생됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 기본 조작 키 중 LeftAlt가 Jump2에 매핑되어 있는데, 향후 제작 시 참고해야 할 변경 예정 사항은 무엇인가요? [answer] | LeftAlt 키는 현재 Jump2에 매핑되어 있지만, 향후 Jump로 통합될 예정입니다. 따라서 LeftAlt를 Jump2 용도로 사용하는 대신, Jump 동작을 구현할 때 Space 키를 사용하거나 통합 이후의 동작 방식을 고려하여 제작해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는
[task] | two_turn [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | 메이플스토리 월드에서 카드 짝 맞추기 게임을 제작하기 위한 사전 준비 절차와 기본 게임 규칙은 무엇인가요? [answer] | 메이플스토리 월드에서 카드 짝 맞추기 게임을 제작하기 위한 사전 준비 절차와 기본 게임 규칙은 다음과 같습니다. **사전 준비 절차** 카드 짝 맞추기 응용 가이드를 따라 하기 위해선 공식 제공 월드를 리메이크하는 과정이 필요합니다. 1. 메이플스토리 월드 공식 홈페이지에 로그인합니다. 2. 검색창에서 **카드 짝 맞추기**를 검색합니다. 3. MSWStarter가 제공하는 **카드 짝 맞추기** 월드를 찾아 **리메이크** 버튼을 클릭합니다. 4. 메이플스토리 월드 클라이언트를 실행하고 **만들기** 탭으로 이동합니다. 5. * [followup] | 가이드에서 언급된 8단계 진행 과정 중 UI 에디터를 활용하여 카드의 시각적 요소를 수정하는 구체적인 방법은 어떻게 되나요? [followup_answer] | 제공된 참고 문서에는 가이드가 총 8단계로 진행된다는 내용과, 월드 제작 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수 있다는 언급만 포함되어 있습니다. 그러나 문서에는 **8단계의 구체적인 내용**이나 **UI 에디터를 활용하여 카드의 시각적 요소를 수정하는 구체적인 방법**에 대한 설명이 포함되어 있지 않습니다. 따라서 문서에 근거하여 해당 질문에 대한 답변을 드릴 수 없습니다. [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.
[task] | two_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | RigidbodyComponent가 없는 엔티티에서 DownJump 함수를 호출했을 때 발생하는 결과는 무엇이며, 정상적인 다운 점프를 위해 엔티티에 어떤 구성이 필요한가? [answer] | RigidbodyComponent가 없는 엔티티에서 `DownJump` 함수를 호출하면 함수가 무시됩니다. 따라서 리턴값이 `true`가 아니라 `false`가 되며, 엔티티가 아래 풋홀드로 이동하지 않습니다. 정상적인 다운 점프를 위해서는 다음 구성이 필요합니다. 1. 엔티티에 `RigidbodyComponent`가 함께 존재해야 합니다. 2. 엔티티가 놓여진 풋홀드 아래에 또 다른 풋홀드가 존재해야 합니다. 3. 플레이어 엔티티의 경우, `RigidbodyComponent`가 client에서 server로 동기화되는 특성상 ` [followup] | 아래에 풋홀드가 존재하지 않거나 조건이 충족되지 않을 경우 리턴값은 어떻게 되며, 3초마다 자동으로 아래 풋홀드로 이동하는 간단한 스크립트 예시를 작성해 주세요. [followup_answer] | 아래에 풋홀드가 존재하지 않거나 이동 조건이 충족되지 않을 경우 `DownJump` 함수는 `false`를 리턴합니다. 정상적으로 아래 풋홀드로 이동한 경우에만 `true`가 리턴됩니다. 참고 문서에 제시된 3초마다 자동으로 아래 풋홀드로 이동하는 스크립트 예시는 다음과 같습니다. 이 예제는 `MovementComponent`와 `RigidbodyComponent`가 모두 장착된 엔티티에 적용할 때 정상 동작하며, 플레이어 엔티티의 경우 실행 제어 공간을 `client` 또는 `client only`로 변경해야 합니다. ```l [scores] | [judge_reason] | [source_doc] | MovementComponent의 **Jump** 함수는 엔티티를 JumpForce에 입력한 힘만큼 점프시킵니다. boolean 타입으로 점프에 성공한 경우 true를 리턴합니다. 엔티티에 RigidbodyComponent가 함께 있어야 작동하며, RigidbodyComponent가 없으면 false를 리턴합니다. 동기화를 위해 일반적으로 server 공간에서 호출하는 것이 좋지만, 플레이어 엔티티의 경우에는 client에서 호출해야 합니다. ```lua [server only] void OnUpdate(number delta) {
[task] | code [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | MovementComponent의 SetPosition 함수를 활용하여 OnUpdate에서 매 프레임마다 x좌표를 10만큼 증가시켜 엔티티가 오른쪽으로 계속 이동하도록 작성해줘. [answer] | MovementComponent의 `SetPosition` 함수는 엔티티의 좌표를 설정하는 데 사용되며, 매개변수로 `Vector2` 값을 받습니다. `OnUpdate`에서 매 프레임마다 x좌표를 10만큼 증가시키려면, 현재 위치에서 `delta`를 곱한 값을 더하여 새로운 위치를 계산한 후 `SetPosition`에 전달해야 합니다. ```lua [server only] void OnUpdate(number delta) { local speed = 10 local pos = self.Entity.TransformC [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | MovementComponent에서는 SetPosition 함수를 통해 엔티티의 좌표를 설정합니다. `SetPosition()`함수는 기본적으로 TransformComponent의 Position을 설정하지만, RigidbodyComponent가 엔티티에 포함되어 있을 경우 RigidbodyComponent를 통해 Position을 설정합니다. 매개 변수로 Vector2 값을 받으며, 이 값에 해당하는 좌표로 엔티티가 이동합니다. ```lua [server only] void OnUpdate(number delta) { l
[task] | two_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | IsFaceLeft 함수를 통해 플레이어의 좌우 방향을 확인하는 코드를 작성하고, 이 값을 기반으로 엔티티의 회전이나 다른 컴포넌트 값을 변경하는 예시를 보여주세요. [answer] | `IsFaceLeft`는 플레이어 엔티티 전용 함수로, 엔티티가 좌측을 바라보고 있으면 `true`, 그렇지 않으면 `false`를 반환합니다. 이 값은 `self.Entity.MovementComponent:IsFaceLeft()` 형태로 호출합니다. 참고 문서에는 `IsFaceLeft` 값을 기반으로 엔티티의 회전을 변경하거나 다른 컴포넌트 값을 수정하는 구체적인 API나 예제가 제공되지 않습니다. 따라서 `IsFaceLeft`의 사용법과 결과를 확인하는 코드만 작성할 수 있으며, 회전 변경 등 추가 동작은 문서에 근거한 코드 [followup] | IsFaceLeft가 true일 때와 false일 때 각각 다른 동작을 수행하는 코드는 어떻게 구성하나요? [followup_answer] | `IsFaceLeft` 함수는 플레이어 엔티티가 좌측을 바라보고 있으면 `true`, 우측을 바라보고 있으면 `false`를 반환합니다. 이 값을 기반으로 분기 처리를 수행하면 두 방향에 따라 서로 다른 동작을 실행할 수 있습니다. 참고 문서에 제공된 `IsFaceLeft` 사용 예제는 `HandleKeyUpEvent` 내에서 좌우 방향키 입력 시 방향을 확인하여 로그를 출력하는 형태입니다. 아래 코드는 이 구조를 기반으로 `IsFaceLeft`의 반환 값이 `true`(좌측)일 때와 `false`(우측)일 때 각각 다른 로그 메 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 점프, 플레이어 이동 및 엔티티 좌표 설정 등 MovementComponent가 제공하는 주요 기능들과 MovementComponent의 기본 작동 방식에 대해 알아봅니다. # MovementComponent 소개 **MovementComponent**는 캐릭터의 이동속도와 점프력 설정은 물론 RigidbodyComponent가 포함된 엔티티를 강제로 점프시키거나 이동 또는 정지시킬 수 있는 여러 기능을 제공합니다. 스크립트 컴포넌트를 통해 TransformComponent를 제어하여 동적으
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerComponent의 Nickname 프로퍼티 값을 조회하여 log 함수를 통해 출력하고, UserId를 반환하는 스크립트를 작성해줘 [answer] | PlayerComponent의 `Nickname` 프로퍼티는 스크립트에서 직접 접근할 수 있는 문자열 값입니다. `UserId`는 플레이어의 고유 식별자입니다. 요청하신 대로 현재 스크립트가 붙어 있는 엔티티(플레이어)의 닉네임을 로그로 출력하고, 해당 유저의 `UserId`를 반환하는 메서드를 작성합니다. ```lua Method: [server only] string GetPlayerInfo() { local nick = self.Entity.PlayerComponent.Nickname local userId [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerComponent의 Enable 프로퍼티를 false로 설정하여 비활성화하고, 다시 true로 설정하여 활성화하는 스크립트를 작성해줘 [answer] | PlayerComponent의 `Enable` 프로퍼티를 통해 컴포넌트의 활성 상태를 제어할 수 있습니다. 아래 스크립트는 `OnBeginPlay()`에서 PlayerComponent를 비활성화한 뒤, 3초 후 다시 활성화하는 예시입니다. ```lua Property: [None] number DisableDuration = 3.0 Method: [server only] void OnBeginPlay() { -- PlayerComponent 비활성화 self.Entity.PlayerComponent.Enable = [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으
[task] | code [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | MovementComponent의 SetPosition 함수를 사용하여 엔티티의 현재 y좌표를 5만큼 감소시켜 아래로 이동하게 하는 OnUpdate 스크립트를 작성해줘. [answer] | MovementComponent의 `SetPosition` 함수를 사용하여 엔티티의 현재 y좌표를 5만큼 감소시키는 `OnUpdate` 스크립트는 다음과 같습니다. 매 프레임마다 `delta` 값을 곱해 부드러운 이동을 구현했습니다. ```lua Method: [server only] void OnUpdate(number delta) { local deltaY = -5 local pos = self.Entity.TransformComponent.Position pos.y = pos.y + deltaY * de [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | MovementComponent에서는 SetPosition 함수를 통해 엔티티의 좌표를 설정합니다. `SetPosition()`함수는 기본적으로 TransformComponent의 Position을 설정하지만, RigidbodyComponent가 엔티티에 포함되어 있을 경우 RigidbodyComponent를 통해 Position을 설정합니다. 매개 변수로 Vector2 값을 받으며, 이 값에 해당하는 좌표로 엔티티가 이동합니다. ```lua [server only] void OnUpdate(number delta) { l
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | 카드 짝 맞추기 게임의 기본 규칙을 5줄 이내의 불릿 포인트로 요약하세요. [answer] | * 정해진 시간 동안 게임을 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.
[task] | code [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | RigidbodyComponent가 포함된 엔티티에서 MovementComponent의 SetPosition 함수를 호출하여 Vector2(100, 50) 좌표로 즉시 이동시키는 OnBeginPlay 메서드를 작성해줘. [answer] | `MovementComponent`의 `SetPosition` 함수는 엔티티에 `RigidbodyComponent`가 포함되어 있을 경우 해당 컴포넌트를 통해 좌표를 설정하도록 설계되어 있습니다. 따라서 `RigidbodyComponent`가 있는 엔티티에 `SetPosition(Vector2(100, 50))`을 호출하면 즉시 해당 좌표로 이동됩니다. 요청하신 `OnBeginPlay` 메서드를 포함한 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { s [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | MovementComponent에서는 SetPosition 함수를 통해 엔티티의 좌표를 설정합니다. `SetPosition()`함수는 기본적으로 TransformComponent의 Position을 설정하지만, RigidbodyComponent가 엔티티에 포함되어 있을 경우 RigidbodyComponent를 통해 Position을 설정합니다. 매개 변수로 Vector2 값을 받으며, 이 값에 해당하는 좌표로 엔티티가 이동합니다. ```lua [server only] void OnUpdate(number delta) { l
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | 가이드에서 명시한 게임 진행 시 카드 개수 및 짝을 맞출 때마다 얻는 점수를 표로 정리하세요. [answer] | 카드 짝 맞추기 가이드에서 명시한 게임 진행 규칙에 따른 카드 개수와 점수는 다음과 같습니다. | 항목 | 값 | | :--- | :--- | | 한 판에 펼쳐지는 카드 개수 | 30개 | | 짝을 맞출 때마다 얻는 점수 | 10점 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.
[task] | two_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | MovementComponent는 어떤 경우에 사용해야 하며, TransformComponent나 RigidbodyComponent와 어떤 차이가 있나요? [answer] | MovementComponent는 엔티티에 **RigidbodyComponent**가 포함되어 있는지 여부를 자동으로 체크하여, 해당 엔티티의 이동을 제어할 때 사용해야 합니다. **사용 이유 및 차이점:** 1. **직접적인 제어의 문제:** 스크립트 컴포넌트를 통해 `TransformComponent`를 직접 제어하여 엔티티를 이동시킬 수 있지만, 만약 엔티티에 `RigidbodyComponent`가 포함되어 있다면 `RigidbodyComponent` 또한 `TransformComponent`를 제어하게 됩니다. 이 경우 [followup] | MovementComponent를 사용해 엔티티를 이동시키려면 어떤 프로퍼티나 메서드를 설정해야 하나요? [followup_answer] | 제공된 참고 문서에는 MovementComponent를 사용하여 엔티티를 **이동시키거나 정지시키는 구체적인 메서드 이름(예: Move, Stop 등)이나 좌표 설정용 프로퍼티**가 명시되어 있지 않습니다. 문서에 포함된 MovementComponent 관련 설정 가능한 항목은 다음과 같습니다. 1. **InputSpeed** * **유형:** 프로퍼티 * **설명:** 조작키(방향키)를 눌렀을 때 엔티티를 이동시킬 힘(속도)을 설정합니다. * **제약:** **플레이어 엔티티에만 유효**합니다 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 점프, 플레이어 이동 및 엔티티 좌표 설정 등 MovementComponent가 제공하는 주요 기능들과 MovementComponent의 기본 작동 방식에 대해 알아봅니다. # MovementComponent 소개 **MovementComponent**는 캐릭터의 이동속도와 점프력 설정은 물론 RigidbodyComponent가 포함된 엔티티를 강제로 점프시키거나 이동 또는 정지시킬 수 있는 여러 기능을 제공합니다. 스크립트 컴포넌트를 통해 TransformComponent를 제어하여 동적으
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 입력 발생부터 애니메이션 재생까지의 전체 흐름에서 StateChangeEvent는 어떤 컴포넌트에 의해 발생되며, 이 이벤트를 받아 애니메이션을 재생시키는 컴포넌트는 무엇인가요? [answer] | 입력 발생부터 애니메이션 재생까지의 전체 흐름에서 **StateChangeEvent**는 **StateComponent**에 의해 발생합니다. 유저가 키를 눌러 'Input'이 발생하면 PlayerControllerComponent가 이를 감지하여 상태를 변경하고 Action을 처리합니다. 이후 StateComponent가 이 상태 변경과 동작을 처리하면서 StateChangeEvent를 발생시킵니다. 이 StateChangeEvent를 받아 애니메이션을 재생시키는 컴포넌트는 **AvatarRendererCompoent**와 같 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | `PlayerComponent:MoveToMapPosition()`과 `TeleportService:TeleportToEntityPath()`의 차이점을 2문장 이내로 비교 설명하세요. [answer] | `PlayerComponent:MoveToMapPosition()`는 플레이어 엔티티에만 적용할 수 있는 반면, `TeleportService:TeleportToEntityPath()`는 모든 Entity를 이동시킬 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveToMapPosition()`를 이용해 플레이어를 특정 위치로 이동시킬 수 있습니다. 이 기능을 활용해 여러 맵으로 모든 유저를 한 번에 옮겨 새로운 맵에서 새로운 게임을 할 수 있게 합니다. 1. **MyDesk**에 새로운 PlayerManagement 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. `TimerService`를 이용해 10초를 셀 수 있게 만들고, 10초 뒤 이동할 map의 이름과 그 맵의 위치를 입력합니다. 맵의 이름은 Hierarchy의 이름과 동일해야 합니다. >**
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 죽은 위치에서 리스폰 시키는 코드 예시에서 이벤트 연결(`ConnectEvent`)과 리스폰 위치 설정(`RespawnPosition`)에 사용된 API 명칭을 표로 정리하세요. [answer] | 죽은 위치에서 리스폰 시키는 코드 예시에서 사용된 API 명칭은 다음과 같습니다. | 구분 | API 명칭 | | :--- | :--- | | 이벤트 연결 | `ConnectEvent` | | 리스폰 위치 설정 | `RespawnPosition` | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveToMapPosition()`를 이용해 플레이어를 특정 위치로 이동시킬 수 있습니다. 이 기능을 활용해 여러 맵으로 모든 유저를 한 번에 옮겨 새로운 맵에서 새로운 게임을 할 수 있게 합니다. 1. **MyDesk**에 새로운 PlayerManagement 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. `TimerService`를 이용해 10초를 셀 수 있게 만들고, 10초 뒤 이동할 map의 이름과 그 맵의 위치를 입력합니다. 맵의 이름은 Hierarchy의 이름과 동일해야 합니다. >**
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | MSWStarter의 '카드 짝 맞추기' 월드를 리메이크하기 위한 사전 준비 단계를 단계별 번호 목록으로 정리하세요. [answer] | MSWStarter의 '카드 짝 맞추기' 월드를 리메이크하기 위한 사전 준비 단계는 다음과 같습니다. 1. [메이플스토리 월드](https://maplestoryworlds.nexon.com)에 로그인합니다. 2. 공식 홈페이지에서 **카드 짝 맞추기**를 검색합니다. 3. MSWStarter가 제공하는 **카드 짝 맞추기** 월드를 찾아, **리메이크** 버튼을 누릅니다. 4. 메이플스토리 월드를 실행하고, 만들기 탭으로 이동합니다. 5. **이어서 만들기**를 선택합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 사다리에 매달려 있는 상태에서 공격 키를 눌렀을 때 공격 애니메이션이 재생되지 않도록 막으려면 어떤 조건을 추가해야 하나요? [answer] | 사다리에 매달려 있는 상태에서 공격 키를 눌렀을 때 공격 액션이 재생되지 않도록 하려면, **PlayerControllerComponent**에 조건(Condition)을 추가해야 합니다. 구체적으로, '사다리에 플레이어가 매달려 있을 때'라는 상태 조건을 설정하고, 이 조건이 참일 경우 '공격 키를 눌러도 공격 액션이 재생되지 않는다'는 로직을 적용하면 됩니다. 이렇게 하면 사다리에 매달린 애니메이션이 재생되는 동안 공격 애니메이션이 겹쳐 재생되는 것을 방지하여 동작이 자연스럽게 처리됩니다. 참고로, PlayerControll [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerSetting 컴포넌트 생성부터 점프 제한 조건 적용까지의 설정 과정을 3문장 이내로 요약해서 설명하세요. [answer] | MyDesk에서 PlayerSetting 컴포넌트를 생성하여 DefaultPlayer에 추가한 후, `AddCondition` 함수를 사용해 Jump 액션의 발동 조건을 정의합니다. 조건 함수 내에서 특정 상태(예: HP가 10 미만)를 검사하여 `false`를 반환하면 점프 동작이 제한됩니다. 이 과정을 통해 기본 조작에 제한 조건을 부여하여 게임 로직을 제어할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 플레이어의 기본 속성에 발동할 수 있게 하는 조건을 추가할 수 있습니다. `AddCondition()` 함수를 사용해 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 1. **MyDesk**에 PlayerSetting 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. Jump 액션이 실행되는 조건을 작성합니다. 10 이상은 Jump가 실
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | AddCondition() 함수를 사용해 Jump 액션 발동 조건을 제한하는 스크립트 예제를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [client only] void OnBeginPlay() { local playerController = self.Entity.PlayerControllerComponent playerController:AddCondition("Jump", function() -- HP가 10 미만일 경우 점프 발동을 차단합니다. if self.Entity.PlayerComponent.Hp < 10 then log("Stop Jumping") [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 플레이어의 기본 속성에 발동할 수 있게 하는 조건을 추가할 수 있습니다. `AddCondition()` 함수를 사용해 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 1. **MyDesk**에 PlayerSetting 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. Jump 액션이 실행되는 조건을 작성합니다. 10 이상은 Jump가 실
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerComponent의 RespawnPosition 프로퍼티를 Vector3(0, 0, 0)으로 지정하고, RespawnDuration을 3초로 변경하는 스크립트를 작성해줘 [answer] | PlayerComponent의 `RespawnPosition`과 `RespawnDuration` 프로퍼티는 문서에 따르면 **프로퍼티 에디터 창에서 노출되지 않으며, 스크립트 작성 시 활용할 수 있습니다.** 따라서 해당 값은 스크립트를 통해 직접 설정해야 합니다. 플레이어 엔티티에 접근하여 `PlayerComponent`의 프로퍼티를 수정하는 코드는 다음과 같습니다. ```lua [server only] void OnBeginPlay() { -- 현재 스크립트가 붙은 엔티티가 Player인지 확인 (PlayerCompo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 플레이어만 특정 지점으로 옮기는 코드 예시에서 `TriggerEnterEvent` 핸들러 내부 로직을 단계별 번호 목록으로 요약하세요. [answer] | 플레이어를 특정 지점으로 옮기는 코드 예시에서 `TriggerEnterEvent` 핸들러 내부 로직은 다음과 같이 요약됩니다. 1. `event.TriggerBodyEntity.PlayerComponent`가 존재하는지 확인합니다. 2. `PlayerComponent`가 존재하면, 해당 엔티티의 `PlayerComponent:MoveToEntityByPath('/maps/map01/portal-3')` 메서드를 호출하여 지정된 경로로 플레이어를 이동시킵니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveToMapPosition()`를 이용해 플레이어를 특정 위치로 이동시킬 수 있습니다. 이 기능을 활용해 여러 맵으로 모든 유저를 한 번에 옮겨 새로운 맵에서 새로운 게임을 할 수 있게 합니다. 1. **MyDesk**에 새로운 PlayerManagement 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. `TimerService`를 이용해 10초를 셀 수 있게 만들고, 10초 뒤 이동할 map의 이름과 그 맵의 위치를 입력합니다. 맵의 이름은 Hierarchy의 이름과 동일해야 합니다. >**
[task] | single_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | OnUpdate 함수 내에서 3초 주기로 점프를 시키기 위해 accTime 변수를 선언하고 누적하는 코드의 동작 원리는 무엇인가요? [answer] | `OnUpdate` 함수는 프레임마다 호출되며, 매 프레임마다 경과한 시간인 `delta`가 인자로 전달됩니다. 3초 주기로 특정 동작(여기서는 점프)을 수행하기 위해 `delta`를 누적하는 `accTime` 변수를 사용하는 원리는 다음과 같습니다. 1. **초기화**: `accTime`이 `nil`인 경우 0으로 초기화하여 누적 시간을 시작점으로 잡습니다. 2. **누적**: 매 프레임마다 전달된 `delta`(경과 시간)를 `accTime`에 더합니다. 이를 통해 프레임 간에 경과한 총 시간을 추적합니다. 3. **조건 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | MovementComponent의 **Jump** 함수는 엔티티를 JumpForce에 입력한 힘만큼 점프시킵니다. boolean 타입으로 점프에 성공한 경우 true를 리턴합니다. 엔티티에 RigidbodyComponent가 함께 있어야 작동하며, RigidbodyComponent가 없으면 false를 리턴합니다. 동기화를 위해 일반적으로 server 공간에서 호출하는 것이 좋지만, 플레이어 엔티티의 경우에는 client에서 호출해야 합니다. ```lua [server only] void OnUpdate(number delta) {
[task] | two_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | MovementComponent의 Jump 함수가 성공적으로 작동하려면 어떤 전제 조건이 필요하며, 실행 공간은 어떻게 설정해야 하는가? [answer] | MovementComponent의 `Jump` 함수가 성공적으로 작동하려면 다음과 같은 전제 조건과 실행 공간 설정이 필요합니다. **1. 전제 조건** * **RigidbodyComponent 존재 여부**: 엔티티에 `RigidbodyComponent`가 반드시 함께 부착되어 있어야 합니다. `RigidbodyComponent`가 없으면 함수는 작동하지 않으며 `false`를 반환합니다. * **점프 성공 반환값**: 함수는 boolean 타입을 반환하며, 점프에 성공한 경우 `true`, 실패한 경우(예: Rigidb [followup] | JumpForce 값을 변경했을 때 점프 높이가 어떻게 달라지는지, 그리고 플레이어 엔티티의 RigidbodyComponent 동기화 특성을 고려하여 client에서 호출해야 하는 이유를 자세히 설명해 주세요. [followup_answer] | **JumpForce 값과 점프 높이의 관계** `JumpForce`는 MovementComponent의 `Jump` 함수가 호출될 때 점프력으로 반영되는 프로퍼티입니다. 이 값을 변경하면 엔티티가 점프할 때의 높이가 직접적으로 달라집니다. * `JumpForce`의 값이 작을수록(예: 1) 점프 높이가 낮아지고, * 값이 클수록(예: 3, 5) 점프 높이가 높아집니다. 즉, `JumpForce` 값을 1에서 5로 변경하면 같은 `Jump()` 함수 호출 시에도 엔티티가 훨씬 더 높은 위치로 점프하게 됩니다. **플레이 [scores] | [judge_reason] | [source_doc] | MovementComponent의 **Jump** 함수는 엔티티를 JumpForce에 입력한 힘만큼 점프시킵니다. boolean 타입으로 점프에 성공한 경우 true를 리턴합니다. 엔티티에 RigidbodyComponent가 함께 있어야 작동하며, RigidbodyComponent가 없으면 false를 리턴합니다. 동기화를 위해 일반적으로 server 공간에서 호출하는 것이 좋지만, 플레이어 엔티티의 경우에는 client에서 호출해야 합니다. ```lua [server only] void OnUpdate(number delta) {