[task] | diverse_qa [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | 질문: `KeyDownEvent`는 언제 발생하는 이벤트인가요? 답변: 키를 눌렀을 때 발생하는 이벤트입니다. 질문: `KeyDownEvent`가 발생했을 때 실행되는 핸들러의 이름은 무엇인가요? 답변: HandleKeyDownEvent가 실행됩니다. 질문: `KeyDownEvent` 이벤트 객체를 통해 유저가 입력한 키 정보는 어떤 데이터 타입으로 전달되나요? 답변: enum으로 넘어오게 됩니다. 질문: 다음 코드는 어떤 기능을 수행하나요? ```lua if key == KeyboardKey.T then log("Pr [original] | `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트입니다. `KeyDownEvent`가 발생하면 **HandleKeyDownEvent**가 실행됩니다. `KeyDownEvent`가 핸들러의 매개 변수로 전송되며, 이벤트에는 유저가 입력한 키가 enum으로 넘어오게 됩니다. 다음은 `T` 키를 눌렀을 때 로그를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- N [chunk_id] | Guides:209:1
[task] | wikipedia [title] | 서버와 클라이언트 [category] | Guides [rephrased] | # 스크립트 이해: 서버와 클라이언트 메이플스토리 월드(MapleStory Worlds)의 스크립트 시스템에서 제작자가 작성한 프로그램은 서버와 클라이언트라는 두 가지 독립적인 실행 환경에서 동작합니다. 이 섹션에서는 스크립트 컴포넌트 내 프로퍼티(Property)와 함수(Method)가 서버와 클라이언트 공간에서 어떻게 생성되고 상호작용하는지, 그리고 두 공간 간의 통신을 위해 제공되는 동기화(Synchronization)와 실행제어(Execution Control) 메커니즘에 대해 설명합니다. ## 서버와 클라이언트의 독립적 [original] | 서버와 클라이언트가 어떻게 상호작용을 하는지를 알아보았으니, 이제 메이커에서 작성한 프로그램이 서버와 클라이언트에서 어떻게 돌아가는지 알아보도록 합니다. 제작자가 스크립트에서 선언한 프로퍼티와 함수는 별도의 설정을 하지 않는 한 기본적으로 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성됩니다. 이름은 같지만 서로 다른 공간에 존재하기 때문에 별도의 프로퍼티 또는 함수라 보는 것이 좋습니다. 기본적으로 함수의 호출과 프로퍼티의 값 참조 및 할당은 같은 공간 내에서만 이루어집니다. 예를 들어 A라는 프로퍼티에 값을 B라는 함 [chunk_id] | Guides:207:1
[task] | knowledge_list [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | 1. `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생하는 클라이언트 이벤트이며, 이벤트 발생 시 `HandleScreenTouchHoldEvent` 핸들러가 실행됩니다. 2. `HandleScreenTouchHoldEvent` 핸들러는 `InputService` 서비스에서 수신하며, 매개변수로 `ScreenTouchHoldEvent` 타입의 이벤트 객체를 받아 터치 중인 위치의 좌표 정보에 접근할 수 있습니다. 3. `ScreenTouchHoldEvent` 이벤트 객체는 `TouchId`와 `T [original] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even [chunk_id] | Guides:209:3
[task] | wikipedia [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | # 스크립트 프로퍼티 동기화 **프로퍼티 동기화**는 메이플스토리 월드(MapleStory Worlds) 환경에서 서버와 클라이언트 간 데이터를 전송하는 방식 중 하나로, 서로 다른 공간에 존재하는 동일한 이름의 프로퍼티 값을 일치시키는 것을 의미합니다. 이 개념은 서버-클라이언트 아키텍처의 특징과 데이터 일관성을 유지하기 위한 메커니즘을 이해하는 데 필수적입니다. ## 동기화의 필요성 및 원리 메이플스토리 월드에서 프로퍼티는 선언 시점에 서버와 클라이언트 각각의 독립된 공간에 생성됩니다. 기본적으로 두 공간의 프로퍼티는 독립 [original] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당 [chunk_id] | Guides:208:0
[task] | wikipedia [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService를 활용한 입력과 액션 메이플스토리 월드의 `InputService`는 사용자의 키보드 입력을 감지하고 처리하는 기능을 제공합니다. 이 서비스는 이벤트 핸들러 방식과 함수 호출 방식 두 가지로 키 입력을 제어할 수 있습니다. ## KeyDownEvent `KeyDownEvent`는 사용자가 키보드의 키를 눌렀을 때 발생하는 이벤트입니다. 해당 이벤트가 발생하면 `HandleKeyDownEvent` 핸들러가 실행됩니다. 이벤트 객체는 핸들러의 매개변수로 전달되며, 사용자가 입력한 키는 `KeyboardK [original] | `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트입니다. `KeyDownEvent`가 발생하면 **HandleKeyDownEvent**가 실행됩니다. `KeyDownEvent`가 핸들러의 매개 변수로 전송되며, 이벤트에는 유저가 입력한 키가 enum으로 넘어오게 됩니다. 다음은 `T` 키를 눌렀을 때 로그를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- N [chunk_id] | Guides:209:1
[task] | extract_knowledge [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | # 프로퍼티 동기화 (Property Synchronization) 메이플스토리 월드의 mLua 스크립트에서 프로퍼티는 기본적으로 서버와 클라이언트 간에 동기화됩니다. 이 메커니즘은 스크립트 에디터의 `Property:` 블록 내에서 설정되며, 특정 값이 모든 참가자에게 동일하게 유지되어야 하는 경우와, 각 공간(스페이스)별로 독립적으로 관리되어야 하는 경우를 구분하여 적용합니다. ## 1. 개념 설명 프로퍼티 상단에는 `[Sync]` 또는 `[None]`이라는 태그가 표시되어 동기화 상태를 나타냅니다. * **[Sync [original] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이 [chunk_id] | Guides:208:1
[task] | wikipedia [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService를 활용한 입력과 액션: 화면 터치 이벤트 메이플스토리 월드의 `InputService`는 사용자의 화면 터치 동작을 감지하고 처리하기 위한 이벤트를 제공합니다. 본 섹션에서는 화면을 지속적으로 누르고 있는 동안 발생하는 `ScreenTouchHoldEvent`와 터치를 종료할 때 발생하는 `ScreenTouchReleaseEvent`에 대해 설명합니다. ## ScreenTouchHoldEvent `ScreenTouchHoldEvent`는 사용자가 화면을 터치하고 있는 상태 동안 프레임 단위로 반복적으 [original] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even [chunk_id] | Guides:209:3
[task] | distill [title] | 실행 제어 [category] | Guides [rephrased] | # 실행 제어 서버와 클라이언트 간 데이터 통신을 단순화하여 흐름을 제어하는 기능입니다. ## 통신 원리 및 효율성 서버-클라이언트 통신은 기본적으론 **메시지 생성 → 송신 → 수신 → 행동** 순으로 진행됩니다. * **전통 방식(전체 메시지 전송):** 메시지 양이 증가할수록 네트워크 비용이 급증하여 비효율적입니다. * **부호화 방식:** 전체 텍스트 대신 약속된 부호(Code)와 필수 파라미터만 전송해 용량을 최소화합니다. * 예: "3초간 춤을 춰"라는 명령을 `Code-45`와 `3`으로 압축. [original] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초 [chunk_id] | Guides:210:0
[task] | wikipedia [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | `KeyHoldEvent`는 키보드의 특정 키가 눌려 있는 상태가 유지되는 동안 프레임 단위로 반복적으로 발생하는 이벤트입니다. 이 이벤트가 발생할 때마다 `HandleKeyHoldEvent` 핸들러가 실행되며, 이벤트 객체는 `KeyHoldEvent` 타입으로 핸들러의 매개변수로 전달됩니다. 전달된 이벤트 객체에는 사용자의 현재 입력 상태, 즉 눌려 있는 키의 정보가 포함됩니다. 다음은 키 T를 누르고 있는 동안 매 프레임마다 "Hold T!"라는 로그를 출력하는 예제입니다. ```lua [service: InputServic [original] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende [chunk_id] | Guides:209:2
[task] | extract_knowledge [title] | 서버와 클라이언트 [category] | Guides [rephrased] | # 서버와 클라이언트 간 실행제어 (Action Execution) ## 1. 개념 설명 메이플스토리 월드 스크립트 환경에서 서버와 클라이언트 간의 통신은 단순한 데이터 동기화(Sync) 외에도, 특정 공간에 정의된 "액션(Action)"을 요청하고 수행하는 과정이 포함됩니다. 이 액션은 스크립트 관점에서 **함수(Function)**에 해당합니다. 서버와 클라이언트는 서로의 함수를 호출하여 작업을 수행할 수 있으며, 이 메커니즘을 **실행제어**라고 부릅니다. * **실행제어**: 각 공간(서버/클라이언트)에 정의된 액션( [original] | 서버와 클라이언트 간 통신에는 데이터의 전달, 즉 동기화 외에도 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 위의 레벨업 처리 과정을 예시로 들면, 클라이언트가 유저의 입력을 받으면, 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 되고, 서버는 클라이언트의 요청에 따라 "몬스터 공격"이라는 "액션"을 수행하게 되는데요, 이렇듯 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 합니다. 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. 위에 말한 "액션"은 결국 스크립트에서는 "함수"라 할 [chunk_id] | Guides:207:2
[task] | diverse_qa [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | 질문: KeyHoldEvent는 어떤 조건에서 발생하나요? 답변: KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. 질문: KeyHoldEvent 핸들러를 통해 얻을 수 있는 정보에는 무엇이 포함되나요? 답변: KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 질문: 다음 코드는 어떤 기능을 수행하나요? ```lua [service: InputSe [original] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende [chunk_id] | Guides:209:2
[task] | knowledge_list [title] | 실행 제어 [category] | Guides [rephrased] | 제시된 원문에는 특정 API 함수명, 매개변수, 반환 타입, 또는 `[server only]`/`[client only]` 등 구체적인 코드 레벨의 기술적 명세가 포함되어 있지 않습니다. 원문은 실행 제어의 개념적 정의, 통신 원리(메시지 생성/송신/수신/행동), 부호화/복호화의 효율성, 그리고 서버-클라이언트 간 통신을 돕는 도구로서의 역할에 대한 설명만 담고 있습니다. 따라서 원문에 존재하는 정보만을 기반으로 핵심 사실을 추출하면 다음과 같습니다. 1. 실행 제어는 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 개념 [original] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초 [chunk_id] | Guides:210:0
[task] | diverse_qa [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | 질문: `ScreenTouchHoldEvent`는 언제 발생하나요? 답변: `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 질문: `ScreenTouchHoldEvent`가 발생했을 때 실행되는 핸들러 함수의 이름은 무엇인가요? 답변: `HandleScreenTouchHoldEvent`가 실행됩니다. 질문: `ScreenTouchHoldEvent` 객체에 포함된 주요 정보 중 터치 위치를 나타내는 프로퍼티는 무엇인가요? 답변: `event.TouchPoint` 프로퍼티에 터치 중인 위 [original] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even [chunk_id] | Guides:209:3
[task] | wikipedia [title] | 실행 제어 [category] | Guides [rephrased] | # 실행 제어 실행 제어(Execution Control)는 메이플스토리 월드(MapleStory Worlds)에서 클라이언트와 서버 간의 데이터 흐름을 효율적으로 관리하고 제어하기 위한 개념입니다. 본 가이드는 서버와 클라이언트 간 통신의 원리를 설명하고, 이를 기반으로 한 실행 제도의 활용 방법을 다루며, 이 내용을 이해하기 위해서는 먼저 '서버와 클라이언트' 관련 가이드를 학습한 것이 전제됩니다. ## 서버-클라이언트 간 데이터 통신의 원리 클라이언트와 서버 간의 흐름을 제어하려면 양측 사이에서 데이터를 전송해야 합니다. [original] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초 [chunk_id] | Guides:210:0
[task] | extract_knowledge [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | # 프로퍼티 동기화 ## 1. 개념 설명 프로퍼티 동기화는 메이플스토리 월드에서 서버와 클라이언트 간 데이터 전송 방식을 의미하며, 각각의 공간(서버, 클라이언트)에 존재하는 **같은 이름의 프로퍼티**를 **같은 값**으로 맞춰주는 것을 목표로 합니다. 기본적으로 프로퍼티는 선언과 동시에 서버와 클라이언트 각각의 메모리 공간에 독립적으로 생성됩니다. 만약 동기화가 이루어지지 않는다면, 이름은 같지만 서버와 클라이언트에서 서로 다른 값을 가질 수 있습니다. 이는 관리의 비효율성을 초래하므로, 메이플스토리 월드에서는 프로퍼티 선 [original] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당 [chunk_id] | Guides:208:0
[task] | distill [title] | 실행 제어 [category] | Guides [rephrased] | # 실행 제어 메이플스토리 월드 컴포넌트는 서버와 클라이언트 공용으로 사용되므로, 함수 호출 시 **실행 공간(서버/클라이언트)**을 명시적으로 제어해야 합니다. 수동 분기(`if isClient`) 대신, 함수별로 실행 제어를 설정하면 네트워크 전송과 실행 위치를 자동으로 처리합니다. ## 실행 제어 종류 기본값은 **사용하지 않음**(공용)으로, 호출한 공간에서 즉시 실행됩니다. 함수별로 6가지 옵션을 설정할 수 있습니다. | 실행 제어 | 서버에서 호출 시 | 클라이언트에서 호출 시 | | :--- | :--- | :- [original] | 실행 제어의 동작 방식을 이해하기 위해 함수 호출 상황을 살펴봅시다. 특정한 소리 효과를 내는 `PlaySoundEffect` 함수가 있다고 가정합니다. 소리 효과는 개인 PC에서 나야 하므로 클라이언트에서만 사용하는 함수일 것입니다. 만약, 서버에서 특정 타이밍에 소리 효과를 내야 한다면, 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출합니다. | 메시지 전송 흐름 | 참고 이미지 | | --------- | ------ | | 메시지 생성 | | | 메 [chunk_id] | Guides:210:1
[task] | extract_knowledge [title] | 실행 제어 [category] | Guides [rephrased] | # 실행 제어 (Execution Control) ## 1. 개념 설명 실행 제어는 메이플스토리 월드에서 서버와 클라이언트 간의 데이터 통신 및 흐름을 제어하기 위한 기능입니다. 전통적인 클라이언트-서버 통신은 다음과 같은 4단계로 진행됩니다. 1. **메시지 생성**: 서버가 요청할 내용(예: "3초간 춤을 춰!")을 생성합니다. 2. **메시지 송신**: 생성된 메시지를 클라이언트로 전송합니다. 3. **메시지 수신**: 클라이언트가 메시지를 수신합니다. 4. **행동/결과**: 클라이언트가 메시지를 해석하여 행동을 수행합니 [original] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초 [chunk_id] | Guides:210:0
[task] | extract_knowledge [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService를 활용한 입력 처리 메이플스토리 월드의 `InputService`는 키보드 및 화면 터치 입력을 감지하여 스크립트에 전달하는 서비스입니다. 이 절에서는 특정 키를 길게 누르는 상태(`KeyHoldEvent`), 키를 떼는 순간(`KeyReleaseEvent`), 그리고 화면 터치(`ScreenTouchEvent`)를 처리하는 이벤트 핸들러의 구조와 사용법을 다룹니다. ## 1. KeyHoldEvent `KeyHoldEvent`는 키보드의 특정 키가 눌려 있는 동안 매 프레임마다 발생하는 이벤트입니다. [original] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende [chunk_id] | Guides:209:2
[task] | extract_knowledge [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # ScreenTouchHoldEvent와 ScreenTouchReleaseEvent ## 개념 설명 `ScreenTouchHoldEvent`와 `ScreenTouchReleaseEvent`는 `InputService`에서 제공하는 화면 터치 관련 이벤트입니다. * **ScreenTouchHoldEvent**: 화면을 터치하고 있는 동안 **매 프레임마다** 발생하며, 터치 중인 위치의 좌표 정보를 전달합니다. * **ScreenTouchReleaseEvent**: 터치를 유지하다가 터치를 종료했을 때 **1회** 발생하 [original] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even [chunk_id] | Guides:209:3
[task] | knowledge_list [title] | 실행 제어 [category] | Guides [rephrased] | 1. 스크립트 함수의 실행 제어 설정은 아이콘으로 표시되며, 아이콘이 없으면 실행 제어 설정을 사용하지 않는 상태를 의미합니다. 2. Client 실행 제어 설정이 적용된 함수에는 Client 아이콘이 표시됩니다. 3. ClientOnly 실행 제어 설정이 적용된 함수에는 ClientOnly 아이콘이 표시됩니다. 4. Server 실행 제어 설정이 적용된 함수에는 Server 아이콘이 표시됩니다. 5. ServerOnly 실행 제어 설정이 적용된 함수에는 ServerOnly 아이콘이 표시됩니다. 6. Multicast 실행 제어 설 [original] | 스크립트 함수의 실행 제어 설정을 아이콘으로 표시합니다. 아이콘은 다음과 같습니다. | Icon | 실행 제어 설정 | | ---- | -------- | | 없음 | 사용하지 않음 | | | Client | | | ClientOnly | | | Server | | | ServerOnly | | | Multicast | 실행 제어가 설정된 함수에는 실행 제어 아이콘이 표시됩니다. 실행될 수 없는 함수는 아이콘이 표시됩니다. # 실행 제어 함수의 매개 변수 서로 다른 공간의 함수를 실행할 때 매개 변수를 통해 다른 [chunk_id] | Guides:210:2
[task] | distill [title] | 실행 제어 [category] | Guides [rephrased] | # 실행 제어 (Execution Control) 스크립트 함수의 실행 공간을 지정하는 설정입니다. 아이콘은 `[server only]`, `[client only]`, `[server]`, `[client]`, `[multicast]` 등 함수 앞 태그로 표시됩니다. ## 1. 매개 변수를 통한 데이터 전송 서버와 클라이언트 등 서로 다른 실행 공간 간 데이터 전송은 함수 **매개 변수**를 통해 이루어집니다. ### 예시: 서버에서 클라이언트로 메시지 전송 ```lua Method: [server only] void On [original] | 스크립트 함수의 실행 제어 설정을 아이콘으로 표시합니다. 아이콘은 다음과 같습니다. | Icon | 실행 제어 설정 | | ---- | -------- | | 없음 | 사용하지 않음 | | | Client | | | ClientOnly | | | Server | | | ServerOnly | | | Multicast | 실행 제어가 설정된 함수에는 실행 제어 아이콘이 표시됩니다. 실행될 수 없는 함수는 아이콘이 표시됩니다. # 실행 제어 함수의 매개 변수 서로 다른 공간의 함수를 실행할 때 매개 변수를 통해 다른 [chunk_id] | Guides:210:2
[task] | distill [title] | 리소스 찾기 [category] | Guides [rephrased] | # 메이커 사용 리소스 찾기 ## 리소스 스토리지 (Resource Storage) `Preset List`에 없는 방대한 데이터를 검색·활용할 때 사용합니다. - **위치**: `Scene` 탭 옆 또는 상단 메뉴 `Panels - Resource Storage`. - **구분**: `내 리소스`, `MSW 리소스`, `즐겨찾기`. ## 내 리소스 외부 리소스 파일을 저장하고 관리합니다. - **추가**: 검색창 왼쪽 버튼 클릭 시 추가되며, 자동으로 **RUID** 값이 부여됩니다. - **폴더 관리 규칙**: - 최대 [original] | # 학습 과정 소개 방대한 리소스 속에서 크리에이터에게 필요한 리소스만 골라 활용할 수 있습니다. 또한 크리에이터가 제작한 리소스를 추가해 제작에 활용할 수도 있습니다. # 리소스 스토리지 소개 메이플스토리 월드에서는 많은 리소스를 **Preset List**로 제공하지만, 모든 리소스가 **Preset List**에 있는 것은 아닙니다. 보다 방대한 데이터에서 원하는 리소스를 검색할 때는 **Resource Storage**를 활용해 봅시다. **Resource Storage**의 기본 위치는 **Scene** 탭 옆입니다 [chunk_id] | Guides:211:0
[task] | knowledge_list [title] | 실행 제어 [category] | Guides [rephrased] | 제시된 문서에 기반하여 메이플스토리 월드 스크립트 언어(mLua)의 실행 제어 관련 핵심 사실을 정리한 목록입니다. 1. `PlaySoundEffect` 함수는 개인 PC에서 소리 효과를 출력해야 하므로 기본적으로 클라이언트에서만 실행되는 함수로 가정됩니다. 2. 서버에서 특정 타이밍에 소리 효과를 내기 위해 전통적인 방식(메시지 생성, 부호화, 송신, 수신, 복호화, 함수 호출, 실행)을 사용하면 반복 시 불필요한 과정이 많아져 효율이 떨어집니다. 3. 메이플스토리 월드의 컴포넌트는 서버와 클라이언트 공용으로 사용되므로, 컴포넌 [original] | 실행 제어의 동작 방식을 이해하기 위해 함수 호출 상황을 살펴봅시다. 특정한 소리 효과를 내는 `PlaySoundEffect` 함수가 있다고 가정합니다. 소리 효과는 개인 PC에서 나야 하므로 클라이언트에서만 사용하는 함수일 것입니다. 만약, 서버에서 특정 타이밍에 소리 효과를 내야 한다면, 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출합니다. | 메시지 전송 흐름 | 참고 이미지 | | --------- | ------ | | 메시지 생성 | | | 메 [chunk_id] | Guides:210:1
[task] | diverse_qa [title] | 실행 제어 [category] | Guides [rephrased] | 질문: 스크립트 함수의 실행 제어 설정은 어떤 형태로 표시됩니다? 답변: 스크립트 함수의 실행 제어 설정은 아이콘으로 표시됩니다. 질문: 실행 제어 설정이 '없음'으로 표시되는 경우의 의미는 무엇인가요? 답변: 실행 제어 설정이 '없음'으로 표시되는 것은 사용하지 않음을 의미합니다. 질문: 다음 중 실행 제어 설정 아이콘에 해당하지 않는 것은 무엇인가요? A. Client B. ServerOnly C. Broadcast D. Multicast 답변: C. Broadcast 질문: 실행될 수 없는 함수에는 어떤 아이콘이 표시되나 [original] | 스크립트 함수의 실행 제어 설정을 아이콘으로 표시합니다. 아이콘은 다음과 같습니다. | Icon | 실행 제어 설정 | | ---- | -------- | | 없음 | 사용하지 않음 | | | Client | | | ClientOnly | | | Server | | | ServerOnly | | | Multicast | 실행 제어가 설정된 함수에는 실행 제어 아이콘이 표시됩니다. 실행될 수 없는 함수는 아이콘이 표시됩니다. # 실행 제어 함수의 매개 변수 서로 다른 공간의 함수를 실행할 때 매개 변수를 통해 다른 [chunk_id] | Guides:210:2
[task] | diverse_qa [title] | 실행 제어 [category] | Guides [rephrased] | 질문: 본 학습 과정('스크립트 이해 실행 제어')을 이해하기 위해 반드시 선행 학습해야 하는 가이드는 무엇인가요? 답변: [서버와 클라이언트] 가이드입니다. 질문: 서버와 클라이언트 간의 흐름을 제어하기 위해 기본적으로 필요한 과정은 무엇인가요? 답변: 데이터를 전송해야 합니다. 질문: 두 사람의 대화 상황을 예시로 들 때, '메시지 생성'에 해당하는 단계는 무엇인가요? 답변: 한 사람이 할 말을 생각하는 것입니다. 질문: 두 사람의 대화 상황에서 '메시지 송신'에 해당하는 단계는 무엇인가요? 답변: 입이나 손으로 생각한 말 [original] | # 학습 과정 소개 클라이언트와 서버의 흐름을 쉽게 제어할 수 있게 하는 실행 제어의 개념과 활용 방법을 알아봅니다. ##### 들어가기에 앞서 본 과정을 이해하기 위해선 다음 가이드 선행 학습이 필요합니다. [서버와 클라이언트](https://mod-developers.nexon.com/docs?postId=207%7B%22target%22:%22\_self%22%7D) # 서버 - 클라이언트 간 데이터 통신 **클라이언트 - 서버** 간의 흐름을 제어하려면 데이터를 전송해야 합니다. 예를 들어, 서버에서 클라이언트로 "3초 [chunk_id] | Guides:210:0
[task] | diverse_qa [title] | 실행 제어 [category] | Guides [rephrased] | 질문: 소리 효과(`PlaySoundEffect`)는 일반적으로 어떤 공간에서 실행되어야 하는가? 답변: 소리 효과는 개인 PC에서 소리가 나야 하므로 클라이언트에서만 사용하는 함수입니다. 질문: 서버에서 특정 타이밍에 클라이언트의 소리 효과를 발생시키려면 어떤 과정이 필요한가? 답변: 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출해야 합니다. 질문: 메시지 전송 흐름의 순서대로 '메시지 송신' 이후의 단계는 무엇인가? 답변: 메시지 수신, 메시지 복호 [original] | 실행 제어의 동작 방식을 이해하기 위해 함수 호출 상황을 살펴봅시다. 특정한 소리 효과를 내는 `PlaySoundEffect` 함수가 있다고 가정합니다. 소리 효과는 개인 PC에서 나야 하므로 클라이언트에서만 사용하는 함수일 것입니다. 만약, 서버에서 특정 타이밍에 소리 효과를 내야 한다면, 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출합니다. | 메시지 전송 흐름 | 참고 이미지 | | --------- | ------ | | 메시지 생성 | | | 메 [chunk_id] | Guides:210:1
[task] | distill [title] | 제작한 월드 불러오기 및 관리 [category] | Guides [rephrased] | # 메이커 사용 제작한 월드 불러오기 및 관리 ## 월드 불러오기 메뉴의 **[만들기]** 버튼에서 원하는 월드를 선택하고 **[이어서 만들기]**를 클릭하여 불러옵니다. ## 리비전 관리 중요한 변경 시 리비전을 기록하여 이전 버전으로 복구하거나 추적할 수 있습니다. ### 리비전 기록 **File - Revisions** 메뉴의 **[지금 기록하기]** 버튼을 통해 메모와 함께 저장합니다. ### 리비전 관리 기능 Revisions 창에서 다음 기능을 사용할 수 있습니다. | 기능 | 설명 | | :--- | :--- [original] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다. [chunk_id] | Guides:213:0
[task] | extract_knowledge [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService를 활용한 키 입력 처리 ## 1. 개념 설명 mLua에서는 `InputService`를 통해 플레이어의 키보드 입력을 처리합니다. 키 입력 처리 방식은 크게 두 가지로 나뉩니다. 1. **이벤트 기반 처리 (Event-based)** * **KeyDownEvent**: 키가 눌린 순간 1회 발생. * **KeyUpEvent**: 키가 눌려있던 상태에서 키를 뗀 순간 1회 발생. * 해당 이벤트가 발생하면 스크립트 컴포넌트 내에서 정의된 핸들러 함수(`HandleKey [original] | `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트입니다. `KeyDownEvent`가 발생하면 **HandleKeyDownEvent**가 실행됩니다. `KeyDownEvent`가 핸들러의 매개 변수로 전송되며, 이벤트에는 유저가 입력한 키가 enum으로 넘어오게 됩니다. 다음은 `T` 키를 눌렀을 때 로그를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- N [chunk_id] | Guides:209:1
[task] | distill [title] | 리소스 찾기 [category] | Guides [rephrased] | # 메이커 사용 리소스 찾기 ## 즐겨찾기 - **기능**: 검색한 리소스를 즐겨찾기에 등록하여 RUID 접근을 용이하게 함. - **제한**: 최대 5,000개까지 저장 가능. - **작업**: 리소스 목록의 별 모양 버튼 클릭으로 등록. ## 리소스 카테고리 리소스는 4개의 상위 카테고리 및 하위 카테고리로 분류됩니다. 검색 시 대상 카테고리를 선택해야 합니다. | 상위 카테고리 | 설명 및 하위 카테고리 | | :--- | :--- | | **Sprite** | 정적 스프라이트<br>object, foothold, mon [original] | 검색한 리소스를 즐겨찾기에 등록해 편리하게 RUID를 찾을 수 있습니다. 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. # 리소스 카테고리 구분 리소스는 4개의 상위 카테고리 **Sprite, AnimationClip, AudioClip, AvatarItem** 아래에 하위 카테고리로 분류되어 있습니다. 4개의 카테고리 중 찾으려는 분류를 선택해 검색합니다. | 카테고리 | 설명 | | --- | --- | | Sprite | 다양하게 활용할 수 있는 스프라이트 [chunk_id] | Guides:211:1
[task] | knowledge_list [title] | 리소스 찾기 [category] | Guides [rephrased] | 제시된 문서 내용에 기반하여 추출한 핵심 사실 목록입니다. * 메이플스토리 월드 메이커에서 검색한 리소스를 별 모양 버튼을 눌러 즐겨찾기에 등록할 수 있으며, 최대 5,000개의 리소스까지 저장 가능합니다. * 리소스는 **Sprite**, **AnimationClip**, **AudioClip**, **AvatarItem** 의 4개 상위 카테고리로 구분되며, 각 상위 카테고리 아래에는 object, monster, npc 등 구체적인 하위 카테고리가 존재합니다. * **Sprite** 카테고리는 다양하게 활용할 수 [original] | 검색한 리소스를 즐겨찾기에 등록해 편리하게 RUID를 찾을 수 있습니다. 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. # 리소스 카테고리 구분 리소스는 4개의 상위 카테고리 **Sprite, AnimationClip, AudioClip, AvatarItem** 아래에 하위 카테고리로 분류되어 있습니다. 4개의 카테고리 중 찾으려는 분류를 선택해 검색합니다. | 카테고리 | 설명 | | --- | --- | | Sprite | 다양하게 활용할 수 있는 스프라이트 [chunk_id] | Guides:211:1