← 목록

mLua · Nemotron SDG 질문-응답 (SFT)

총 21,567개 · 페이지 538/719
🔀 랜덤
불러오는 중…

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 UI 스크립트 작성하기 [question] | `OnBeginPlay()` 내에서 `slotList`를 초기화하는 반복문 블록을 3문장 이내로 설명하세요. [answer] | `self._T.slotList` 테이블을 빈 상태로 초기화한 뒤, `UserItemDataSet`의 행 수만큼 반복을 실행합니다. 각 반복에서 `AddSlot` 메서드를 호출하여 인덱스와 초기 개수 0을 매개변수로 전달하고, 반환된 값을 `slotList`에 저장합니다. 이를 통해 아이템 종류에 해당하는 슬롯 엔티티들을 미리 생성하여 인벤토리 UI에 배치합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > 2편. [몬스터 드롭 아이템과 인벤토리 UI 만들기](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > **▶ 4편.** [**인벤토리 UI 스크립트 작성하기**](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 인벤토리 UI 스크립트를 작성해

[task] | code [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `ModifyItem` 함수에서 `itemIndex`가 `self._T.inventoryData` 범위를 벗어나면 `log_error`를 출력하고 함수를 종료하도록, `amountResult`가 0 미만이면 0으로 보정하여 `self._T.inventoryData[itemIndex]`를 갱신하는 [server only] 메서드를 작성해줘. [answer] | ```lua Method: [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local prevAmount = self._T.inventor [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```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

[task] | code [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | while true와 wait(1)을 사용하여 5초 동안 초를 카운트하고 break로 종료하는 스크립트를 작성해줘 [answer] | 요청하신 5초 카운트 및 종료 로직은 `while true` 무한 반복문과 `wait(1)` 대기 함수를 조합하여 구현할 수 있습니다. 매 루프마다 경과 시간을 로그로 출력하고, 카운터가 5가 되었을 때 `break`를 사용하여 루프를 종료합니다. ```lua [server only] void OnBeginPlay() { local secondsElapsed = 0 local timeout = 5 while true do log(secondsElapsed .. "초") wait( [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다. 일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다. 일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다. #### 배열(Array) `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 예제를 살펴봅시다. ```lua local testArray = {"A", "B

[task] | code [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | OnBeginPlay에서 사전(Dictionary)을 pairs()로 반복하며 key와 value를 log()로 출력하는 스크립트를 작성해줘 [answer] | `OnBeginPlay` 라이프사이클 메서드 안에서 `pairs()` 함수를 사용하여 사전(Dictionary)의 key와 value를 반복하며 `log()` 함수로 출력하는 mLua 스크립트입니다. ```lua Property: [None] table MyData = {} Method: [server only] void OnBeginPlay() { -- OnBeginPlay 시점에 사용할 사전(Dictionary) 데이터 초기화 self.MyData = { name = "Tom", a [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다. 일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다. 일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다. #### 배열(Array) `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 예제를 살펴봅시다. ```lua local testArray = {"A", "B

[task] | single_turn [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | while 반복문과 repeat-until 반복문의 가장 큰 차이점과 각각 언제 사용해야 하는지 알려주세요. [answer] | `while` 반복문과 `repeat-until` 반복문의 가장 큰 차이점은 **조건을 확인하는 시점**과 **최소 실행 횟수**입니다. 1. **while 반복문** * **조건 확인 시점:** 반복 블록을 실행하기 **전에** 조건식을 먼저 평가합니다. * **최소 실행 횟수:** 처음부터 조건이 `false` 또는 `nil` 이면 **0회** 실행될 수 있습니다. * **사용 시점:** 반복 블록이 실행될지 여부를 사전에 정확히 알고 있을 때, 또는 조건이 성립하지 않으면 아예 실행하지 않아 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용

[task] | code [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `itemIndex`가 1 미만 또는 `#self._T.inventoryData`를 초과하는 경우 오류를 기록하고 반환하며, 정상 범위 내라면 현재 개수에 `deltaAmount`를 더한 결과가 음수가 아닌지 검증하여 인벤토리 데이터를 안전하게 수정하는 [server only] `ModifyItem` 메서드를 작성해줘. [answer] | ```lua Method: [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local prevAmount = self._T.inventor [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```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

[task] | single_turn [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | 수치 for 문에서 증감값을 음수로 지정하면 어떤 결과가 나오며, 초깃값과 최종값의 관계는 어떻게 설정해야 하나요? [answer] | 수치 `for` 문에서 증감값을 음수로 지정하면, 반복 변수가 **초깃값에서 최종값으로 감소**하는 방향으로 반복됩니다. 초깃값과 최종값의 관계는 다음과 같이 설정해야 합니다. * **증감값이 양수일 때:** 초깃값이 최종값보다 작거나 같아야 합니다. * **증감값이 음수일 때:** 초깃값이 최종값보다 크거나 같아야 합니다. 증감값이 음수인 경우, 반복 변수는 매 반복마다 증감값만큼 감소하며, 최종값을 지나치기 전까지 실행됩니다. 최종값을 포함하여 실행됩니다. 예를 들어, `for i = 20, 10, -2 do` 구문 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용

[task] | code [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | LiteInventory 컴포넌트에 RemoveItem 메서드를 추가하여 itemIndex 범위를 검증하고 self._T.inventoryData 배열의 해당 인덱스를 0으로 설정한 후 OnInventoryModified 이벤트와 SendModifiedEvent를 통해 변경 사항을 전송하는 server only 로직을 작성해줘. [answer] | LiteInventory 컴포넌트에 `RemoveItem` 메서드를 추가하는 로직은 다음과 같습니다. 1. **실행 공간**: `[server only]` 2. **매개변수**: `number` 타입의 `itemIndex` 3. **처리 내용**: * `itemIndex`가 인벤토리 데이터 배열(`self._T.inventoryData`)의 범위(1부터 배열 길이까지)에 벗어나는지 확인합니다. * 범위를 벗어나면 `log_error`로 오류를 기록하고 함수를 종료합니다. * 범위가 적절하면 해 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터가 게임에 새로 접속할 때마다 인벤토리를 비우도록 설정해 봅시다. 1. 아이템 삭제를 처리하기 위해 **LiteInventory**에 `RemoveItem()` 함수를 추가합니다. 실행 공간은 **server only**로 설정합니다. 매개 변수로 **number** 타입의 **itemIndex**를 추가합니다. 그리고 아래와 같이 작성합니다. ```lua [server only] void RemoveItem(number itemIndex) {

[task] | code [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | 테이블의 항목을 ipairs()로 반복하다가 특정 값이 나오면 break로 반복을 종료하는 스크립트를 작성해줘 [answer] | 테이블의 항목을 `ipairs()`로 반복하면서 특정 값을 찾으면 `break`를 사용해 반복을 종료하는 스크립트입니다. ```lua Method: [server only] void FindSpecificValue() { local testArray = {"A", "B", "C", "D", "E"} local targetValue = "C" for index, value in ipairs(testArray) do log(index, value) -- 특정 값이 나 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다. 일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다. 일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다. #### 배열(Array) `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 예제를 살펴봅시다. ```lua local testArray = {"A", "B

[task] | single_turn [pass] | ⏳ 미판정 [title] | 다시 게임하기 [question] | Retry 컴포넌트의 HandleButtonClickEvent에서 _EntityService:GetEntityByPath를 사용할 때 경로를 어떻게 작성해야 하나요? [answer] | Retry 컴포넌트의 `HandleButtonClickEvent`에서 `_EntityService:GetEntityByPath`를 사용해 **CardPairGameUI** 엔티티를 참조할 때, 문서에 제시된 경로는 **`/ui/CardPairGameUI`** 입니다. 아래와 같이 코드를 작성하면 됩니다. ```lua Event Handler: [self] HandleButtonClickEvent (ButtonClickEvent event) { -- Parameters local Entity = event.Entit [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임을 단 한 번만 할 수 있다면 너무나 아쉽겠죠. 게임의 묘미는 다시 하는 것이지요. 언제든지 **게임 다시하기** 버튼을 누르면 카드 짝 맞추기를 할 수 있게 지금까지 만든 월드를 아주 약간만 수정해봅시다. 정말 아주 약간이요! # 게임 시작 부분 다듬기 짝 맞추기 게임을 완성한 여러분 축하합니다! 지금까지 만든 게임을 실행하면 월드에 입장할 때마다 무조건 짝 맞추기 게임을 한번 한 뒤에야 크리에이터가 만든 월드를 둘러볼 수 있습니다. 유저가 게임을 하고 싶을 때만 게임을 할 수 있게 만들려면 어디를 고쳐야할까요? 약간의 힌

[task] | single_turn [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | while 문에서 조건식이 false 또는 nil일 때 반복이 종료된다는 설명은 어떤 상황에서의 동작을 의미하나요? [answer] | mLua(루아 5.3)의 `while` 문에서 조건식이 `false` 또는 `nil`인 경우 반복이 종료된다는 설명은, **반복 블록이 실행되기 전에 조건식을 평가할 때** 해당 값이 나오면 즉시 루프를 빠져나간다는 동작을 의미합니다. 구체적으로 다음과 같은 상황입니다. 1. **초기 평가 시:** `while` 문이 실행되면 먼저 조건식을 계산합니다. 이 결과가 `false`이거나 `nil`이면 반복 블록(`do` ... `end`) 안의 코드는 **한 번도 실행되지 않고** 바로 종료됩니다. 2. **반복 중 평가 시:* [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용

[task] | code [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | OnBeginPlay에서 테이블을 ipairs()로 반복하며 각 항목을 log()로 출력하는 스크립트를 작성해줘 [answer] | `ipairs()`는 배열(Array) 형태의 테이블, 즉 연속된 숫자 인덱스(1, 2, 3...)를 가진 항목을 순서대로 반복할 때 사용합니다. `OnBeginPlay`에서 초기화된 테이블을 `ipairs()`로 순회하며 각 항목을 `log()`로 출력하는 스크립트는 다음과 같습니다. ```lua Property: [None] table MyItems = {} Method: [server only] void OnBeginPlay() { -- 배열 형태의 데이터 초기화 (연속된 숫자 인덱스를 가짐) self.MyI [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **일반 for 문**은 일련의 숫자가 아닌 테이블의 항목을 반복합니다. 일반 for 문을 사용하면 각 테이블에 대한 코드를 실행할 수 있고, 코드에서 각 항목을 쉽게 사용할 수 있습니다. 일반 for 문은 함수나 반복자가 필요합니다. `ipairs()`는 배열(Array)의 반복을 반환하고 `pairs()`는 사전(Dictionary)의 반복을 반환합니다. #### 배열(Array) `ipairs()`는 배열의 인덱스와 값을 반복해서 반환합니다. 예제를 살펴봅시다. ```lua local testArray = {"A", "B

[task] | code [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `ModifyItem` 함수의 마지막에 `OnInventoryModified()` 인스턴스를 생성하여 `ItemIndex`와 `ItemCount`에 계산된 값을 대입하고, `self:SendModifiedEvent(modifiedEvent)`를 호출하여 UI에 변경 정보를 브로드캐스트하는 로직을 작성해줘. [answer] | `ModifyItem` 함수 내에서 아이템 수량 변경이 완료된 후, 해당 변경 사항을 클라이언트 UI로 전달하기 위해 `OnInventoryModified` 이벤트 객체를 생성하고 데이터를 설정한 뒤, `multicast` 실행 공간의 `SendModifiedEvent` 메서드를 호출하는 로직은 다음과 같습니다. ```lua Method: [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemInd [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```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

[task] | single_turn [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | self:SendInitializedEvent(initEvent) 호출 시 [multicast] 메서드가 실행되는 원리와, 이 이벤트가 클라이언트에 전달되기까지의 흐름은 어떻게 되나요? [answer] | 제공된 참고 문서의 코드 예제와 설명을 바탕으로 `self:SendInitializedEvent(initEvent)` 호출 시 `[multicast]` 메서드가 실행되는 원리와 이벤트 전달 흐름을 설명합니다. **1. `[multicast]` 메서드 실행 원리** mLua 스크립트에서 `[multicast]` 실행 공간으로 선언된 메서드는 서버와 모든 연결된 클라이언트(플레이어) 양쪽에서 동시에 실행되도록 설계된 특수한 메서드입니다. * **서버에서의 역할:** 서버에서 `self:SendInitializedEvent(in [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```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

[task] | single_turn [pass] | ⏳ 미판정 [title] | 다시 게임하기 [question] | CardPairGameUI의 Enable 프로퍼티가 false일 때만 StartGame을 호출하도록 조건을 추가해야 하는 이유는 무엇인가요? [answer] | CardPairGameUI의 Enable 프로퍼티가 false일 때만 StartGame을 호출하도록 조건을 추가하는 이유는 게임이 이미 실행 중이거나 UI가 이미 활성화된 상태를 방지하기 위해서입니다. 문서에 따르면, 유저가 게임을 하고 싶을 때만 게임을 시작할 수 있도록 해야 합니다. 게임 시작 버튼이 눌릴 때마다 무조건적으로 StartGame()이 호출되면, 게임 진행 중에도 다시 게임이 초기화되거나 UI가 겹쳐지는 등 의도하지 않은 동작이 발생할 수 있습니다. 따라서 CardPairGameUI가 현재 비활성화 상태(Enabl [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임을 단 한 번만 할 수 있다면 너무나 아쉽겠죠. 게임의 묘미는 다시 하는 것이지요. 언제든지 **게임 다시하기** 버튼을 누르면 카드 짝 맞추기를 할 수 있게 지금까지 만든 월드를 아주 약간만 수정해봅시다. 정말 아주 약간이요! # 게임 시작 부분 다듬기 짝 맞추기 게임을 완성한 여러분 축하합니다! 지금까지 만든 게임을 실행하면 월드에 입장할 때마다 무조건 짝 맞추기 게임을 한번 한 뒤에야 크리에이터가 만든 월드를 둘러볼 수 있습니다. 유저가 게임을 하고 싶을 때만 게임을 할 수 있게 만들려면 어디를 고쳐야할까요? 약간의 힌

[task] | code [pass] | ⏳ 미판정 [title] | 몬스터 드롭 아이템과 인벤토리 UI 만들기 [question] | _InventoryService와 UIInventory 컴포넌트의 InventoryBtnPath를 초기화하여 버튼 클릭 시 인벤토리 UI가 열리도록 설정하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `_InventoryService`라는 서비스 API에 대한 설명이 없습니다. 문서에서는 인벤토리 UI 관련 내용으로 `Inventory` 엔티티의 `UIInventory` 컴포넌트 프로퍼티인 `InventoryBtnPath`가 비어있을 경우, 에디터의 **Reset All Properties** 기능을 사용하여 연결을 복구하는 방법을 설명하고 있을 뿐, 스크립트 코드를 통해 `InventoryBtnPath`를 초기화하거나 `_InventoryService`를 사용하여 인벤토리를 조작하는 방법에 대한 코드가 포 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > **▶ 2편.** [**몬스터 드롭 아이템과 인벤토리 UI 만들기**](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 몬스터를 처치했을 때 드롭될 아

[task] | code [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `table.concat`을 사용하여 인벤토리 데이터를 문자열로 변환하고, `_DataStorageService:SetAsync`를 통해 비동기 저장 및 완료 로그를 출력하는 `saveInventory` 함수 스크립트를 작성해줘. [answer] | 참고 문서에 포함된 인벤토리 스크립트 예제에서 `saveInventory` 로컬 함수의 구현 방식을 그대로 따르겠습니다. `table.concat`으로 인벤토리 데이터를 쉼표로 구분된 문자열로 변환하고, `_DataStorageService`의 `SetAsync` 메서드를 호출하여 비동기 저장하며 완료 시 로그를 출력하는 구조입니다. ```lua Property: [None] table inventoryData = {} [None] any userDataStorage = nil Method: [server only] void O [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```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

[task] | single_turn [pass] | ⏳ 미판정 [title] | 다시 게임하기 [question] | CardBoard 컴포넌트의 OnBeginPlay 함수에 [client only] 실행 공간을 지정해야 하는 이유는 무엇인가요? [answer] | `CardBoard` 컴포넌트의 `OnBeginPlay` 함수에 `[client only]` 실행 공간을 지정해야 하는 이유는 **`CardPairGameUI`의 `Enable` 프로퍼티가 클라이언트(유저의 화면)에서 직접 제어되는 UI 요소이기 때문**입니다. 메이플스토리 월드에서 UI 컴포넌트(예: `CardPairGameUI`)의 가시성(`Enable`)은 서버에서 변경해도 유저의 화면에 바로 반영되지 않으며, 반드시 해당 UI가 존재하는 클라이언트 환경에서 직접 프로퍼티를 수정해야 합니다. 따라서 월드에 입장할 때마다 초기 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임을 단 한 번만 할 수 있다면 너무나 아쉽겠죠. 게임의 묘미는 다시 하는 것이지요. 언제든지 **게임 다시하기** 버튼을 누르면 카드 짝 맞추기를 할 수 있게 지금까지 만든 월드를 아주 약간만 수정해봅시다. 정말 아주 약간이요! # 게임 시작 부분 다듬기 짝 맞추기 게임을 완성한 여러분 축하합니다! 지금까지 만든 게임을 실행하면 월드에 입장할 때마다 무조건 짝 맞추기 게임을 한번 한 뒤에야 크리에이터가 만든 월드를 둘러볼 수 있습니다. 유저가 게임을 하고 싶을 때만 게임을 할 수 있게 만들려면 어디를 고쳐야할까요? 약간의 힌

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 UI 스크립트 작성하기 [question] | OnInventoryInitialized 이벤트 핸들러에서 self._T.slotList[i].UIItemSlot:SetData(i, itemCount) 호출 시 전달되는 인자 두 개를 코드에서 추출하여 나열하세요. [answer] | `OnInventoryInitialized` 이벤트 핸들러에서 `self._T.slotList[i].UIItemSlot:SetData(i, itemCount)` 호출 시 전달되는 인자 두 개는 다음과 같습니다. 1. `i` 2. `itemCount` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **UIInventory** 스크립트에서는 이 정보를 전달받기 위해 이벤트 핸들러에 `OnInventoryInitialized` 이벤트를 추가하겠습니다. 그리고 핸들러 상단의 이벤트 중계자는 **localplayer**로 설정합니다. 보유 중인 아이템을 UI에 보여주기 위해 아래와 같이 작성합니다. ```lua [localplayer] HandleOnInventoryInitialized(OnInventoryInitialized event) { -- Parameters loc

[task] | two_turn [pass] | ⏳ 미판정 [title] | 인벤토리 UI 스크립트 작성하기 [question] | UIInventory 스크립트에서 `OnBeginPlay()` 함수를 사용하여 `UserItemDataSet`의 행 수만큼 아이템 슬롯을 미리 생성하는 로직을 어떻게 구현합니까? [answer] | `UIInventory` 스크립트에서 `OnBeginPlay()` 함수의 마지막에 아래 코드를 추가하여 구현합니다. 이 로직은 `_DataService:GetRowCount("UserItemDataSet")`으로 데이터셋의 행 수(아이템 종류 수)를 구한 후, 해당 횟수만큼 `AddSlot` 메서드를 호출해 슬롯 엔티티를 생성하고 `self._T.slotList` 테이블에 저장하는 방식입니다. ```lua Method: [server only] void OnBeginPlay() { -- 아이템 종류만큼 슬롯을 미리 생성 [followup] | `_DataService:GetRowCount("UserItemDataSet")`의 반환 값이 0이거나, `self:AddSlot(i, 0)` 호출 시 `itemUI` 에셋이 비어 있어 `nil`이 반환될 경우 발생하는 에러를 방지하기 위한 null 체크 코드 예제를 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 `_DataService:GetRowCount("UserItemDataSet")`의 반환 값이 0이거나 `self.itemUI`가 `nil`인 경우를 처리하는 null 체크 코드 예제가 포함되어 있지 않습니다. 문서에 명시된 구현은 다음과 같이 조건부 검사 없이 직접 루프를 실행하고 `SpawnByEntity`를 호출하는 방식입니다. ```lua Method: [server only] void OnBeginPlay() { -- 아이템 종류만큼 슬롯을 미리 생성 -- slotList로 인벤토리 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > 2편. [몬스터 드롭 아이템과 인벤토리 UI 만들기](/docs?postId=943) > 3편. [인벤토리 스크립트 작성하기](/docs?postId=942) > **▶ 4편.** [**인벤토리 UI 스크립트 작성하기**](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 인벤토리 UI 스크립트를 작성해

[task] | code [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | OnBeginPlay에서 local 변수 count를 10으로 초기화한 뒤 while문을 사용해 count가 15 이하일 때 count를 2씩 증가시키며 log로 출력하는 스크립트를 작성해줘 [answer] | 요청하신 로직을 구현한 스크립트입니다. ```lua Method: [server only] void OnBeginPlay() { local count = 10 while count <= 15 do log(count) count = count + 2 end } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용

[task] | code [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | OnUpdate에서 self.Hp의 값에 따라 if/elseif/else 조건문을 사용하여 Hp가 100보다 크면 "Full", 50보다 크면 "Middle", 그 외에는 "Low"를 log로 출력하는 스크립트를 작성해줘 [answer] | ```lua Property: [None] number Hp = 100 Method: [server only] void OnUpdate(number delta) { if self.Hp > 100 then log("Full") elseif self.Hp > 50 then log("Middle") else log("Low") end } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용

[task] | code [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | DefaultPlayer 엔티티에 ClearInventoryOnBeginPlay 컴포넌트를 추가하고 Enable 프로퍼티를 true로 설정하여 게임 시작 시 인벤토리가 초기화되도록 구성하는 스크립트를 작성해줘. [answer] | DefaultPlayer 엔티티에 `ClearInventoryOnBeginPlay` 컴포넌트를 추가하고 게임 시작 시 인벤토리를 초기화하도록 설정하는 스크립트는 다음과 같습니다. 참고 문서에 명시된 바와 같이, `LiteInventory` 컴포넌트에 `RemoveItem()` 메서드가 존재해야 하며, `ClearInventoryOnBeginPlay`는 `OnBeginPlay()` 시점에 `LiteInventory`의 초기화가 완료될 때까지 대기한 후 데이터셋의 행 수만큼 아이템을 삭제합니다. ### 1. LiteInventory [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터가 게임에 새로 접속할 때마다 인벤토리를 비우도록 설정해 봅시다. 1. 아이템 삭제를 처리하기 위해 **LiteInventory**에 `RemoveItem()` 함수를 추가합니다. 실행 공간은 **server only**로 설정합니다. 매개 변수로 **number** 타입의 **itemIndex**를 추가합니다. 그리고 아래와 같이 작성합니다. ```lua [server only] void RemoveItem(number itemIndex) {

[task] | two_turn [pass] | ⏳ 미판정 [title] | 인벤토리 UI 스크립트 작성하기 [question] | `OnInventoryInitialized` 이벤트 핸들러에서 `AllItemCounts` 데이터를 받아 UI 슬롯에 초기 아이템을 표시하는 구체적인 코드 작성 방법은 무엇인가요? [answer] | `OnInventoryInitialized` 이벤트 핸들러에서 `AllItemCounts` 데이터를 받아 UI 슬롯에 초기 아이템을 표시하는 구체적인 코드는 다음과 같습니다. 이벤트 중계자를 `localplayer`로 설정하고, 이벤트에서 전달받은 `AllItemCounts` 테이블을 반복문으로 순회하여 각 슬롯에 데이터를 설정합니다. ```lua Event Handler: [localplayer] HandleOnInventoryInitialized(OnInventoryInitialized event) { -- Param [followup] | `OnInventoryModified` 이벤트 수신 시 기존 슬롯이 존재하지 않는 경우 `AddSlot` 메서드를 통해 새 슬롯을 생성하고 `SetCount`로 개수를 갱신하는 예외 처리 로직을 작성해 주세요. [followup_answer] | `OnInventoryModified` 이벤트 수신 시 기존 슬롯이 존재하지 않는 경우를 처리하는 로직은 다음과 같습니다. 이벤트 중계자를 `localplayer`로 설정하고, 이벤트에서 전달받은 `ItemIndex`와 `ItemCount`를 바탕으로 슬롯 존재 여부를 확인합니다. `self._T.slotList`가 비어 있거나 해당 인덱스의 슬롯이 없는 경우 `AddSlot` 메서드로 새 슬롯을 생성하고, 슬롯이 존재하면 `SetCount` 메서드로 아이템 개수를 갱신합니다. ```lua Event Handler: [local [scores] | [judge_reason] | [source_doc] | **UIInventory** 스크립트에서는 이 정보를 전달받기 위해 이벤트 핸들러에 `OnInventoryInitialized` 이벤트를 추가하겠습니다. 그리고 핸들러 상단의 이벤트 중계자는 **localplayer**로 설정합니다. 보유 중인 아이템을 UI에 보여주기 위해 아래와 같이 작성합니다. ```lua [localplayer] HandleOnInventoryInitialized(OnInventoryInitialized event) { -- Parameters loc

[task] | code [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `_DataService`의 "UserItemDataSet" 행 수만큼 초기화하고, `_DataStorageService`에서 "ItemData"를 읽어 `_TimerService`로 300초 간격 자동 저장을 설정하는 인벤토리 초기화 스크립트를 작성해줘. [answer] | 요청하신 인벤토리 초기화 로직을 포함하는 mLua 스크립트입니다. `_DataService:GetRowCount("UserItemDataSet")`로 행 수를 확인하여 `inventoryData` 테이블을 초기화하고, `_DataStorageService`에서 저장된 "ItemData"를 읽어옵니다. 이후 `_TimerService:SetTimerRepeat`을 사용하여 300초 간격으로 데이터를 문자열로 변환하여 자동으로 저장하는 구조입니다. 참고: `OnInventoryInitialized` 및 `OnInventoryModi [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```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

[task] | code [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | OnBeginPlay에서 수치 for 문을 사용해 i가 20에서 10까지 -2씩 감소하며 log로 출력하는 스크립트를 작성해줘 [answer] | OnBeginPlay에서 수치 for 문을 사용해 i가 20에서 10까지 -2씩 감소하며 log로 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { for i = 20, 10, -2 do log(i) end } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용

[task] | code [pass] | ⏳ 미판정 [title] | 메이플스토리 월드 루아 구문 [question] | OnBeginPlay에서 local 변수 countdown을 5로 초기화한 뒤 repeat-until 문을 사용해 countdown이 0이 될 때까지 1씩 감소시키며 log로 출력하고 종료 후 "The countdown is over."를 log로 출력하는 스크립트를 작성해줘 [answer] | OnBeginPlay에서 local 변수 countdown을 5로 초기화한 뒤 repeat-until 문을 사용해 countdown이 0이 될 때까지 1씩 감소시키며 log로 출력하고 종료 후 "The countdown is over."를 log로 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { local countdown = 5 repeat countdown = countdown - 1 log(countdo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 루아로 스크립트를 작성할 때 자주 사용하는 구문의 사용법을 알아봅시다. 본 가이드를 보기 전 [메이플스토리 월드 루아 기초](/docs?postId=822)를 학습하는 것을 권장합니다. # 조건문 보통 프로그램의 로직을 살펴보면 반복문과 조건문의 조합으로 이뤄지는 경우가 많습니다. 그만큼 조건문과 반복문은 프로그래밍의 기본이 되는 구문입니다. 먼저 조건문을 살펴봅시다. * **if** * 기본 조건문입니다. 조건이 **true** 면 **then**과 **end** 사이의 내용

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 UI 스크립트 작성하기 [question] | 두 이벤트 핸들러 모두에서 이벤트 중계자 설정값과 이벤트 객체에서 접근하는 파라미터 변수명을 단계별 번호 목록으로 제시하세요. [answer] | 두 이벤트 핸들러의 이벤트 중계자 설정값과 이벤트 객체에서 접근하는 파라미터 변수명은 다음과 같습니다. 1. **`OnInventoryInitialized` 이벤트 핸들러** - **이벤트 중계자 설정값**: `localplayer` - **이벤트 객체에서 접근하는 파라미터 변수명**: `AllItemCounts` (접근 방식: `event.AllItemCounts`) 2. **`OnInventoryModified` 이벤트 핸들러** - **이벤트 중계자 설정값**: `localplayer` - **이벤트 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **UIInventory** 스크립트에서는 이 정보를 전달받기 위해 이벤트 핸들러에 `OnInventoryInitialized` 이벤트를 추가하겠습니다. 그리고 핸들러 상단의 이벤트 중계자는 **localplayer**로 설정합니다. 보유 중인 아이템을 UI에 보여주기 위해 아래와 같이 작성합니다. ```lua [localplayer] HandleOnInventoryInitialized(OnInventoryInitialized event) { -- Parameters loc

[task] | single_turn [pass] | ⏳ 미판정 [title] | 다시 게임하기 [question] | CardPairGameUI의 Enable 프로퍼티가 기본값으로 비활성화되어 있으면 유저가 게임을 하지 않아도 되나요? [answer] | 네, CardPairGameUI의 Enable 프로퍼티가 기본값으로 비활성화(false)되어 있으면 유저가 게임을 하지 않아도 됩니다. 월드 입장 시 CardBoard 컴포넌트의 OnBeginPlay()에서 CardPairGameUI의 Enable을 false로 설정하면, CardPairGameUI가 비활성화 상태로 유지되어 게임이 자동으로 시작되지 않습니다. 이후 유저가 '게임 시작하기' 버튼을 누를 때만 CardPairGameUI의 Enable이 true로 변경되고 게임이 시작됩니다. 이를 구현하기 위한 코드는 다음과 같습니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임을 단 한 번만 할 수 있다면 너무나 아쉽겠죠. 게임의 묘미는 다시 하는 것이지요. 언제든지 **게임 다시하기** 버튼을 누르면 카드 짝 맞추기를 할 수 있게 지금까지 만든 월드를 아주 약간만 수정해봅시다. 정말 아주 약간이요! # 게임 시작 부분 다듬기 짝 맞추기 게임을 완성한 여러분 축하합니다! 지금까지 만든 게임을 실행하면 월드에 입장할 때마다 무조건 짝 맞추기 게임을 한번 한 뒤에야 크리에이터가 만든 월드를 둘러볼 수 있습니다. 유저가 게임을 하고 싶을 때만 게임을 할 수 있게 만들려면 어디를 고쳐야할까요? 약간의 힌

[task] | two_turn [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | 인벤토리 데이터의 주기적 저장과 플레이 종료 시 저장을 위한 `_TimerService` 및 `UserLeaveEvent` 처리 코드를 작성하는 방법은 무엇인가요? [answer] | 인벤토리 데이터를 주기적으로 저장하고, 플레이어가 게임을 나갈 때 최종 데이터를 안전하게 저장하기 위해서는 `_TimerService`와 `UserLeaveEvent` 핸들러를 조합하여 사용해야 합니다. 주기적 저장은 `_TimerService:SetTimerRepeat`을 통해 설정된 간격(예: 300초)마다 실행되는 함수를 등록하는 방식으로 처리합니다. 이 함수 내부에서는 인벤토리 데이터를 문자열로 변환한 후 `_DataStorageService`의 `SetAsync` 메서드를 호출하여 비동기적으로 저장합니다. 플레이어 종료 [followup] | `_TimerService:SetTimerRepeat`의 매개변수 순서와 `HandleUserLeaveEvent`에서 `SetAndWait`를 사용해야 하는 이유, 그리고 다른 유저의 이벤트가 수신될 때 `UserId`를 비교하여 필터링하는 로직을 코드에 어떻게 반영해야 하는지 설명해 주세요. [followup_answer] | `_TimerService:SetTimerRepeat`의 매개변수 순서, `SetAndWait` 사용 이유, 그리고 `UserId` 필터링 로직에 대한 설명과 코드 반영 방법은 다음과 같습니다. ### 1. `_TimerService:SetTimerRepeat` 매개변수 순서 `_TimerService:SetTimerRepeat` 함수는 주기적으로 특정 작업을 실행하기 위해 사용됩니다. 문서의 예시 코드에 따르면 매개변수는 다음과 같은 순서로 전달됩니다. ```lua _TimerService:SetTimerRepeat(save [scores] | [judge_reason] | [source_doc] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self.

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