← 목록

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

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

[task] | code [pass] | ⏳ 미판정 [title] | 서버와 클라이언트 [question] | 클라이언트에서 유저 입력을 받아 서버에 이동 액션을 요청하고, 서버에서 검증 후 클라이언트로 최종 위치 동기화를 요청하는 스크립트를 작성해줘 (Method: [server] HandleMoveRequest, Method: [client] UpdateClientPosition) [answer] | 요청하신 시나리오(클라이언트 입력 → 서버 요청 → 서버 검증 → 클라이언트 위치 동기화)를 구현하기 위해 제공된 참고 문서의 정보만 바탕으로 작성했습니다. **주의사항 및 한계:** 1. **클라이언트에서 서버로 액션을 요청하는 메서드:** 제공된 문서에는 "클라이언트에서 서버로 수행을 요청할 수도 있다"는 설명만 있고, 이를 위한 구체적인 메서드 실행 공간 태그(예: `[client]` 또는 `[request]` 등)나 API 명세가 **없습니다**. 따라서 클라이언트에서 서버 함수를 호출하는 구체적인 코드 문법은 문서에 근 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 서버와 클라이언트 간 통신에는 데이터의 전달, 즉 동기화 외에도 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 위의 레벨업 처리 과정을 예시로 들면, 클라이언트가 유저의 입력을 받으면, 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 되고, 서버는 클라이언트의 요청에 따라 "몬스터 공격"이라는 "액션"을 수행하게 되는데요, 이렇듯 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 합니다. 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. 위에 말한 "액션"은 결국 스크립트에서는 "함수"라 할

[task] | code [pass] | ⏳ 미판정 [title] | 서버와 클라이언트 [question] | 서버에서 클라이언트로 몬스터 사망 연출을 요청하여 클라이언트에서 사운드와 이펙트를 재생하는 스크립트를 작성해줘 (Method: [client] PlayDeathEffect, Method: [server] NotifyDeath) [answer] | 제시된 참고 문서에는 `PlayDeathEffect`나 `NotifyDeath`라는 특정 함수 이름, 사운드/이펙트 재생을 위한 API(예: `_SoundService` 등), 또는 `[client]` 및 `[server]` 실행 공간 태그를 사용하여 서버에서 클라이언트로 함수를 호출하는 구체적인 코드 예제가 포함되어 있지 않습니다. 참고 문서에서 확인되는 내용: 1. **실행제어 개념**: 서버에 선언된 함수의 실행 공간을 클라이언트로 설정하면, 서버에서 해당 함수를 호출할 때 클라이언트에서 실행되도록 요청할 수 있다고 설명하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 서버와 클라이언트 간 통신에는 데이터의 전달, 즉 동기화 외에도 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 위의 레벨업 처리 과정을 예시로 들면, 클라이언트가 유저의 입력을 받으면, 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 되고, 서버는 클라이언트의 요청에 따라 "몬스터 공격"이라는 "액션"을 수행하게 되는데요, 이렇듯 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 합니다. 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. 위에 말한 "액션"은 결국 스크립트에서는 "함수"라 할

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | 부호화 방식 도입 시 발생하는 추가적인 통신 단계를 '부호화'와 '복호화'를 포함해 총 2개만 코드 주석 형식으로 간략히 설명하세요. [answer] | ```lua -- 1. 부호화: 메시지에 담긴 의미(예: X초간 춤)를 효율적인 부호(예: Code-45)로 변환하는 과정 -- 2. 복호화: 수신한 부호(예: Code-45)를 원래 의미(예: X초간 춤)로 변환해 행동을 실행하는 과정 ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초

[task] | two_turn [pass] | ⏳ 미판정 [title] | 서버와 클라이언트 [question] | 클라이언트가 유저 입력을 받아 서버에게 "몬스터 공격" 액션을 요청하는 과정에서, 스크립트 함수의 실행 공간 설정이 어떻게 변경되어야 하는가? [answer] | 클라이언트가 유저 입력을 받아 서버에게 "몬스터 공격" 액션을 요청하는 과정은 **실행제어**를 통해 처리됩니다. 이 과정에서 스크립트 함수의 실행 공간 설정은 다음과 같이 이루어져야 합니다. 1. **클라이언트에서 서버로 요청하는 함수 (클라이언트 -> 서버):** * 클라이언트에서 유저의 입력을 감지하고, 서버에게 해당 액션 수행을 요청하는 함수는 **클라이언트 공간**에서 실행되어야 합니다. * 하지만 이 함수가 서버에서 수행되도록 요청하려면, 해당 함수의 실행 공간 설정이 **클라이언트**로 되어 있 [followup] | 유저 입력을 감지하는 클라이언트 이벤트 핸들러에서 서버 함수를 호출하여 액션을 수행하도록 하는 mLua 코드 예시를 작성해 달라. [followup_answer] | 제공된 참고 문서에는 클라이언트 이벤트 핸들러에서 서버 함수를 호출하는 구체적인 mLua 문법이나 코드 예제가 포함되어 있지 않습니다. 문서에는 "클라이언트에서 서버로 수행을 요청할 수도 있고"라는 원리와 "서버에 선언된 함수 B의 실행 공간을 클라이언트로 설정했다면, 함수 B는 서버 내 다른 함수에서 호출이 가능하지만, 클라이언트에서 실행되기 때문에 서버에서 호출할 수 있는 클라이언트 함수처럼 사용이 가능합니다"라는 설명만 있을 뿐, 클라이언트 이벤트 핸들러(예: `HandleTouchEvent`)에서 서버 함수를 호출하는 구체 [scores] | [judge_reason] | [source_doc] | 서버와 클라이언트 간 통신에는 데이터의 전달, 즉 동기화 외에도 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 위의 레벨업 처리 과정을 예시로 들면, 클라이언트가 유저의 입력을 받으면, 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 되고, 서버는 클라이언트의 요청에 따라 "몬스터 공격"이라는 "액션"을 수행하게 되는데요, 이렇듯 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 합니다. 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. 위에 말한 "액션"은 결국 스크립트에서는 "함수"라 할

[task] | two_turn [pass] | ⏳ 미판정 [title] | 서버와 클라이언트 [question] | 서버와 클라이언트 간 상호작용을 위한 '동기화'와 '실행제어'의 차이점과 각각의 용도를 구분해 주세요. [answer] | 서버와 클라이언트 간 상호작용을 위한 **동기화(Synchronization)**와 **실행제어(Execution Control)**는 데이터 전달 방식과 목적에 따라 명확히 구분됩니다. ### 1. 동기화 (Synchronization) * **정의**: 서버와 클라이언트의 별도 공간에 존재하는 **프로퍼티(Property) 값**을 자동으로 맞춰주는 과정입니다. * **용도**: 두 공간이 동일한 데이터나 상태를 유지해야 할 때 사용합니다. * **동작 방식**: * 일반적으로 **서버에서 클라이언트로 단 [followup] | 특정 조건에서 클라이언트에서 서버로 이벤트를 전달해야 하는 '실행제어'의 사용 예시와, 서버에서 클라이언트로 상태를 전달하는 '동기화'의 예시를 코드와 함께 비교해 주세요. [followup_answer] | 참고 문서에 **실행제어(Execution Control)**의 구체적인 API 이름, 이벤트 전달 메서드, 또는 코드 예시가 포함되어 있지 않습니다. 문서에는 실행제어가 "특정 상황에 발생해야 할 행위, 행동들을 전달하는 방식"이라는 개념적 정의만 존재할 뿐, 실제 mLua 코드 형태로 어떻게 구현되는지에 대한 정보는 없습니다. 따라서 요청하신 "클라이언트에서 서버로 이벤트를 전달하는 실행제어 사용 예시"는 **문서에 없는 API를 지어낼 수 없어 제공하지 않습니다.** 대신, 문서에 명확히 기술된 **동기화(Synchroni [scores] | [judge_reason] | [source_doc] | 서버와 클라이언트가 어떻게 상호작용을 하는지를 알아보았으니, 이제 메이커에서 작성한 프로그램이 서버와 클라이언트에서 어떻게 돌아가는지 알아보도록 합니다. 제작자가 스크립트에서 선언한 프로퍼티와 함수는 별도의 설정을 하지 않는 한 기본적으로 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성됩니다. 이름은 같지만 서로 다른 공간에 존재하기 때문에 별도의 프로퍼티 또는 함수라 보는 것이 좋습니다. 기본적으로 함수의 호출과 프로퍼티의 값 참조 및 할당은 같은 공간 내에서만 이루어집니다. 예를 들어 A라는 프로퍼티에 값을 B라는 함

[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | KeyDownEvent 핸들러에서 event.key 값이 enum 형식으로 넘어온다는데, KeyboardKey.T와 같은 상수를 비교할 때 소문자나 대소문자가 다른 경우에도 동작하나요? [answer] | 제공된 문서에는 `KeyboardKey` enum 상수의 대소문자 구별 여부나 대소문자가 다른 경우의 동작 방식에 대한 정보가 포함되어 있지 않습니다. 문서에서 확인할 수 있는 사실은 다음과 같습니다: 1. `KeyDownEvent` 핸들러에서 `event.key`는 enum 형식으로 전달됩니다. 2. 예제 코드에서는 `KeyboardKey.T`와 같이 대문자 `T`를 사용하여 비교합니다 (`if key == KeyboardKey.T then`). 3. `IsKeyPressed()` 함수를 사용할 때도 `KeyboardKey [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트입니다. `KeyDownEvent`가 발생하면 **HandleKeyDownEvent**가 실행됩니다. `KeyDownEvent`가 핸들러의 매개 변수로 전송되며, 이벤트에는 유저가 입력한 키가 enum으로 넘어오게 됩니다. 다음은 `T` 키를 눌렀을 때 로그를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- N

[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | ScreenTouchHoldEvent와 ScreenTouchReleaseEvent의 발생 시점과 횟수 차이는 무엇인가요? [answer] | `ScreenTouchHoldEvent`와 `ScreenTouchReleaseEvent`의 발생 시점과 횟수 차이는 다음과 같습니다. 1. **ScreenTouchHoldEvent** * **발생 시점**: 화면을 터치하고 **유지하고 있는 동안** 발생합니다. * **발생 횟수**: 터치 상태를 유지하는 동안 **프레임마다 반복적으로** 발생합니다. 2. **ScreenTouchReleaseEvent** * **발생 시점**: 터치를 유지하다가 터치를 **종료(뗀)했을 때** 발생합니다. * **발생 횟수 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even

[task] | code [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | 클라이언트에서 직접 [Sync] 프로퍼티의 값을 수정하는 것은 비추천되므로, 서버로 요청을 보내 서버에서 프로퍼티 값을 변경하게 하여 동기화를 유도하는 구조의 스크립트를 작성해줘. [answer] | 메이플스토리 월드에서 `[Sync]` 프로퍼티의 동기화는 기본적으로 **서버에서 클라이언트로** 진행됩니다. 따라서 클라이언트에서 값을 직접 변경하면 서버로 전달되지 않으며, 서버의 값만 변경해야 클라이언트에 반영됩니다. 클라이언트에서 서버로 값을 변경할 요청을 보내는 방법은 제공된 문서의 내용만으로 작성할 수 없습니다. 제공된 문서에는 프로퍼티 동기화의 개념, 방향(서버 -> 클라이언트), `[Sync]` 선언 방식, 그리고 `OnSyncProperty` 이벤트 핸들러에 대한 설명과 예제만 포함되어 있으며, **클라이언트에서 서 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당

[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | OnUpdate 함수 안에서 IsKeyPressed()를 호출했을 때 키를 누르고 있는 동안 매 프레임마다 조건이 true가 되는 건가요? [answer] | 네, 맞습니다. `OnUpdate` 함수 안에서 `IsKeyPressed()`를 호출하면 키를 누르고 있는 동안 매 프레임마다 조건이 `true`가 됩니다. `IsKeyPressed()`는 이벤트 기반이 아니라 **상태 확인** 함수이기 때문입니다. * **KeyDownEvent (이벤트)**: 키를 누르는 순간 **1회만** 발생합니다. * **IsKeyPressed() (상태 확인)**: 현재 해당 키가 눌려있는 상태인지 물어보는 것이므로, 키를 유지하고 있는 동안 `OnUpdate`가 실행되는 매 프레임마다 `true [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트입니다. `KeyDownEvent`가 발생하면 **HandleKeyDownEvent**가 실행됩니다. `KeyDownEvent`가 핸들러의 매개 변수로 전송되며, 이벤트에는 유저가 입력한 키가 enum으로 넘어오게 됩니다. 다음은 `T` 키를 눌렀을 때 로그를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- N

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | 전통적 메시지 전송 방식과 부호화 방식의 차이점을 '단계 수'와 '네트워크 비용' 두 가지 항목을 기준으로 비교하는 표로 정리해서 출력하세요. [answer] | 제공된 문서에 따르면, 전통적 메시지 전송 방식과 부호화 방식의 차이는 다음과 같습니다. | 구분 | 단계 수 | 네트워크 비용 | | :--- | :--- | :--- | | **전통적 메시지 전송 방식** | 4단계<br>(메시지 생성 → 메시지 송신 → 메시지 수신 → 메시지에 따른 행동) | 메시지 양이 많아질수록 증가 | | **부호화 방식** | 6단계<br>(메시지 생성 → 메시지 부호화 → 메시지 송신 → 메시지 수신 → 메시지 복호화 → 메시지에 따른 행동) | 전체 메시지 전송보다 적은 용량으로 통신 가능 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | 단계별 번호 목록으로, 함수에 실행 제어를 설정하기 위한 메뉴 조작 절차를 순서대로 나열하세요. [answer] | 함수에 실행 제어를 설정하기 위한 메뉴 조작 절차는 다음과 같습니다. 1. 함수를 추가합니다. 2. **[메뉴]** 버튼을 누릅니다. 3. **Excution Space Setting**을 클릭합니다. 4. 원하는 실행 제어 옵션을 선택합니다. (실행 제어를 사용하지 않으려면 **사용하지 않음**을 선택합니다.) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 실행 제어의 동작 방식을 이해하기 위해 함수 호출 상황을 살펴봅시다. 특정한 소리 효과를 내는 `PlaySoundEffect` 함수가 있다고 가정합니다. 소리 효과는 개인 PC에서 나야 하므로 클라이언트에서만 사용하는 함수일 것입니다. 만약, 서버에서 특정 타이밍에 소리 효과를 내야 한다면, 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출합니다. | 메시지 전송 흐름 | 참고 이미지 | | --------- | ------ | | 메시지 생성 | | | 메

[task] | two_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | ScreenTouchEvent에서 터치 좌표를 얻어내는 코드 예제를 보여주세요. [answer] | `ScreenTouchEvent` 이벤트 핸들러에서 `event.TouchPoint` 프로퍼티를 통해 터치한 위치의 좌표(Vector2)를 얻을 수 있습니다. 다음은 화면을 터치했을 때 터치 좌표를 로그로 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleScreenTouchEvent(ScreenTouchEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: [followup] | ScreenTouchEvent 핸들러에서 event.TouchPoint 값을 받아 콘솔에 출력하는 mLua 코드를 작성해 주세요. [followup_answer] | `ScreenTouchEvent` 핸들러에서 `event.TouchPoint` 값을 받아 콘솔에 출력하는 mLua 코드는 다음과 같습니다. ```lua Event Handler: [service: InputService] HandleScreenTouchEvent(ScreenTouchEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: InputService -- Space: Client ----------- [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | 3문장 이내로, 메시지 전송 방식보다 함수별 실행 공간 설정이 효율적인 이유를 분기문의 필요성 관점에서 설명하세요. [answer] | 서버에서 클라이언트 함수를 호출할 때 메시지 생성과 송신 과정을 매번 거쳐야 하는 메시지 전송 방식은 반복 시 효율이 떨어집니다. 반면 함수별 실행 공간 설정을 사용하면 호출 측에서 실행 공간을 명시적으로 분기 처리할 필요가 없어 코드가 간결해집니다. 따라서 매 호출마다 `if` 분기문을 작성하지 않아도 시스템이 자동으로 올바른 공간에서 함수를 실행하므로 개발 편의성과 실행 효율이 모두 높아집니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 실행 제어의 동작 방식을 이해하기 위해 함수 호출 상황을 살펴봅시다. 특정한 소리 효과를 내는 `PlaySoundEffect` 함수가 있다고 가정합니다. 소리 효과는 개인 PC에서 나야 하므로 클라이언트에서만 사용하는 함수일 것입니다. 만약, 서버에서 특정 타이밍에 소리 효과를 내야 한다면, 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출합니다. | 메시지 전송 흐름 | 참고 이미지 | | --------- | ------ | | 메시지 생성 | | | 메

[task] | code [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | InputService의 HandleKeyHoldEvent를 활용하여 KeyboardKey.T 키를 누르고 있는 동안 매 프레임마다 "T Hold"를 로그로 출력하는 스크립트를 작성해줘 [answer] | `InputService`의 `HandleKeyHoldEvent` 이벤트 핸들러를 사용하여 `KeyboardKey.T` 키가 눌려 있는 동안 매 프레임마다 로그를 출력하는 스크립트입니다. ```lua Event Handler: [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { local key = event.key if key == KeyboardKey.T then log("T Hold") end } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende

[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | 화면을 계속 누르고 있는 동안에도 좌표가 계속 갱신되어 출력되도록 하려면 어떤 이벤트 핸들러를 사용해야 하나요? [answer] | 화면을 계속 누르고 있는 동안 좌표가 프레임마다 계속 갱신되어 출력되도록 하려면 `ScreenTouchHoldEvent` 이벤트 핸들러를 사용해야 합니다. `ScreenTouchHoldEvent`는 화면이 터치된 상태가 유지되는 동안 프레임마다 반복적으로 발생하며, 매번 현재 터치 위치의 좌표(`TouchPoint`)를 전달받습니다. 이에 반해 `ScreenTouchReleaseEvent`는 터치를 놓는 시점에 단 1회만 발생합니다. 다음은 `ScreenTouchHoldEvent`를 활용해 터치 중 좌표를 실시간으로 콘솔에 출력 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even

[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | 터치 좌표가 담긴 이벤트 객체의 TouchPoint 속성을 콘솔에 출력하려면 어떤 코드를 작성해야 하나요? [answer] | 터치 좌표가 담긴 이벤트 객체의 `TouchPoint` 속성을 콘솔에 출력하려면 `InputService`의 이벤트 핸들러를 사용해야 합니다. 터치 중이거나 터치를 해제하는 시점에 발생하는 이벤트(`ScreenTouchHoldEvent`, `ScreenTouchReleaseEvent`)에서 `event.TouchPoint`를 접근하여 로그를 기록할 수 있습니다. 다음은 터치를 유지하는 동안 매 프레임마다 좌표를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleSc [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even

[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | InputService를 통해 터치 이벤트를 처리할 때 핸들러 함수의 매개 변수로 어떤 객체가 전달되나요? [answer] | InputService를 통해 터치 이벤트를 처리할 때, 이벤트 유형에 따라 다음과 같은 객체가 핸들러 함수의 매개 변수로 전달됩니다. * **ScreenTouchHoldEvent**: 화면을 터치하고 있는 동안 프레임마다 발생합니다. `HandleScreenTouchHoldEvent` 핸들러에 `ScreenTouchHoldEvent` 객체가 전달됩니다. * **ScreenTouchReleaseEvent**: 터치를 유지하다가 종료했을 때 1회 발생합니다. `HandleScreenTouchReleaseEvent` 핸들러에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even

[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | 터치를 떼는 순간에만 특정 동작을 실행하고 싶을 때 ScreenTouchHoldEvent 대신 어떤 이벤트를 구독해야 하나요? [answer] | 터치를 떼는 순간에만 특정 동작을 실행하려면 `ScreenTouchReleaseEvent`를 구독해야 합니다. `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 반복적으로 발생하지만, `ScreenTouchReleaseEvent`는 터치를 유지하다가 터치를 종료했을 때 1회만 발생합니다. 따라서 터치를 뗀 시점에 한 번만 실행되는 로직을 작성할 때는 `ScreenTouchReleaseEvent`와 `HandleScreenTouchReleaseEvent` 핸들러를 사용해야 합니다. 이벤트가 발생하면 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even

[task] | single_turn [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | 이미지 검색 기능은 어떤 리소스 카테고리에서만 지원되나요? [answer] | 이미지 검색 기능은 **Sprite** 카테고리에서만 지원됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색한 리소스를 즐겨찾기에 등록해 편리하게 RUID를 찾을 수 있습니다. 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. # 리소스 카테고리 구분 리소스는 4개의 상위 카테고리 **Sprite, AnimationClip, AudioClip, AvatarItem** 아래에 하위 카테고리로 분류되어 있습니다. 4개의 카테고리 중 찾으려는 분류를 선택해 검색합니다. | 카테고리 | 설명 | | --- | --- | | Sprite | 다양하게 활용할 수 있는 스프라이트

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | 폴더 이름에 사용할 수 없는 기호 3가지를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua -- 폴더 이름에 사용할 수 없는 기호 3가지: '/', '\', '|' local invalidSymbols = { "/", "\\", "|" } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 방대한 리소스 속에서 크리에이터에게 필요한 리소스만 골라 활용할 수 있습니다. 또한 크리에이터가 제작한 리소스를 추가해 제작에 활용할 수도 있습니다. # 리소스 스토리지 소개 메이플스토리 월드에서는 많은 리소스를 **Preset List**로 제공하지만, 모든 리소스가 **Preset List**에 있는 것은 아닙니다. 보다 방대한 데이터에서 원하는 리소스를 검색할 때는 **Resource Storage**를 활용해 봅시다. **Resource Storage**의 기본 위치는 **Scene** 탭 옆입니다

[task] | single_turn [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | 서버와 클라이언트 간의 데이터 통신 흐름을 '메시지 생성, 송신, 수신, 행동'으로 나누어 설명해 주세요. [answer] | 서버와 클라이언트 간의 데이터 통신 흐름은 두 사람 사이의 대화 과정과 유사하며, 크게 네 단계로 나뉩니다. 1. **메시지 생성**: 한 쪽(보내는 측)이 전달하고자 하는 내용을 생각하고 메시지로 만듭니다. 2. **메시지 송신**: 만들어진 메시지를 상대방에게 전달합니다. 3. **메시지 수신**: 상대방이 해당 메시지를 받아들이고 내용을 이해합니다. 4. **행동/결과**: 수신한 메시지의 의미를 바탕으로 구체적인 행동을 수행하거나 결과를 도출합니다. 이처럼 "메시지 생성 → 메시지 송신 → 메시지 수신 → 행동/결과"의 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초

[task] | code [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | InputService의 HandleKeyReleaseEvent를 활용하여 KeyboardKey.T 키를 눌렀다가 손을 떼는 시점에 1회 "T Release"를 로그로 출력하는 스크립트를 작성해줘 [answer] | `InputService`의 `HandleKeyReleaseEvent` 이벤트 핸들러를 사용해야 합니다. `KeyReleaseEvent`는 키가 눌려있던 상태에서 손을 떼는 시점에 1회 발생하며, 이벤트 객체의 `key` 속성을 통해 어떤 키가 해제되었는지 확인할 수 있습니다. 요청하신 대로 `KeyboardKey.T` 키를 눌렀다가 떼는 시점에 "T Release"를 로그로 출력하는 스크립트는 다음과 같습니다. ```lua Event Handler: [service: InputService] HandleKeyReleaseEve [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende

[task] | two_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | 키보드의 특정 키가 눌려있는 동안 매 프레임마다 액션이 실행되도록 설정하려면 어떻게 해야 하나요? [answer] | 키보드의 특정 키가 눌려있는 동안 매 프레임마다 액션을 실행하려면 `InputService`의 `KeyHoldEvent`를 처리하는 이벤트 핸들러를 작성해야 합니다. `KeyHoldEvent`는 해당 키가 눌려있는 상태가 유지되는 동안 프레임마다 발생하며, 이때 `HandleKeyHoldEvent` 함수가 매번 호출됩니다. 이벤트 핸들러의 매개변수로 전달되는 `KeyHoldEvent` 객체에서 `key` 속성을 읽어 어떤 키가 눌려 있는지 확인하고, 조건에 맞는 액션을 수행하면 됩니다. 아래는 키 `T`가 눌려있는 동안 매 프레 [followup] | KeyboardKey.T 키가 눌려있는 동안 "Hold T!" 로그를 매 프레임 출력하는 HandleKeyHoldEvent 코드 예제를 보여주세요. [followup_answer] | `KeyboardKey.T` 키가 눌려있는 동안 매 프레임마다 "Hold T!" 로그를 출력하는 `HandleKeyHoldEvent` 코드 예제는 다음과 같습니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { local key = event.key if key == KeyboardKey.T then log("Hold T!") end } ``` [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | Workspace - MyDesk와 Resource Storage에 리소스를 추가했을 때 리메이크에 미치는 차이를 단계별 번호 목록으로 나열하세요. [answer] | Workspace - MyDesk와 Resource Storage에 리소스를 추가했을 때 리메이크에 미치는 차이는 다음과 같습니다. 1. **Workspace - MyDesk에 추가한 경우**: - 월드를 출시한 뒤 해당 리소스를 변경하더라도, 리메이크된 월드는 영향을 받지 않습니다. 2. **Resource Storage에 추가한 경우**: - 리소스 저장소에 추가한 리소스를 변경하게 되면, 리메이크된 모든 월드가 영향을 받습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 방대한 리소스 속에서 크리에이터에게 필요한 리소스만 골라 활용할 수 있습니다. 또한 크리에이터가 제작한 리소스를 추가해 제작에 활용할 수도 있습니다. # 리소스 스토리지 소개 메이플스토리 월드에서는 많은 리소스를 **Preset List**로 제공하지만, 모든 리소스가 **Preset List**에 있는 것은 아닙니다. 보다 방대한 데이터에서 원하는 리소스를 검색할 때는 **Resource Storage**를 활용해 봅시다. **Resource Storage**의 기본 위치는 **Scene** 탭 옆입니다

[task] | single_turn [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | 메이플스토리 월드 공식 홈페이지에서도 리소스 검색이 가능한가요? [answer] | 네, 메이플스토리 월드 공식 홈페이지에서도 동일하게 리소스 검색이 가능합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색한 리소스를 즐겨찾기에 등록해 편리하게 RUID를 찾을 수 있습니다. 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. # 리소스 카테고리 구분 리소스는 4개의 상위 카테고리 **Sprite, AnimationClip, AudioClip, AvatarItem** 아래에 하위 카테고리로 분류되어 있습니다. 4개의 카테고리 중 찾으려는 분류를 선택해 검색합니다. | 카테고리 | 설명 | | --- | --- | | Sprite | 다양하게 활용할 수 있는 스프라이트

[task] | single_turn [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | 함수를 추가한 뒤 실행 공간을 설정하는 구체적인 메뉴 경로와 설정 방법은 어떻게 되나요? [answer] | 함수를 추가한 뒤 실행 공간을 설정하는 구체적인 방법은 다음과 같습니다. 1. 추가하려는 함수를 선택합니다. 2. **메뉴** 버튼을 누릅니다. 3. **Excution Space Setting**을 클릭합니다. 4. 원하는 실행 제어 옵션을 선택합니다. * 실행 제어를 사용하지 않으려면 **사용하지 않음**을 선택합니다. * 그 외에는 `client`, `client only`, `server`, `server only`, `multicast` 중 하나를 선택할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 실행 제어의 동작 방식을 이해하기 위해 함수 호출 상황을 살펴봅시다. 특정한 소리 효과를 내는 `PlaySoundEffect` 함수가 있다고 가정합니다. 소리 효과는 개인 PC에서 나야 하므로 클라이언트에서만 사용하는 함수일 것입니다. 만약, 서버에서 특정 타이밍에 소리 효과를 내야 한다면, 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출합니다. | 메시지 전송 흐름 | 참고 이미지 | | --------- | ------ | | 메시지 생성 | | | 메

[task] | single_turn [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | 메이커에서 리소스 RUID를 복사해서 사용하려면 어떤 버튼을 눌러야 하나요? [answer] | 메이커에서 검색한 리소스의 RUID를 복사하려면 해당 리소스 옆에 있는 **[RUID 복사]** 버튼을 클릭하면 됩니다. 복사한 값은 스크립트나 프로퍼티 에디터 등 필요한 곳에 사용하시면 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색한 리소스를 즐겨찾기에 등록해 편리하게 RUID를 찾을 수 있습니다. 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. # 리소스 카테고리 구분 리소스는 4개의 상위 카테고리 **Sprite, AnimationClip, AudioClip, AvatarItem** 아래에 하위 카테고리로 분류되어 있습니다. 4개의 카테고리 중 찾으려는 분류를 선택해 검색합니다. | 카테고리 | 설명 | | --- | --- | | Sprite | 다양하게 활용할 수 있는 스프라이트

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | 메이커에서 리소스를 즐겨찾기에 저장하는 방법과 최대 저장 가능 개수를 2문장 이내로 설명하세요. [answer] | 검색한 리소스의 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색한 리소스를 즐겨찾기에 등록해 편리하게 RUID를 찾을 수 있습니다. 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. # 리소스 카테고리 구분 리소스는 4개의 상위 카테고리 **Sprite, AnimationClip, AudioClip, AvatarItem** 아래에 하위 카테고리로 분류되어 있습니다. 4개의 카테고리 중 찾으려는 분류를 선택해 검색합니다. | 카테고리 | 설명 | | --- | --- | | Sprite | 다양하게 활용할 수 있는 스프라이트

[task] | single_turn [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | 메시지 부호화와 복호화 과정이 포함된 통신 방식에서 네트워크 비용이 효율적으로 줄어드는 이유는 무엇인가요? [answer] | 메시지 전체를 전송하는 대신, 사전에 약속된 의미를 가진 짧은 '부호'와 필요한 최소한의 데이터(예: 시간 등)만 전송하기 때문입니다. 전통적인 방식에서는 "3초간 춤을 춰!"와 같은 전체 문장을 전송해야 하므로 메시지 양이 많아질수록 네트워크 비용이 증가합니다. 반면, 부호화 방식을 사용하면 서로 미리 "Code-45는 X초간 춤을 춘다는 명령"이라고 약속해 두면, 실제 통신 시에는 **Code-45**와 **3초**라는 아주 적은 용량의 정보만 전송하면 됩니다. 이처럼 메시지 자체의 용량이 줄어들기 때문에 네트워크 비용이 효 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초

[task] | code [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | InputService의 HandleScreenTouchEvent를 활용하여 화면을 터치할 때 이벤트의 TouchPoint 좌표를 문자열로 변환하여 콘솔에 출력하는 스크립트를 작성해줘 [answer] | InputService의 `HandleScreenTouchEvent`를 사용하여 화면 터치 시 `TouchPoint` 좌표를 문자열로 변환해 콘솔에 출력하는 스크립트는 다음과 같습니다. ```lua Event Handler: [service: InputService] HandleScreenTouchEvent(ScreenTouchEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: InputService -- Spa [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende

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