← 목록

mLua · Nemotron SDG 질문-응답 (SFT)

총 21,567개 · 페이지 415/719
🔀 랜덤
불러오는 중…

[task] | code [pass] | ⏳ 미판정 [title] | 아바타 표정 바꾸기 [question] | `_UserService`와 `AvatarRendererComponent`의 `PlayEmotion` 메서드를 사용하여 숫자키 1을 누르면 `EmotionalType.Angry` 표정을 5초간 재생하는 스크립트를 작성해줘 [answer] | 사용자가 요청한 기능은 키보드 숫자키 1을 누를 때, 해당 플레이어의 아바타에 `EmotionalType.Angry` 표정을 5초 동안 재생하는 것입니다. 이를 구현하기 위해 `_UserService`를 통해 현재 플레이어를 식별하고, `AvatarRendererComponent`의 `PlayEmotion` 메서드를 호출하는 로직을 작성합니다. 입력 이벤트(`KeyDownEvent`)는 클라이언트에서 발생하므로 `[Client Only]` 속성을 가진 이벤트 핸들러로 처리하고, 실제 표정 재생 로직은 서버에서 수행되도록 `[ser [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 키보드의 숫자키를 1부터 5까지 누르면 각각 다른 표정이 5초 동안 재생합니다. 1. MyDesk에서 새로운 컴포넌트를 만들고, 스크립트 작성 화면을 엽니다. 2. Function: 옆의 추가 를 눌러 **New**를 선택합니다. 3. 함수 이름을 Emote로 변경하고, 더 보기 를 선택해 **Add Parameter**를 두 번 추가해 매개 변수를 입력합니다. 5. `PlayEmotion`을 이용해 재생할 표정을 작성합니다. 6. Entity Event Handler에 `KeyDownEvent`를 추가하고, 표정 재생을

[task] | instruction_following [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | MovementComponent의 SetPosition 함수가 기본적으로 설정하는 컴포넌트와 RigidbodyComponent 존재 시 설정하는 컴포넌트를 2행 표로 정리하세요. [answer] | | 조건 | 설정 대상 컴포넌트 | | :--- | :--- | | 기본적으로 | TransformComponent | | RigidbodyComponent 존재 시 | RigidbodyComponent | [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] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | StateToAvatarBodyActionSheet의 Key와 AvatarBodyActionStateName 관계가 어떻게 작동하나요? [answer] | `StateToAvatarBodyActionSheet`는 아바타의 현재 상태(`Key`)와 해당 상태에서 재생할 애니메이션(`AvatarBodyActionStateName`)을 연결하는 매핑 테이블 역할을 합니다. 작동 방식은 다음과 같습니다. 1. **상태 변경 요청**: 아바타가 특정 상태가 되면 시스템이 해당 `Key`를 기반으로 애니메이션 재생을 요청합니다. `Key`는 항상 **대문자**로 입력해야 합니다. 2. **애니메이션 매칭**: 요청된 `Key`에 연결된 `AvatarBodyActionStateName` 값을 [followup] | Key를 입력하지 않고 AvatarBodyActionStateName만 지정하면 애니메이션이 재생되지 않는 이유는 무엇이며, Key는 대문자로만 입력해야 하는 규칙이 있나요? [followup_answer] | **Key 미입력 시 애니메이션 재생되지 않는 이유** `StateToAvatarBodyActionSheet`에서 애니메이션 재생은 아바타가 특정 상태(`Key`)로 변경되었을 때 트리거됩니다. `Key`는 아바타의 현재 상태를 나타내는 식별자 역할을 하며, 이 `Key`에 연결된 `AvatarBodyActionStateName` 값을 찾아 해당 애니메이션을 재생합니다. 따라서 `Key`를 입력하지 않고 `AvatarBodyActionStateName`만 지정하면, 그 애니메이션을 재생할 수 있는 상태 트리거가 존재하지 않기 때 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **StateToAvatarBodyActionSheet**의 아바타 상태를 통해 애니메이션을 손쉽게 제어하는 방법을 소개합니다. # 아바타 애니메이션 아바타가 걸을 때, 앉을 때, 공격할 때, 점프할 때를 유저가 인지하려면 상태에 맞는 애니메이션이 필요합니다. [AvatarStateAnimationComponent](/apiReference/Components/AvatarStateAnimationComponent)의 **StateToAvatarBodyActionSheet**에 **Key**와 **Avatar

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerControllerComponent와 StateComponent의 참조 관계 및 제거 시 발생하는 문제를 3문장 이내로 설명하세요. [answer] | 기본 Player 모델에는 PlayerControllerComponent와 StateComponent가 모두 포함되며, PlayerControllerComponent가 StateComponent를 참조하고 있어 둘 중 하나를 제거하면 정상 동작하지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는

[task] | instruction_following [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | 제시된 코드 예제에서 self.Entity.MovementComponent:SetPosition() 호출에 전달되는 인자의 타입과 생성 방식을 코드로만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua -- SetPosition() 함수는 Vector2 타입의 좌표를 인자로 받습니다. -- TransformComponent.Position 에서 x, y 값을 가져와 Vector2 객체를 생성하여 전달합니다. local pos = self.Entity.TransformComponent.Position local targetPos = Vector2(pos.x, pos.y) self.Entity.MovementComponent:SetPosition(targetPos) ``` [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] | single_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | MovementComponent의 SetPosition을 사용했는데 RigidbodyComponent가 붙어 있는 경우와 없는 경우 위치가 다르게 반영되는 이유가 무엇인가요? [answer] | MovementComponent의 `SetPosition` 함수는 엔티티에 RigidbodyComponent가 존재하는지에 따라 위치를 설정하는 대상 컴포넌트가 달라지기 때문입니다. 기본적으로 `SetPosition()`은 `TransformComponent`의 `Position`을 설정합니다. 하지만 엔티티에 RigidbodyComponent가 포함되어 있는 경우, 물리 엔진이 엔티티의 위치를 관리하므로 `TransformComponent`가 아닌 `RigidbodyComponent`를 통해 `Position`을 설정합니다. [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] | single_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | SetPosition 함수에 Vector3 값을 전달하려고 하면 에러가 발생하는데, 이 함수가 지원하는 좌표 타입은 무엇인가요? [answer] | `SetPosition` 함수는 **Vector2** 타입의 좌표만 지원합니다. 참고 문서에 따르면, `MovementComponent`의 `SetPosition()` 함수는 매개 변수로 `Vector2` 값을 받으며, 해당 값에 해당하는 2D 좌표로 엔티티를 이동시킵니다. 따라서 `Vector3` 값을 전달하면 에러가 발생할 수 있습니다. 2D 좌표로 전달하려면 `Vector2(x, y)` 형태로 값을 구성해야 합니다. ```lua [server only] void OnUpdate(number delta) { local [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] | code [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | 5초마다 MovementComponent의 DownJump 함수를 호출하여 아래 풋홀드로 이동시키는 스크립트를 작성해줘 [answer] | MovementComponent의 `DownJump` 함수는 엔티티가 현재 있는 풋홀드 아래에 다른 풋홀드가 존재할 경우, 엔티티를 그 아래 풋홀드로 이동시킵니다. 이 함수는 엔티티에 `RigidbodyComponent`가 함께 장착되어 있어야 정상적으로 작동하며, `RigidbodyComponent`가 없다면 함수 호출이 무시됩니다. 일반적인 엔티티의 경우 서버 공간에서 제어하는 것이 좋지만, 플레이어 엔티티의 `RigidbodyComponent`는 클라이언트에서 서버로 동기화되므로 플레이어의 경우 클라이언트 공간에서 호출하는 [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] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | ActionSheet의 Size를 늘려 새로운 Key를 추가했는데, 기존에 지정해둔 애니메이션이 사라진 것처럼 보이거나 작동하지 않는 이유는 무엇인가요? [answer] | ActionSheet의 `Size`를 늘려 새로운 Key를 추가한 후 기존 애니메이션이 작동하지 않거나 사라진 것처럼 보이는 주된 이유는, **기존에 지정해두었던 Key와 애니메이션 이름(`AvatarBodyActionStateName`) 값이 소실되었거나 올바르게 유지되지 않았기 때문**입니다. 참고 문서에 따르면, 새로운 상태(Key)를 추가하고 애니메이션을 지정할 때 **기존의 키를 삭제하지 않고** 새로운 상태와 액션을 추가해야 두 상태 모두 동작합니다. 즉, `Size`를 변경하는 과정에서 기존 행들의 데이터(예: `CR [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] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | Jump 함수가 false를 반환하는 원인은 무엇이며, 이를 해결하기 위해 반드시 함께 적용해야 하는 컴포넌트는 무엇인가요? [answer] | Jump 함수가 false를 반환하는 원인은 엔티티에 **RigidbodyComponent**가 없기 때문입니다. Jump 함수는 엔티티에 RigidbodyComponent가 함께 장착되어야 정상적으로 작동하며, 이 컴포넌트가 부재하면 점프가 실행되지 않고 false를 리턴합니다. 따라서 Jump 함수를 정상적으로 사용하려면 반드시 **RigidbodyComponent**를 함께 적용해야 합니다. [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] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | 플레이어 엔티티의 점프 제어를 위해 MovementComponent의 Jump 함수를 호출할 때, 왜 server 공간이 아닌 client 공간에서 실행하는 것이 권장되나요? [answer] | 플레이어 엔티티의 경우 RigidbodyComponent가 다른 일반 엔티티와 달리 server에서 client로 동기화되는 것이 아니라, client에서 server로 동기화됩니다. 이러한 동기화 방향의 특성 때문에, 플레이어의 RigidbodyComponent를 제어하는 것이 client 공간에서 더 적합하며, 따라서 Jump 함수 호출 역시 client에서 수행하는 것이 권장됩니다. [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] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 입력 발생부터 애니메이션 재생까지의 처리 흐름을 단계별 번호 목록으로 4단계로 작성하세요. [answer] | 입력 발생부터 애니메이션 재생까지의 처리 흐름은 다음과 같습니다. 1. 유저가 키를 눌러 특정 'Input'이 발생합니다. 2. `PlayerControllerComponent`가 해당 입력을 감지하고, 맞는 State로 변경하며 Action을 처리합니다. 3. `StateComponent`가 State 변경과 동작을 처리하며, `StateChangeEvent`를 발생시킵니다. 4. `AvatarRendererComponent`와 같은 애니메이션 관련 컴포넌트가 이 이벤트를 받아 애니메이션을 재생시킵니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는

[task] | instruction_following [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | MovementComponent의 SetPosition 함수가 RigidbodyComponent가 있을 때와 없을 때 각각 어떤 컴포넌트를 통해 좌표를 설정하는지 설명하세요. [answer] | MovementComponent의 `SetPosition()` 함수는 엔티티에 RigidbodyComponent가 존재하는지에 따라 좌표를 설정하는 대상이 달라집니다. 1. **RigidbodyComponent가 없을 때**: `TransformComponent`의 `Position`을 직접 설정합니다. 2. **RigidbodyComponent가 있을 때**: `RigidbodyComponent`를 통해 `Position`을 설정합니다. 이 함수는 매개변수로 `Vector2` 값을 받아 해당 좌표로 엔티티를 이동시킵니다. ` [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] | 기본 조작 키(key)와 값(value)의 매핑 관계를 표로 정리해서 나열하세요. [answer] | 메이플스토리 월드에서 기본으로 설정된 조작 키(key)와 값(value)의 매핑 관계는 다음과 같습니다. | Key (키) | Value (값) | | :--- | :--- | | W, UpArrow | MoveUp | | A, DownArrow | MoveLeft | | S, LeftArrow | MoveDown | | D, RightArrow | MoveRight | | Space | Jump | | LeftAlt | Jump2 | | LeftControl | Attack | | C | Sit | 참고로, `LeftAlt` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는

[task] | two_turn [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | AvatarRendererComponent의 SetColor 함수와 확장한 TriggerComponent를 사용해 특정 엔티티와 유저가 닿으면(충돌하면) 유저가 빨간색으로 변하게 하는 방법을 알려주세요. [answer] | 아바타를 빨간색으로 변경하는 작업은 `TriggerComponent`를 확장하여 충돌 이벤트를 처리하고, 해당 엔티티의 `AvatarRendererComponent`를 통해 색상을 적용하는 방식으로 진행합니다. ### 1. 컴포넌트 설정 1. **BaseEnvironment - NativeScripts - Component - TriggerComponent**를 선택합니다. 2. 선택한 **TriggerComponent**의 콘텍스트 메뉴에서 **Extend**를 클릭하여 스크립트를 확장합니다. 3. 확장한 스크립트 이름을 변경하 [followup] | TriggerEnterEvent의 TriggerBodyEntity가 가리키는 엔티티에 AvatarRendererComponent가 없을 경우의 예외 처리는 어떻게 하며, SetColor 인자값이 아닌 다른 색(예: 투명도 포함)을 지정하려면 어떻게 작성해야 하나요? [followup_answer] | `TriggerBodyEntity`에 `AvatarRendererComponent`가 없는 경우와 색상 지정 방법은 다음과 같습니다. ### 1. AvatarRendererComponent 부재 예외 처리 `enterEvent.TriggerBodyEntity`가 가리키는 엔티티(플레이어)에 `AvatarRendererComponent`가 없으면 해당 컴포넌트에 접근할 수 없습니다. 따라서 코드를 실행하기 전에 `nil` 여부를 반드시 확인해야 합니다. * **처리 방식:** `player.AvatarRendererCompon [scores] | [judge_reason] | [source_doc] | **AvatarRendererComponent**의 `SetColor` 함수와 **확장한 TriggerComponent**를 사용해 특정 엔티티와 유저가 닿으면(충돌하면) 유저가 빨간색으로 변하게 합니다. 1. **BaseEnvironment - NativeScripts - Component - TriggerComponent**를 선택합니다. 2. **TriggerComponent**의 콘텍스트 메뉴를 열고 **Extend**를 클릭합니다. 3. 확장한 스크립트 이름을 변경하고, 아바타와 부딪힐 엔티티에 컴포넌트를 추가합니

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아바타 표정 바꾸기 [question] | 몬스터에게 맞았을 때 "Hit" 표정을 자동으로 재생시키려면 어떤 이벤트 핸들러를 사용해야 하는지, 그리고 그 코드를 작성할 때 주의할 점이 있을까요? [answer] | 제공된 문서에는 몬스터에게 맞았을 때 특정 표정을 재생시키는 **구체적인 이벤트 핸들러 이름이나 API가 명시되어 있지 않습니다.** 문서에서는 "몬스터에게 맞았을 때 특정 표정을 재생시킬 수도 있다"고 원문을 언급하고 있지만, 이를 위한 구체적인 이벤트(예: `HandleDamageEvent`, `HandleHitEvent` 등)나 트리거 방식에 대한 기술적 상세 설명은 없습니다. 따라서 문서에 없는 API나 이벤트를 지어내어 답변할 수 없습니다. 다만, 문서에 있는 **표정 재생 자체의 코드 작성 방식과 주의사항**은 다음과 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 AvatarRendererComponent의 `PlayEmotion`을 사용해 플레이어 아바타의 표정을 바꿀 수 있습니다. 특정 입력 키와 표정을 연결 지어 생동감 있게 감정을 표현할 수도 있고, 몬스터에게 맞았을 때 특정 표정을 재생시킬 수도 있습니다. 적극적으로 사용해 유저들끼리의 활발하고 쉬운 의사소통을 할 수 있게 도와주세요. # 표정 종류 총 22가지의 표정을 제공합니다. 표정은 얼굴마다 다르게 나타나므로 크리에이터가 설정한 얼굴에 따라 가이드의 표정과 다를 수 있습니다 | 표정 | key | 예

[task] | code [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | MovementComponent의 JumpForce 프로퍼티를 3으로 설정하여 점프력을 조정하는 스크립트를 작성해줘 [answer] | MovementComponent의 `JumpForce` 프로퍼티는 엔티티가 점프할 때 적용되는 힘을 결정하며, `Jump()` 함수가 호출될 때 이 값이 점프력으로 사용됩니다. `JumpForce`를 3으로 설정하여 점프력을 조정하는 스크립트는 다음과 같습니다. 참고로, 엔티티에 `RigidbodyComponent`가 함께 존재해야 `Jump()` 함수가 정상적으로 작동하며, `RigidbodyComponent`가 없으면 `Jump()`는 `false`를 반환합니다. 또한, 동기화를 위해 일반적으로 server 공간에서 제어하지만 [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] | code [pass] | ⏳ 미판정 [title] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | AvatarStateAnimationComponent 의 StateToAvatarBodyActionSheet 에 새로운 Key "SPECIAL" 과 AvatarBodyActionStateName "attack" 을 추가하고 PlayRate 를 1.5 로 설정하는 스크립트를 작성해줘 [answer] | ```lua Property: [None] boolean isInitialized = false Method: [server only] void OnBeginPlay() { -- AvatarStateAnimationComponent가 Player 모델의 기본 컴포넌트이므로 직접 접근 local animComponent = self.Entity.AvatarStateAnimationComponent if animComponent ~= nil and animComponent.StateToAvatarBody [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **StateToAvatarBodyActionSheet**의 아바타 상태를 통해 애니메이션을 손쉽게 제어하는 방법을 소개합니다. # 아바타 애니메이션 아바타가 걸을 때, 앉을 때, 공격할 때, 점프할 때를 유저가 인지하려면 상태에 맞는 애니메이션이 필요합니다. [AvatarStateAnimationComponent](/apiReference/Components/AvatarStateAnimationComponent)의 **StateToAvatarBodyActionSheet**에 **Key**와 **Avatar

[task] | two_turn [pass] | ⏳ 미판정 [title] | 아바타의 외형 변경과 활용 [question] | CostumeManagerComponent의 SetEquip를 이용해 아바타가 특정 엔티티와 닿았을 때 크리에이터가 지정한 의상(RUID)으로 모습을 변경하는 스크립트 예제를 보여주세요. [answer] | `CostumeManagerComponent`의 `SetEquip` 메서드를 사용하려면, 먼저 대상 엔티티에 `TriggerComponent`를 추가하고 이를 확장(Extend)해야 합니다. `TriggerEnterEvent` 이벤트 핸들러에서 `MapleAvatarItemCategory`를 통해 부위(모자, 한벌옷, 무기 등)를 지정하고, 해당 부위에 적용할 아이템의 RUID를 전달합니다. 아래는 아바타가 특정 엔티티와 닿았을 때 모자, 한벌옷, 한손무기의 의상을 지정된 RUID로 변경하는 스크립트 예제입니다. ```lua E [followup] | CustomCapEquip, CustomLongcoatEquip, CustomOneHandedWeaponEquip 프로퍼티에 RUID를 직접 대입하는 방식 외에, 다른 장비 슬롯(예: 신발, 팔찌 등)도 동일하게 변경하려면 어떤 프로퍼티 이름을 사용해야 하며, 기존에 착용 중이던 의상을 해제하려면 어떻게 해야 하나요? [followup_answer] | 제공된 참고 문서에는 `CustomCapEquip`, `CustomLongcoatEquip`, `CustomOneHandedWeaponEquip` 프로퍼티에 RUID를 직접 대입하는 방식과 `CostumeManagerComponent`의 `SetEquip` 메서드를 사용하는 방식 두 가지가 언급되어 있습니다. 질문하신 내용에 대해 문서에 근거하여 답변드립니다. 1. **다른 장비 슬롯(신발, 팔찌 등)의 프로퍼티 이름:** 참고 문서에는 모자(`CustomCapEquip`), 롱코트/한벌옷(`CustomLongcoatE [scores] | [judge_reason] | [source_doc] | **AvatarRendererComponent**의 `SetColor` 함수와 **확장한 TriggerComponent**를 사용해 특정 엔티티와 유저가 닿으면(충돌하면) 유저가 빨간색으로 변하게 합니다. 1. **BaseEnvironment - NativeScripts - Component - TriggerComponent**를 선택합니다. 2. **TriggerComponent**의 콘텍스트 메뉴를 열고 **Extend**를 클릭합니다. 3. 확장한 스크립트 이름을 변경하고, 아바타와 부딪힐 엔티티에 컴포넌트를 추가합니

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerComponent가 없는 엔티티를 플레이어로 식별할 수 있는 이유를 3문장 이내로 설명하세요. [answer] | PlayerComponent는 다른 엔티티와 달리 플레이어만이 가지는 특성을 포함하고 있어, 이 컴포넌트의 존재 여부가 플레이어를 식별하는 기준이 됩니다. 따라서 PlayerComponent가 없는 엔티티는 플레이어로 인식되지 않으며, 해당 컴포넌트를 기준으로만 플레이어임을 판별할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으

[task] | single_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | OnUpdate에서 TransformComponent.Position을 직접 수정하는 것과 MovementComponent:SetPosition을 호출하는 것의 차이는 무엇인가요? [answer] | MovementComponent의 `SetPosition()` 함수를 사용하는 것과 `TransformComponent.Position`을 직접 수정하는 것의 핵심 차이는 **물리 엔진(RigidbodyComponent)과의 연동 여부**입니다. `MovementComponent:SetPosition()`은 엔티티에 `RigidbodyComponent`가 포함되어 있는 경우, 단순히 좌표 값을 바꾸는 것이 아니라 물리 컴포넌트를 통해 위치를 설정합니다. 이는 물리 시뮬레이션과 충돌 처리가 올바르게 이루어지도록 보장합니다. 반면, [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] | PlayerComponent의 주요 프로퍼티 중 MaxHp, RespawnDuration, Enable의 기본값과 설명을 표로 정리해서 출력하세요. [answer] | | 프로퍼티 | 기본값 | 설명 | | :--- | :--- | :--- | | MaxHp | 1000 | Player의 최대 체력을 정할 수 있습니다. 이 값은 UI 상태 창 모델의 HP와 연동되어, 변경한 값이 UI 모델에 반영됩니다. | | RespawnDuration | 5초 | 플레이어가 죽은 후 다시 맵에 리스폰될 때까지 걸리는 시간을 정합니다. | | Enable | (기본값 명시 없음) | 컴포넌트의 활성/비활성 상태를 설정할 수 있습니다. | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으

[task] | single_turn [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | DownJump 함수가 정상적으로 작동하지 않고 무시되는 경우, 엔티티에 어떤 컴포넌트가 부재한 것이 원인일 수 있나요? [answer] | 네, `DownJump` 함수가 무시되는 가장 흔한 원인은 엔티티에 **RigidbodyComponent**가 부재한 것입니다. `DownJump`는 엔티티가 풋홀드(Foothold) 위에 있을 때 아래에 있는 다른 풋홀드로 이동시키는 함수로, 이 함수는 **RigidbodyComponent가 함께 존재해야만 정상적으로 작동**합니다. 만약 엔티티에 RigidbodyComponent가 없다면 함수 호출이 무시되어 `false`가 리턴되며 아무 동작도 하지 않습니다. 따라서 `DownJump`를 사용하려면 엔티티에 반드시 `Rig [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] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | 새로운 상태를 추가할 때 StateComponent의 AddState()와 ChangeState() 함수를 어디에, 어떤 순서로 호출해야 하는지 정확히 알고 싶습니다. [answer] | `StateComponent`의 `AddState()`와 `ChangeState()` 함수를 사용할 때는 다음 순서와 위치를 지켜야 합니다. 1. **호출 위치**: 두 함수 모두 **클라이언트 전용**(`[client only]`) 메서드 내에서 호출해야 합니다. 서버에서는 아바타 애니메이션 상태 변경이 반영되지 않을 수 있으므로 클라이언트 공간에서 실행하는 것이 정확합니다. 2. **호출 순서**: * **`AddState()`**: 먼저 **새로운 상태(Key)를 등록**해야 합니다. 이 함수는 `AvatarS [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] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | SetPosition으로 좌표를 변경했는데 엔티티가 즉시 이동하지 않고 다음 프레임부터 움직이는 것처럼 보이는 현상은 왜 발생하는가요? [answer] | MovementComponent의 `SetPosition` 함수는 호출된 시점의 좌표 값으로 엔티티의 위치를 설정합니다. 참고 문서의 예시 코드에서 볼 수 있듯이, 이 함수는 `OnUpdate` 이벤트 핸들러 내부에서 `delta` 값을 이용하여 계산된 새로운 위치(`deltaPos`)를 매개변수로 전달받아 실행됩니다. `OnUpdate` 함수는 게임 루프에서 프레임마다 호출되는 생명주기 메서드이므로, `SetPosition`이 `OnUpdate` 블록 안에서 실행되면 해당 프레임의 로직 처리 과정에서 위치가 변경됩니다. 따라서 [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] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | RespawnPosition 프로퍼티를 스크립트로 직접 설정하지 않고 비워두면 플레이어는 어떤 순서대로 리스폰 위치를 결정하나요? [answer] | RespawnPosition 프로퍼티를 스크립트로 직접 설정하지 않고 비워두면, 플레이어의 리스폰 위치는 다음 순서대로 결정됩니다. 1. SpawnLocation의 위치 2. 맵 진입 시점의 위치 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으

[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerComponent의 MaxHp 프로퍼티를 500으로 설정하고, PVPMode를 활성화하는 스크립트를 작성해줘 [answer] | `OnBeginPlay` 라이프사이클 메서드에서 `PlayerComponent`의 `MaxHp`를 500으로 설정하고 `PVPMode`를 `true`로 변경하는 스크립트입니다. ```lua Method: [server only] void OnBeginPlay() { self.Entity.PlayerComponent.MaxHp = 500 self.Entity.PlayerComponent.PVPMode = true } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으

[task] | code [pass] | ⏳ 미판정 [title] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | 3초마다 MovementComponent의 Jump 함수를 호출하여 점프하는 스크립트를 작성해줘 [answer] | MovementComponent의 `Jump` 함수는 엔티티가 `JumpForce` 값만큼 점프하도록 하며, 성공 시 `true`를 반환합니다. 이 함수가 작동하려면 엔티티에 `RigidbodyComponent`가 반드시 함께 장착되어 있어야 합니다. `RigidbodyComponent`가 없으면 함수는 `false`를 반환하고 점프가 수행되지 않습니다. 일반적인 엔티티의 경우 서버 공간(`[server only]`)에서 호출하는 것이 동기화 관점에서 권장되지만, **플레이어 엔티티의 경우 클라이언트 공간(`[client only [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] | MovementComponent를 활용한 엔티티의 이동 제어 [question] | JumpForce 프로퍼티의 값을 변경하면 엔티티의 점프 동작에 어떤 변화가 생기며, 이 값은 어떤 시점에 적용되나요? [answer] | JumpForce 프로퍼티는 엔티티가 점프했을 때 얼마나 높이 뛸지를 결정하는 값입니다. 이 값이 커질수록 점프 높이가 높아지고, 작아질수록 점프 높이가 낮아집니다. JumpForce 값의 변경은 MovementComponent의 Jump 함수가 호출되는 시점에 적용됩니다. 즉, Jump 함수가 실행될 때의 JumpForce 값이 점프력으로 반영되어 점프 동작이 수행됩니다. JumpForce 값을 변경하는 예시 코드는 다음과 같습니다. ```lua [client only] [self] HandleTriggerEnterEvent [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] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | PlayRate를 통해 애니메이션 재생 속도를 조정할 때 각 상태별 기본값 차이를 어떻게 활용할 수 있나요? [answer] | `PlayRate`는 아바타 애니메이션의 재생 속도를 조절하는 값으로, 상태별 기본값이 서로 다르기 때문에 이 차이를 활용하면 더 자연스럽고 몰입감 있는 동작을 만들 수 있습니다. 기본적으로 `StateToAvatarBodyActionSheet`에 등록된 상태별 `PlayRate` 기본값은 다음과 같습니다. | Key | AvatarBodyActionStateName | PlayRate | | --- | --- | --- | | IDLE | stand | 1 | | MOVE | walk | 1.68 | | ATTACK | att [followup] | MOVE 상태의 PlayRate가 1.68인 이유와 이를 코드나 설정으로 수정하여 걷기 속도를 변경하는 구체적인 방법이나 예제가 있나요? [followup_answer] | 참고 문서에 따르면, `MOVE` 상태의 `PlayRate`가 1.68인 구체적인 이유(예: 이동 속도와 애니메이션 프레임 수 동기화 등)는 명시되어 있지 않습니다. 문서에는 "AvatarBodyActionStateName별로 기본값이 다릅니다"라고만 설명하고 있습니다. `StateToAvatarBodyActionSheet`는 `AvatarStateAnimationComponent`의 **프로퍼티**이며, 문서의 설명에 따르면 이 프로퍼티는 에디터에서 직접 편집하도록 설계되어 있습니다. 구체적으로: 1. **에디터 설정을 통한 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **StateToAvatarBodyActionSheet**의 아바타 상태를 통해 애니메이션을 손쉽게 제어하는 방법을 소개합니다. # 아바타 애니메이션 아바타가 걸을 때, 앉을 때, 공격할 때, 점프할 때를 유저가 인지하려면 상태에 맞는 애니메이션이 필요합니다. [AvatarStateAnimationComponent](/apiReference/Components/AvatarStateAnimationComponent)의 **StateToAvatarBodyActionSheet**에 **Key**와 **Avatar

← → 방향키로 페이지 이동 · 숫자 입력 후 Enter로 점프