[task] | diverse_qa [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | 질문: 엔티티가 삭제될 때 발생하는 이벤트는 무엇이며, 어디서 핸들러를 추가할 수 있나요? 답변: 엔티티가 삭제될 때 발생하는 이벤트는 `HandleEntityDestroyEvent`이며, **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 질문: `HandleEntityDestroyEvent` 핸들러의 매개 변수로 전달되는 이벤트 객체에는 어떤 정보가 포함되어 있나요? 답변: 이벤트 객체에는 삭제 대기 중인 엔티티의 정보가 포함되어 있습니다. 질문: 다음 코드에서 `_TimerService:SetTi [original] | 엔티티가 삭제될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 삭제 대기 중인 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬 [chunk_id] | Guides:201:4
[task] | extract_knowledge [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | # EntityService: 엔티티 삭제 및 유효성 검사 ## 개념 설명 `EntityService`는 맵 내 특정 경로에 있는 엔티티를 검색하고, 이를 삭제하거나 상태(존재/삭제)를 확인하는 데 사용됩니다. 엔티티는 `_EntityService:Destroy` 메서드 또는 엔티티 객체 자체의 `Destroy` 메서드를 통해 삭제할 수 있습니다. 삭제 후 엔티티가 더 이상 유효하지 않은지 확인하기 위해 `_EntityService:IsValid` 또는 전역 함수 `isvalid`를 사용합니다. 엔티티의 생성 또는 삭제 시점은 [original] | 매개 변수로 전달한 엔티티를 삭제합니다. ```lua void DestroyExample() { local entity = _EntityService:GetEntityByPath("/maps/map01/Monster1_1") _EntityService:Destroy(entity) if isvalid(entity) == false then log("Entity is destroyed") end } ``` 꼭 `EntityService:Destroy`를 사용하지 않고도, 엔티티의 ` [chunk_id] | Guides:201:2
[task] | knowledge_list [title] | 스크립트 디버그 [category] | Guides [rephrased] | 제시된 문서에서 추출한 핵심 사실 목록입니다. 1. 디버깅 중 중단점에서 실행이 멈춘 상태일 때, '다음 중단점까지 이동', '프로시저 단위 실행', '한 단계씩 코드 실행', '프로시저 나가기' 기능을 통해 단위별로 코드를 실행하며 상태와 흐름을 파악할 수 있으며, 이 버튼들은 디버그가 시작되면 디버그 시작/중지 버튼 옆에 노출됩니다. 2. '다음 중단점까지 이동' 버튼은 단축키 `F5`를 사용하며, 현재 실행된 라인에서 다음 중단점이 설정된 코드 라인까지 코드를 실행합니다. 3. '프로시저 단위 실행' 버튼은 단축키 `F10` [original] | 중단점을 설정한 코드를 확인했을 때 문제가 없다면, 혹은 해당 코드 아래 줄의 상태도 함께 확인하고 싶다면 어떻게 해야 할까요? 확인하고자 하는 모든 코드 라인에 중단점을 설정할 수도 없고, 매번 디버그 시작/중지를 반복하며 중단점 설정 해제를 반복하는 것도 비효율적입니다. 디버깅 중 중단점에서 플레이가 멈춘 뒤, 중단점이 설정된 라인 이후로 코드를 실행하는 방법이 있습니다. **프로시저 단위 실행**, **한 단계씩 코드 실행** 등을 통해 단위별로 코드를 실행하며 코드의 상태나 흐름을 파악할 수 있습니다. 단위별 코드 실행은 디 [chunk_id] | Guides:202:3
[task] | distill [title] | 점프대 만들기 [category] | Guides [rephrased] | # 점프대 만들기 (Spring) `TriggerComponent`를 확장하여 캐릭터 충돌 시 물리적 힘을 가하는 예제입니다. ## 1. 컴포넌트 생성 1. `TriggerComponent`를 **Extend** 하여 **Spring** 컴포넌트 생성. ## 2. 스크립트 구현 `Spring` 컴포넌트에 `OnEnterTriggerBody` 메서드를 추가하여 충돌 처리 로직을 작성합니다. * **동작 규칙**: * 충돌 대상(`enterEvent.TriggerBodyEntity`)의 `RigidbodyCompo [original] | # 학습 과정 소개 점프대에 닿으면 캐릭터가 높이 솟아오르는 점프대를 만들어 봅니다. 이번 예제를 통해 확장 스크립트 작성법과 스크립트를 통해 물체와의 충돌 및 충돌 시 처리, 그리고 물체에 물리적인 힘을 가하는 방법에 대해 알아봅니다. 추가로 컴포넌트에 프로퍼티를 추가하고, 오브젝트별로 다른 프로퍼티 값을 설정하는 방법을 알아봅니다. # 점프대 배치하기 1. **Preset List**에서 스프링 모양의 모델(object-4575)을 찾아 맵에 배치합니다. # TriggerComponent로 충돌 기능 활용하기 물체와 [chunk_id] | Guides:203:0
[task] | knowledge_list [title] | 점프대 만들기 [category] | Guides [rephrased] | 1. 점프대 예제는 모델 ID `object-4575`를 맵에 배치하여 시작하며, 이 과정은 Preset List에서 해당 모델을 검색하고 선택하는 절차로 이루어집니다. 2. 충돌 감지 및 처리를 위해 `TriggerComponent`를 확장하여 `Spring`이라는 이름의 새 스크립트 컴포넌트를 생성해야 합니다. 3. `Spring` 컴포넌트는 `TriggerComponent`의 `OnEnterTriggerBody(TriggerEnterEvent enterEvent)` 메서드를 오버라이드하여 충돌 이벤트를 처리합니다. 4. `On [original] | # 학습 과정 소개 점프대에 닿으면 캐릭터가 높이 솟아오르는 점프대를 만들어 봅니다. 이번 예제를 통해 확장 스크립트 작성법과 스크립트를 통해 물체와의 충돌 및 충돌 시 처리, 그리고 물체에 물리적인 힘을 가하는 방법에 대해 알아봅니다. 추가로 컴포넌트에 프로퍼티를 추가하고, 오브젝트별로 다른 프로퍼티 값을 설정하는 방법을 알아봅니다. # 점프대 배치하기 1. **Preset List**에서 스프링 모양의 모델(object-4575)을 찾아 맵에 배치합니다. # TriggerComponent로 충돌 기능 활용하기 물체와 [chunk_id] | Guides:203:0
[task] | knowledge_list [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 제시된 문서 내용만을 바탕으로 추출한 핵심 사실 목록입니다. 1. 본 가이드는 몬스터 스폰, 몬스터 처치 시 아이템 드랍, 인벤토리에 아이템 저장하는 일련의 과정을 구현하는 것을 목표로 하며, 총 5편으로 구성된 시리즈의 1편입니다. 2. 월드 제작 시 편의를 위해 "기본" 템플릿을 사용하여 월드를 생성하는 것이 권장됩니다. 3. 해당 스폰 규칙은 맵 내 몬스터 최대 개체 수를 10마리로 제한합니다. 4. 리스폰 로직은 5초 주기로 맵 내 현재 몬스터 수를 체크하여, 최대 수량(10마리) 대비 부족한 수만큼만 몬스터를 생성하도록 [original] | # 학습 과정 소개 몬스터를 스폰한 뒤, 몬스터를 처치하면 아이템을 드랍하고 이 아이템을 인벤토리에 저장하는 일련의 과정을 구현해 봅시다. > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**몬스터를 스폰해보자**](/docs?postId=204) > 2편. [몬스터 드랍 아이템과 인벤토리 UI 만들기](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 [chunk_id] | Guides:204:0
[task] | extract_knowledge [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | # EntityService: 엔티티 생성 및 삭제 이벤트 핸들링 ## 개념 설명 mLua에서는 엔티티의 상태 변화, 특히 **생성(Create)** 과 **삭제(Destroy)** 시점에 발생하는 이벤트를 처리하기 위해 `EntityService` 이벤트 핸들러를 사용합니다. * **HandleEntityCreateEvent**: 엔티티가 생성될 때 발화되며, 매개변수로 `EntityCreateEvent` 객체를 전달받습니다. * **HandleEntityDestroyEvent**: 엔티티가 삭제될 때 발화되며, 매개변 [original] | 엔티티가 삭제될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 삭제 대기 중인 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬 [chunk_id] | Guides:201:4
[task] | extract_knowledge [title] | 스크립트 디버그 [category] | Guides [rephrased] | # mLua 스크립트 디버깅 ## 개념 설명 mLua 스크립트 디버깅은 실행 중인 스크립트의 상태를 정지시켜 코드의 흐름과 변수 값을 확인하는 과정입니다. 디버깅 세션이 시작되면 월드가 정상 플레이되다가, 미리 설정한 **중단점(Breakpoint)**에 도달한 시점에 실행이 일시 정지됩니다. 이를 통해 특정 라인에서 변수나 프로퍼티에 할당된 값, 실행 공간, 타입 등을 상세히 파악할 수 있습니다. ## API 및 도구 사용법 mLua의 디버깅 기능은 IDE의 패널과 단축 조작으로 제어됩니다. ### 1. 중단점 관리 중단 [original] | 중단점을 비활성화할 때는 마우스 왼쪽 버튼을 클릭합니다. 비활성화된 중단점은 ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1769135859948681fdb075cef4ee7ab4fed9f2f4d4ebd.png "breakpoint4"), ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1769135881421982425439c154f54a9f5db45be1c38a6.png "breakpoint5") 로 표시되며, ** [chunk_id] | Guides:202:2
[task] | knowledge_list [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 1. `MonsterSpawn` 스크립트 컴포넌트를 생성하여 몬스터 스폰 기능을 구현하는 첫 단계입니다. 2. `SpawnMonster()` 메서드 내에서 `_EntityService:GetEntityByPath("/maps/map01")` 호출을 통해 부모 엔티티를 조회합니다. 3. `_SpawnService:SpawnByModelId` 메서드는 모델 ID(Entry ID), 엔티티 이름, 좌표(Vector3), 부모 엔티티를 매개변수로 받아 몬스터를 스폰합니다. 4. `_SpawnService:SpawnByModelId` 호출 [original] | 이제 스크립트를 통해 몬스터 스폰 기능을 만들어보겠습니다. 우선은 특정 좌표에 몬스터를 스폰해 보고 점차 기능을 확장해 봅시다. 1. 새 스크립트 컴포넌트 **MonsterSpawn**을 생성합니다. 2. **MonsterSpawn** 스크립트를 열어 `SpawnMonster()` 함수를 추가합니다. 3. `SpawnMonster()` 함수를 다음과 같이 작성합니다. ```lua void SpawnMonster() { local parent = _EntityServ [chunk_id] | Guides:204:1
[task] | wikipedia [title] | 스크립트 디버그 [category] | Guides [rephrased] | # 스크립트 디버깅 메이플스토리 월드의 스크립트 디버거는 중단점(Breakpoint)을 통한 코드 실행 정지 및 상태 확인 기능을 제공합니다. 중단점을 설정한 라인에서 코드가 멈춘 후, 해당 라인 이후의 코드 실행 흐름을 제어하거나 특정 변수의 값 변화를 추적할 수 있으며, 이는 복잡한 로직의 오류를 찾기 위해 필수적인 도구입니다. ## 단위별 코드 실행 중단점에서 플레이가 멈춘 상태에서 다음 중단점까지 바로 이동하지 않고, 코드 실행의 단위를 조절하여 상태를 세밀하게 파악할 수 있는 기능입니다. 디버그 세션이 시작되면 디버그 [original] | 중단점을 설정한 코드를 확인했을 때 문제가 없다면, 혹은 해당 코드 아래 줄의 상태도 함께 확인하고 싶다면 어떻게 해야 할까요? 확인하고자 하는 모든 코드 라인에 중단점을 설정할 수도 없고, 매번 디버그 시작/중지를 반복하며 중단점 설정 해제를 반복하는 것도 비효율적입니다. 디버깅 중 중단점에서 플레이가 멈춘 뒤, 중단점이 설정된 라인 이후로 코드를 실행하는 방법이 있습니다. **프로시저 단위 실행**, **한 단계씩 코드 실행** 등을 통해 단위별로 코드를 실행하며 코드의 상태나 흐름을 파악할 수 있습니다. 단위별 코드 실행은 디 [chunk_id] | Guides:202:3
[task] | diverse_qa [title] | 점프대 만들기 [category] | Guides [rephrased] | 질문: 이번 학습 과정에서 만들 점프대의 주요 기능은 무엇인가요? 답변: 점프대에 닿으면 캐릭터가 높이 솟아오르는 기능을 만드는 것입니다. 질문: 이 예제를 통해 학습할 수 있는 주요 기술 요소 세 가지를 모두 나열하시오. 답변: 확장 스크립트 작성법, 스크립트를 통한 물체와의 충돌 및 충돌 시 처리, 그리고 물체에 물리적인 힘을 가하는 방법입니다. 질문: 점프대 모델은 Preset List에서 어떤 모양의 모델로 찾을 수 있나요? 답변: 스프링 모양의 모델(object-4575)입니다. 질문: 물체와 충돌했을 때 특정 액션을 [original] | # 학습 과정 소개 점프대에 닿으면 캐릭터가 높이 솟아오르는 점프대를 만들어 봅니다. 이번 예제를 통해 확장 스크립트 작성법과 스크립트를 통해 물체와의 충돌 및 충돌 시 처리, 그리고 물체에 물리적인 힘을 가하는 방법에 대해 알아봅니다. 추가로 컴포넌트에 프로퍼티를 추가하고, 오브젝트별로 다른 프로퍼티 값을 설정하는 방법을 알아봅니다. # 점프대 배치하기 1. **Preset List**에서 스프링 모양의 모델(object-4575)을 찾아 맵에 배치합니다. # TriggerComponent로 충돌 기능 활용하기 물체와 [chunk_id] | Guides:203:0
[task] | wikipedia [title] | 점프대 만들기 [category] | Guides [rephrased] | # 점프대 만들기 메이플스토리 월드의 응용 제작 가이드 중 '점프대 만들기'는 캐릭터가 특정 오브젝트에 닿으면 높이 솟아오르는 점프대 기능을 구현하는 예제입니다. 이 과정을 통해 확장 스크립트 작성법, 물체 충돌 감지 및 충돌 시 처리 로직, 그리고 물체에 물리적인 힘을 가하는 방법을 학습할 수 있습니다. 또한 컴포넌트에 프로퍼티를 추가하고 오브젝트별로 다른 프로퍼티 값을 설정하는 방법도 함께 다루고 있습니다. ## 점프대 배치 점프대 오브젝트를 맵에 배치하는 과정은 다음과 같습니다. 먼저 **Preset List**에서 스프 [original] | # 학습 과정 소개 점프대에 닿으면 캐릭터가 높이 솟아오르는 점프대를 만들어 봅니다. 이번 예제를 통해 확장 스크립트 작성법과 스크립트를 통해 물체와의 충돌 및 충돌 시 처리, 그리고 물체에 물리적인 힘을 가하는 방법에 대해 알아봅니다. 추가로 컴포넌트에 프로퍼티를 추가하고, 오브젝트별로 다른 프로퍼티 값을 설정하는 방법을 알아봅니다. # 점프대 배치하기 1. **Preset List**에서 스프링 모양의 모델(object-4575)을 찾아 맵에 배치합니다. # TriggerComponent로 충돌 기능 활용하기 물체와 [chunk_id] | Guides:203:0
[task] | wikipedia [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 몬스터 스폰 시스템 구현 가이드 본 가이드는 메이플스토리 월드(MapleStory Worlds)에서 몬스터를 스폰하고, 몬스터 처치 시 아이템이 드랍되며 해당 아이템을 인벤토리에 저장하는 일련의 과정을 구현하는 방법을 다룹니다. 본 학습 과정은 총 5편으로 구성되어 있으며, 다음과 같은 순서로 진행됩니다. 1. **1편.** [몬스터를 스폰해보자](/docs?postId=204) 2. **2편.** [몬스터 드랍 아이템과 인벤토리 UI 만들기](/docs?postId=943) 3. **3편.** [인벤토리 스크립트 작성하기] [original] | # 학습 과정 소개 몬스터를 스폰한 뒤, 몬스터를 처치하면 아이템을 드랍하고 이 아이템을 인벤토리에 저장하는 일련의 과정을 구현해 봅시다. > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**몬스터를 스폰해보자**](/docs?postId=204) > 2편. [몬스터 드랍 아이템과 인벤토리 UI 만들기](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 [chunk_id] | Guides:204:0
[task] | knowledge_list [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 1. `MonsterSpawn` 스크립트 에디터에서 `Vector3` 타입을 반환하는 `GetRandomPosition()` 함수를 정의하여, 주어진 좌표 기준의 스폰 영역 내에서 랜덤한 x 좌표를 계산하고 y 좌표와 z 좌표(0)를 조합한 `Vector3` 객체를 반환합니다. 2. `GetRandomPosition()` 함수 내부에서 `_UtilLogic:RandomIntegerRange(0, 100)` 메서드를 호출하여 0부터 100 사이의 정수를 생성하고, 이를 100으로 나누어 0.0~1.0 범위의 소수로 변환한 후 스폰 영 [original] | 지정한 영역 안에서 랜덤한 위치에 몬스터를 스폰하는 기능을 추가하겠습니다. 위에 확인했던 좌표를 기준으로 스폰 영역을 정의하고, 영역 내 랜덤한 위치에 몬스터를 스폰해 봅시다. 1. **MonsterSpawn**을 스크립트 에디터에서 열고 **Vector3** 타입의 새 함수 `GetRandomPosition()`을 추가합니다. 2. `GetRandomPosition()` 함수를 다음과 같이 작성합니다. 위에서 기록해두었던 좌표를 함수에 활용합니다. ```lua Vector3 GetRandomPositio [chunk_id] | Guides:204:2
[task] | distill [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | **몬스터 스폰 구현 가이드** ### 1. 스크립트 컴포넌트 구성 `MonsterSpawn` 컴포넌트를 생성하고 `SpawnMonster()` 메서드를 정의합니다. ```lua void SpawnMonster() { local parent = _EntityService:GetEntityByPath("/maps/map01") _SpawnService:SpawnByModelId( "Entry ID", "SpawnedMonster", Vector3(0,0,0), [original] | 이제 스크립트를 통해 몬스터 스폰 기능을 만들어보겠습니다. 우선은 특정 좌표에 몬스터를 스폰해 보고 점차 기능을 확장해 봅시다. 1. 새 스크립트 컴포넌트 **MonsterSpawn**을 생성합니다. 2. **MonsterSpawn** 스크립트를 열어 `SpawnMonster()` 함수를 추가합니다. 3. `SpawnMonster()` 함수를 다음과 같이 작성합니다. ```lua void SpawnMonster() { local parent = _EntityServ [chunk_id] | Guides:204:1
[task] | diverse_qa [title] | 스크립트 디버그 [category] | Guides [rephrased] | 질문: 디버깅 중 중단점에서 멈춘 후, 중단점 설정 해제 없이 이후 코드를 실행하며 상태를 확인하기 위한 방법에는 어떤 것들이 있나요? 답변: 프로시저 단위 실행, 한 단계씩 코드 실행, 다음 중단점까지 이동, 프로시저 나가기 등 단위별 코드 실행 기능을 사용할 수 있습니다. 질문: '다음 중단점까지 이동' 버튼의 단축키는 무엇이며, 어떤 기능을 수행하나요? 답변: 단축키는 F5이며, 현재까지 실행된 라인에서 다음 중단점이 있는 코드 라인까지 코드를 실행하는 기능입니다. 질문: '프로시저 단위 실행' 버튼의 단축키와 동작 방식을 [original] | 중단점을 설정한 코드를 확인했을 때 문제가 없다면, 혹은 해당 코드 아래 줄의 상태도 함께 확인하고 싶다면 어떻게 해야 할까요? 확인하고자 하는 모든 코드 라인에 중단점을 설정할 수도 없고, 매번 디버그 시작/중지를 반복하며 중단점 설정 해제를 반복하는 것도 비효율적입니다. 디버깅 중 중단점에서 플레이가 멈춘 뒤, 중단점이 설정된 라인 이후로 코드를 실행하는 방법이 있습니다. **프로시저 단위 실행**, **한 단계씩 코드 실행** 등을 통해 단위별로 코드를 실행하며 코드의 상태나 흐름을 파악할 수 있습니다. 단위별 코드 실행은 디 [chunk_id] | Guides:202:3
[task] | diverse_qa [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 질문: 본 가이드가 다루는 학습 과정의 주요 목표는 무엇인가요? 답변: 몬스터를 스폰한 뒤, 몬스터를 처치하면 아이템을 드랍하고 이 아이템을 인벤토리에 저장하는 일련의 과정을 구현하는 것입니다. 질문: 본 가이드는 전체 5편 중 몇 번째에 해당하며, 직전 편(1편)의 제목은 무엇인가요? 답변: 본 가이드는 2편에 해당하며, 직전 편인 1편의 제목은 '몬스터를 스폰해보자'입니다. 질문: 메이플 스토리의 필드에서 몬스터가 지속적으로 스폰되는 원리는 무엇인가요? 답변: 각 필드 단위별로 스폰할 몬스터와 스폰할 몬스터의 수를 설정하여, [original] | # 학습 과정 소개 몬스터를 스폰한 뒤, 몬스터를 처치하면 아이템을 드랍하고 이 아이템을 인벤토리에 저장하는 일련의 과정을 구현해 봅시다. > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**몬스터를 스폰해보자**](/docs?postId=204) > 2편. [몬스터 드랍 아이템과 인벤토리 UI 만들기](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 [chunk_id] | Guides:204:0
[task] | distill [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 몬스터 스폰 시스템 구현 (1편) 몬스터 처치 시 아이템 드랍 및 인벤토리 저장 과정의 첫 단계로, 필드별 스폰 규칙을 설정하여 몬스터를 생성하는 시스템을 구현합니다. ## 스폰 규칙 * **최대 개체 수**: 10마리 * **리스폰 주기**: 5초마다 현재 맵 내 몬스터 수를 체크하여, 최대 수량 부족분만큼 리스폰 * **스포인 위치**: 특정 영역 내 랜덤 위치 * **대상 몬스터**: Preset List에서 선택한 몬스터 ## 준비 작업 1. **월드 템플릿**: 제작 편의를 위해 "기본" 템플릿으로 [original] | # 학습 과정 소개 몬스터를 스폰한 뒤, 몬스터를 처치하면 아이템을 드랍하고 이 아이템을 인벤토리에 저장하는 일련의 과정을 구현해 봅시다. > 본 가이드는 아래의 순서로 이어지는 과정입니다. > **▶ 1편.** [**몬스터를 스폰해보자**](/docs?postId=204) > 2편. [몬스터 드랍 아이템과 인벤토리 UI 만들기](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 [chunk_id] | Guides:204:0
[task] | extract_knowledge [title] | 스크립트 디버그 [category] | Guides [rephrased] | # mLua 디버깅: 중단점(BreakPoint) 설정과 관리 ## 1. 개념 설명 mLua 디버거는 스크립트 실행 중 특정 라인에서 실행을 일시 정지하거나 조건부 로그를 출력하기 위해 **중단점(BreakPoint)** 기능을 제공합니다. * **수명 주기**: 디버그 세션이 시작되거나 종료된 상태와 무관하게 언제든 중단점을 추가, 수정, 삭제할 수 있습니다. 편집된 설정은 디버그 실행 상태에 관계없이 유지됩니다. * **접근 방법**: 편집기에서 마우스 오른쪽 버튼을 클릭하여 **BreakPoint Settings* [original] | 디버그를 시작했거나 종료한 이후 등 언제든 중단점을 편집할 수 있습니다. 디버그 실행 상태와 관계 없이 편집된 내용은 유지됩니다. 중단점은 마우스 오른쪽 버튼을 클릭해 **BreakPoint Settings** 창을 열고 편집할 수 있습니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/177319929868794f98eef19be40fb98fbc36f88291b3a.png "BreakingPoint Settings") | 번호 | 이름 | 설명 | | --- | --- [chunk_id] | Guides:202:1
[task] | extract_knowledge [title] | 엔티티를 탐색하는 EntityService [category] | Guides [rephrased] | # 심화 엔티티 탐색 및 유효성 검사 (EntityService) `_EntityService`는 맵에 배치된 엔티티를 모델 ID, 모델 객체, 태그를 기준으로 검색하거나, 특정 엔티티의 삭제 여부(유효성)를 검사하기 위한 서비스를 제공합니다. ## 1. 개념 설명 ### 1.1 모델 기반 엔티티 탐색 맵에는 동일한 모델로부터 생성된 여러 엔티티(예: 동일한 NPC 모델의 여러 인스턴스)가 존재할 수 있습니다. `EntityService`는 이러한 동일 모델의 엔티티들을 일괄적으로 조회하는 기능을 제공합니다. * **모델 [original] | 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. 다음과 같이 수많은 엔티티가 배치된 상황에서 NPC와 같이 동일 모델로부터 생성된 모든 엔티티를 받고 싶을 때 유용하게 사용됩니다. 특정 엔티티에 접근하여 모델을 받은 뒤, 해당 모델로부터 생성된 모든 엔티티를 받을 수 있습니다. ```lua void GetEntitiesSpawnedByModelIdExample() { local modelId = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1").Mode [chunk_id] | Guides:201:1
[task] | distill [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | **몬스터 랜덤 스폰 및 스폰 제한** 지정된 영역 내 랜덤 좌표 계산 및 몬스터 스폰 기능을 구현합니다. ### 1. 랜덤 좌표 계산 함수 `MonsterSpawn` 컴포넌트에 `Vector3` 타입 반환 함수 `GetRandomPosition()`을 추가합니다. 영역 좌표(`leftX`, `rightX`, `y`)를 기반으로 x축 랜덤 값을 생성합니다. ```lua Vector3 GetRandomPosition() { local leftX = -3.571 -- 스폰 영역 왼쪽의 x좌표 local rightX [original] | 지정한 영역 안에서 랜덤한 위치에 몬스터를 스폰하는 기능을 추가하겠습니다. 위에 확인했던 좌표를 기준으로 스폰 영역을 정의하고, 영역 내 랜덤한 위치에 몬스터를 스폰해 봅시다. 1. **MonsterSpawn**을 스크립트 에디터에서 열고 **Vector3** 타입의 새 함수 `GetRandomPosition()`을 추가합니다. 2. `GetRandomPosition()` 함수를 다음과 같이 작성합니다. 위에서 기록해두었던 좌표를 함수에 활용합니다. ```lua Vector3 GetRandomPositio [chunk_id] | Guides:204:2
[task] | diverse_qa [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 질문: 몬스터를 스폰하기 위해 새로 생성해야 하는 스크립트 컴포넌트의 이름은 무엇인가요? 답변: MonsterSpawn 질문: `SpawnMonster()` 함수 내에서 몬스터를 스폰하기 위해 `_SpawnService`의 어떤 함수를 호출하는가요? 답변: `SpawnByModelId` 함수를 호출합니다. 질문: 다음 코드는 무엇을 하는 코드인가요? ```lua local parent = _EntityService:GetEntityByPath("/maps/map01") _SpawnService:SpawnByModelId( [original] | 이제 스크립트를 통해 몬스터 스폰 기능을 만들어보겠습니다. 우선은 특정 좌표에 몬스터를 스폰해 보고 점차 기능을 확장해 봅시다. 1. 새 스크립트 컴포넌트 **MonsterSpawn**을 생성합니다. 2. **MonsterSpawn** 스크립트를 열어 `SpawnMonster()` 함수를 추가합니다. 3. `SpawnMonster()` 함수를 다음과 같이 작성합니다. ```lua void SpawnMonster() { local parent = _EntityServ [chunk_id] | Guides:204:1
[task] | wikipedia [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 몬스터 스폰 주기 및 최대 수량 제한 본 섹션에서는 지정한 영역 내에서 몬스터가 랜덤한 위치에 스폰되도록 하는 기능을 구현하는 과정을 다룹니다. 이전에 기록한 좌표를 기반으로 스폰 영역을 정의하고, 해당 영역 내부의 랜덤한 좌표 값을 계산하여 몬스터를 생성하는 방식입니다. 구현을 위해 `MonsterSpawn` 스크립트를 열고, 반환 타입이 `Vector3`인 새 함수 `GetRandomPosition()`을 추가합니다. 이 함수는 스폰 영역의 좌표 정보를 바탕으로 무작위 위치를 산출합니다. 구체적으로, 영역의 왼쪽 X 좌표 [original] | 지정한 영역 안에서 랜덤한 위치에 몬스터를 스폰하는 기능을 추가하겠습니다. 위에 확인했던 좌표를 기준으로 스폰 영역을 정의하고, 영역 내 랜덤한 위치에 몬스터를 스폰해 봅시다. 1. **MonsterSpawn**을 스크립트 에디터에서 열고 **Vector3** 타입의 새 함수 `GetRandomPosition()`을 추가합니다. 2. `GetRandomPosition()` 함수를 다음과 같이 작성합니다. 위에서 기록해두었던 좌표를 함수에 활용합니다. ```lua Vector3 GetRandomPositio [chunk_id] | Guides:204:2
[task] | extract_knowledge [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 몬스터 스폰 기능 구현 ## 1. 개념 설명 mLua 스크립트에서는 `_SpawnService`를 활용하여 특정 좌표에 몬스터를 스폰할 수 있습니다. 이 과정에서 엔티티로 생성할 모델은 반드시 **Workspace**에 추가되어 있어야 하며, 해당 모델의 **Entry ID**를 매개변수로 전달해야 합니다. Entry ID는 Workspace에 추가된 모델의 컨텍스트 메뉴에서 **Copy Entry ID**를 통해 복사할 수 있습니다. ## 2. API 사용법 - **`_SpawnService:SpawnByModelId(id [original] | 이제 스크립트를 통해 몬스터 스폰 기능을 만들어보겠습니다. 우선은 특정 좌표에 몬스터를 스폰해 보고 점차 기능을 확장해 봅시다. 1. 새 스크립트 컴포넌트 **MonsterSpawn**을 생성합니다. 2. **MonsterSpawn** 스크립트를 열어 `SpawnMonster()` 함수를 추가합니다. 3. `SpawnMonster()` 함수를 다음과 같이 작성합니다. ```lua void SpawnMonster() { local parent = _EntityServ [chunk_id] | Guides:204:1
[task] | extract_knowledge [title] | 스크립트 디버그 [category] | Guides [rephrased] | # mLua 스크립트 디버깅: 코드 흐름 추적 및 상태 모니터링 mLua 스크립트 디버거는 중단점(Breakpoint)을 설정하여 실행을 일시정지한 후, 코드의 실행 흐름을 단위별로 제어하고 변수의 상태 변화를 추적하며, 함수 호출 계층을 확인하는 기능을 제공합니다. ## 1. 개념 설명 중단점에서 코드가 멈춘 상태에서도 매번 중단점을 설정/해제하거나 디버그 세션을 반복하지 않고, 현재 라인 이후의 코드를 특정 단위로 실행하여 논리 흐름과 변수 값을 파악할 수 있습니다. 주요 기능은 다음과 같습니다. * **단위별 코드 [original] | 중단점을 설정한 코드를 확인했을 때 문제가 없다면, 혹은 해당 코드 아래 줄의 상태도 함께 확인하고 싶다면 어떻게 해야 할까요? 확인하고자 하는 모든 코드 라인에 중단점을 설정할 수도 없고, 매번 디버그 시작/중지를 반복하며 중단점 설정 해제를 반복하는 것도 비효율적입니다. 디버깅 중 중단점에서 플레이가 멈춘 뒤, 중단점이 설정된 라인 이후로 코드를 실행하는 방법이 있습니다. **프로시저 단위 실행**, **한 단계씩 코드 실행** 등을 통해 단위별로 코드를 실행하며 코드의 상태나 흐름을 파악할 수 있습니다. 단위별 코드 실행은 디 [chunk_id] | Guides:202:3
[task] | diverse_qa [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 질문: `GetRandomPosition()` 함수의 반환 타입은 무엇인가요? 답변: `GetRandomPosition()` 함수의 반환 타입은 **Vector3** 입니다. 질문: 스폰 영역의 왼쪽 x좌표(`leftX`)와 오른쪽 x좌표(`rightX`) 값은 각각 얼마인가요? 답변: 스폰 영역의 왼쪽 x좌표(`leftX`)는 **-3.571**, 오른쪽 x좌표(`rightX`)는 **2.688** 입니다. 질문: `GetRandomPosition()` 함수에서 `areaWidth` 변수는 어떻게 계산되나요? 답변: `area [original] | 지정한 영역 안에서 랜덤한 위치에 몬스터를 스폰하는 기능을 추가하겠습니다. 위에 확인했던 좌표를 기준으로 스폰 영역을 정의하고, 영역 내 랜덤한 위치에 몬스터를 스폰해 봅시다. 1. **MonsterSpawn**을 스크립트 에디터에서 열고 **Vector3** 타입의 새 함수 `GetRandomPosition()`을 추가합니다. 2. `GetRandomPosition()` 함수를 다음과 같이 작성합니다. 위에서 기록해두었던 좌표를 함수에 활용합니다. ```lua Vector3 GetRandomPositio [chunk_id] | Guides:204:2
[task] | wikipedia [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 몬스터 스폰과 아이템 획득: 몬스터를 스폰해 보자 본 가이드는 mLua 스크립트를 통해 몬스터 스폰 기능을 구현하는 방법을 단계별로 설명합니다. 특정 좌표에 몬스터를 생성하는 기본 구조부터 시작하여, 점차 기능을 확장하는 과정을 다룹니다. ## 1. 특정 좌표에 몬스터 스폰하기 ### 1. 스크립트 컴포넌트 생성 및 함수 작성 먼저 `MonsterSpawn`이라는 이름의 새 스크립트 컴포넌트를 생성합니다. 생성된 `MonsterSpawn` 스크립트 파일을 열고 `SpawnMonster()`라는 이름의 메서드를 추가합니다. [original] | 이제 스크립트를 통해 몬스터 스폰 기능을 만들어보겠습니다. 우선은 특정 좌표에 몬스터를 스폰해 보고 점차 기능을 확장해 봅시다. 1. 새 스크립트 컴포넌트 **MonsterSpawn**을 생성합니다. 2. **MonsterSpawn** 스크립트를 열어 `SpawnMonster()` 함수를 추가합니다. 3. `SpawnMonster()` 함수를 다음과 같이 작성합니다. ```lua void SpawnMonster() { local parent = _EntityServ [chunk_id] | Guides:204:1
[task] | knowledge_list [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 1. `MonsterSpawn` 컴포넌트의 `GetRandomPosition()` 메서드에 매개변수 `number spawnCount`를 추가하고, 반환 타입을 `table`로 변경하여 주어진 개수만큼의 스폰 좌표 배열을 생성하도록 수정합니다. 2. 수정된 `GetRandomPosition(number spawnCount)` 메서드는 스폰 영역 좌표(`leftX: -3.571`, `rightX: 2.688`, `y: 0.170`)를 기반으로 `_UtilLogic:RandomIntegerRange(0, 100) / 100` 값을 활용 [original] | 이번에는 5초마다 한 마리씩 스폰하는 것이 아니라, 5초마다 현재 몬스터 수량을 체크하여 최대 몬스터 수량보다 부족한 만큼 생성하도록 수정해 봅시다. 1. **MonsterSpawn**의 `GetRandomPosition()` 함수에 매개 변수를 하나 추가합니다. 2. 매개 변수 타입은 **number**로, 이름은 **spawnCount**로 설정하고, 리턴 타입을 **table**로 변경합니다. 함수는 다음과 같이 수정합니다. ```lua table GetRandomPosition(nu [chunk_id] | Guides:204:4
[task] | extract_knowledge [title] | 점프대 만들기 [category] | Guides [rephrased] | # 점프대(스프링) 구현: 충돌 감지 및 물리적 힘 적용 ## 1. 개념 설명 메이플스토리 월드에서 물체와 충돌했을 때 특정 액션을 수행하기 위해서는 `TriggerComponent`를 사용해야 합니다. 본 절에서는 `TriggerComponent`를 상속(Extend)하여 확장 스크립트 컴포넌트를 생성하고, 충돌 이벤트(`OnEnterTriggerBody`)를 처리하는 방법을 다룹니다. 충돌 이벤트 발생 시, 충돌 대상 엔티티의 `RigidbodyComponent`를 통해 물리적인 힘(`SetForce`)을 가함으로써 캐릭터를 [original] | # 학습 과정 소개 점프대에 닿으면 캐릭터가 높이 솟아오르는 점프대를 만들어 봅니다. 이번 예제를 통해 확장 스크립트 작성법과 스크립트를 통해 물체와의 충돌 및 충돌 시 처리, 그리고 물체에 물리적인 힘을 가하는 방법에 대해 알아봅니다. 추가로 컴포넌트에 프로퍼티를 추가하고, 오브젝트별로 다른 프로퍼티 값을 설정하는 방법을 알아봅니다. # 점프대 배치하기 1. **Preset List**에서 스프링 모양의 모델(object-4575)을 찾아 맵에 배치합니다. # TriggerComponent로 충돌 기능 활용하기 물체와 [chunk_id] | Guides:203:0
[task] | distill [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 일정 시간마다 부족한 수량만큼 스폰 5초 간격으로 몬스터를 스폰하되, 유효한 개수가 `MaxSpawnCount`(기본 10) 미만일 때만 생성하는 기능입니다. ### 1. 프로퍼티 ```lua Property: [Sync] number MaxSpawnCount = 10 [Sync] number Time = 0 [None] table MonsterArray = {} ``` ### 2. 초기화 (`OnBeginPlay`) 서버 시작 시 스폰 목록을 초기화합니다. ```lua [server only] void OnBeginPla [original] | 이번에는 5초마다 몬스터를 한 마리씩 추가로 스폰하되, 최대 10개까지만 생성하는 기능을 만들어보겠습니다. 1. **MonsterSpawn**을 열고 프로퍼티를 추가합니다. ```lua Property: [Sync] number MaxSpawnCount = 10 [Sync] number Time = 0 [None] table MonsterArray = {} ``` 2. `OnBeginPlay()` 함수를 다음과 같이 수정합니다. ```lua [chunk_id] | Guides:204:3