← 목록

mLua · Nemotron-CC 리프레이즈 (CPT)

총 8,200개 · 페이지 204/274
🔀 랜덤
불러오는 중…

[task] | distill [title] | 몬스터 드롭 아이템과 인벤토리 UI 만들기 [category] | Guides [rephrased] | # 몬스터 드롭 아이템과 인벤토리 UI 만들기 ## 1. 아이템 테이블 (DataSet) 설정 `_ItemService`를 사용할 경우 데이터셋 이름은 반드시 **UserItemDataSet**으로 지정해야 합니다. (본 가이드는 `_DataStorageService` 사용 예시이나, 명명 규칙은 동일하게 적용) **UserItemDataSet** 구조: | ID | Name | IconRUID | | :---: | --- | --- | | 1 | RedPotion | 323920d2805d4ec1aa85eca9e3e1cab2 [original] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > **▶ 2편.** [**몬스터 드롭 아이템과 인벤토리 UI 만들기**](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 몬스터를 처치했을 때 드롭될 아 [chunk_id] | Guides:943:0

[task] | distill [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | ### `RemoveItem` 메서드 인벤토리에서 특정 인덱스의 아이템을 제거합니다. ```lua [server only] void RemoveItem(number itemIndex) { if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end self._T.inventoryData[itemIndex] = 0 local modifiedE [original] | [server only] void RemoveItem(number itemIndex) { if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end self._T.inventoryData[itemIndex] = 0 local modifiedEvent = OnInventoryModified() modifiedEvent.ItemIndex = ite [chunk_id] | Guides:942:7

[task] | wikipedia [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # 인벤토리 비우기 테스트 환경에서의 편의성을 높이기 위해, 캐릭터가 게임에 재접속할 때마다 인벤토리가 초기화되도록 구성하는 방법을 설명합니다. 이 구성은 `LiteInventory` 컴포넌트의 기능 확장 및 새로운 스크립트 컴포넌트를 통한 자동 실행 로직으로 이루어집니다. 먼저, 아이템 삭제를 수행하기 위해 `LiteInventory` 컴포넌트에 `RemoveItem()` 메서드를 추가합니다. 해당 메서드의 실행 공간은 `[server only]`로 지정되며, 매개변수로 `number` 타입의 `itemIndex`를 받습니다. [original] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터가 게임에 새로 접속할 때마다 인벤토리를 비우도록 설정해 봅시다. 1. 아이템 삭제를 처리하기 위해 **LiteInventory**에 `RemoveItem()` 함수를 추가합니다. 실행 공간은 **server only**로 설정합니다. 매개 변수로 **number** 타입의 **itemIndex**를 추가합니다. 그리고 아래와 같이 작성합니다. ```lua [server only] void RemoveItem(number itemIndex) { [chunk_id] | Guides:942:5

[task] | diverse_qa [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 질문: `RemoveItem()` 함수의 실행 공간은 어떻게 설정해야 하나요? 답변: `RemoveItem()` 함수의 실행 공간은 **server only**로 설정해야 합니다. 질문: `RemoveItem()` 함수에 전달되는 매개 변수 `itemIndex`의 데이터 타입은 무엇인가요? 답변: `RemoveItem()` 함수의 매개 변수 `itemIndex`는 **number** 타입입니다. 질문: 아래 코드가 수행하는 주요 로직은 무엇인가요? ```lua if itemIndex < 1 or itemIndex > #self. [original] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터가 게임에 새로 접속할 때마다 인벤토리를 비우도록 설정해 봅시다. 1. 아이템 삭제를 처리하기 위해 **LiteInventory**에 `RemoveItem()` 함수를 추가합니다. 실행 공간은 **server only**로 설정합니다. 매개 변수로 **number** 타입의 **itemIndex**를 추가합니다. 그리고 아래와 같이 작성합니다. ```lua [server only] void RemoveItem(number itemIndex) { [chunk_id] | Guides:942:5

[task] | knowledge_list [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 제시된 문서 내용만을 기반으로 추출한 핵심 사실 목록입니다. 1. `RemoveItem` 메서드는 `[server only]` 실행 공간에서 동작하며, 인자로는 삭제할 아이템의 인덱스인 `number itemIndex`를 받습니다. 2. `RemoveItem` 메서드 내부에서 `itemIndex`가 1보다 작거나 `self._T.inventoryData` 테이블의 길이(`#self._T.inventoryData`)보다 크면 `log_error("itemIndex error")`를 호출하고 함수를 즉시 반환합니다. 3. 검증이 통과 [original] | [server only] void RemoveItem(number itemIndex) { if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end self._T.inventoryData[itemIndex] = 0 local modifiedEvent = OnInventoryModified() modifiedEvent.ItemIndex = ite [chunk_id] | Guides:942:7

[task] | knowledge_list [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 제공된 문서에 포함된 핵심 사실을 바탕으로 추출한 목록은 다음과 같습니다. 1. `IsInitialized` 속성은 `[Sync]` 속성을 가지며 기본값은 `false`인 `boolean` 타입입니다. 2. `OnBeginPlay()` 메서드는 `[server only]` 실행 공간에서 작동하며, `_DataService:GetRowCount("UserItemDataSet")`의 반환 값을 기반으로 `self._T.inventoryData` 테이블을 초기화합니다. 3. `OnBeginPlay()` 메서드 내부에서 `_DataSto [original] | ```lua Property: [Sync] boolean IsInitialized = false Function: [server only] void OnBeginPlay() { -- inventoryData에 UserItemDataSet를 불러옴 self._T.inventoryData = {} for i = 1, _DataService:GetRowCount("UserItemDataSet") do self._T.inventoryData[i] = 0 end local userDataSto [chunk_id] | Guides:942:6

[task] | diverse_qa [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 질문: `OnBeginPlay` 함수 내에서 `self._T.inventoryData` 테이블의 초기 크기는 어떻게 결정되나요? 답변: `_DataService:GetRowCount("UserItemDataSet")` 메서드가 반환하는 행 수만큼 반복문을 돌리며, 각 인덱스에 0을 할당하여 초기화합니다. 질문: 플레이어의 기존 아이템 데이터를 불러올 때 사용되는 서비스와 메서드는 무엇인가요? 답변: `_DataStorageService:GetUserDataStorage(self.Entity.PlayerComponent.UserId [original] | ```lua Property: [Sync] boolean IsInitialized = false Function: [server only] void OnBeginPlay() { -- inventoryData에 UserItemDataSet를 불러옴 self._T.inventoryData = {} for i = 1, _DataService:GetRowCount("UserItemDataSet") do self._T.inventoryData[i] = 0 end local userDataSto [chunk_id] | Guides:942:6

[task] | distill [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # 몬스터 사냥과 아이템 획득 인벤토리 스크립트 작성하기 ## 핵심 로직 서버에서 `UserItemDataSet` 기반 인벤토리 상태를 초기화 및 관리하고, 클라이언트로 이벤트를 브로드캐스트하는 구조입니다. ## API 및 동작 규칙 * **데이터 로드/저장**: `_DataStorageService`의 `GetUserDataStorage`로 사용자 스토리지 접근. `ItemData` 키에 콤마(,) 구분 문자열로 저장/로드. * **타입 변환**: 로드 시 `_UtilLogic:Split`으로 배열 분리 후 `tonum [original] | ```lua Property: [Sync] boolean IsInitialized = false Function: [server only] void OnBeginPlay() { -- inventoryData에 UserItemDataSet를 불러옴 self._T.inventoryData = {} for i = 1, _DataService:GetRowCount("UserItemDataSet") do self._T.inventoryData[i] = 0 end local userDataSto [chunk_id] | Guides:942:6

[task] | extract_knowledge [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # 인벤토리 초기화 및 데이터 동기화 본 절에서는 `LiteInventory` 스크립트와 `OnInventoryInitialized` 이벤트 핸들러를 연계하여 클라이언트 UI에 인벤토리 데이터를 전달하고, 서버 측에서 주기적으로 데이터를 저장하는 방법을 다룹니다. ## 1. 개념 설명 메이플스토리 월드의 인벤토리 시스템은 서버(`OnInventoryInitialized`)와 클라이언트(`LiteInventory`) 간의 데이터 흐름을 기반으로 합니다. 1. **이벤트 정의**: `OnInventoryInitialized`는 [original] | 6. **OnInventoryInitialized** 스크립트를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. 프로퍼티 타입으로 SyncTable\<v>를 선택하고, v를 **number**로 설정하면 됩니다. ```lua Property: SyncTable<number> AllItemCounts ``` 7. 다시 **LiteInventory** 스크립트로 돌아갑니다. 이제 인벤토리 UI에 로드된 데이터를 전달해야 합니다. 위에서 작성한 `OnBeginPlay()` 함수에 아래 내용을 추가합니다 [chunk_id] | Guides:942:2

[task] | diverse_qa [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 질문: `RemoveItem` 메서드에서 `itemIndex`가 유효한 범위를 벗어나면 어떤 처리가 이루어집니까? 답변: `log_error("itemIndex error")`를 출력한 후 함수를 즉시 종료(return)합니다. 질문: `RemoveItem` 메서드가 정상적으로 실행될 때, `self._T.inventoryData`의 해당 인덱스 값은 어떻게 변경됩니까? 답변: 해당 인덱스의 값은 0으로 설정됩니다. 질문: `RemoveItem` 메서드에서 아이템 삭제 후 `OnInventoryModified()`로 생성된 이벤 [original] | [server only] void RemoveItem(number itemIndex) { if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end self._T.inventoryData[itemIndex] = 0 local modifiedEvent = OnInventoryModified() modifiedEvent.ItemIndex = ite [chunk_id] | Guides:942:7

[task] | knowledge_list [title] | 몬스터 드롭 아이템과 인벤토리 UI 만들기 [category] | Guides [rephrased] | 1. 개별 아이템은 Workspace - MyDesk의 콘텍스트 메뉴에서 Create DataSet을 선택하여 이름을 UserItemDataSet으로 입력함으로써 DataSet의 아이템 테이블로 생성할 수 있습니다. 2. 스크립트에서 _ItemService API를 사용하는 경우, 해당 데이터셋의 이름을 반드시 UserItemDataSet으로 지정해야 하며, _ItemService를 사용하지 않는 경우 이름은 자유롭게 지정할 수 있습니다. 3. 본 가이드에서는 _ItemService 대신 _DataStorageService를 사용할 [original] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > **▶ 2편.** [**몬스터 드롭 아이템과 인벤토리 UI 만들기**](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 몬스터를 처치했을 때 드롭될 아 [chunk_id] | Guides:943:0

[task] | extract_knowledge [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # 인벤토리 아이템 변경 및 클라이언트 동기화 ## 개념 설명 서버 측 인벤토리 데이터는 `ModifyItem` 메서드를 통해 안전하게 수정되며, 변경된 값이 0 미만으로 내려가지 않도록 검증됩니다. 서버에서 아이템 수량이 변경되면, 해당 정보를 클라이언트(또는 다른 참여자)의 UI에 반영하기 위해 커스텀 이벤트 타입을 정의하고 `multicast` 실행 공간에서 이벤트를 전송합니다. ## API 사용법 ### 1. 서버 측 아이템 수정 로직 (`ModifyItem`) `[server only]` 실행 공간에서 동작하며, 다 [original] | ```lua [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local [chunk_id] | Guides:942:4

[task] | distill [title] | 메이플스토리 월드 루아 구문 [category] | Guides [rephrased] | ## 일반 for 문 테이블 항목 반복에 사용. `ipairs()`(배열), `pairs()`(사전) 반복자 필수. * **배열**: `ipairs()`는 인덱스, 값을 순서대로 반환. * **사전**: `pairs()`는 key-value 반환. **주의**: 반환 순서는 보장되지 않음. ```lua local testArray = {"A", "B"} for index, value in ipairs(testArray) do log(index, value) end local testdictionary = {nam [original] | **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다. 일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다. 일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다. #### 배열(Array) `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 예제를 살펴봅시다. ```lua local testArray = {"A", "B [chunk_id] | Guides:944:1

[task] | wikipedia [title] | 몬스터 드롭 아이템과 인벤토리 UI 만들기 [category] | Guides [rephrased] | # 몬스터 드롭 아이템과 인벤토리 UI 만들기 본 가이드는 몬스터 사냥과 아이템 획득을 다루는 5부작 시리즈의 두 번째 편입니다. 해당 시리즈는 몬스터 스폰(1편), 몬스터 드롭 아이템과 인벤토리 UI 생성(2편, 현재), 인벤토리 스크립트 작성(3편), 인벤토리 UI 스크립트 작성(4편), 아이템 스크립트 작성(5편)의 순서로 진행됩니다. 본 장에서는 전편에서 몬스터를 스폰한 것을 바탕으로, 몬스터 처치 시 드롭될 아이템을 데이터셋(DataSet)을 통해 정의하고, 이를 표시할 인벤토리 UI를 에디터에 추가하는 방법을 다룹니다. [original] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > **▶ 2편.** [**몬스터 드롭 아이템과 인벤토리 UI 만들기**](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 몬스터를 처치했을 때 드롭될 아 [chunk_id] | Guides:943:0

[task] | knowledge_list [title] | 메이플스토리 월드 루아 구문 [category] | Guides [rephrased] | ```lua -- (코드 예제는 문서에 포함된 내용만 재현하며, 새로운 API나 코드를 추가하지 않았습니다.) ``` - `if` 구문은 조건이 `true`인 경우 `then`과 `end` 사이에 있는 코드를 실행하는 기본 조건문입니다. - `elseif` 구문은 `if` 구문 뒤에 추가로 사용할 수 있으며, 직전 `if` 또는 `elseif`의 조건이 `false`일 때 해당 조건을 평가하여 실행할 수 있는 선택적 요소입니다. - `else` 구문은 `if` 구문 뒤에 사용할 수 있으며, 직전 `if` 및 모든 `elseif`의 [original] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용 [chunk_id] | Guides:944:0

[task] | knowledge_list [title] | 메이플스토리 월드 루아 구문 [category] | Guides [rephrased] | - `ipairs()` 함수는 배열(Array) 타입의 테이블에 대해 인덱스와 값을 순차적으로 반복하는 반복자(iterator)를 반환하며, `for index, value in ipairs(table) do` 구문에서 사용되어 배열의 항목을 정해진 순서대로 접근할 수 있게 합니다. - `pairs()` 함수는 사전(Dictionary) 타입의 테이블에 대해 키(key)와 값(value) 쌍을 반복하는 반복자(iterator)를 반환하며, `for key, value in pairs(table) do` 구문에서 사용되지만, 반환 순 [original] | **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다. 일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다. 일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다. #### 배열(Array) `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 예제를 살펴봅시다. ```lua local testArray = {"A", "B [chunk_id] | Guides:944:1

[task] | distill [title] | 메이플스토리 월드 루아 구문 [category] | Guides [rephrased] | # 메이플스토리 월드 mLua 구문 요약 ## 조건문 * **if**: 조건이 `true`면 `then`과 `end` 사이 실행. * **elseif**: `if` 조건이 `false`일 때 평가. 선택 사항. * **else**: `if`, `elseif` 조건이 모두 `false`일 때 실행. 선택 사항. ```lua [server only] void OnBeginPlay() { local a = 7 if a > 10 then log("big") elseif a > 5 [original] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용 [chunk_id] | Guides:944:0

[task] | knowledge_list [title] | 다시 게임하기 [category] | Guides [rephrased] | 제공된 문서의 내용을 바탕으로 핵심 사실을 추출하여 목록으로 정리했습니다. 1. `CardBoard` 컴포넌트의 `OnBeginPlay()` 메서드는 `[client only]` 실행 공간에서 동작하며, 월드 시작 시 `_CardPairGameLogic.CardPairGameUI.Enable` 프로퍼티를 `false`로 초기화합니다. 2. `CardPairGameLogic`의 `StartGame()` 메서드 내에서 `self.CardPairGameUI.Enable`이 `false`일 때만 해당 값을 `true`로 변경하는 조건문을 [original] | 게임을 단 한 번만 할 수 있다면 너무나 아쉽겠죠. 게임의 묘미는 다시 하는 것이지요. 언제든지 **게임 다시하기** 버튼을 누르면 카드 짝 맞추기를 할 수 있게 지금까지 만든 월드를 아주 약간만 수정해봅시다. 정말 아주 약간이요! # 게임 시작 부분 다듬기 짝 맞추기 게임을 완성한 여러분 축하합니다! 지금까지 만든 게임을 실행하면 월드에 입장할 때마다 무조건 짝 맞추기 게임을 한번 한 뒤에야 크리에이터가 만든 월드를 둘러볼 수 있습니다. 유저가 게임을 하고 싶을 때만 게임을 할 수 있게 만들려면 어디를 고쳐야할까요? 약간의 힌 [chunk_id] | Guides:945:0

[task] | distill [title] | 다시 게임하기 [category] | Guides [rephrased] | # 카드 짝 맞추기: 게임 다시하기 구현 ## 1. 기본 비활성화 및 시작 조건 설정 월드 입장 시 게임 UI가 자동으로 활성화되지 않도록 설정합니다. 1. **CardBoard** 컴포넌트에 `OnBeginPlay()`를 추가하여 UI를 비활성화합니다. ```lua [client only] void OnBeginPlay () { _CardPairGameLogic.CardPairGameUI.Enable = false } ``` 2. **CardPairGameLogic** [original] | 게임을 단 한 번만 할 수 있다면 너무나 아쉽겠죠. 게임의 묘미는 다시 하는 것이지요. 언제든지 **게임 다시하기** 버튼을 누르면 카드 짝 맞추기를 할 수 있게 지금까지 만든 월드를 아주 약간만 수정해봅시다. 정말 아주 약간이요! # 게임 시작 부분 다듬기 짝 맞추기 게임을 완성한 여러분 축하합니다! 지금까지 만든 게임을 실행하면 월드에 입장할 때마다 무조건 짝 맞추기 게임을 한번 한 뒤에야 크리에이터가 만든 월드를 둘러볼 수 있습니다. 유저가 게임을 하고 싶을 때만 게임을 할 수 있게 만들려면 어디를 고쳐야할까요? 약간의 힌 [chunk_id] | Guides:945:0

[task] | wikipedia [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | **몬스터 사냥과 아이템 획득 인벤토리 스크립트: 아이템 삭제 및 데이터 저장** 본 섹션은 메이플스토리 월드(mLua)에서 인벤토리 시스템의 핵심 기능인 특정 인덱스의 아이템을 삭제하고, 사용자가 세션을 종료할 때 인벤토리 데이터를 영구적으로 저장하는 로직을 다룹니다. 이 스크립트는 서버에서 실행되며, 데이터 무결성을 유지하기 위해 인덱스 범위 검사와 이벤트 발생을 포함합니다. ### 1. 아이템 삭제 로직 (`RemoveItem`) `RemoveItem` 메서드는 지정된 인덱스에 해당하는 아이템을 인벤토리에서 제거하는 역할 [original] | [server only] void RemoveItem(number itemIndex) { if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end self._T.inventoryData[itemIndex] = 0 local modifiedEvent = OnInventoryModified() modifiedEvent.ItemIndex = ite [chunk_id] | Guides:942:7

[task] | diverse_qa [title] | 몬스터 드롭 아이템과 인벤토리 UI 만들기 [category] | Guides [rephrased] | 질문: 본 가이드는 '몬스터 사냥과 아이템 획득' 시리즈 중 몇 번째 편에 해당하나요? 답변: 본 가이드는 시리즈 중 2편으로, 제목은 '몬스터 드롭 아이템과 인벤토리 UI 만들기'입니다. 질문: 개별 아이템을 정의하기 위해 어떤 객체를 생성해야 하나요? 답변: 개별 아이템은 DataSet의 아이템 테이블로 만들 수 있으며, 이를 위해 Workspace - MyDesk에서 Create DataSet을 클릭하여 생성합니다. 질문: `_ItemService`를 스크립트에서 사용하고자 할 때, 데이터셋의 이름은 어떻게 지정해야 하나요 [original] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > **▶ 2편.** [**몬스터 드롭 아이템과 인벤토리 UI 만들기**](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 몬스터를 처치했을 때 드롭될 아 [chunk_id] | Guides:943:0

[task] | wikipedia [title] | 메이플스토리 월드 루아 구문 [category] | Guides [rephrased] | # 스크립트 이해: 메이플스토리 월드 루아 구문 ## 일반 for 문 일반 `for` 문은 연속된 숫자 범위가 아닌 테이블의 항목을 순회할 때 사용됩니다. 이 구문을 통해 각 테이블 항목에 대해 특정 코드를 실행하고, 코드 내부에서 해당 항목을 쉽게 참조할 수 있습니다. 일반 `for` 문은 함수 또는 반복자를 필요로 하며, 데이터 구조의 종류에 따라 `ipairs()` 또는 `pairs()` 함수를 사용합니다. `ipairs()`는 배열(Array)의 반복을 처리하고, `pairs()`는 사전(Dictionary)의 반복을 처 [original] | **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다. 일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다. 일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다. #### 배열(Array) `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 예제를 살펴봅시다. ```lua local testArray = {"A", "B [chunk_id] | Guides:944:1

[task] | extract_knowledge [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # 인벤토리 초기화 및 아이템 제거 로직 본 절에서는 테스트 환경에서 캐릭터 접속 시 인벤토리를 초기화하는 메커니즘과, 특정 인덱스의 아이템을 삭제하는 로직을 구현하는 방법을 다룹니다. 이 구현은 서버 측에서만 실행되며, `LiteInventory` 컴포넌트와 새로운 컨트롤 컴포넌트 `ClearInventoryOnBeginPlay`를 결합하여 동작합니다. ## 개념 설명 인벤토리 초기화 시스템은 두 가지 핵심 컴포넌트로 구성됩니다. 1. **LiteInventory**: 실제 아이템 데이터를 관리하는 컴포넌트입니다. `in [original] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터가 게임에 새로 접속할 때마다 인벤토리를 비우도록 설정해 봅시다. 1. 아이템 삭제를 처리하기 위해 **LiteInventory**에 `RemoveItem()` 함수를 추가합니다. 실행 공간은 **server only**로 설정합니다. 매개 변수로 **number** 타입의 **itemIndex**를 추가합니다. 그리고 아래와 같이 작성합니다. ```lua [server only] void RemoveItem(number itemIndex) { [chunk_id] | Guides:942:5

[task] | knowledge_list [title] | 인벤토리 UI 스크립트 작성하기 [category] | Guides [rephrased] | * `OnBeginPlay()` 함수의 마지막에 `self._T.slotList = {}`를 초기화하고, `_DataService:GetRowCount("UserItemDataSet")`으로 반환된 행 수만큼 반복문을 실행하여 `self:AddSlot(i, 0)` 호출 결과를 `self._T.slotList[i]`에 대입하는 코드를 작성해야 합니다. * `AddSlot()` 메서드는 실행 공간 제약이 명시되지 않았으며, `number` 타입의 매개변수 `itemIndex`와 `itemCount`를 받아 **Entity** 타 [original] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > 2편. [몬스터 드롭 아이템과 인벤토리 UI 만들기](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > **▶ 4편.** [**인벤토리 UI 스크립트 작성하기**](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 인벤토리 UI 스크립트를 작성해 [chunk_id] | Guides:946:0

[task] | distill [title] | 인벤토리 UI 스크립트 작성하기 [category] | Guides [rephrased] | # 인벤토리 UI 스크립트 작성하기 (4편) ## 1. 슬롯 초기화 `OnBeginPlay()` 함수 마지막에 `UserItemDataSet` 행수만큼 슬롯을 미리 생성하고 `slotList`로 관리합니다. ```lua self._T.slotList = {} for i = 1, _DataService:GetRowCount("UserItemDataSet") do self._T.slotList[i] = self:AddSlot(i, 0) end ``` ## 2. AddSlot 메서드 추가 **리턴 타입**: `Entity` [original] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > 2편. [몬스터 드롭 아이템과 인벤토리 UI 만들기](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > **▶ 4편.** [**인벤토리 UI 스크립트 작성하기**](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 인벤토리 UI 스크립트를 작성해 [chunk_id] | Guides:946:0

[task] | wikipedia [title] | 메이플스토리 월드 루아 구문 [category] | Guides [rephrased] | # 학습 과정 소개 메이플스토리 월드에서 루아(Lua)로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 다루는 본 가이드를 읽기 전에, [메이플스토리 월드 루아 기초](/docs?postId=822) 문서를 학습하는 것을 권장합니다. # 조건문 프로그램 로직은 대개 반복문과 조건문의 조합으로 구성되며, 이는 프로그래밍의 기본이 되는 구문입니다. 루아의 조건문은 `if`, `elseif`, `else`로 구성됩니다. `if`는 기본 조건문으로, 조건이 `true`일 경우 `then`과 `end` 사이의 내용을 실행합니다. [original] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용 [chunk_id] | Guides:944:0

[task] | distill [title] | 인벤토리 UI 스크립트 작성하기 [category] | Guides [rephrased] | **UIInventory** 스크립트에서 인벤토리 초기화 및 변경 이벤트를 수신하여 아이템 상태를 갱신합니다. 이벤트 중계자는 **localplayer**로 설정합니다. ```lua [localplayer] HandleOnInventoryInitialized(OnInventoryInitialized event) { local AllItemCounts = event.AllItemCounts for i, itemCount in pairs(AllItemCounts) do self._T.slotList[i]. [original] | **UIInventory** 스크립트에서는 이 정보를 전달받기 위해 이벤트 핸들러에 `OnInventoryInitialized` 이벤트를 추가하겠습니다. 그리고 핸들러 상단의 이벤트 중계자는 **localplayer**로 설정합니다. 보유 중인 아이템을 UI에 보여주기 위해 아래와 같이 작성합니다. ```lua [localplayer] HandleOnInventoryInitialized(OnInventoryInitialized event) { -- Parameters loc [chunk_id] | Guides:946:1

[task] | wikipedia [title] | 다시 게임하기 [category] | Guides [rephrased] | # 카드 짝 맞추기: 다시 게임하기 카드 짝 맞추기 게임의 재진입성을 확보하기 위해, 기존 월드 구조를 최소한으로 수정하여 '게임 다시하기' 기능을 구현하는 절차입니다. 본 가이드는 유저가 원하는 시점에 게임을 시작하거나 재시작할 수 있도록 `CardPairGameLogic`과 `CardBoard` 컴포넌트의 동작을 조정하는 내용을 다룹니다. ## 게임 시작 로직 수정 기본적으로 월드에 입장하면 `CardPairGameUI`가 활성화되어 게임을 강제 수행하게 됩니다. 이를 방지하고 유저의 선택에 따라 게임을 시작하도록 하려면, [original] | 게임을 단 한 번만 할 수 있다면 너무나 아쉽겠죠. 게임의 묘미는 다시 하는 것이지요. 언제든지 **게임 다시하기** 버튼을 누르면 카드 짝 맞추기를 할 수 있게 지금까지 만든 월드를 아주 약간만 수정해봅시다. 정말 아주 약간이요! # 게임 시작 부분 다듬기 짝 맞추기 게임을 완성한 여러분 축하합니다! 지금까지 만든 게임을 실행하면 월드에 입장할 때마다 무조건 짝 맞추기 게임을 한번 한 뒤에야 크리에이터가 만든 월드를 둘러볼 수 있습니다. 유저가 게임을 하고 싶을 때만 게임을 할 수 있게 만들려면 어디를 고쳐야할까요? 약간의 힌 [chunk_id] | Guides:945:0

[task] | diverse_qa [title] | 메이플스토리 월드 루아 구문 [category] | Guides [rephrased] | 질문: 일반 for 문이 주로 어떤 데이터 구조를 반복할 때 사용됩니까? 답변: 일반 for 문은 일련의 숫자가 아닌 테이블의 항목을 반복할 때 사용되며, 각 테이블에 대한 코드를 실행하고 코드에서 각 항목을 쉽게 사용할 수 있게 합니다. 질문: `ipairs()` 함수는 어떤 형태의 테이블 반복을 반환합니까? 답변: `ipairs()`는 배열(Array)의 반복을 반환합니다. 질문: `pairs()` 함수는 어떤 형태의 테이블 반복을 반환합니까? 답변: `pairs()`는 사전(Dictionary)의 반복을 반환합니다. 질문 [original] | **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다. 일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다. 일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다. #### 배열(Array) `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 예제를 살펴봅시다. ```lua local testArray = {"A", "B [chunk_id] | Guides:944:1

[task] | diverse_qa [title] | 메이플스토리 월드 루아 구문 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 루아 스크립트 작성 시 기본 if 문이 false일 때 다음 조건을 확인하는 구문은 무엇이며, 이 구문은 필수 요소인가요? 답변: 기본 if 문이 false일 때 다음 조건을 확인하는 구문은 elseif이며, 이는 필수적인 요소가 아닙니다. 질문: 다음 코드에서 a의 값이 7일 때 출력되는 결과는 무엇인가요? ```lua if a > 10 then log("big") elseif a > 5 then log("middle") else log("little") end ``` 답변: a [original] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용 [chunk_id] | Guides:944:0

← → 방향키로 페이지 이동 · 숫자 입력 후 Enter로 점프