[task] | diverse_qa [title] | 엔티티의 충돌 [category] | Guides [rephrased] | 질문: 확장된 TriggerComponent에서 오버라이딩할 수 있는 함수는 총 몇 가지이며 각각 무엇인가요? 답변: 총 세 가지이며, OnEnterTriggerBody, OnStayTriggerBody, OnLeaveTriggerBody입니다. 질문: OnEnterTriggerBody 함수는 언제 호출되나요? 답변: 엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. 질문: OnStayTriggerBody 함수의 호출 주기는 어떻게 되나요? 답변: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐있는 동안 프레임마다 호출됩니다 [original] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐 [chunk_id] | Guides:175:2
[task] | extract_knowledge [title] | 엔티티의 충돌 [category] | Guides [rephrased] | # 충돌 엔티티의 충돌 (TriggerComponent 오버라이딩) ## 1. 개념 설명 메이플스토리 월드에서 다른 스크립트 컴포넌트와 달리, 확장된 `TriggerComponent`는 충돌 이벤트 발생 시점에 호출되는 특정 함수를 오버라이딩할 수 있습니다. 이 메커니즘을 통해 엔티티 간의 충돌 시작, 유지, 종료 단계별로 로직을 처리할 수 있습니다. 오버라이딩 가능한 함수는 총 3가지이며, 각 함수의 호출 시점은 다음과 같습니다. * **`OnEnterTriggerBody`**: 엔티티 간 충돌이 **처음 발생했을 때 [original] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐 [chunk_id] | Guides:175:2
[task] | wikipedia [title] | 엔티티의 충돌 [category] | Guides [rephrased] | # 충돌 엔티티의 충돌 **학습 과정 소개** 본 가이드는 메이플스토리 월드(mLua) 환경에서 충돌 이벤트와 충돌 처리 방법에 대한 이해를 돕기 위해 작성되었습니다. 충돌 시스템의 동작 원리를 파악하기 위해서는 [Event System](https://mod-developers.nexon.com/docs?postId=73) 및 [Entity Event System](https://mod-developers.nexon.com/docs?postId=176) 가이드를 함께 참고하는 것이 좋습니다. ## 충돌의 정의 및 생성 ** [original] | # 학습 과정 소개 충돌 이벤트와 충돌 처리 방법에 대해 알아봅시다. ##### 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176) # 충돌 **충돌**이란 충돌체를 포함하는 엔티티'의 충돌 영역이 서로 교차하는 것을 말합니다. 엔티티에 [TriggerComponent](/apiReference/Components/Trigge [chunk_id] | Guides:175:0
[task] | wikipedia [title] | 함수 [category] | Guides [rephrased] | # mLua 스크립트: 함수(메소드) 호출 mLua 스크립트에서 메소드 내부에서는 다른 메소드를 호출하여 해당 함수의 기능을 실행할 수 있습니다. 호출 방식은 대상이 동일한 컴포넌트, 다른 컴포넌트, 서비스, 또는 언어 내장 함수인지에 따라 달라집니다. ## 기본 호출 형식 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. 여기서 콜론(`:`)은 인스턴스 메소드 호출을 나타내며, 첫 번째 인자로 호출 대상 객체가 암묵적으로 전달됩니다. ## 동일한 컴포넌트 내 메소드 호출 동 [original] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다. [chunk_id] | Guides:172:1
[task] | distill [title] | 엔티티의 충돌 [category] | Guides [rephrased] | # 충돌 엔티티의 충돌 처리 충돌 이벤트 발생 후 액션 실행은 **Entity Event System** 또는 **확장된 TriggerComponent**로 구현합니다. 두 방식 모두 엔티티에 충돌 감지 기능이 포함된 컴포넌트(`TriggerComponent` 또는 확장 컴포넌트)와 액션을 수행하는 스크립트/함수가 필요합니다. ## 1. Entity Event System 활용 엔티티에 `TriggerComponent`와 스크립트 컴포넌트(리액터)를 모두 추가해야 합니다. ### 이벤트 핸들러 종류 스크립트 컴포넌트의 `Ev [original] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충 [chunk_id] | Guides:175:1
[task] | diverse_qa [title] | 엔티티의 충돌 [category] | Guides [rephrased] | 질문: 충돌 이벤트 발생 후 추가 액션을 수행하기 위해 활용할 수 있는 두 가지 방법은 무엇인가요? 답변: Entity Event System을 활용하거나, 확장된 TriggerComponent를 활용합니다. 질문: TriggerComponent를 포함하는 두 엔티티가 부딪히면 충돌 이벤트가 발생하지만, 특별한 변화가 일어나지 않는 이유는 무엇인가요? 답변: 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. 질문: TriggerComponent를 활용하여 충돌 시 A와 B의 체력을 깎거나 하나의 엔티티를 없애는 등 [original] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충 [chunk_id] | Guides:175:1
[task] | wikipedia [title] | 엔티티의 충돌 [category] | Guides [rephrased] | 충돌 엔티티의 충돌 이벤트 이후에 실행할 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent**를 활용하는 두 가지 방식으로 구현할 수 있습니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 존재한다고 가정해 보겠습니다. A와 B가 물리적으로 부딪히면 충돌 이벤트는 발생하지만, 이 시점에서 추가적인 로직이 정의되지 않은 한 게임 상태에 어떠한 변화도 일어나지 않습니다. **TriggerComponent**를 활용하면 충돌 이벤트 발생 시점에 실 [original] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충 [chunk_id] | Guides:175:1
[task] | knowledge_list [title] | Entity Event System [category] | Guides [rephrased] | 제시된 문서 원문에 포함된 정보만 기반으로 핵심 사실을 추출하여 정리한 목록입니다. * 메이플스토리 월드의 Entity Event System은 컴포넌트가 엔티티를 중계자로 사용하여 이벤트를 제어하는 메커니즘을 제공하며, 각 컴포넌트는 엔티티를 통해 이벤트 핸들러를 등록하고 이벤트를 발생시킬 수 있습니다. * 이벤트 발생(Send)은 엔티티를 통해 이루어지며, 해당 엔티티는 발생한 이벤트를 등록된 핸들러에 전송하는 역할을 수행합니다. * 기본적으로 컴포넌트는 자기 자신의 엔티티에 이벤트를 연결하지만, 맵 엔티티와 월드 [original] | # 학습 과정 소개 메이플스토리 월드에서는 Entity Event System을 사용해 이벤트를 제어할 수 있습니다. 이번 시간에는 Entity Event System을 이용해 "뱀파이어 vs 헌터"의 게임 요소 중 하나를 만들어봅시다. 다음 가이드를 먼저 학습하면 이번 과정을 이해하는 데 많은 도움이 됩니다. [Event System](https://mod-developers.nexon.com/docs?postId=73) # Entity Event System 이벤트를 받고 보내려면 먼저 Entity Event System을 [chunk_id] | Guides:176:0
[task] | extract_knowledge [title] | 엔티티의 충돌 [category] | Guides [rephrased] | # 충돌 엔티티의 충돌 ## 1. 개념 설명 **충돌(Collision)**이란 충돌체를 포함하는 엔티티의 충돌 영역이 서로 교차하는 것을 의미합니다. 엔티티에 `TriggerComponent` 또는 `HitComponent`를 추가하면 충돌체가 자동 생성됩니다. * **TriggerComponent**: **충돌 범위**를 설정할 때 사용하며, 해당 범위를 제어하는 컴포넌트입니다. * **HitComponent**: **피격 범위**를 설정할 때 사용하며, 해당 범위를 제어하는 컴포넌트입니다. 충돌체의 형태(`Col [original] | # 학습 과정 소개 충돌 이벤트와 충돌 처리 방법에 대해 알아봅시다. ##### 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176) # 충돌 **충돌**이란 충돌체를 포함하는 엔티티'의 충돌 영역이 서로 교차하는 것을 말합니다. 엔티티에 [TriggerComponent](/apiReference/Components/Trigge [chunk_id] | Guides:175:0
[task] | extract_knowledge [title] | 함수 [category] | Guides [rephrased] | # mLua 메소드 호출 규칙 mLua 스크립트에서 메소드 호출은 대상 객체의 종류(동일 컴포넌트, 다른 컴포넌트, 서비스, 정적 메소드)에 따라 콜론(`:`)과 점(`.`) 사용법이 달라집니다. 기본적으로 인스턴스 메소드는 `객체:메소드명(매개변수)` 형식을 따르며, 정적 메소드나 표준 라이브러리 함수는 `객체.메소드명(매개변수)` 형식을 따릅니다. ## 1. 동일한 컴포넌트 내 메소드 호출 현재 실행 중인 메소드가 포함된 컴포넌트 객체를 참조하기 위해 `self` 키워드를 사용합니다. 다른 메소드를 호출할 때는 `self: [original] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다. [chunk_id] | Guides:172:1
[task] | diverse_qa [title] | 함수 [category] | Guides [rephrased] | 질문: 메이플스토리 월드의 컴포넌트는 기본적으로 무엇과 무엇으로 구성됩니까? 답변: 컴포넌트는 기본적으로 프로퍼티와 메소드로 구성됩니다. 질문: 메이플스토리 월드의 함수는 호출 주체에 따라 어떤 두 가지로 나뉘나요? 답변: 함수는 호출 주체가 누구냐에 따라 기본 이벤트 메소드와 사용자 지정 메소드로 나뉩니다. 질문: 기본 이벤트 메소드의 호출 시점과 함수 이름은 어떻게 결정되나요? 답변: 기본 이벤트 메소드는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때 호출되며, 호출 시점과 함수 이름이 정해져 있습니다 [original] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때 [chunk_id] | Guides:172:0
[task] | knowledge_list [title] | Entity Event System [category] | Guides [rephrased] | 제공된 원문에는 `HunterComponent`와 `VampireComponent`의 스크립트 구현 예시와 이벤트 연결 설정 내용이 포함되어 있습니다. 원문에 명시된 사실만 바탕으로 핵심 정보를 추출하여 정리했습니다. * **HunterComponent**와 **VampireComponent** 스크립트에는 `SunriseEvent`를 처리하기 위해 `Event Handler` 블록을 추가해야 합니다. * `SunriseEvent`의 중계 엔티티(Relayer)는 핸들러 상단에서 `map01` 경로(`/maps/map01` [original] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma [chunk_id] | Guides:176:1
[task] | wikipedia [title] | Entity Event System [category] | Guides [rephrased] | # Entity Event System 메이플스토리 월드에서는 **Entity Event System**을 활용하여 게임 내 이벤트를 제어할 수 있습니다. 본 가이드에서는 이 시스템을 이용하여 '뱀파이어 vs 헌터' 게임의 특정 요소를 구현하는 과정을 다룹니다. 이 내용을 이해하기 위해서는 사전에 [Event System](https://mod-developers.nexon.com/docs?postId=73) 가이드를 학습하는 것이 권장됩니다. ## 시스템 개요 이벤트의 수신과 송신을 위해서는 Entity Event Syste [original] | # 학습 과정 소개 메이플스토리 월드에서는 Entity Event System을 사용해 이벤트를 제어할 수 있습니다. 이번 시간에는 Entity Event System을 이용해 "뱀파이어 vs 헌터"의 게임 요소 중 하나를 만들어봅시다. 다음 가이드를 먼저 학습하면 이번 과정을 이해하는 데 많은 도움이 됩니다. [Event System](https://mod-developers.nexon.com/docs?postId=73) # Entity Event System 이벤트를 받고 보내려면 먼저 Entity Event System을 [chunk_id] | Guides:176:0
[task] | diverse_qa [title] | Entity Event System [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 이벤트를 제어하기 위해 사용하는 시스템은 무엇인가요? 답변: 메이플스토리 월드에서는 Entity Event System을 사용해 이벤트를 제어할 수 있습니다. 질문: Entity Event System에서 컴포넌트는 무엇을 중계자로 사용하여 이벤트를 주고받나요? 답변: 컴포넌트는 엔티티(Entity)를 중계자로 사용하여 핸들러를 등록하고 이벤트를 발생시킬 수 있습니다. 질문: 기본적으로 이벤트는 어떤 엔티티에 연결되나요? 답변: 기본적으로는 자기 자신의 엔티티에 이벤트를 연결하지만, 상황에 따라 다른 [original] | # 학습 과정 소개 메이플스토리 월드에서는 Entity Event System을 사용해 이벤트를 제어할 수 있습니다. 이번 시간에는 Entity Event System을 이용해 "뱀파이어 vs 헌터"의 게임 요소 중 하나를 만들어봅시다. 다음 가이드를 먼저 학습하면 이번 과정을 이해하는 데 많은 도움이 됩니다. [Event System](https://mod-developers.nexon.com/docs?postId=73) # Entity Event System 이벤트를 받고 보내려면 먼저 Entity Event System을 [chunk_id] | Guides:176:0
[task] | distill [title] | Entity Event System [category] | Guides [rephrased] | # Entity Event System: SunriseEvent 처리 예제 `HunterComponent`와 `VampireComponent`는 `map01` 엔티티에서 발생하는 `SunriseEvent`를 수신하여 각각 HP를 증가/감소시킵니다. ## 핵심 구성 1. **이벤트 수신 설정**: 두 컴포넌트 모두 Event Handler에 `SunriseEvent`를 추가하고, 중계자(Relayer)를 `map01(/maps/map01)`으로 지정합니다. 2. **초기값**: 프로퍼티 에디터에서 `Hp`를 `100`으로 설정합 [original] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma [chunk_id] | Guides:176:1
[task] | knowledge_list [title] | Entity Event System [category] | Guides [rephrased] | 제시된 원문 문서에 포함된 핵심 사실은 다음과 같습니다. 1. **컴포넌트 생성**: Workspace의 MyDesk에서 Create Scrips - Create Component 메뉴를 통해 이름이 TimeManager인 새로운 스크립트 컴포넌트를 생성합니다. 2. **속성 선언**: TimeManager 컴포넌트의 Property 블록에서 [Sync] 동기화 속성으로 boolean 타입의 isSunrise를 선언하고 기본값을 false로 설정합니다. 3. **OnUpdate 메서드**: TimeManager 컴포넌트의 Meth [original] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy [chunk_id] | Guides:176:2
[task] | distill [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | # EntityService 엔티티 탐색, 삭제, 유효성 체크를 제공하는 서비스입니다. `common` 컴포넌트에서 테스트할 것을 권장합니다. ## 엔티티 탐색 함수 월드 경로, 엔티티 ID, 모델 ID 등을 매개 변수로 받아 단일 또는 복수 엔티티를 반환합니다. ### GetEntityByPath() 월드 경로(path)와 일치하는 **단일** 엔티티를 반환합니다. 경로가 중복되면 가장 먼저 찾은 엔티티를 반환하므로, **유니크한 경로**의 엔티티 탐색에 권장됩니다. * **worldPath**: Hierarchy의 엔 [original] | # 학습 과정 소개 월드를 제작하다 보면 특정 엔티티를 탐색하여 받아오거나, 혹은 관련 있는 여러 엔티티를 한 번에 받아야 하는 상황이 자주 발생합니다. 이럴 때 [**EntityService**](/apiReference/Services/EntityService)를 활용할 수 있습니다. **EntityService**는 엔티티 탐색, 삭제, 유효성 체크 등의 기능을 제공하고 있습니다. 이번 과정에서는 **EntityService**에서 제공하는 기능의 사용법을 하나씩 알아보도록 하겠습니다. **테스트 환경** **common [chunk_id] | Guides:201:0
[task] | distill [title] | Entity Event System [category] | Guides [rephrased] | # 이벤트 Entity Event System (일출/일몰 예제) 특정 시간마다 해가 뜨고 지는 로직과 이를 트리거하는 입력 이벤트를 처리하는 예제입니다. ## 1. TimeManager 컴포넌트 `TimeManager` 스크립트 컴포넌트를 생성하여 시간 관리와 이벤트 전송을 수행합니다. * **Property**: `[Sync]` 속성 `isSunrise` (boolean) * **Method**: * `OnUpdate`: 서버에서 실행되며, `delta` 기반 시간 누적 및 5초 주기 상태 전환 후 `S [original] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy [chunk_id] | Guides:176:2
[task] | extract_knowledge [title] | Entity Event System [category] | Guides [rephrased] | # Entity Event System 메이플스토리 월드에서는 `Entity Event System`을 통해 컴포넌트 간 이벤트를 제어합니다. 이 시스템은 컴포넌트가 엔티티를 중계자로 사용하여 핸들러를 등록하고 이벤트를 발생시키는 구조입니다. 기본적으로 컴포넌트는 자신의 엔티티에 이벤트를 연결하지만, 맵 엔티티와 월드 엔티티처럼 다른 엔티티 간에 이벤트를 주고받는 경우에도 동일한 방식으로 동작합니다. ## 1. 개념 설명 - **중계자 역할**: 컴포넌트는 직접 이벤트를 주고받는 것이 아니라, 소속된 엔티티를 매개로 핸들러 등 [original] | # 학습 과정 소개 메이플스토리 월드에서는 Entity Event System을 사용해 이벤트를 제어할 수 있습니다. 이번 시간에는 Entity Event System을 이용해 "뱀파이어 vs 헌터"의 게임 요소 중 하나를 만들어봅시다. 다음 가이드를 먼저 학습하면 이번 과정을 이해하는 데 많은 도움이 됩니다. [Event System](https://mod-developers.nexon.com/docs?postId=73) # Entity Event System 이벤트를 받고 보내려면 먼저 Entity Event System을 [chunk_id] | Guides:176:0
[task] | diverse_qa [title] | Entity Event System [category] | Guides [rephrased] | 질문: 해가 뜨고 지는 시간을 관리하기 위해 생성하는 스크립트 컴포넌트의 이름은 무엇인가요? 답변: TimeManager입니다. 질문: TimeManager 컴포넌트를 생성하기 위해 Workspace의 MyDesk에서 어떤 메뉴 경로를 따라가야 하나요? 답변: Create Scrips - Create Component 경로를 따라가야 합니다. 질문: TimeManager의 OnUpdate 함수는 어떤 실행 공간에서 동작하나요? 답변: [server only] 실행 공간에서 동작합니다. 질문: 아래 코드는 어떤 기능을 수행하나요 [original] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy [chunk_id] | Guides:176:2
[task] | extract_knowledge [title] | 엔티티의 충돌 [category] | Guides [rephrased] | # 충돌 엔티티의 충돌 처리 메이플스토리 월드에서 두 엔티티가 부딪혔을 때(`TriggerComponent`를 가진 엔티티끼리) 발생하는 충돌 이벤트 이후의 액션(예: 체력 감소, 엔티티 소멸 등)을 처리하는 방법은 크게 두 가지입니다. 1. **Entity Event System 활용**: 스크립트 컴포넌트(리액터)에 이벤트 핸들러를 등록하여 충돌 이벤트를 수신하고 액션을 수행하는 방식입니다. 2. **확장된 TriggerComponent 활용**: 원본 `TriggerComponent`를 확장(Extend)하여 내부 함수 [original] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충 [chunk_id] | Guides:175:1
[task] | knowledge_list [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | 제공된 문서 원문에 명시된 정보만 기반으로 `EntityService`의 핵심 사실과 API를 추출하여 정리한 목록입니다. 1. `EntityService`는 엔티티의 탐색, 삭제, 유효성 체크 기능을 제공하며, 월드 경로, 엔티티 ID, 모델 ID 등을 매개변수로 받아 엔티티를 반환합니다. 2. `_EntityService:GetEntityByPath(worldPath)` 함수는 월드 경로와 일치하는 단일 엔티티를 반환하며, 동일한 경로가 여러 개 존재할 경우 가장 먼저 찾은 엔티티를 반환하므로 경로가 유니크한 엔티티 탐색에 권 [original] | # 학습 과정 소개 월드를 제작하다 보면 특정 엔티티를 탐색하여 받아오거나, 혹은 관련 있는 여러 엔티티를 한 번에 받아야 하는 상황이 자주 발생합니다. 이럴 때 [**EntityService**](/apiReference/Services/EntityService)를 활용할 수 있습니다. **EntityService**는 엔티티 탐색, 삭제, 유효성 체크 등의 기능을 제공하고 있습니다. 이번 과정에서는 **EntityService**에서 제공하는 기능의 사용법을 하나씩 알아보도록 하겠습니다. **테스트 환경** **common [chunk_id] | Guides:201:0
[task] | wikipedia [title] | Entity Event System [category] | Guides [rephrased] | # 이벤트 Entity Event System 이벤트 시스템(Entity Event System)은 게임 객체(Entity) 간에 상태 변경이나 특정 동작을 알리는 데 사용되는 메커니즘입니다. 본 문서에서는 특정 시간 간격으로 해가 뜨고 지는 로직을 구현하고, 이를 트리거로 하는 스킬 시스템을 만드는 과정을 통해 `SendEvent` 및 이벤트 핸들링 방법을 설명합니다. ## 1. TimeManager 스크립트 컴포넌트 작성 해가 뜨고 지는 시간을 관리하기 위해 `TimeManager`라는 이름의 스크립트 컴포넌트를 생성해야 [original] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy [chunk_id] | Guides:176:2
[task] | wikipedia [title] | Entity Event System [category] | Guides [rephrased] | # 이벤트 Entity Event System 이벤트 Entity Event System은 특정 엔티티가 발생시킨 이벤트를 다른 엔티티의 스크립트 컴포넌트가 수신하여 로직을 처리하는 구조를 제공한다. 본 문서에서는 **HunterComponent**와 **VampireComponent**를 예시로 들어, 두 컴포넌트가 공통적으로 **SunriseEvent**를 수신하고 이를 바탕으로 각자의 생명체량(HP)을 다르게 조작하는 과정을 설명한다. ## 이벤트 수신 설정 **HunterComponent**와 **VampireCompo [original] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma [chunk_id] | Guides:176:1
[task] | knowledge_list [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | ```lua -- 문서에 포함된 핵심 사실 목록 ``` 1. `_EntityService:GetEntitiesSpawnedByModelId(modelId)` 는 매개변수로 전달된 모델 ID 와 일치하는 모델로부터 생성된 모든 엔티티를 반환하며, 반환 값은 엔티티를 포함하는 테이블입니다. 2. `_EntityService:GetEntitiesSpawnedByModel(model)` 는 매개변수로 전달된 모델 객체로부터 생성된 모든 엔티티를 반환하며, 반환 값은 엔티티를 포함하는 테이블입니다. 3. `_EntityService:Get [original] | 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. 다음과 같이 수많은 엔티티가 배치된 상황에서 NPC와 같이 동일 모델로부터 생성된 모든 엔티티를 받고 싶을 때 유용하게 사용됩니다. 특정 엔티티에 접근하여 모델을 받은 뒤, 해당 모델로부터 생성된 모든 엔티티를 받을 수 있습니다. ```lua void GetEntitiesSpawnedByModelIdExample() { local modelId = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1").Mode [chunk_id] | Guides:201:1
[task] | diverse_qa [title] | Entity Event System [category] | Guides [rephrased] | 질문: HunterComponent와 VampireComponent가 공통으로 수신하도록 설정해야 하는 이벤트는 무엇인가요? 답변: 두 컴포넌트 모두 SunriseEvent를 받도록 설정해야 합니다. 질문: SunriseEvent의 중계 엔티티(중계자)는 어디로 설정해야 하나요? 답변: SunriseEvent의 중계 엔티티는 map01으로 설정해야 합니다. 질문: HunterComponent에서 해가 떴을 때 HP가 증가하는 로직은 어떤 조건에서 실행되나요? 답변: self.isSunrise가 true인 경우, 즉 해가 떠 있을 [original] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma [chunk_id] | Guides:176:1
[task] | wikipedia [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | # EntityService: 심화 엔티티 탐색 월드를 제작하는 과정에서 특정 엔티티를 탐색하여 가져오거나, 관련이 있는 여러 엔티티를 일괄적으로 처리해야 하는 상황이 빈번하게 발생합니다. 이러한 요구 사항을 충족하기 위해 **EntityService**를 활용할 수 있습니다. **EntityService**는 엔티티의 탐색, 삭제, 유효성 검증 등 다양한 기능을 제공합니다. 본 섹션에서는 **EntityService**가 제공하는 주요 기능의 사용법을 자세히 살펴봅니다. 테스트를 수행할 때는 **common** 컴포넌트를 생성 [original] | # 학습 과정 소개 월드를 제작하다 보면 특정 엔티티를 탐색하여 받아오거나, 혹은 관련 있는 여러 엔티티를 한 번에 받아야 하는 상황이 자주 발생합니다. 이럴 때 [**EntityService**](/apiReference/Services/EntityService)를 활용할 수 있습니다. **EntityService**는 엔티티 탐색, 삭제, 유효성 체크 등의 기능을 제공하고 있습니다. 이번 과정에서는 **EntityService**에서 제공하는 기능의 사용법을 하나씩 알아보도록 하겠습니다. **테스트 환경** **common [chunk_id] | Guides:201:0
[task] | distill [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | # EntityService: 심화 엔티티 탐색 및 유효성 체크 `_EntityService`는 모델 ID, 모델 객체, 또는 태그를 기반으로 엔티티를 탐색하고, 엔티티의 삭제(유효성) 상태를 관리합니다. ## 1. 모델 기반 엔티티 탐색 동일 모델로부터 생성된 모든 엔티티를 반환합니다. ### `GetEntitiesSpawnedByModelId(modelId)` 모델 ID와 일치하는 모든 엔티티를 반환합니다. ```lua local modelId = _EntityService:GetEntityByPath("/maps/map [original] | 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. 다음과 같이 수많은 엔티티가 배치된 상황에서 NPC와 같이 동일 모델로부터 생성된 모든 엔티티를 받고 싶을 때 유용하게 사용됩니다. 특정 엔티티에 접근하여 모델을 받은 뒤, 해당 모델로부터 생성된 모든 엔티티를 받을 수 있습니다. ```lua void GetEntitiesSpawnedByModelIdExample() { local modelId = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1").Mode [chunk_id] | Guides:201:1
[task] | diverse_qa [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | 질문: EntityService는 주로 어떤 기능을 제공합니까? 답변: EntityService는 엔티티 탐색, 삭제, 유효성 체크 등의 기능을 제공합니다. 질문: EntityService에서 엔티티를 탐색하는 함수는 몇 개 제공됩니까? 답변: EntityService에서는 8개의 엔티티를 탐색하는 함수를 제공합니다. 질문: GetEntityByPath() 함수는 어떤 엔티티를 반환합니까? 답변: GetEntityByPath() 함수는 월드 상의 경로(path)와 일치하는 단일 엔티티를 반환합니다. 질문: GetEntityBy [original] | # 학습 과정 소개 월드를 제작하다 보면 특정 엔티티를 탐색하여 받아오거나, 혹은 관련 있는 여러 엔티티를 한 번에 받아야 하는 상황이 자주 발생합니다. 이럴 때 [**EntityService**](/apiReference/Services/EntityService)를 활용할 수 있습니다. **EntityService**는 엔티티 탐색, 삭제, 유효성 체크 등의 기능을 제공하고 있습니다. 이번 과정에서는 **EntityService**에서 제공하는 기능의 사용법을 하나씩 알아보도록 하겠습니다. **테스트 환경** **common [chunk_id] | Guides:201:0
[task] | distill [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | # EntityService: 심화 엔티티 탐색 엔티티 생성/파괴 시 발생하는 이벤트를 처리하여 동적 객제 제어가 가능합니다. `Entity Event Handler` 블록을 통해 등록합니다. ## EntityCreateEvent 엔티티가 생성될 때 발생하며, 이벤트 객체에 생성된 `Entity` 정보가 포함됩니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map [original] | 엔티티가 생성될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 생성된 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬스터 엔티티 스폰 [chunk_id] | Guides:201:3