[task] | distill [title] | 서버와 클라이언트 [category] | Guides [rephrased] | # 서버와 클라이언트 실행 모델 ## 기본 원리: 독립적인 실행 공간 스크립트에서 선언한 프로퍼티와 함수는 별도 설정 없이는 **서버**와 **클라이언트**에 각각 독립적으로 생성됩니다. * **공간 격리:** 같은 이름이라도 서버와 클라이언트의 프로퍼티/함수는 서로 다른 객체입니다. * **로컬 접근:** 함수 호출, 프로퍼티 값 참조/할당은 **같은 공간 내**에서만 이루어집니다. * 예: 서버 함수 `B`가 프로퍼티 `A`에 값을 할당하면, **서버의** `A`에만 반영되며 클라이언트의 `A`에는 영향이 없 [original] | 서버와 클라이언트가 어떻게 상호작용을 하는지를 알아보았으니, 이제 메이커에서 작성한 프로그램이 서버와 클라이언트에서 어떻게 돌아가는지 알아보도록 합니다. 제작자가 스크립트에서 선언한 프로퍼티와 함수는 별도의 설정을 하지 않는 한 기본적으로 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성됩니다. 이름은 같지만 서로 다른 공간에 존재하기 때문에 별도의 프로퍼티 또는 함수라 보는 것이 좋습니다. 기본적으로 함수의 호출과 프로퍼티의 값 참조 및 할당은 같은 공간 내에서만 이루어집니다. 예를 들어 A라는 프로퍼티에 값을 B라는 함 [chunk_id] | Guides:207:1
[task] | knowledge_list [title] | 서버와 클라이언트 [category] | Guides [rephrased] | 제시된 문서 내용을 바탕으로 추출한 핵심 사실 목록입니다. * 메이커가 스크립트에서 선언한 프로퍼티와 함수는 별도의 설정이 없으면 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성되며, 이름이 같더라도 서로 다른 공간의 개별 객체로 간주됩니다. * 함수의 호출과 프로퍼티의 값 참조 및 할당은 기본적으로 선언된 것과 동일한 공간(서버 또는 클라이언트) 내에서만 이루어지며, 다른 공간의 동일 이름 객체에 영향을 주지 않습니다. * MapleStory World의 서버-클라이언트 간 통신 방식은 데이터 또는 상태를 전달 [original] | 서버와 클라이언트가 어떻게 상호작용을 하는지를 알아보았으니, 이제 메이커에서 작성한 프로그램이 서버와 클라이언트에서 어떻게 돌아가는지 알아보도록 합니다. 제작자가 스크립트에서 선언한 프로퍼티와 함수는 별도의 설정을 하지 않는 한 기본적으로 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성됩니다. 이름은 같지만 서로 다른 공간에 존재하기 때문에 별도의 프로퍼티 또는 함수라 보는 것이 좋습니다. 기본적으로 함수의 호출과 프로퍼티의 값 참조 및 할당은 같은 공간 내에서만 이루어집니다. 예를 들어 A라는 프로퍼티에 값을 B라는 함 [chunk_id] | Guides:207:1
[task] | diverse_qa [title] | 공격과 피격 [category] | Guides [rephrased] | 질문: AttackComponent를 가진 엔티티가 HitComponent를 가진 엔티티를 공격할 때, 추가 처리를 하지 않으면 어떤 일이 발생합니까? 답변: 엔티티는 자동으로 피격 당하게 되며, 추가 처리가 없기 때문에 기본값인 1로 대미지 스킨이 재생됩니다. 질문: 피격량을 계산할 때 공격량과 다른 공식을 사용할 수 있는 예시로 문서에 제시된 경우는 무엇입니까? 답변: 100의 공격력으로 공격했지만 몬스터의 방어력이 높아 절반의 공격만 유효하게 처리하는 경우입니다. 질문: 본 가이드에서 구현하려고 하는 두 가지 기능은 무엇입 [original] | **AttackComponent**를 가진 엔티티가 **HitComponent**를 가진 엔티티를 공격하면, 별다른 추가 처리를 하지 않아도 엔티티는 피격 당하게 됩니다. 이 경우 추가 처리가 없기 때문에 기본값인 1로 대미지 스킨이 재생됩니다. 피격을 구현할 때는 공격량 그대로 대미지로 받을 수도 있지만, 공격과 다른 공식을 함께 사용해 피격량을 계산할 수도 있습니다. 예를 들어 100의 공격력으로 공격했지만 몬스터의 방어력이 높은 경우 절반의 공격만 유효하게 처리할 수 있습니다. 이번에는 아래 두 가지를 구현해 피격 당하는지를 [chunk_id] | Guides:206:3
[task] | diverse_qa [title] | 서버와 클라이언트 [category] | Guides [rephrased] | 질문: 서버와 클라이언트 간 통신에서 데이터 동기화 외에 필요한 과정은 무엇인가요? 답변: 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 질문: 클라이언트가 유저의 입력을 받으면 서버에게 무엇을 요청하게 되나요? 답변: 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 됩니다. 질문: 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 무엇이라 하나요? 답변: 실행제어라고 합니다. 질문: 스크립트에서 "액션"은 어떤 코드로 표현되나요? 답변: 스크립트에서는 "함수"로 표현됩니다. 질문: 함수의 설정에 따 [original] | 서버와 클라이언트 간 통신에는 데이터의 전달, 즉 동기화 외에도 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 위의 레벨업 처리 과정을 예시로 들면, 클라이언트가 유저의 입력을 받으면, 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 되고, 서버는 클라이언트의 요청에 따라 "몬스터 공격"이라는 "액션"을 수행하게 되는데요, 이렇듯 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 합니다. 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. 위에 말한 "액션"은 결국 스크립트에서는 "함수"라 할 [chunk_id] | Guides:207:2
[task] | diverse_qa [title] | 공격과 피격 [category] | Guides [rephrased] | 질문: `CharacterAttack` 컴포넌트를 만들기 위해 선택해야 하는 원래 컴포넌트의 경로는 무엇인가요? 답변: Workspace - BaseEnvironment - NativeScripts - Component - AttackComponent 경로에서 컴포넌트를 선택해야 합니다. 질문: `AttackComponent`를 확장하여 만든 새로운 컴포넌트의 이름은 무엇으로 변경하나요? 답변: 확장한 컴포넌트의 이름을 `CharacterAttack`으로 변경합니다. 질문: `NormalAttack` 함수 내에서 공격 범위와 오 [original] | 1. **Workspace - BaseEnvironment - NativeScripts - Component - AttackComponent**를 선택합니다. 2. 콘텍스트 메뉴에서 **Extend**를 눌러 컴포넌트를 확장합니다. 확장한 컴포넌트의 이름을 **CharacterAttack**으로 변경합니다. 3. **CharacterAttack** 컴포넌트를 더블 클릭하여 스크립트 에디터를 엽니다. 4. **Method**에서 새로운 함수를 추가하고, 이름을 **NormalAttack** 으로 변경합니다. 5. `Att [chunk_id] | Guides:206:2
[task] | distill [title] | 서버와 클라이언트 [category] | Guides [rephrased] | # 서버와 클라이언트: 실행제어 서버-클라이언트 통신은 데이터 동기화 외에도, 공간에 정의된 **액션(스크립트 함수)** 의 요청 및 수행 과정(실행제어)을 포함합니다. ## 실행제어 규칙 - 스크립트 함수의 **실행 공간**(Execution Space) 설정에 따라 요청/수행 주체가 결정됩니다. - 예: 서버에 선언된 함수의 실행 공간을 `client`로 설정하면, 서버에서 호출할 수 있지만 실제로는 클라이언트에서 실행됩니다. ## 코드 예시 함수 `MethodB`의 실행 공간이 `client`, `MethodC`의 실행 [original] | 서버와 클라이언트 간 통신에는 데이터의 전달, 즉 동기화 외에도 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 위의 레벨업 처리 과정을 예시로 들면, 클라이언트가 유저의 입력을 받으면, 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 되고, 서버는 클라이언트의 요청에 따라 "몬스터 공격"이라는 "액션"을 수행하게 되는데요, 이렇듯 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 합니다. 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. 위에 말한 "액션"은 결국 스크립트에서는 "함수"라 할 [chunk_id] | Guides:207:2
[task] | knowledge_list [title] | 서버와 클라이언트 [category] | Guides [rephrased] | - 서버와 클라이언트 간 통신에는 데이터의 전달(동기화) 외에, 공간에 정의된 "액션"을 요청하고 수행하는 과정도 포함됩니다. - 클라이언트는 유저의 입력을 받아 서버에게 "몬스터 공격"과 같은 "액션"을 요청하며, 서버는 해당 요청에 따라 액션을 수행합니다. - 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 정의합니다. - 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. - 스크립트에서 "액션"은 "함수"에 해당하며, 함수의 설정에 따라 클라이언트에서 서버로 또는 서버에서 클라이언트로 수행을 요청할 수 [original] | 서버와 클라이언트 간 통신에는 데이터의 전달, 즉 동기화 외에도 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 위의 레벨업 처리 과정을 예시로 들면, 클라이언트가 유저의 입력을 받으면, 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 되고, 서버는 클라이언트의 요청에 따라 "몬스터 공격"이라는 "액션"을 수행하게 되는데요, 이렇듯 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 합니다. 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. 위에 말한 "액션"은 결국 스크립트에서는 "함수"라 할 [chunk_id] | Guides:207:2
[task] | distill [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | # 프로퍼티 동기화 서버와 클라이언트 간에 같은 이름의 프로퍼티 값을 일치시키는 데이터 전송 방식입니다. 별도의 구현 코드 없이, 프로퍼티 선언 시 동기화 여부만 설정하면 자동으로 동작합니다. ## 동기화 방향 및 제약 * **기본 방향:** 서버 → 클라이언트. 서버에서 값을 할당하면 클라이언트로 전송되어 값이 일치합니다. * **클라이언트 → 서버:** 제한됨. 클라이언트 단독으로 값을 변경하는 것은 비권장이며, 특수한 경우를 제외하면 서버 값이 변경되지 않습니다. * **딜레이 존재:** 서버 변경 직후 클라이언 [original] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당 [chunk_id] | Guides:208:0
[task] | wikipedia [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | 프로퍼티 동기화 설정은 간단하며, 스크립트 에디터에서 프로퍼티를 추가한 경험이 있다면 프로퍼티 상단에 표시되는 `Sync` 태그를 확인해 본 적이 있을 것입니다. 이 `Sync` 표시는 해당 프로퍼티가 서버와 클라이언트 간에 동기화되고 있음을 의미합니다. 프로퍼티 동기화를 원하지 않는 경우, `Sync` 옵션을 `None`으로 변경하면 됩니다. 동기화 상태가 `None`으로 설정된 프로퍼티는 동기화되지 않으며, 각 공간(서버 또는 클라이언트)에서 프로퍼티 값을 독립적으로 관리할 수 있게 됩니다. 모든 타입의 프로퍼티가 동기화 설 [original] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이 [chunk_id] | Guides:208:1
[task] | extract_knowledge [title] | 공격과 피격 [category] | Guides [rephrased] | # 공격과 피격 시스템 ## 개념 설명 메이플스토리 월드에서 공격과 피격 로직은 `AttackComponent`와 `HitComponent`를 통해 처리됩니다. 이 시스템은 공격자가 타격 대상인지, 피격자가 타격을 받을 수 있는지, 그리고 최종 대미지 값을 어떻게 계산할지를 제어합니다. 1. **공격 대상 판별 (`IsAttackTarget`)**: * `AttackComponent`의 `IsAttackTarget(Entity defender)` 함수는 충돌한 엔티티(`defender`)가 유효한 공격 대상인지 판 [original] | 크리에이터의 공격 제작 방식에 따라 `IsAttackTarget()` 함수를 활용해 피격 대상을 선정할 수 있습니다. `IsAttackTarget()` 함수는 공격자가 공격 박스에 포함되지 않도록 처리되어 있으므로, 공격자가 타격을 받지 않게 처리할 필요가 없습니다. **Entity** 타입의 `defender` 매개변수는 충돌한 엔티티가 공격 대상인지 판단할 수 있는 엔티티 정보를 받습니다. 함수의 리턴값이 **false**면 **AttackComponent**에서 적합한 공격 대상으로 판별하고 이후 판단을 **HitCompone [chunk_id] | Guides:206:1
[task] | extract_knowledge [title] | 공격과 피격 [category] | Guides [rephrased] | # 공격과 피격 처리 (Attack & Hit) ## 1. 개념 설명 메이플스토리 월드의 mLua 환경에서 **AttackComponent**를 가진 엔티티가 **HitComponent**를 가진 엔티티를 공격하면, 추가 코드가 없어도 기본 피격 처리가 수행됩니다. 이때 기본값인 대미지 1이 적용되어 대미지 스킨이 재생됩니다. 개발자는 `HitComponent`를 확장하여 피격량 계산 로직을 커스터마이징할 수 있습니다. 예를 들어, 공격자의 공격력과 방어자의 방어력을 고려하여 실제 적용되는 대미지를 조절하거나, 피격 시 시각적 [original] | **AttackComponent**를 가진 엔티티가 **HitComponent**를 가진 엔티티를 공격하면, 별다른 추가 처리를 하지 않아도 엔티티는 피격 당하게 됩니다. 이 경우 추가 처리가 없기 때문에 기본값인 1로 대미지 스킨이 재생됩니다. 피격을 구현할 때는 공격량 그대로 대미지로 받을 수도 있지만, 공격과 다른 공식을 함께 사용해 피격량을 계산할 수도 있습니다. 예를 들어 100의 공격력으로 공격했지만 몬스터의 방어력이 높은 경우 절반의 공격만 유효하게 처리할 수 있습니다. 이번에는 아래 두 가지를 구현해 피격 당하는지를 [chunk_id] | Guides:206:3
[task] | knowledge_list [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | * `InputService`는 월드에서 유저가 특정 입력을 수행할 때 해당 입력에 대한 이벤트를 발생시키는 서비스입니다. * `InputService`를 통해 발생한 입력 이벤트는 유저의 입력이 클라이언트에서만 감지되기 때문에, 이를 처리하는 이벤트 핸들러도 클라이언트에서만 실행됩니다. * 입력 관련 이벤트 핸들러는 스크립트 컴포넌트의 `Event Handler` 블록에서 추가하며, 이벤트 탐색 창에서 이벤트를 선택하면 이벤트 센더가 `InputService`로 설정됩니다. * `InputService`에서 제공하는 [original] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176 [chunk_id] | Guides:209:0
[task] | knowledge_list [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | * 프로퍼티 동기화 상태는 스크립트 에디터의 프로퍼티 상단 `[Sync]` 태그로 표시되며, 이 태그가 존재할 경우 해당 프로퍼티 값은 서버와 클라이언트 간에 동기화됩니다. * 프로퍼티 동기화를 비활성화하려면 프로퍼티 상단의 `[Sync]` 태그를 클릭하여 `[None]`으로 변경해야 하며, `[None]`으로 설정된 프로퍼티는 동기화되지 않고 각 공간(클라이언트/서버)별로 독립적으로 값이 관리됩니다. * `any` 타입과 `table` 타입의 프로퍼티는 동기화 설정이 제한되어 동기화할 수 없습니다. * `string [original] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이 [chunk_id] | Guides:208:1
[task] | distill [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService: 입력과 액션 ## 개요 `InputService`는 유저의 입력에 따라 이벤트를 발생시킵니다. 입력 이벤트는 **클라이언트에서만** 발생하므로, 관련 이벤트 핸들러도 `[client only]` 또는 `[client]` 공간에서 실행되어야 합니다. ## 이벤트 핸들러 구성 스크립트 컴포넌트의 `Event Handler:` 블록에 `[service: InputService]` 접두사로 이벤트를 등록합니다. ```lua [service: InputService] HandleKeyDownEvent(Key [original] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176 [chunk_id] | Guides:209:0
[task] | distill [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | # 프로퍼티 동기화 (Sync) `[Sync]` 속성을 가진 프로퍼티는 서버와 클라이언트 간 값이 자동으로 동기화됩니다. 동기화를 비활성화하려면 `[Sync]`를 `[None]`으로 변경합니다. `[None]` 상태에서는 각 엔티티 인스턴스별로 프로퍼티 값을 독립적으로 관리할 수 있습니다. ## 타입별 동기화 지원 여부 아래 표에 명시된 타입만 `[Sync]` 설정이 가능합니다. | 타입 | 동기화 가능 여부 | | :--- | :--- | | `string` | O | | `integer` | O | | `number` | [original] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이 [chunk_id] | Guides:208:1
[task] | extract_knowledge [title] | 서버와 클라이언트 [category] | Guides [rephrased] | # 서버와 클라이언트 통신 모델 및 구조 ## 1. 개념 설명 MapleStory Worlds는 멀티플레이 게임 환경에서 **서버-클라이언트(Server-Client) 모델**을 기반으로 통신을 처리합니다. * **클라이언트 (Client)**: 유저가 게임을 플레이하는 모바일, PC 등 개별 기기에서 실행되는 프로그램입니다. 주로 유저의 입력을 처리하거나, 서버로부터 받은 정보를 내부적으로 처리하여 유저에게 가시적으로 출력하는 역할을 수행합니다. * **서버 (Server)**: 다수의 클라이언트가 연결된 단일 컴퓨터 [original] | # 학습 과정 소개 멀티 플레이를 제공하는 게임의 경우 각 게임의 특성에 따라 사용되는 통신 모델들이 다양합니다. MapleStory World는 다양한 통신 모델 중에서도 서버 - 클라이언트 모델을 사용하고 있습니다. 이번 과정에서는 MapleStory World의 통신 모델인 서버와 클라이언트의 개념과 구조, 그리고 각 공간 간의 정보전달 방법에 대해 알아보도록 하겠습니다. # 서버와 클라이언트 클라이언트는 게임을 플레이하는 유저들의 모바일이나 PC, 또는 해당 기기에서 개별적으로 돌아가는 프로그램을 의미합니다.주로 유저의 [chunk_id] | Guides:207:0
[task] | knowledge_list [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | 제공된 문서에 기반하여 프로퍼티 동기화에 관한 핵심 사실을 정리한 목록입니다. * 프로퍼티 동기화는 서버와 클라이언트 간 데이터 전송 방식 중 하나로, 각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. * 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되며, 동기화가 설정되지 않으면 이름은 같지만 서로 다른 값으로 설정될 수 있습니다. * 메이플스토리 월드는 프로퍼티를 자동으로 동기화해주는 기능을 제공하여, 프로퍼티 선언 후 동기화 여부만 설정하면 별도의 구현이 필요 없 [original] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당 [chunk_id] | Guides:208:0
[task] | diverse_qa [title] | 서버와 클라이언트 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 제작자가 스크립트에 선언한 프로퍼티와 함수는 기본적으로 어떻게 생성되나요? 답변: 별도의 설정을 하지 않는 한, 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성됩니다. 질문: 서버에 있는 함수 B가 프로퍼티 A에 값을 할당할 때, 클라이언트에 있는 프로퍼티 A에는 값이 할당되나요? 답변: 아니요, 서버에 있는 함수 B가 호출되면 서버에 있는 프로퍼티 A에만 값이 할당되고, 클라이언트에 있는 프로퍼티 A에는 값이 할당되지 않습니다. 질문: 클라이언트의 함수 A가 함수 B를 호출할 때 어떤 일이 [original] | 서버와 클라이언트가 어떻게 상호작용을 하는지를 알아보았으니, 이제 메이커에서 작성한 프로그램이 서버와 클라이언트에서 어떻게 돌아가는지 알아보도록 합니다. 제작자가 스크립트에서 선언한 프로퍼티와 함수는 별도의 설정을 하지 않는 한 기본적으로 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성됩니다. 이름은 같지만 서로 다른 공간에 존재하기 때문에 별도의 프로퍼티 또는 함수라 보는 것이 좋습니다. 기본적으로 함수의 호출과 프로퍼티의 값 참조 및 할당은 같은 공간 내에서만 이루어집니다. 예를 들어 A라는 프로퍼티에 값을 B라는 함 [chunk_id] | Guides:207:1
[task] | extract_knowledge [title] | 서버와 클라이언트 [category] | Guides [rephrased] | # 서버와 클라이언트 공간의 독립성 및 통신 원리 ## 1. 개념 설명 메이플스토리 월드(mLua)에서 스크립트 컴포넌트 내의 프로퍼티와 함수는 별도의 설정이 없는 한 **서버(Server)**와 **클라이언트(Client)** 두 개의 독립된 공간에 각각 생성됩니다. 이름이 동일하더라도 서로 다른 인스턴스로 취급됩니다. * **독립적 실행**: 함수 호출, 프로퍼티 값 참조 및 할당, 함수 간 호출은 모두 **같은 공간 내에서만** 수행됩니다. * 서버의 함수가 서버의 프로퍼티만 수정하며, 클라이언트의 프로퍼티 [original] | 서버와 클라이언트가 어떻게 상호작용을 하는지를 알아보았으니, 이제 메이커에서 작성한 프로그램이 서버와 클라이언트에서 어떻게 돌아가는지 알아보도록 합니다. 제작자가 스크립트에서 선언한 프로퍼티와 함수는 별도의 설정을 하지 않는 한 기본적으로 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성됩니다. 이름은 같지만 서로 다른 공간에 존재하기 때문에 별도의 프로퍼티 또는 함수라 보는 것이 좋습니다. 기본적으로 함수의 호출과 프로퍼티의 값 참조 및 할당은 같은 공간 내에서만 이루어집니다. 예를 들어 A라는 프로퍼티에 값을 B라는 함 [chunk_id] | Guides:207:1
[task] | wikipedia [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService를 활용한 입력과 액션 모든 게임은 유저의 입력과 해당 입력에 대한 피드백을 통해 진행됩니다. 메이플스토리 월드에서는 `InputService`를 사용하여 유저의 입력에 반응하는 액션을 제어할 수 있습니다. 본 가이드에서는 유저의 입력이 발생했을 때 특정 액션을 실행하는 방법을 설명합니다. 관련된 추가 정보는 [Event System](https://mod-developers.nexon.com/docs?postId=73)과 [Entity Event System](https://mod-developers. [original] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176 [chunk_id] | Guides:209:0
[task] | diverse_qa [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 유저의 입력과 액션을 제어하기 위해 사용하는 서비스는 무엇인가요? 답변: InputService입니다. 질문: InputService에서 발생하는 유저 입력 이벤트는 서버와 클라이언트 중 어디서만 발생하나요? 답변: 클라이언트에서만 발생합니다. 질문: InputService 이벤트 핸들러는 서버와 클라이언트 중 어디서 실행되어야 하나요? 답변: 클라이언트에서만 실행됩니다. 질문: 입력에 관한 이벤트 핸들러를 추가하기 위해 스크립트 컴포넌트를 생성한 후 반드시 수행해야 하는 첫 번째 단계는 무엇인가요 [original] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176 [chunk_id] | Guides:209:0
[task] | diverse_qa [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 프로퍼티 동기화의 정의는 무엇인가요? 답변: 서버와 클라이언트 간 데이터 전송 방식의 일종으로, 각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 질문: 기본적으로 프로퍼티는 언제 생성되나요? 답변: 프로퍼티는 선언과 동시에 서버와 클라이언트 각각의 공간에 생성됩니다. 질문: 프로퍼티 동기화가 되지 않을 때 발생하는 문제는 무엇인가요? 답변: 이름은 같지만 서버와 클라이언트에서 서로 다른 값으로 설정될 수 있어, 서버 로직이 실행되어도 클라이언트 UI 등에서 값이 [original] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당 [chunk_id] | Guides:208:0
[task] | diverse_qa [title] | 프로퍼티 동기화 [category] | Guides [rephrased] | 질문: 프로퍼티 동기화를 원하지 않을 때 Sync 설정을 무엇으로 변경해야 하나요? 답변: Sync를 눌러 None으로 변경해 줍니다. 질문: 프로퍼티 동기화 표시가 None으로 되어 있으면 어떤 의미가 있나요? 답변: 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. 질문: any 타입의 프로퍼티는 동기화가 가능한가요? 답변: 아니요, any 타입의 프로퍼티는 동기화 설정이 제한되어 동기화가 불가능합니다. 질문: string 타입의 프로퍼티는 동기화가 가능한가요? 답변 [original] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이 [chunk_id] | Guides:208:1
[task] | extract_knowledge [title] | 공격과 피격 [category] | Guides [rephrased] | # 게임 로직: 공격과 피격 구현 ## 1. 개념 설명 메이플스토리 월드(mLua)에서 플레이어의 공격 동작을 구현하기 위해서는 기본 제공되는 `AttackComponent`를 확장하여 커스텀 로직을 추가해야 합니다. 이 과정은 다음과 같은 단계로 구성됩니다. 1. **컴포넌트 확장**: 기본 `AttackComponent`를 상속받아 커스텀 메서드와 이벤트 핸들러를 정의합니다. 2. **공격 범위 및 동작 정의**: `Attack` 메서드를 호출하여 공격의 크기(`attackSize`)와 오프셋(`attackOffset`)을 [original] | 1. **Workspace - BaseEnvironment - NativeScripts - Component - AttackComponent**를 선택합니다. 2. 콘텍스트 메뉴에서 **Extend**를 눌러 컴포넌트를 확장합니다. 확장한 컴포넌트의 이름을 **CharacterAttack**으로 변경합니다. 3. **CharacterAttack** 컴포넌트를 더블 클릭하여 스크립트 에디터를 엽니다. 4. **Method**에서 새로운 함수를 추가하고, 이름을 **NormalAttack** 으로 변경합니다. 5. `Att [chunk_id] | Guides:206:2
[task] | extract_knowledge [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService를 활용한 입력 처리 ## 개념 설명 `InputService`는 메이플스토리 월드에서 유저의 입력(키보드, 마우스 등)을 감지하고 해당 입력에 대한 이벤트를 발생하는 서비스입니다. 유저의 입력은 클라이언트 환경에서만 발생하므로, `InputService`가 발생시키는 모든 이벤트와 이를 처리하는 이벤트 핸들러는 반드시 클라이언트 실행 공간에서만 동작합니다. ## API 사용법 `InputService`의 이벤트를 처리하기 위해 스크립트 컴포넌트 내부에 이벤트 핸들러를 구성해야 합니다. 1. **스 [original] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176 [chunk_id] | Guides:209:0
[task] | distill [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService: 키 입력 처리 `InputService`는 키보드 입력을 `KeyDownEvent`, `KeyUpEvent`, `KeyHoldEvent` 이벤트와 `IsKeyPressed()`, `IsAnyKeyPressed()` 함수를 통해 처리합니다. ## 이벤트 핸들러 이벤트는 **Client** 공간에서 발생하며, `event.key`를 통해 `KeyboardKey` enum 값을 제공합니다. ### KeyDownEvent 키가 눌린 순간 1회 발생합니다. ```lua Event Handler: [ser [original] | `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트입니다. `KeyDownEvent`가 발생하면 **HandleKeyDownEvent**가 실행됩니다. `KeyDownEvent`가 핸들러의 매개 변수로 전송되며, 이벤트에는 유저가 입력한 키가 enum으로 넘어오게 됩니다. 다음은 `T` 키를 눌렀을 때 로그를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- N [chunk_id] | Guides:209:1
[task] | knowledge_list [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | * `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트이며, 해당 이벤트가 발생하면 `HandleKeyDownEvent` 핸들러가 실행됩니다. * `HandleKeyDownEvent` 핸들러는 `InputService` 서비스에서 발생하며, 실행 공간은 `Client`입니다. * `HandleKeyDownEvent` 핸들러는 매개변수로 `KeyDownEvent` 타입의 `event` 객체를 수신하며, 이 객체의 `key` 프로퍼티는 유저가 입력한 키를 나타내는 `KeyboardKey` 타입의 enum 값입니다. [original] | `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트입니다. `KeyDownEvent`가 발생하면 **HandleKeyDownEvent**가 실행됩니다. `KeyDownEvent`가 핸들러의 매개 변수로 전송되며, 이벤트에는 유저가 입력한 키가 enum으로 넘어오게 됩니다. 다음은 `T` 키를 눌렀을 때 로그를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- N [chunk_id] | Guides:209:1
[task] | distill [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | ### ScreenTouchHoldEvent 화면을 터치하고 있는 동안 프레임마다 발생하는 이벤트입니다. 핸들러 `HandleScreenTouchHoldEvent`가 실행되며, 매개변수로 `ScreenTouchHoldEvent`가 전달됩니다. `event.TouchPoint`를 통해 터치 중인 위치의 좌표를 조회할 수 있습니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent event) { local TouchPoint = eve [original] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even [chunk_id] | Guides:209:3
[task] | knowledge_list [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | - `KeyHoldEvent`는 키보드의 키가 눌려 있는 동안 프레임마다 발생하며, 해당 이벤트가 발생할 때마다 `HandleKeyHoldEvent` 핸들러가 매번 실행됩니다. - `HandleKeyHoldEvent`는 `InputService`의 `[service: InputService]` 블록에 선언되며, 실행 공간(Space)은 `Client`입니다. - `KeyHoldEvent`는 `HandleKeyHoldEvent`의 매개변수로 전송되며, 이벤트 객체에서 `event.key` 속성을 통해 입력된 키 정보(예: `Keybo [original] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende [chunk_id] | Guides:209:2
[task] | distill [title] | InputService를 활용한 입력과 액션 [category] | Guides [rephrased] | # InputService: 입력 이벤트 핸들러 `InputService`는 클라이언트 공간(`[client]`)에서 동작하며, 키보드 및 화면 터치 입력을 처리합니다. 모든 이벤트 핸들러는 `[service: InputService]` 블록 내에 정의됩니다. ## KeyHoldEvent 키가 **눌려 있는 동안 프레임마다** 발생합니다. - **핸들러**: `HandleKeyHoldEvent(KeyHoldEvent event)` - **매개변수**: `event.key` (누르고 있는 키 정보) ```lua [service: [original] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende [chunk_id] | Guides:209:2