[task] | knowledge_list [title] | 프로퍼티 [category] | Guides [rephrased] | 1. 프로퍼티는 컴포넌트의 멤버 변수이며, 엔티티별로 서로 다른 값을 가질 수 있습니다. 2. 메이플스토리 월드의 프로퍼티는 루아 변수와 달리 선언 시점에 타입을 명시적으로 설정해야 하며, 이를 통해 값 대입 및 참조가 가능합니다. 3. 프로퍼티는 컴포넌트 외부에서도 접근 가능하며, 함수 내에서 값을 읽거나 쓸 수 있습니다. 4. 프로퍼티는 `[Sync]` 또는 `[None]` 등 동기화 설정을 통해 서버와 클라이언트 간의 동기화 여부를 지정할 수 있습니다. 5. 새 프로퍼티는 Workspace의 MyDesk에서 Create Scr [original] | # 학습 과정 소개 이번 과정에서는 메이플스토리 월드의 프로퍼티가 무엇인지 알아봅니다. 또한 프로퍼티 선언 및 초깃값 설정, 프로퍼티 동기화 방법 등 프로퍼티 관련 정보를 살펴보겠습니다. # MSW의 프로퍼티 프로퍼티는 컴포넌트의 멤버 변수로써, 엔티티 별로 다른 값을 가질 수 있습니다. 프로퍼티는 세 가지 특징이 있습니다. * 루아 변수와 달리 메이플스토리 월드의 프로퍼티는 선언할 때 타입을 설정하고, 값을 대입하거나 참조할 수 있습니다. * 컴포넌트 내 외부에서 프로퍼티에 접근할 수 있고, 각 함수에서 값을 읽거나 쓸 수 [chunk_id] | Guides:205:0
[task] | distill [title] | 프로퍼티 [category] | Guides [rephrased] | # MSW 프로퍼티 (Property) 프로퍼티는 컴포넌트의 멤버 변수로, 엔티티별로 다른 값을 가질 수 있습니다. 루아 변수와 달리 **선언 시 타입 지정이 필수**하며, 외부 접근 및 서버-클라이언트 간 동기화 설정이 가능합니다. ## 선언 및 관리 * **생성**: 스크립트 에디터의 `[+]` 버튼으로 추가. 이름, 타입, 초깃값, 동기화 여부(`[Sync]` 등) 설정. * **삭제**: 프로퍼티 우측 `[⋮]` 메뉴의 `Remove` 클릭. ## 타입 및 동작 규칙 ### string 문자열 값을 저장. 연결 [original] | # 학습 과정 소개 이번 과정에서는 메이플스토리 월드의 프로퍼티가 무엇인지 알아봅니다. 또한 프로퍼티 선언 및 초깃값 설정, 프로퍼티 동기화 방법 등 프로퍼티 관련 정보를 살펴보겠습니다. # MSW의 프로퍼티 프로퍼티는 컴포넌트의 멤버 변수로써, 엔티티 별로 다른 값을 가질 수 있습니다. 프로퍼티는 세 가지 특징이 있습니다. * 루아 변수와 달리 메이플스토리 월드의 프로퍼티는 선언할 때 타입을 설정하고, 값을 대입하거나 참조할 수 있습니다. * 컴포넌트 내 외부에서 프로퍼티에 접근할 수 있고, 각 함수에서 값을 읽거나 쓸 수 [chunk_id] | Guides:205:0
[task] | knowledge_list [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 제시된 문서 내용을 바탕으로 추출한 핵심 사실 목록입니다. ```lua 1. MonsterSpawn 컴포넌트는 [Sync] 속성을 가진 number 타입의 MaxSpawnCount 프로퍼티(기본값 10)를 정의하여 최대 스폰 수를 관리합니다. 2. MonsterSpawn 컴포넌트는 [Sync] 속성을 가진 number 타입의 Time 프로퍼티(기본값 0)를 정의하여 스폰 간격 타이머 역할을 수행합니다. 3. MonsterSpawn 컴포넌트는 [None] 속성을 가진 table 타입의 MonsterArray 프로퍼티(기본값 {})를 [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
[task] | diverse_qa [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 질문: 이 가이드에서 구현하려는 주요 기능은 무엇인가요? 답변: 5초마다 몬스터를 한 마리씩 추가로 스폰하되, 최대 10개까지만 생성하는 기능을 만들어보는 것입니다. 질문: `MonsterSpawn` 컴포넌트에서 `MaxSpawnCount` 프로퍼티의 기본값과 동기화 속성은 무엇인가요? 답변: 기본값은 10이며, 동기화 속성은 `[Sync]`입니다. 질문: `MonsterArray` 프로퍼티의 타입과 동기화 속성은 어떻게 설정되어 있나요? 답변: 타입은 `table`이고 동기화 속성은 `[None]`입니다. 질문: `OnBeg [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
[task] | distill [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 몬스터 수량 기반 스폰 (mLua) 기존의 고정 간격 스폰 방식을 **현재 몬스터 수량 확인 → 최대 수량 대비 부족한 만큼 스폰**하는 로직으로 변경합니다. ### 1. `GetRandomPosition()` 수정 매개변수 `number spawnCount` 추가 및 리턴 타입을 `table`로 변경합니다. 지정된 횟수만큼의 `Vector3` 좌표 테이블을 반환합니다. ```lua table GetRandomPosition(number spawnCount) { local leftX = -3.571 local [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. 개념 설명 이 절에서는 지정한 좌표 범위(영역) 내에서 몬스터를 랜덤한 위치에 스폰하는 로직을 구현합니다. 구현은 두 단계로 나뉩니다. 1. **랜덤 위치 계산**: 스폰 영역의 좌표 경계를 정의하고, 해당 범위 내의 x좌표를 랜덤하게 추출하여 `Vector3` 객체를 반환하는 함수(`GetRandomPosition`)를 정의합니다. 2. **몬스터 스폰**: 계산된 랜덤 위치를 파라미터로 전달하여 `_SpawnService`를 통해 실제 엔티티를 생성하는 함수(`SpawnMons [original] | 지정한 영역 안에서 랜덤한 위치에 몬스터를 스폰하는 기능을 추가하겠습니다. 위에 확인했던 좌표를 기준으로 스폰 영역을 정의하고, 영역 내 랜덤한 위치에 몬스터를 스폰해 봅시다. 1. **MonsterSpawn**을 스크립트 에디터에서 열고 **Vector3** 타입의 새 함수 `GetRandomPosition()`을 추가합니다. 2. `GetRandomPosition()` 함수를 다음과 같이 작성합니다. 위에서 기록해두었던 좌표를 함수에 활용합니다. ```lua Vector3 GetRandomPositio [chunk_id] | Guides:204:2
[task] | knowledge_list [title] | 프로퍼티 [category] | Guides [rephrased] | 제시된 문서의 내용만 기반으로 핵심 사실을 추출하여 목록으로 정리합니다. 1. **table** 타입의 프로퍼티는 루아 테이블을 참조하며, `[Sync]` 속성을 사용하여 동기화(Sync)되지 않습니다. 2. **table** 타입의 프로퍼티는 `[None]` 동기화 속성을 가지며, 초기값으로 `{1,2,3,4,5}` 형태의 배열을 지정할 수 있습니다. 3. **SyncTable< v >** 타입은 루아 테이블 형태이지만 `next` 함수를 사용할 수 없는 제약이 있으며, value에만 정해진 타입 목록 중 하나를 설정할 수 [original] | #### table 루아 테이블을 참조합니다. 동기화(Sync)는 되지 않습니다. ```lua Property: [None] table TableProperty = {1,2,3,4,5} Method: [Server Only] void OnBeginPlay() { local tmpTable = self.TableProperty self.TableProperty[1] = 10 log("tmpTable : "..tmpTable[1]) --콘솔 창에 "tmpTable : 10" 출력 log("TablePr [chunk_id] | Guides:205:1
[task] | distill [title] | 프로퍼티 [category] | Guides [rephrased] | ### table - **동기화**: 비동기화(No Sync). - **특징**: 일반 Lua 테이블 참조. ```lua Property: [None] table TableProperty = {1,2,3,4,5} Method: [Server Only] void OnBeginPlay() { local tmpTable = self.TableProperty self.TableProperty[1] = 10 log("tmpTable : "..tmpTable[1]) -- tmpTable : 10 log("Tab [original] | #### table 루아 테이블을 참조합니다. 동기화(Sync)는 되지 않습니다. ```lua Property: [None] table TableProperty = {1,2,3,4,5} Method: [Server Only] void OnBeginPlay() { local tmpTable = self.TableProperty self.TableProperty[1] = 10 log("tmpTable : "..tmpTable[1]) --콘솔 창에 "tmpTable : 10" 출력 log("TablePr [chunk_id] | Guides:205:1
[task] | diverse_qa [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | 질문: 이번 수정의 주요 목적은 무엇인가요? 답변: 5초마다 한 마리씩 스폰하는 방식에서 벗어나, 5초마다 현재 몬스터 수량을 체크하여 최대 몬스터 수량보다 부족한 만큼만 생성하도록 하는 것입니다. 질문: `GetRandomPosition()` 함수에 추가하는 매개 변수의 이름과 타입은 무엇인가요? 답변: 매개 변수의 이름은 `spawnCount`이고, 타입은 `number`입니다. 질문: `GetRandomPosition()` 함수의 리턴 타입은 무엇으로 변경해야 하나요? 답변: 리턴 타입은 `table`로 변경해야 합니다. [original] | 이번에는 5초마다 한 마리씩 스폰하는 것이 아니라, 5초마다 현재 몬스터 수량을 체크하여 최대 몬스터 수량보다 부족한 만큼 생성하도록 수정해 봅시다. 1. **MonsterSpawn**의 `GetRandomPosition()` 함수에 매개 변수를 하나 추가합니다. 2. 매개 변수 타입은 **number**로, 이름은 **spawnCount**로 설정하고, 리턴 타입을 **table**로 변경합니다. 함수는 다음과 같이 수정합니다. ```lua table GetRandomPosition(nu [chunk_id] | Guides:204:4
[task] | wikipedia [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 몬스터 스폰 및 아이템 획득: 최대 수량 기반 동적 스폰 구현 이 가이드는 메이플스토리 월드 스크립트 언어 mLua 환경에서 몬스터 스폰 로직을 수정하여, 고정된 주기로 단일 개체를 생성하는 방식 대신 현재 스폰된 몬스터 수를 실시간으로 확인하고 최대 허용 수량보다 부족한 만큼만 생성하도록 하는 방법을 다룹니다. ## 1. `GetRandomPosition` 함수 수정 먼저 `MonsterSpawn` 컴포넌트의 `GetRandomPosition()` 함수에 매개 변수를 추가합니다. 매개 변수의 타입은 **number**, [original] | 이번에는 5초마다 한 마리씩 스폰하는 것이 아니라, 5초마다 현재 몬스터 수량을 체크하여 최대 몬스터 수량보다 부족한 만큼 생성하도록 수정해 봅시다. 1. **MonsterSpawn**의 `GetRandomPosition()` 함수에 매개 변수를 하나 추가합니다. 2. 매개 변수 타입은 **number**로, 이름은 **spawnCount**로 설정하고, 리턴 타입을 **table**로 변경합니다. 함수는 다음과 같이 수정합니다. ```lua table GetRandomPosition(nu [chunk_id] | Guides:204:4
[task] | wikipedia [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 일정 시간마다 부족한 수량만큼 스폰 이 가이드에서는 5초 간격으로 몬스터를 스폰하되, 맵에 존재하는 몬스터의 총 개수가 최대 10마리를 초과하지 않도록 제어하는 `MonsterSpawn` 컴포넌트 구현 방법을 다룹니다. 이 기능은 서버 측에서 타이머를 관리하여 주기적으로 현재 몬스터 수를 검증하고, 한도에 도달하지 않았다면 새 몬스터를 생성하는 로직으로 구성됩니다. ## 1. 프로퍼티 정의 `MonsterSpawn` 컴포넌트에 필요한 상태 변수를 프로퍼티 블록에 추가합니다. `MaxSpawnCount`는 스폰 가능한 최대 [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
[task] | diverse_qa [title] | 프로퍼티 [category] | Guides [rephrased] | 질문: 메이플스토리 월드(MSW)에서 프로퍼티(Property)는 무엇을 의미합니까? 답변: 프로퍼티는 컴포넌트의 멤버 변수로써, 엔티티 별로 다른 값을 가질 수 있는 변수입니다. 질문: MSW의 프로퍼티는 일반적인 루아(Lua) 변수와 어떻게 다른가요? 답변: 루아 변수와 달리 MSW의 프로퍼티는 선언할 때 타입을 설정해야 하며, 값을 대입하거나 참조할 수 있습니다. 질문: 컴포넌트 내 외부에서 프로퍼티에 접근할 수 있나요? 답변: 네, 컴포넌트 내 외부에서 프로퍼티에 접근할 수 있고, 각 함수에서 값을 읽거나 쓸 수 있습니다 [original] | # 학습 과정 소개 이번 과정에서는 메이플스토리 월드의 프로퍼티가 무엇인지 알아봅니다. 또한 프로퍼티 선언 및 초깃값 설정, 프로퍼티 동기화 방법 등 프로퍼티 관련 정보를 살펴보겠습니다. # MSW의 프로퍼티 프로퍼티는 컴포넌트의 멤버 변수로써, 엔티티 별로 다른 값을 가질 수 있습니다. 프로퍼티는 세 가지 특징이 있습니다. * 루아 변수와 달리 메이플스토리 월드의 프로퍼티는 선언할 때 타입을 설정하고, 값을 대입하거나 참조할 수 있습니다. * 컴포넌트 내 외부에서 프로퍼티에 접근할 수 있고, 각 함수에서 값을 읽거나 쓸 수 [chunk_id] | Guides:205:0
[task] | distill [title] | 프로퍼티 [category] | Guides [rephrased] | **Vector3** 3차원 벡터/위치 표현용 참조 타입. `Vector2`보다 `z` 멤버가 추가됩니다. `TransformComponent.Position` 할당 시 제외하면 주로 `Vector2`를 사용하세요. ```lua Method: [Server Only] void OnBeginPlay() { local tmpVector3 = Vector3(10,10,10) local Vt1 = tmpVector3 tmpVector3.x = 20 log(Vt1) -- (20.000, 20.000, 20.00 [original] | 3차원 벡터와 위치를 표현합니다. **Vector2**와 마찬가지로 프로퍼티 또는 변수에 할당 시 참조됩니다. **Vector2**에서 멤버 변수 z가 추가됩니다. **TransformComponent**의 **Position**에 할당할 때를 제외하곤 주로 **Vector2**를 사용합니다. 값의 생성과 참조, 그리고 멤버 변수 x, y, z에 접근하는 방법은 아래를 참고합니다. ```lua Method: [Server Only] void OnBeginPlay() { local tmpVector3 = Vector3(10, [chunk_id] | Guides:205:2
[task] | wikipedia [title] | 프로퍼티 [category] | Guides [rephrased] | # 학습 과정 소개 본 학습 과정에서는 메이플스토리 월드의 프로퍼티 개념을 이해하고, 프로퍼티의 선언 방법, 초기값 설정, 그리고 서버와 클라이언트 간의 동기화 방식을 다루는 것을 목표로 합니다. # MSW의 프로퍼티 프로퍼티는 컴포넌트의 멤버 변수로서, 개별 엔티티마다 서로 다른 값을 가질 수 있습니다. 프로퍼티는 다음 세 가지 주요 특징을 지닙니다. 첫째, 일반적인 Lua 변수와 달리 메이플스토리 월드의 프로퍼티는 선언 시점에 반드시 타입을 지정해야 하며, 이후 값을 대입하거나 참조할 수 있습니다. 둘째, 컴포넌트 외부에 [original] | # 학습 과정 소개 이번 과정에서는 메이플스토리 월드의 프로퍼티가 무엇인지 알아봅니다. 또한 프로퍼티 선언 및 초깃값 설정, 프로퍼티 동기화 방법 등 프로퍼티 관련 정보를 살펴보겠습니다. # MSW의 프로퍼티 프로퍼티는 컴포넌트의 멤버 변수로써, 엔티티 별로 다른 값을 가질 수 있습니다. 프로퍼티는 세 가지 특징이 있습니다. * 루아 변수와 달리 메이플스토리 월드의 프로퍼티는 선언할 때 타입을 설정하고, 값을 대입하거나 참조할 수 있습니다. * 컴포넌트 내 외부에서 프로퍼티에 접근할 수 있고, 각 함수에서 값을 읽거나 쓸 수 [chunk_id] | Guides:205:0
[task] | extract_knowledge [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 몬스터 스폰 시스템 구현 ## 개념 설명 메이플스토리 월드에서 몬스터 스폰 시스템은 맵 내 특정 조건에 따라 몬스터가 생성되는 메커니즘을 정의합니다. 이는 실제 게임 필드에서 몬스터가 일정 마릿수 내에서 지속적으로 유지되는 방식을 모방합니다. 주요 구성 요소는 다음과 같습니다: * **스포너(Spawner) 로직**: 맵에 존재하는 몬스터 수를 주기적으로 확인합니다. * **최대 개체 수 제한**: 맵에 동시 존재할 수 있는 몬스터의 최대 수량을 지정합니다. * **리스폰 주기**: 몬스터 수를 확인하고 부족한 [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] | # 프로퍼티 (Property) ## Component와 ComponentRef 컴포넌트를 참조하는 프로퍼티 타입입니다. 두 타입의 기본 사용법은 동일하며, 참조 방식에 따라 차이가 있습니다. * **Component**: 컴포넌트를 직접 참조합니다. 다른 맵으로 이동 후 복귀 시 참조가 끊어져 사용할 수 없습니다. * **ComponentRef**: 컴포넌트의 키 값을 저장하고, 실제 접근 시점에 컴포넌트를 검색합니다. 맵 이동 후에도 안정적으로 접근 가능합니다. 그러나 접근 시마다 검색을 수행하므로 `Component [original] | 컴포넌트 가리키는 프로퍼티입니다. 프로퍼티 타입을 Component 선택 후, 버튼을 눌러 특정 컴포넌트를 타입으로 설정할 수 있습니다. Component와 ComponentRef의 기본 사용법은 동일하며, 참조 방식이 다릅니다. * Component: 컴포넌트를 직접 참조합니다. 다른 맵에 갔다 오면 참조가 끊어지고 프로퍼티를 사용할 수 없게 됩니다. * ComponentRef: 컴포넌트의 키 값을 가지고 있다가 실제 접근할 때 컴포넌트를 찾습니다. 다른 맵에 갔다 왔을 때 원래 가리키던 컴포넌트에 문제없이 접근할 수 있습니다. [chunk_id] | Guides:205:3
[task] | diverse_qa [title] | 프로퍼티 [category] | Guides [rephrased] | 질문: mLua에서 `table` 타입의 프로퍼티는 동기화(Sync)가 가능한가요? 답변: 아니요, `table` 타입은 루아 테이블을 참조하며 동기화(Sync)는 되지 않습니다. 질문: 아래 코드를 실행했을 때 `log("tmpTable : "..tmpTable[1])`의 출력 결과는 무엇인가요? ```lua Property: [None] table TableProperty = {1,2,3,4,5} Method: [Server Only] void OnBeginPlay() { local tmpTable = self.Ta [original] | #### table 루아 테이블을 참조합니다. 동기화(Sync)는 되지 않습니다. ```lua Property: [None] table TableProperty = {1,2,3,4,5} Method: [Server Only] void OnBeginPlay() { local tmpTable = self.TableProperty self.TableProperty[1] = 10 log("tmpTable : "..tmpTable[1]) --콘솔 창에 "tmpTable : 10" 출력 log("TablePr [chunk_id] | Guides:205:1
[task] | knowledge_list [title] | 프로퍼티 [category] | Guides [rephrased] | 제공된 문서 내용에만 근거하여 핵심 사실을 정리한 목록입니다. 1. `Vector3`은 3차원 벡터와 위치를 표현하는 참조 타입이며, 프로퍼티 또는 변수에 할당 시 참조 방식으로 동작합니다. 2. `Vector3`은 `Vector2`에 멤버 변수 `z`가 추가된 형태이며, `TransformComponent`의 `Position`에 할당할 때를 제외하고는 주로 `Vector2`를 사용하는 것이 일반적입니다. 3. `Vector3` 객체는 생성자 `Vector3(x, y, z)`로 생성되며, 멤버 변수 `x`, `y`, `z`에 직 [original] | 3차원 벡터와 위치를 표현합니다. **Vector2**와 마찬가지로 프로퍼티 또는 변수에 할당 시 참조됩니다. **Vector2**에서 멤버 변수 z가 추가됩니다. **TransformComponent**의 **Position**에 할당할 때를 제외하곤 주로 **Vector2**를 사용합니다. 값의 생성과 참조, 그리고 멤버 변수 x, y, z에 접근하는 방법은 아래를 참고합니다. ```lua Method: [Server Only] void OnBeginPlay() { local tmpVector3 = Vector3(10, [chunk_id] | Guides:205:2
[task] | distill [title] | 프로퍼티 [category] | Guides [rephrased] | # 프로퍼티 접근 ### 같은 컴포넌트 내 접근 `self.프로퍼티명`으로 접근합니다. ```lua Property: [None] string StringProperty = "Hello!!" Method: [Server Only] void OnBeginPlay() { local stringProperty = self.StringProperty } ``` ### 다른 컴포넌트 접근 타겟 엔티티를 `_EntityService:GetEntityByPath(path)`로 가져온 후, `엔티티.컴포넌트명.프로퍼티명` 순서로 [original] | 함수에서 프로퍼티에 접근하는 방법을 알아봅시다. 먼저 같은 컴포넌트에서는 다음과 같이 접근할 수 있습니다. ```lua Property: [None] string StringProperty = "Hello!!" Method: [Server Only] void OnBeginPlay() { local stringProperty = self.StringProperty --"self.프로퍼티명"으로 해당 프로퍼티를 가져옴 } ``` 다른 컴포넌트의 프로퍼티는 다음과 같이 접근할 수 있습니다. 아래 상황에서 접근하는 방법 [chunk_id] | Guides:205:4
[task] | knowledge_list [title] | 프로퍼티 [category] | Guides [rephrased] | 제시된 문서의 내용만을 바탕으로 핵심 사실을 정리한 목록입니다. **1. Component 프로퍼티 타입** `Component` 타입의 프로퍼티는 특정 컴포넌트를 직접 참조하며, 다른 맵으로 이동 후 복귀 시 참조가 끊어져 프로퍼티를 사용할 수 없게 됩니다. **2. ComponentRef 프로퍼티 타입** `ComponentRef` 타입의 프로퍼티는 컴포넌트의 키 값을 저장해 두고 실제 접근 시점에 컴포넌트를 탐색하므로 다른 맵으로 이동 후 복귀해도 문제없이 접근할 수 있지만, 매 접근마다 탐색을 수행하기 때문에 `Compo [original] | 컴포넌트 가리키는 프로퍼티입니다. 프로퍼티 타입을 Component 선택 후, 버튼을 눌러 특정 컴포넌트를 타입으로 설정할 수 있습니다. Component와 ComponentRef의 기본 사용법은 동일하며, 참조 방식이 다릅니다. * Component: 컴포넌트를 직접 참조합니다. 다른 맵에 갔다 오면 참조가 끊어지고 프로퍼티를 사용할 수 없게 됩니다. * ComponentRef: 컴포넌트의 키 값을 가지고 있다가 실제 접근할 때 컴포넌트를 찾습니다. 다른 맵에 갔다 왔을 때 원래 가리키던 컴포넌트에 문제없이 접근할 수 있습니다. [chunk_id] | Guides:205:3
[task] | knowledge_list [title] | 프로퍼티 [category] | Guides [rephrased] | * 같은 컴포넌트 내에서 프로퍼티에 접근할 때는 `self.프로퍼티명` 형식을 사용하며, 예시에서는 `self.StringProperty`를 통해 `[None]` 동기화 속성인 `string StringProperty`의 값을 읽어옵니다. * 다른 엔티티에 속한 컴포넌트의 프로퍼티에 접근하려면 먼저 `_EntityService:GetEntityByPath(경로)` 메서드를 호출하여 대상 엔티티를 가져와야 하며, 매개변수로 엔티티 경로 문자열을 전달합니다. * 엔티티 객체를 통해 특정 컴포넌트를 참조할 때는 `엔티티명.컴포 [original] | 함수에서 프로퍼티에 접근하는 방법을 알아봅시다. 먼저 같은 컴포넌트에서는 다음과 같이 접근할 수 있습니다. ```lua Property: [None] string StringProperty = "Hello!!" Method: [Server Only] void OnBeginPlay() { local stringProperty = self.StringProperty --"self.프로퍼티명"으로 해당 프로퍼티를 가져옴 } ``` 다른 컴포넌트의 프로퍼티는 다음과 같이 접근할 수 있습니다. 아래 상황에서 접근하는 방법 [chunk_id] | Guides:205:4
[task] | extract_knowledge [title] | 몬스터를 스폰해 보자 [category] | Guides [rephrased] | # 일정 시간 간격으로 몬스터 스폰 제한 구현 본 절에서는 `MonsterSpawn` 컴포넌트를 사용하여 특정 시간 간격(5초)마다 몬스터를 스폰하되, 동시 존재하는 몬스터 수량이 지정된 최대치(`MaxSpawnCount`)를 초과하지 않도록 제어하는 방법을 다룹니다. 이 기능은 서버 측 로직으로 처리되며, 유효하지 않은 엔티티 참조가 테이블에서 제거되어 실제 존재하는 몬스터 수량이 정확히 계산됩니다. ## 1. 개념 설명 * **스포닝 간격 제어**: `OnUpdate` 이벤트 핸들러에서 매 프레임 업데이트되는 `delt [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
[task] | extract_knowledge [title] | 프로퍼티 [category] | Guides [rephrased] | # MSW 스크립트 프로퍼티 (Property) ## 1. 개념 설명 메이플스토리 월드(MSW)의 **프로퍼티(Property)** 는 스크립트 컴포넌트의 멤버 변수로, 엔티티별로 다른 값을 가질 수 있습니다. 일반적인 Lua 변수와 구별되는 세 가지 핵심 특징을 가집니다. 1. **타입 명시**: 선언 시점에 타입을 설정해야 하며, 값 대입 및 참조가 가능합니다. 2. **접근성**: 컴포넌트 외부에서 접근 가능하며, 함수 내부에서 값을 읽거나 쓸 수 있습니다. 3. **동기화 설정**: 서버와 클라이언트 간의 동기화 여 [original] | # 학습 과정 소개 이번 과정에서는 메이플스토리 월드의 프로퍼티가 무엇인지 알아봅니다. 또한 프로퍼티 선언 및 초깃값 설정, 프로퍼티 동기화 방법 등 프로퍼티 관련 정보를 살펴보겠습니다. # MSW의 프로퍼티 프로퍼티는 컴포넌트의 멤버 변수로써, 엔티티 별로 다른 값을 가질 수 있습니다. 프로퍼티는 세 가지 특징이 있습니다. * 루아 변수와 달리 메이플스토리 월드의 프로퍼티는 선언할 때 타입을 설정하고, 값을 대입하거나 참조할 수 있습니다. * 컴포넌트 내 외부에서 프로퍼티에 접근할 수 있고, 각 함수에서 값을 읽거나 쓸 수 [chunk_id] | Guides:205:0
[task] | distill [title] | 프로퍼티 [category] | Guides [rephrased] | # 프로퍼티 (Property) 프로퍼티는 컴포넌트 내 멤버 변수로, 함수 종료 후에도 값이 보존됩니다. 상태 누적이나 값 저장에 활용됩니다. ## 일반 프로퍼티 `Property:` 블록에서 선언하며, `[Sync]` 등을 지정할 수 있습니다. ```lua Property: [Sync] number AccTime = 0 Method: [server only] void OnUpdate(number delta) { self.AccTime = self.AccTime + delta if self.AccTime >= [original] | 프로퍼티는 컴포넌트 내 멤버 변수로, 함수에서 쓰고 읽어도 종료되지 않고 함수에서 설정한 값이 보존됩니다. 따라서 함수를 통해 어떤 값을 담아놓거나 함수를 반복 호출하여 값을 누적할 때 활용될 수 있습니다. 다음은 3초 간격으로 콘솔 창에 "HelloMSW"를 출력하는 예제입니다. ```lua Property: [Sync] number AccTime = 0 Method: [Server Only] void OnUpdate(delta) { self.AccTime = self.AccTime + delta --OnUpd [chunk_id] | Guides:205:5
[task] | diverse_qa [title] | 프로퍼티 [category] | Guides [rephrased] | 질문: Vector3 타입은 무엇을 표현하는 데 사용되며, Vector2와 비교했을 때 어떤 멤버 변수가 추가되나요? 답변: Vector3은 3차원 벡터와 위치를 표현하며, Vector2에 비해 멤버 변수 z가 추가됩니다. 질문: mLua에서 Vector3을 생성하고 x, y, z 값을 수정하는 과정을 보여주는 코드를 작성하세요. 답변: ```lua local tmpVector3 = Vector3(10, 10, 10) tmpVector3.x = 20 tmpVector3.y = 20 tmpVector3.z = 20 ``` 질문: [original] | 3차원 벡터와 위치를 표현합니다. **Vector2**와 마찬가지로 프로퍼티 또는 변수에 할당 시 참조됩니다. **Vector2**에서 멤버 변수 z가 추가됩니다. **TransformComponent**의 **Position**에 할당할 때를 제외하곤 주로 **Vector2**를 사용합니다. 값의 생성과 참조, 그리고 멤버 변수 x, y, z에 접근하는 방법은 아래를 참고합니다. ```lua Method: [Server Only] void OnBeginPlay() { local tmpVector3 = Vector3(10, [chunk_id] | Guides:205:2
[task] | wikipedia [title] | 프로퍼티 [category] | Guides [rephrased] | mLua 스크립트에서 테이블(table) 관련 프로퍼티는 데이터의 동기화 여부에 따라 `table`, `SyncTable< v >`, `SyncTable< k, v >`으로 구분됩니다. 또한 2차원 공간 좌표를 표현하기 위한 `Vector2` 타입이 존재합니다. 각 타입의 특징과 사용 방법은 다음과 같습니다. ### table `table` 타입은 표준 루아(Lua) 테이블을 참조하며, 네트워크 동기화(Sync) 기능이 지원되지 않습니다. 이 타입의 프로퍼티는 참조 변수로 동작하며, 테이블 자체의 값을 수정하거나 새로운 테이블로 [original] | #### table 루아 테이블을 참조합니다. 동기화(Sync)는 되지 않습니다. ```lua Property: [None] table TableProperty = {1,2,3,4,5} Method: [Server Only] void OnBeginPlay() { local tmpTable = self.TableProperty self.TableProperty[1] = 10 log("tmpTable : "..tmpTable[1]) --콘솔 창에 "tmpTable : 10" 출력 log("TablePr [chunk_id] | Guides:205:1
[task] | diverse_qa [title] | 프로퍼티 [category] | Guides [rephrased] | 질문: Component 프로퍼티 타입과 ComponentRef 프로퍼티 타입의 가장 큰 차이점은 무엇인가요? 답변: Component는 컴포넌트를 직접 참조하여 다른 맵으로 이동하면 참조가 끊어지는 반면, ComponentRef는 컴포넌트의 키 값을 가지고 있어 다른 맵으로 이동해도 원래 가리키던 컴포넌트에 문제없이 접근할 수 있습니다. 질문: ComponentRef가 Component보다 성능이 느린 이유는 무엇인가요? 답변: ComponentRef는 컴포넌트에 접근할 때마다 실제 컴포넌트를 다시 찾아야 하기 때문에 Compo [original] | 컴포넌트 가리키는 프로퍼티입니다. 프로퍼티 타입을 Component 선택 후, 버튼을 눌러 특정 컴포넌트를 타입으로 설정할 수 있습니다. Component와 ComponentRef의 기본 사용법은 동일하며, 참조 방식이 다릅니다. * Component: 컴포넌트를 직접 참조합니다. 다른 맵에 갔다 오면 참조가 끊어지고 프로퍼티를 사용할 수 없게 됩니다. * ComponentRef: 컴포넌트의 키 값을 가지고 있다가 실제 접근할 때 컴포넌트를 찾습니다. 다른 맵에 갔다 왔을 때 원래 가리키던 컴포넌트에 문제없이 접근할 수 있습니다. [chunk_id] | Guides:205:3
[task] | wikipedia [title] | 프로퍼티 [category] | Guides [rephrased] | # 스크립트 프로퍼티 접근 방법 mLua 스크립트에서 함수 내부에 선언된 프로퍼티(Property)에 접근하는 방법은 접근 대상이 같은 컴포넌트인지 다른 엔티티의 컴포넌트인지에 따라 달라집니다. ## 같은 컴포넌트 내 프로퍼티 접근 같은 컴포넌트 내에서 프로퍼티에 접근하려면 `self` 키워드 뒤에 점(.)과 프로퍼티 이름을 붙여 `self.프로퍼티명` 형태로 사용합니다. 이를 통해 해당 프로퍼티의 값을 읽거나 수정할 수 있습니다. 다음 예시는 `StringProperty`라는 문자열 프로퍼티를 선언하고, `OnBeginPl [original] | 함수에서 프로퍼티에 접근하는 방법을 알아봅시다. 먼저 같은 컴포넌트에서는 다음과 같이 접근할 수 있습니다. ```lua Property: [None] string StringProperty = "Hello!!" Method: [Server Only] void OnBeginPlay() { local stringProperty = self.StringProperty --"self.프로퍼티명"으로 해당 프로퍼티를 가져옴 } ``` 다른 컴포넌트의 프로퍼티는 다음과 같이 접근할 수 있습니다. 아래 상황에서 접근하는 방법 [chunk_id] | Guides:205:4
[task] | diverse_qa [title] | 프로퍼티 [category] | Guides [rephrased] | 질문: 같은 컴포넌트 내에서 프로퍼티에 접근할 때 사용하는 문법은 무엇인가요? 답변: `self.프로퍼티명` 형식을 사용하여 해당 프로퍼티에 접근합니다. 질문: 아래 코드에서 `self.StringProperty`는 어떤 값을 가리키나요? ```lua Property: [None] string StringProperty = "Hello!!" Method: [Server Only] void OnBeginPlay() { local stringProperty = self.StringProperty } ``` 답변: `Stri [original] | 함수에서 프로퍼티에 접근하는 방법을 알아봅시다. 먼저 같은 컴포넌트에서는 다음과 같이 접근할 수 있습니다. ```lua Property: [None] string StringProperty = "Hello!!" Method: [Server Only] void OnBeginPlay() { local stringProperty = self.StringProperty --"self.프로퍼티명"으로 해당 프로퍼티를 가져옴 } ``` 다른 컴포넌트의 프로퍼티는 다음과 같이 접근할 수 있습니다. 아래 상황에서 접근하는 방법 [chunk_id] | Guides:205:4
[task] | knowledge_list [title] | 프로퍼티 [category] | Guides [rephrased] | 1. 프로퍼티는 컴포넌트 내 멤버 변수로, 함수를 통해 값을 설정하면 종료되지 않고 유지되어 값의 누적이나 저장 목적으로 활용됩니다. 2. `Property:` 블록에서 `[Sync]` 속성을 가진 `number` 타입의 프로퍼티 `AccTime`을 0으로 초기화하여 선언할 수 있습니다. 3. `[Server Only]` 실행 공간의 `void OnUpdate(delta)` 메서드에서는 매 프레임마다 전달되는 `delta` 값을 `self.AccTime`에 더하여 누적 시간을 관리할 수 있습니다. 4. 누적된 `self.AccTim [original] | 프로퍼티는 컴포넌트 내 멤버 변수로, 함수에서 쓰고 읽어도 종료되지 않고 함수에서 설정한 값이 보존됩니다. 따라서 함수를 통해 어떤 값을 담아놓거나 함수를 반복 호출하여 값을 누적할 때 활용될 수 있습니다. 다음은 3초 간격으로 콘솔 창에 "HelloMSW"를 출력하는 예제입니다. ```lua Property: [Sync] number AccTime = 0 Method: [Server Only] void OnUpdate(delta) { self.AccTime = self.AccTime + delta --OnUpd [chunk_id] | Guides:205:5