← 목록

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

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

[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | WASD 키를 삭제하고 F키를 공격으로 재지정하려면 어떤 함수들을 사용해야 하나요? [answer] | WASD 키(이동)와 F키(공격)를 재지정하려면 `PlayerControllerComponent`의 `RemoveActionKey`와 `SetActionKey` 함수를 사용해야 합니다. 참고 문서에 제시된 예제는 왼쪽 Ctrl 키에 연결된 액션을 삭제하고 F 키에 "Attack" 액션을 연결하는 방식입니다. WASD 키를 삭제하려면 해당 키에 매핑된 액션 이름(예: "Move" 등)을 확인하여 `RemoveActionKey`에 전달해야 하지만, 제공된 문서에는 WASD 키에 구체적으로 어떤 액션 이름이 매핑되어 있는지 명시되어 있 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 플레이어의 기본 속성에 발동할 수 있게 하는 조건을 추가할 수 있습니다. `AddCondition()` 함수를 사용해 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 1. **MyDesk**에 PlayerSetting 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. Jump 액션이 실행되는 조건을 작성합니다. 10 이상은 Jump가 실

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerComponent의 Nickname, RespawnPosition, RespawnTime 프로퍼티가 프로퍼티 에디터 창에서 노출되지 않는 이유와 스크립트 활용 방식을 단계별 번호 목록으로 작성하세요. [answer] | PlayerComponent의 `Nickname`, `RespawnPosition`, `RespawnTime` 프로퍼티가 프로퍼티 에디터 창에서 노출되지 않는 이유는, 이러한 값들이 **플레이어마다 고유하거나 런타임에 동적으로 결정되는 정보**이기 때문입니다. * **Nickname**: 플레이어가 웹에서 직접 설정한 닉네임으로, 서버가 플레이어를 인식할 때 실시간으로 가져오는 값입니다. * **RespawnPosition**: 리스폰 위치는 맵 진입 시점이나 SpawnLocation 등 런타임 상황(또는 다른 스크립트 로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으

[task] | two_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 기존 조작키를 삭제하고 새로운 키로 대체할 때 `RemoveActionKey`와 `SetActionKey` 함수는 어떤 순서로 호출해야 하며, 특정 키(예: LeftControl)에 연결된 액션을 삭제한 후 F 키에 Attack을 연결하는 전체 스크립트 구조는 어떻게 되어 있나요? [answer] | `RemoveActionKey`와 `SetActionKey` 함수의 호출 순서에 대한 명시적인 제약은 없습니다. 다만, 기존 키에 연결된 액션을 삭제한 후 새로운 키에 액션을 연결하는 논리적 흐름을 따르는 것이 일반적입니다. 특정 키(예: `LeftControl`)에 연결된 액션을 삭제한 후 F 키에 `Attack`을 연결하는 전체 스크립트 구조는 다음과 같습니다. 1. **MyDesk**에 `PlayerSetting` 컴포넌트를 생성하고, `DefaultPlayer`에 추가합니다. 2. 아래 코드를 작성합니다. ```lua [followup] | 만약 W, A, S, D 이동 키를 모두 삭제하고 새로운 키로 대체하려면 `RemoveActionKey` 호출을 어떻게 반복하거나 배치해야 하나요? [followup_answer] | 참고 문서에는 W, A, S, D 키 이동을 삭제하고 새로운 키로 만들 수 있다는 설명만 있으며, `KeyboardKey` 열거형의 구체적인 값(예: `KeyboardKey.W`, `KeyboardKey.A` 등)이나 `RemoveActionKey` 호출을 반복하는 구체적인 코드 예제는 제공되지 않습니다. 따라서 문서에 근거하여 W, A, S, D 키를 삭제하는 정확한 `KeyboardKey` 상수 이름이나 반복 구조를 답변드릴 수 없습니다. [scores] | [judge_reason] | [source_doc] | 플레이어의 기본 속성에 발동할 수 있게 하는 조건을 추가할 수 있습니다. `AddCondition()` 함수를 사용해 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 1. **MyDesk**에 PlayerSetting 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. Jump 액션이 실행되는 조건을 작성합니다. 10 이상은 Jump가 실

[task] | code [pass] | ⏳ 미판정 [title] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | InputService의 HandleKeyDownEvent 이벤트 핸들러에서 event.key 값이 KeyboardKey.Alpha6, Alpha7, Alpha8, Alpha9 중 하나일 때만 동작하며, 해당 키에 매핑된 StateComponent:ChangeState()를 통해 아바타의 동작 애니메이션을 재생하는 스크립트를 작성해줘 [answer] | 메이플스토리 월드에서 `InputService`의 `HandleKeyDownEvent`를 활용해 숫자 키 6, 7, 8, 9 입력 시 `StateComponent:ChangeState()`로 아바타 애니메이션을 제어하는 스크립트입니다. ```lua Property: [None] any stateComponent = nil Method: [client only] void OnBeginPlay() { self.stateComponent = self.Entity.StateComponent } [client only] void [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 새로운 상태(Key)를 추가하고, 애니메이션을 지정할 수 있습니다. 기존의 키를 삭제하지 않고 새로운 상태와 액션을 추가하면 두 상태 모두 동작합니다. 숫자 6, 7, 8, 9를 눌렀을 때 특정 애니메이션이 재생되게 만들어봅시다. 1. **Workspace - DefaultPlayer - AvatarStateAnimationComponent**의 **Size**를 **15**로 변경합니다. 2. 추가한 칸에 새로운 **Key**와 **AvatarBodyActionStateName**를 입력합니다. | Key |

[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | OnUpdate 메서드에서 _TimerService:SetTimerOnce를 사용하여 5초 후 다른 맵으로 이동시키는 로직을 구현하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `_TimerService:SetTimerOnce`를 사용하여 **5초 후 다른 맵으로 이동시키는 로직**에 대한 설명이나 API가 포함되어 있지 않습니다. 문서에는 `_TimerService:SetTimerOnce`가 토스트 메시지(TOAST)를 3초 후 숨기는 용도로만 사용된 예시가 있으며, 맵 이동(teleport/map change) 관련 API나 함수는 문서에 나와 있지 않습니다. 따라서 요청하신 "5초 후 다른 맵으로 이동"하는 로직은 **제공된 문서 근거로 구현할 수 없습니다.** 대신, 문서 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는

[task] | single_turn [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | OnBeginPlay() 함수 안에 wait() 를 넣으면 OnUpdate() 가 실행되지 않는 원리는 어떻게 이해해야 하나요? [answer] | `OnBeginPlay()` 함수 안에 `wait()`를 사용하면 `OnUpdate()`가 실행되지 않는 이유는 mLua의 생명주기 처리 순서 때문입니다. `OnBeginPlay()`가 완전히 종료(마무리)되어야 게임 루프가 다음 단계인 `OnUpdate()` 호출로 넘어갈 수 있습니다. `wait()`는 해당 함수의 실행을 일시 정지(대기) 상태로 만듭니다. `OnBeginPlay()` 내에서 `wait()`를 만나면 함수가 즉시 반환되지 않고 대기 상태에 머물러 `OnBeginPlay()`가 "끝났다"는 신호를 시스템에 전달하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `wait()`는 보통 아래 예시 코드처럼 간단하게 사용합니다. ```lua _UIToast:ShowMessage("Show Message") wait(1) _UIToast:ShowMessage("Show Delay Message") ``` 하지만 `wait()`를 사용할 때는 주의해야 합니다. `wait()`는 말 그대로 행동을 '기다리고' 있기 때문에 여기저기에 마구 사용한다면 전체적인 흐름을 파악하기 어려워집니다. 또한, '대기'를 하므로 이후 작업이 진행되지 않는 문제도 있습니다. 아래 예시를 통해 '대기' 때문에

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | OnUpdate에서 동기화 프로퍼티를 매 프레임 갱신할 때 발생하는 N * N 네트워크 비용 문제를 표로 정리해서 나타내세요. [answer] | OnUpdate에서 동기화 프로퍼티를 매 프레임마다 갱신할 때 발생하는 네트워크 비용 문제와 그 원인을 정리한 표입니다. | 구분 | 내용 | | :--- | :--- | | **발생 원인** | 동기화 프로퍼티는 서버와 클라이언트 간 데이터 동기화에 막대한 네트워크 비용을 사용합니다. OnUpdate는 매 프레임마다 호출되므로, 이 프로퍼티가 매 프레임마다 변경되면 매 프레임마다 네트워크 송신이 발생합니다. | | **비용 구조 (N * N)** | **N (엔티티 수)**: 월드에 존재하는 해당 컴포넌트를 가진 엔티티의 수.< [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `wait`는 대기한 뒤에 직접 어떤 행동을 수행하는 것이고, `TimerService`는 해당 행동을 수행하는 별도의 일을 만드는 것입니다. `wait`는 직렬, `TimerService`는 병렬 형태로 동작합니다. 따라서 `wait`의 사용 코드는 다음과 같이 표현할 수 있습니다 ```lua local targetEntity = _EntityService:GetEntity("a22396e1-6365-42d4-9cef-5924c223f7fa") targetEntity.TestComponent:ShowMessage() func

[task] | two_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 플레이어 행동 제약 조건을 추가할 때 `AddCondition()` 함수를 어떤 방식으로 활용하나요? [answer] | `AddCondition()` 함수는 `PlayerControllerComponent`를 통해 호출하며, 특정 플레이어 행동(액션)이 실행되기 전에 체크할 조건을 함수로 전달하는 방식으로 활용합니다. 이 조건 함수에서 `true`를 반환하면 해당 행동이 정상적으로 실행되고, `false`를 반환하면 행동이 차단됩니다. 기본적으로 사용 가능한 공격, 점프 등의 행동을 일시적으로 제한하거나, 특정 상태(예: HP가 일정 수치 이하일 때)에서만 행동이 가능하도록 색다른 조건을 부여할 때 사용합니다. 아래는 HP가 10 미만일 때 점프 [followup] | HP가 10 미만일 때 점프를 막는 예시 코드에서 조건식이 `true`/`false` 반환으로 동작하는 원리와, 다른 액션(예: Attack)에 동일한 조건을 적용하고 싶다면 코드를 어떻게 수정해야 하나요? [followup_answer] | `AddCondition()` 함수에 전달되는 조건 함수는 해당 액션이 실행되기 직전에 호출됩니다. 이 함수가 `true`를 반환하면 액션이 정상적으로 실행되고, `false`를 반환하면 액션이 차단됩니다. 따라서 HP가 10 미만일 때 `false`를 반환함으로써 점프 동작이 재생되지 않도록 제어하는 원리입니다. 다른 액션(예: `Attack`)에 동일한 조건을 적용하려면 `AddCondition()` 함수의 첫 번째 인자인 액션 이름을 `"Attack"`으로 변경하고, 내부 조건 로직을 그대로 유지하면 됩니다. ```lua [scores] | [judge_reason] | [source_doc] | 플레이어의 기본 속성에 발동할 수 있게 하는 조건을 추가할 수 있습니다. `AddCondition()` 함수를 사용해 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 1. **MyDesk**에 PlayerSetting 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. Jump 액션이 실행되는 조건을 작성합니다. 10 이상은 Jump가 실

[task] | two_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerControllerComponent에서 입력에 따른 액션 실행 시, 사다리 매달림 등 특정 상태에서의 동작을 어떻게 제어할 수 있나요? [answer] | PlayerControllerComponent는 입력에 따라 액션을 수행하고, 특정 조건을 처리하도록 설계되어 있습니다. 사다리에 매달려 있을 때와 같이 특정 상태에서의 동작을 제어하려면, **입력(Input), 액션(Action), 조건(Condition)**의 관계를 설정하여 조건이 충족될 때만 액션이 실행되도록 구성할 수 있습니다. 구체적으로 사다리 매달림 상태에서의 동작 제제는 다음과 같은 원리로 작동합니다. 1. **기본 동작:** 일반적으로 공격 키를 눌렀을 때 '공격 애니메이션 재생'이라는 액션이 연결되어 있습니다 [followup] | 사다리에 매달려 있을 때 '공격 키를 눌러도 공격 액션이 재생되지 않는다'는 조건을 구체적으로 어떻게 설정해야 하는지, 또는 StateComponent와 PlayerControllerComponent의 참조 관계가 끊어질 경우 발생하는 오류와 해결 방법을 알려주세요. [followup_answer] | 제시된 참고 문서를 기준으로 질문에 답하겠습니다. **1. 사다리 매달림 상태에서의 공격 액션 제어 방법** 참고 문서에는 사다리 매달림 상태에서 공격 액션이 재생되지 않도록 하기 위해 **"사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있다"**고 명시되어 있습니다. 하지만 문서에는 이 조건을 **구체적으로 어떤 UI나 API를 통해 설정하는지(예: 특정 프로퍼티 값 변경, 스크립트 코드 작성 등)에 대한 상세한 절차나 API 이름이 포함되어 있지 않습니다.** 따 [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는

[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | PlayerControllerComponent의 Enable 프로퍼티를 false로 설정하여 플레이어가 사다리에 매달려 있을 때 공격 액션이 재생되지 않도록 하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서를 기준으로, `PlayerControllerComponent`의 `Enable` 프로퍼티를 `false`로 설정하는 것만으로는 "사다리에 매달려 있을 때"라는 특정 조건을 만족하는 로직을 구현할 수 없습니다. 문서에 따르면, `Enable`은 컴포넌트 전체의 활성/비활성 상태를 설정하는 프로퍼티이며, "사다리에 매달려 있을 때 공격 액션이 재생되지 않도록 한다"는 것은 **조건(Condition)**에 해당합니다. `PlayerControllerComponent`는 입력(Input), 액션(Action), **조 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는

[task] | code [pass] | ⏳ 미판정 [title] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | AvatarStateAnimationComponent의 Size 프로퍼티가 15로 설정된 환경에서, 클라이언트 측([client only])으로 실행되는 NewAvatarAnimation 스크립트 컴포넌트 내에서 self.Entity.StateComponent를 참조하고 입력 이벤트에 반응하여 상태 변경을 처리하는 스크립트를 작성해줘 [answer] | `AvatarStateAnimationComponent`의 `Size`가 15로 설정되어 있고, `NEW_ATTACK`, `NEW_DEAD`, `NEW_JUMP`, `NEW_CROUCH`라는 새로운 상태(Key)가 이미 등록되어 있다고 가정합니다. 클라이언트에서 실행되는 `NewAvatarAnimation` 스크립트 컴포넌트에서 `StateComponent`를 참조하고, 숫자 키(6, 7, 8, 9) 입력 시 해당 상태로 변경하는 스크립트는 다음과 같습니다. ```lua Property: [None] any stateCompon [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 새로운 상태(Key)를 추가하고, 애니메이션을 지정할 수 있습니다. 기존의 키를 삭제하지 않고 새로운 상태와 액션을 추가하면 두 상태 모두 동작합니다. 숫자 6, 7, 8, 9를 눌렀을 때 특정 애니메이션이 재생되게 만들어봅시다. 1. **Workspace - DefaultPlayer - AvatarStateAnimationComponent**의 **Size**를 **15**로 변경합니다. 2. 추가한 칸에 새로운 **Key**와 **AvatarBodyActionStateName**를 입력합니다. | Key |

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | OnUpdate()에서 wait()를 사용했을 때 기대 동작과 실제 동작의 차이를 3문장 이내로 설명하세요. [answer] | `OnUpdate()`에서 `wait()`를 사용하면 대기 중에도 다음 프레임마다 새로운 `OnUpdate()`가 생성되어 처음부터 실행되며, 이는 `wait()`가 끝나기 전까지 반복됩니다. 기대했던 일회성 순차 실행과 달리 `log("TEST")`가 매 프레임마다 반복 출력되고, `wait()` 완료 시점 이후에야 `log("TEST2")`가 출력되는 비효율적인 동작이 발생합니다. 이로 인해 Update 객체가 계속 쌓여 메모리 및 성능 저하가 일어나므로, `OnUpdate()` 내에서 `wait()` 사용을 피하고 다른 설계 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 그럼 `OnUpdate()`에서 사용할 경우를 살펴보겠습니다. `OnUpdate()` 문에서 아래 코드는 어떻게 동작할까요? ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` * 기대 동작: TEST - 1초 대기 - TEST2 - TEST1 - 1초 대기 - TEST2 * 실제 동작: **TEST - TEST - TEST - .... (첫 번째 TEST가 찍힌 시점부터 1초가 지났을 때 ) - TEST2** `OnUpdate()`는 논리적인 측면에서 수행이 끝날 당시

[task] | code [pass] | ⏳ 미판정 [title] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | StateComponent의 AddState() 메서드를 통해 4가지 새로운 상태 키(NEW_ATTACK, NEW_DEAD, NEW_JUMP, NEW_CROUCH)를 초기화하는 로직과, 숫자 6, 7, 8, 9 키 입력에 따라 각각 attack, dead, fall, crouch 애니메이션 상태로 전환되는 Animate() 메서드를 구현하는 NewAvatarAnimation 스크립트를 작성해줘 [answer] | 사용자가 요청한 `NewAvatarAnimation` 스크립트는 `OnBeginPlay` 시점에 `StateComponent`를 참조하여 4개의 새로운 상태 키를 `AddState()`로 등록하고, `InputService`의 `KeyDownEvent`를 통해 숫자 키 6, 7, 8, 9 입력을 감지한 후 `Animate()` 메서드를 호출하여 해당 키에 매핑된 상태(`NEW_ATTACK`, `NEW_DEAD`, `NEW_JUMP`, `NEW_CROUCH`)로 `ChangeState()`를 실행하는 로직으로 구성됩니다. ```lu [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 새로운 상태(Key)를 추가하고, 애니메이션을 지정할 수 있습니다. 기존의 키를 삭제하지 않고 새로운 상태와 액션을 추가하면 두 상태 모두 동작합니다. 숫자 6, 7, 8, 9를 눌렀을 때 특정 애니메이션이 재생되게 만들어봅시다. 1. **Workspace - DefaultPlayer - AvatarStateAnimationComponent**의 **Size**를 **15**로 변경합니다. 2. 추가한 칸에 새로운 **Key**와 **AvatarBodyActionStateName**를 입력합니다. | Key |

[task] | code [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | '게임 시작하기' 버튼 클릭 시 카드 30개를 초기화하고 점수를 0으로 리셋하며 게임 UI 를 다시 활성화하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 '게임 시작하기' 버튼 클릭 시 카드 30개를 초기화하고 점수를 0으로 리셋하며 게임 UI를 다시 활성화하는 구체적인 스크립트 코드나 관련 API(버튼 클릭 이벤트 핸들러, 카드 초기화 로직, UI 활성화 메서드 등)가 포함되어 있지 않습니다. 문서에는 게임의 기본 규칙(30개 카드, 10점 증가, 0초 시 종료, 재시작 가능)과 mLua의 일반적 문법 예제(컴포넌트 구조, `_EntityService`, `_TimerService` 사용법 등)만 제시되어 있으며, 요청하신 특정 기능 구현을 위한 상세 코드나 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.

[task] | single_turn [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | 월드 규모가 커질수록 발생하는 흐름 제어 및 최적화 문제를 예방하기 위해 제작 초기에 고려해야 할 구조적인 요소는 무엇인가요? [answer] | 월드 규모가 커질수록 발생하는 흐름 제어 및 최적화 문제를 예방하기 위해 제작 초기부터 고려해야 할 구조적인 요소는 다음과 같습니다. 1. **모든 동작의 원활하고 효율적인 진행을 위한 구조 설계** 월드의 규모가 작거나 제작 초기에는 문제가 발견되기 어렵지만, 규모와 완성도가 높아질수록 문제가 드러납니다. 따라서 초기 단계부터 월드가 느려지지 않도록 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민하여 제작해야 합니다. 2. **흐름 제어와 최적화 문제의 상시 고려** 월드 제작 과정에서 특히 흐름 제어(Flo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민

[task] | single_turn [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | isvalid() 함수와 단순히 ~= nil 비교를 사용하는 것 사이의 근본적인 동작 원리 차이는 무엇인가요? [answer] | `isvalid()` 함수와 `~= nil` 비교의 근본적인 차이는 **엔티티의 삭제 과정이 즉시 완료되지 않는다는 점**을 반영하느냐에 있습니다. 메이플스토리 월드에서 엔티티를 삭제할 때 실제 내부 동작은 단순한 값이 `nil`로 바뀌는 것이 아닙니다. 삭제 요청이 들어온 후 **삭제 처리 대기**, **삭제 중**, **삭제 완료** 단계를 거쳐야만 비로소 `nil` 상태가 됩니다. * **`~= nil` 비교의 한계:** 이 비교는 대상이 `nil` 값으로만 변경되었을 때만 `false`를 반환합니다. 위와 같이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민

[task] | single_turn [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | wait(3) 호출 후 해당 엔티티 참조 변수를 다시 사용하려고 했는데 에러가 나는 이유는 뭘까요? [answer] | `wait(3)` 호출 후 엔티티 참조 변수를 다시 사용할 때 에러가 발생하는 주된 이유는, 대기(`wait`)가 진행되는 동안 해당 엔티티나 컴포넌트가 삭제되었을 가능성이 있기 때문입니다. `wait()`는 스크립트 실행을 일시 중지시킵니다. 이 시간 동안 다른 스크립트나 시스템이 해당 엔티티를 제거할 수 있습니다. 따라서 `wait()` 이후에 이전에 저장해 둔 엔티티 참조 변수를 그대로 사용하면, 그 변수가 더 이상 유효한 엔티티를 가리키지 않을 수 있어 에러가 발생합니다. 이 문제를 방지하기 위해서는 `wait()` 이후 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `wait()`는 보통 아래 예시 코드처럼 간단하게 사용합니다. ```lua _UIToast:ShowMessage("Show Message") wait(1) _UIToast:ShowMessage("Show Delay Message") ``` 하지만 `wait()`를 사용할 때는 주의해야 합니다. `wait()`는 말 그대로 행동을 '기다리고' 있기 때문에 여기저기에 마구 사용한다면 전체적인 흐름을 파악하기 어려워집니다. 또한, '대기'를 하므로 이후 작업이 진행되지 않는 문제도 있습니다. 아래 예시를 통해 '대기' 때문에

[task] | single_turn [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | 게임 시작하기 버튼을 눌렀을 때 기존 게임 UI가 완전히 사라지지 않고 겹쳐 보이거나, 점수가 초기화되지 않는 오류가 발생하면 어떤 설정을 점검해야 하나요? [answer] | 카드 짝 맞추기 가이드의 제공된 문서 내용에는 "게임 시작하기 버튼을 눌렀을 때 UI가 겹쳐 보이거나 점수가 초기화되지 않는 오류"에 대한 구체적인 원인과 해결 방법, 또는 해당 오류를 방지하기 위한 특정 설정이나 API 사용법이 명시되어 있지 않습니다. 따라서 주어진 참고 문서만으로는 이 오류의 원인 분석이나 해결책을 제시할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.

[task] | code [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | `_TimerService` 를 이용해 30초 카운트다운 타이머를 설정하고, 0초가 되면 게임 종료 UI 를 표시하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `_TimerService`의 `SetTimer` 및 `ClearTimer` 메서드 사용법과 예제만 포함되어 있으며, **30초 카운트다운을 위한 1초 단위 반복 타이머 설정**이나 **게임 종료 UI를 표시하기 위한 특정 UI API**에 대한 설명이 없습니다. 따라서 문서에 근거하여 정확한 카운트다운 로직과 UI 표시 코드를 작성할 수 없습니다. 참고 문서에 포함된 `_TimerService` 사용 예제(3초 지연 후 콜백 실행)만 참고용으로 제시해 드립니다. ```lua Method: [server [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | wait() 사용으로 인해 Update 객체가 계속 쌓이는 현상이 성능과 디버깅에 미치는 영향을 표로 정리해서 작성하세요. [answer] | `OnUpdate()` 내에서 `wait()`를 사용할 경우 발생하는 성능 및 디버깅 문제를 정리하면 다음과 같습니다. | 구분 | 영향 내용 | | :--- | :--- | | **성능 (속도)** | `wait()`로 인해 현재 `OnUpdate` 수행이 종료되지 않아 **Update 객체가 계속 쌓입니다.** 이로 인해 자원이 과도하게 소모되어 월드 전체의 속도가 느려집니다. | | **성능 (메모리)** | 반복적으로 생성되고 종료되지 않는 Update 객체들이 **메모리 측면에서 자원을 잡아먹는** 원인이 됩니다. | | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 그럼 `OnUpdate()`에서 사용할 경우를 살펴보겠습니다. `OnUpdate()` 문에서 아래 코드는 어떻게 동작할까요? ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` * 기대 동작: TEST - 1초 대기 - TEST2 - TEST1 - 1초 대기 - TEST2 * 실제 동작: **TEST - TEST - TEST - .... (첫 번째 TEST가 찍힌 시점부터 1초가 지났을 때 ) - TEST2** `OnUpdate()`는 논리적인 측면에서 수행이 끝날 당시

[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | UserId 프로퍼티는 Client 실행제어 함수의 targetUserId 매개변수로 사용된다고 하는데, Nickname과 함께 스크립트 내에서 어떻게 활용하나요? [answer] | `UserId`는 각 플레이어를 고유하게 식별하는 문자열 값입니다. 이 값은 다른 플레이어와 구별하거나, 특정 플레이어에게만 명령을 보내거나, 클라이언트 측에서 "나"를 확인하는 데 핵심적으로 사용됩니다. 문서에 명시된 `UserId`의 주요 활용 방법은 다음과 같습니다. ### 1. Client 실행제어 함수의 `targetUserId` 매개변수로 사용 서버에서 특정 플레이어의 클라이언트에 함수를 호출할 때, 그 대상 플레이어를 지정하기 위해 `UserId`를 사용합니다. * **활용 시나리오:** 서버에서 아이템 구매 요 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 Player 모델에는 캐릭터의 초기 속성을 만들 때도 유용하게 사용하지만, 캐릭터를 이동시키거나, 상태를 제어할 때 유용하게 사용할 수 있습니다. PlayerComponent와 PlayerControllerComponent의 개념을 알아보고, 액션과 상태 애니메이션의 관계를 파악해 크리에이터의 의도에 따라 플레이어가 동작할 수 있게 만들어봅시다. # PlayerComponent 개념 **PlayerComponent**는 다른 엔티티와 다르게 플레이어만이 가지고 있는 특성을 모아 놓은 컴포넌트입니다. 대표적으

[task] | code [pass] | ⏳ 미판정 [title] | ActionSheet로 아바타 애니메이션 손쉽게 제어하기 [question] | DefaultPlayer에 추가된 NewAvatarAnimation 스크립트 컴포넌트에서 OnBeginPlay() 시 StateComponent:AddState()를 호출하여 NEW_ATTACK, NEW_DEAD, NEW_JUMP, NEW_CROUCH 상태를 등록하고, InputService의 HandleKeyDownEvent에서 KeyboardKey.Alpha6부터 Alpha9까지의 키 입력을 감지하여 각각의 키에 대응하는 StateComponent:ChangeState()를 실행해 아바타 애니메이션을 제어하는 스크립트를 작성해줘 [answer] | 요청하신 기능은 `DefaultPlayer`에 추가된 스크립트 컴포넌트에서 `OnBeginPlay()` 시점에 새로운 상태 키를 등록하고, 키 입력 이벤트에 따라 해당 상태로 전환하여 아바타 애니메이션을 제어하는 것입니다. 아래는 `NewAvatarAnimation` 스크립트 컴포넌트의 mLua 코드입니다. ```lua Property: [None] any stateComponent = nil Method: [client only] void OnBeginPlay() { self.stateComponent = self.E [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] | 월드 리메이크 후 메이플스토리 월드를 실행해 만들기 탭으로 갔는데, 새로 만든 월드가 목록에 안 보여서 '이어서 만들기'에서 찾을 수 없다면 어떤 원인이 있을까요? [answer] | 제공된 참고 문서에는 월드 리메이크 후 '이어서 만들기' 목록에 월드가 표시되지 않는 원인에 대한 정보가 포함되어 있지 않습니다. 문서에는 다음과 같은 사전 준비 단계만 안내되어 있습니다: 1. 메이플스토리 월드 홈페이지에서 카드 짝 맞추기 월드를 리메이크합니다. 2. 메이플스토리 월드를 실행합니다. 3. 만들기 탭으로 이동합니다. 4. **이어서 만들기**를 선택합니다. 따라서 목록에 월드가 안 보이는 구체적인 원인(예: 동기화 지연, 로그인 계정 불일치, 클라이언트 캐시 문제 등)에 대해서는 문서 근거가 없으므로 답변 드리기 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.

[task] | single_turn [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | 카드 짝 맞추기 게임에서 한 판에 펼쳐지는 카드 수를 30개에서 20개로 변경하려면 스크립트나 UI 에디터에서 어떤 부분을 수정해야 하나요? [answer] | 제공된 참고 문서에는 카드 짝 맞추기 게임의 기본 규칙(한 판에 30개의 카드가 펼쳐짐)과 UI 에디터 활용, 월드 리메이크 과정만 설명되어 있습니다. 하지만, 카드 수를 30개에서 20개로 변경하기 위해 구체적으로 **어떤 변수를 수정해야 하는지**, **어떤 UI 오브젝트를 조작해야 하는지**, 또는 **카드 생성 로직이 담긴 스크립트의 코드**는 문서에 포함되어 있지 않습니다. 따라서 제공된 문서 정보만으로는 카드 수를 20개로 변경하는 구체적인 수정 방법(스크립트 코드 또는 UI 에디터 설정)을 안내해 드릴 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.

[task] | two_turn [pass] | ⏳ 미판정 [title] | 플레이어 설정과 제어 [question] | 플레이어가 사망한 위치에서 즉시 리스폰하게 하려면 어떤 컴포넌트와 이벤트를 사용해야 하나요? [answer] | 플레이어가 사망한 위치에서 즉시 리스폰하게 하려면 **PlayerSetting** 컴포넌트와 **DeadEvent**를 사용해야 합니다. 1. **MyDesk**에 **PlayerSetting** 컴포넌트를 생성하여 **DefaultPlayer**에 추가합니다. 2. `OnBeginPlay` 메서드 내에서 `ConnectEvent`를 통해 `DeadEvent`를 연결합니다. 3. 사망 이벤트가 발생하면, 현재 플레이어의 위치(`self.Entity.TransformComponent.Position`)를 `self.Entity.Pl [followup] | `DeadEvent`를 통해 사망 위치를 `RespawnPosition`으로 설정하는 `[client only]` 스크립트 코드를 보여주세요. [followup_answer] | 플레이어가 사망한 위치에서 즉시 리스폰하게 하려면 **PlayerSetting** 컴포넌트를 **DefaultPlayer**에 추가하고, 아래 `[client only]` 스크립트를 적용합니다. ```lua Method: [client only] void OnBeginPlay() { self.Entity:ConnectEvent(DeadEvent, function() self.Entity.PlayerComponent.RespawnPosition = self.Entity.TransformComponent.Posi [scores] | [judge_reason] | [source_doc] | `MoveToMapPosition()`를 이용해 플레이어를 특정 위치로 이동시킬 수 있습니다. 이 기능을 활용해 여러 맵으로 모든 유저를 한 번에 옮겨 새로운 맵에서 새로운 게임을 할 수 있게 합니다. 1. **MyDesk**에 새로운 PlayerManagement 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. `TimerService`를 이용해 10초를 셀 수 있게 만들고, 10초 뒤 이동할 map의 이름과 그 맵의 위치를 입력합니다. 맵의 이름은 Hierarchy의 이름과 동일해야 합니다. >**

[task] | two_turn [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | 여러 개의 DataStorage 값을 순차적으로 가져올 때 발생하는 성능 문제는 무엇이며, 이를 해결하기 위해 _DataStorageService:GetAsync를 어떻게 사용해야 하나요? [answer] | 여러 개의 DataStorage 값을 `GetAndWait`처럼 동기적으로 순차 호출하면, 각 요청이 완료될 때까지 다음 요청을 보낼 수 없으므로 전체 대기 시간이 누적됩니다. 예를 들어 7개의 값을 가져오는데 각 요청에 0.5초가 걸린다면 총 3.5초가 소요되며, 이 시간 동안 해당 스크립트 흐름이 멈추어 다른 작업이나 접근 시 순서 오류가 발생할 수 있습니다. 이 문제를 해결하기 위해 `_DataStorageService:GetAsync`를 사용하면 요청을 보낸 후 대기 없이 즉시 다음 코드로 진행할 수 있어 병렬 처리가 가능 [followup] | GetAsync로 요청을 보낸 뒤 응답이 도착했을 때의 처리 로직을 구현하는 코드 예시를 보여주세요. [followup_answer] | 제공된 문서에는 `_DataStorageService:GetAsync`의 구체적인 메서드 시그니처, 콜백 함수 파라미터 구조, 또는 응답 처리를 위한 코드 예시가 포함되어 있지 않습니다. 문서에서는 해당 API의 사용 방법에 대해 "[DataStorageService](/apiReference?postId=309)"를 참고하라고 안내만 하고 있을 뿐, 실제 구현 코드를 제시하지 않습니다. 따라서 문서의 근거만으로는 `GetAsync` 응답 처리 로직을 구현하는 코드 예시를 보여드릴 수 없습니다. [scores] | [judge_reason] | [source_doc] | `wait()`는 보통 아래 예시 코드처럼 간단하게 사용합니다. ```lua _UIToast:ShowMessage("Show Message") wait(1) _UIToast:ShowMessage("Show Delay Message") ``` 하지만 `wait()`를 사용할 때는 주의해야 합니다. `wait()`는 말 그대로 행동을 '기다리고' 있기 때문에 여기저기에 마구 사용한다면 전체적인 흐름을 파악하기 어려워집니다. 또한, '대기'를 하므로 이후 작업이 진행되지 않는 문제도 있습니다. 아래 예시를 통해 '대기' 때문에

[task] | single_turn [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | Client의 OnUpdate에서 Server 쪽 함수를 호출하면 어떤 문제가 발생하나요? [answer] | Client의 `OnUpdate`에서 Server 쪽 함수를 호출하면 매 프레임마다 네트워크 비용이 소모되는 문제가 발생합니다. `OnUpdate`는 매 프레임마다 실행되는 함수이므로, 이 안에서 Server로 호출이 발생하면 네트워크 통신이 계속해서 일어나게 됩니다. 이로 인해 상당한 네트워크 부하가 생길 수 있으므로, `OnUpdate` 내에서 다른 실행 공간(Server 또는 Client)으로의 호출은 주의 깊게 관리해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `wait`는 대기한 뒤에 직접 어떤 행동을 수행하는 것이고, `TimerService`는 해당 행동을 수행하는 별도의 일을 만드는 것입니다. `wait`는 직렬, `TimerService`는 병렬 형태로 동작합니다. 따라서 `wait`의 사용 코드는 다음과 같이 표현할 수 있습니다 ```lua local targetEntity = _EntityService:GetEntity("a22396e1-6365-42d4-9cef-5924c223f7fa") targetEntity.TestComponent:ShowMessage() func

[task] | code [pass] | ⏳ 미판정 [title] | 카드 짝 맞추기 [question] | 카드가 터치될 때마다 호출되는 `HandleTouchEvent` 이벤트 핸들러에서 카드 상태를 변경하고, 짝이 맞으면 10점을 가점으로 더하는 로직을 구현하는 스크립트를 작성해줘 [answer] | 카드 짝 맞추기 가이드 문서에는 `HandleTouchEvent` 이벤트 핸들러가 카드 터치 시 카드 상태를 변경하고, 짝이 맞으면 10점을 더하는 구체적인 로직이나 관련 프로퍼티(예: 현재 선택된 카드 목록, 점수 변수 등)에 대한 API 정의나 코드 예제가 포함되어 있지 않습니다. 제공된 참고 문서에는 단순히 UI의 가시성을 변경하는 `HandleTouchEvent` 예제만 있을 뿐, 카드 게임의 상태 관리(짝 맞추기 판별, 점수 계산)를 위한 mLua 스크립트 구조나 API(예: 카드의 상태 프로퍼티, 점수 프로퍼티, 짝 판 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다.

[task] | two_turn [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | `wait()` 계열 함수가 편리하지만 남용 시 문제가 생길 수 있다고 하는데, 구체적으로 어떤 상황에서 월드 성능 저하나 동작 오류가 발생하는지 알려주세요. [answer] | 참고 문서에는 `wait()` 계열 함수(`wait()`, `_DataStorage:SetAndWait()`, `_DataStorage:GetAndWait()`)가 실행 순서를 파악하기 쉽고 사용이 간편하다는 장점이 있다고 설명하고 있습니다. 문서에서는 이 함수들이 남용될 경우 **"문제가 생길 수 있다"**고 언급하고 있으나, 구체적으로 어떤 상황에서 월드의 성능 저하나 동작 오류가 발생하는지에 대한 상세한 원인이나 사례는 설명되어 있지 않습니다. 문서에는 월드 규모가 커지거나 완성도가 높아질수록 흐름 제어와 최적화 문제가 중요 [followup] | `wait()` 대신 다른 비동기 처리 방식을 사용해야 하는 최적화 사례를 mLua 코드로 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 `wait()` 계열 함수가 편리하지만 남용 시 문제가 될 수 있다고 언급하고 있으나, `wait()` 대신 사용할 구체적인 **다른 비동기 처리 방식**이나 **최적화 코드 예제**는 포함되어 있지 않습니다. 문서에서 제시하는 해결 방향은 `wait()` 함수 자체의 대안 코드가 아니라, **제작 초기부터 흐름 제어와 최적화를 염두에 두고 구조를 고민**하며, 엔티티나 컴포넌트 접근 시 `isvalid()`를 적극적으로 활용하는 것입니다. 따라서 제공된 문서 범위 내에서 `wait()`를 대체하는 특정 비 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Effective MSW 1 [question] | OnUpdate()에서 wait()를 사용하지 않는 방향으로 코드를 수정할 때 적용해야 할 원칙을 단계별 번호 목록으로 제시하세요. [answer] | `OnUpdate()`에서 `wait()`를 사용하지 않기 위해 코드를 수정할 때 적용해야 할 원칙은 다음과 같습니다. 1. **누적 시간(Accumulated Time)을 사용한다** `wait()`로 특정 시간 동안 동작을 멈추는 대신, 매 프레임마다 전달되는 `delta` 값을 누적 프로퍼티에 더해준다. 목표 시간이 되면 해당 누적값을 초기화하고 원하는 작업을 실행한다. 2. **누적값을 초기화한다** 목표 시간(예: 3초)에 도달하여 작업을 수행한 직후, 누적된 시간을 0으로 초기화한다. 이렇게 해야 다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 그럼 `OnUpdate()`에서 사용할 경우를 살펴보겠습니다. `OnUpdate()` 문에서 아래 코드는 어떻게 동작할까요? ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` * 기대 동작: TEST - 1초 대기 - TEST2 - TEST1 - 1초 대기 - TEST2 * 실제 동작: **TEST - TEST - TEST - .... (첫 번째 TEST가 찍힌 시점부터 1초가 지났을 때 ) - TEST2** `OnUpdate()`는 논리적인 측면에서 수행이 끝날 당시

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