← 목록

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

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

[task] | code [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | 서버 공간에서 "Inventory"라는 이름의 GlobalDataStorage를 생성하고, 아이템 ID "1001"을 키로 사용하여 수량 5를 저장하는 스크립트를 작성해줘. [answer] | 요청하신 기능을 구현하는 mLua 스크립트입니다. `_DataStorageService:GetGlobalDataStorage`는 서버 전용 함수이므로 메서드에 `[server only]` 어노테이션을 적용해야 합니다. 저장할 값은 문자열 타입으로 변환하여 `SetAsync` 메서드의 두 번째 인자로 전달해야 합니다. ```lua Method: [server only] void SaveItemQuantity() { -- "Inventory"라는 이름의 GlobalDataStorage를 생성 또는 불러옵니다. loca [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임 중 변경된 데이터 값을 GlobalDataStorage에 저장하고 불러오는 방법에 대해 알아봅니다. # Data 생성 및 불러오기 GlobalDataStorage는 데이터의 저장과 불러오기를 할 수 있는 "보관소"라 할 수 있습니다. 우리는 데이터베이스에서 데이터를 저장하거나 불러올 일이 있을 때 이 "보관소"를 이용하면 됩니다. GlobalDataStorage는 `_DataStorageService:GetGlobalDataStorage`를 통해 생성하거나 불러오기가 가능합니다. GetGlobalDat

[task] | single_turn [pass] | ⏳ 미판정 [title] | 데이터 편집 [question] | CSV 파일을 불러올 때 utf-8 인코딩이 아니면 정상적으로 가져오지 못한다는 설명이 있는데, 인코딩이 다른 CSV 파일을 그대로 사용하면 어떤 현상이 나타나나요? [answer] | 참고 문서에는 CSV 파일을 불러올 때 utf-8로 저장된 파일만 정상적으로 가져올 수 있다고 명시되어 있습니다. 그러나 인코딩이 다른(예: EUC-KR 등) CSV 파일을 그대로 사용할 경우 구체적으로 어떤 현상이 나타나는지(예: 깨진 글자, 에러 메시지 등)에 대한 설명은 문서에 포함되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 데이터 셋을 이용해 데이터를 추가하거나 수정할 수 있습니다. 이번 가이드에서는 데이터의 생성 및 편집 방법, 스크립트로 데이터를 불러오는 방법에 대해 알아봅니다. # 데이터 셋 생성 및 데이터 에디터 열기 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create DataSet**을 클릭합니다. 2. 생성된 데이터를 더블클릭하여 데이터 에디터를 엽니다. # 데이터 에디터 | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합

[task] | single_turn [pass] | ⏳ 미판정 [title] | 데이터 편집 [question] | GoogleSpreadSheet에서 데이터를 가져올 때 "웹에 게시한 URL만 사용할 수 있다"는 제약이 있는 이유는 무엇이며, 그렇지 않으면 어떻게 되나요? [answer] | 제공된 참고 문서에는 GoogleSpreadSheet에서 데이터를 가져올 때 "웹에 게시한 URL만 사용할 수 있다"는 제약 사항이 명시되어 있습니다. 그러나 이 제약을 두는 **구체적인 이유**나, 웹에 게시하지 않은 URL을 사용할 경우 발생하는 **구체적인 오류 메시지나 동작 방식**에 대한 설명은 문서에 포함되어 있지 않습니다. 따라서 해당 제건의 기술적 배경이나 실패 시나리오는 확인된 문서 정보만으로는 답변할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 데이터 셋을 이용해 데이터를 추가하거나 수정할 수 있습니다. 이번 가이드에서는 데이터의 생성 및 편집 방법, 스크립트로 데이터를 불러오는 방법에 대해 알아봅니다. # 데이터 셋 생성 및 데이터 에디터 열기 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create DataSet**을 클릭합니다. 2. 생성된 데이터를 더블클릭하여 데이터 에디터를 엽니다. # 데이터 에디터 | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | _EffectService:PlayEffect 함수의 매개변수 순서와 각 인자가 의미하는 값을 5줄 이내의 표로 정리해 주세요. [answer] | 제공된 문서에는 `_EffectService:PlayEffect` 함수의 매개변수 순서와 각 인자의 구체적인 의미를 명시한 내용이 없습니다. 문서에는 Q, W, E, R 키 입력 시 아래 코드처럼 함수가 호출되는 **예제**만 제시되어 있을 뿐, 인자별 정의는 찾을 수 없습니다. ```lua _EffectService:PlayEffect("f396262ddb6e4d5581360496bb4e9f86", self.Entity, Vector3(x,y,z), 0, Vector3(1,1,1), false) ``` 따라서 요청하신 5줄 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 위에 이어서 이번에는 각 키를 입력할 때마다 다음의 스킬 이펙트가 호출되도록 만들어보겠습니다. 우선 **_EffectService**의 함수 중 `PlayEffect` 함수를 이용해 스크립트를 작성해보겠습니다. 1. **NewSkill** 컴포넌트의 **HandleKeyDownEvent**를 다음과 같이 수정해줍니다. ```lua [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { -- Parameters

[task] | code [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | _UserItemService:CreateItem() 메서드를 사용하여 UserItemDataSet 에서 정의된 데이터를 바탕으로 인벤토리에 랜덤한 아이템을 생성하는 스크립트를 작성해줘 [answer] | 사용자가 `_UserItemService:CreateItem()` 메서드 이름을 사용하도록 요청했으나, 제공된 참고 문서에는 `_ItemService:CreateItem()` API만 등장합니다. 문서에 `_UserItemService`라는 서비스나 메서드가 존재한다고 명시되어 있지 않으므로, 존재하는 `_ItemService:CreateItem()`을 사용하여 요청하신 기능을 구현하겠습니다. 또한, `UserItemDataSet`에서 랜덤 아이템을 선택하기 위해 `OnCreate()`에서 아이템 테이블 데이터를 읽는 방식(`se [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 아이템 생성과 삭제 기능을 알아봅니다. 제작할 예제는 다음과 같습니다. * 맵에 놓인 아이템을 먹을 때마다 인벤토리에 랜덤한 아이템이 생성 * 아이템을 먹으면, 5초 뒤 아이템이 놓여있던 자리에 다시 생성 * 맵에 놓인 다른 아이템을 먹을 때마다 인벤토리에 있는 모든 아이템 삭제 # 아이템 테이블 만들기 먼저 개별 아이템을 만들어 봅시다. 개별 아이템은 아이템 테이블에서 정의할 수 있습니다. 아이템 테이블은 **DataSet**으로 만듭니다. **Workspace - MyDesk**에서 콘

[task] | code [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | 서버 공간에서 "PlayerStats"라는 이름의 GlobalDataStorage를 불러와 "Score" 값을 조회하고, 해당 값이 50보다 크면 10을 증가시켜 다시 저장하는 로직을 가진 스크립트를 작성해줘. [answer] | 요청하신 로직을 수행하기 위한 스크립트는 다음과 같습니다. `_DataStorageService:GetGlobalDataStorage`는 Server Only 함수이므로, 해당 로직은 `[server only]` 메서드 내에서 실행되어야 합니다. 데이터 조회는 `GetAsync`를 통해 비동기 방식으로 수행하며, 조회된 값이 50보다 큰 경우에만 10을 증가시킨 후 `SetAsync`를 통해 다시 저장합니다. ```lua Method: [server only] void CheckAndUpdateScore() { local [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임 중 변경된 데이터 값을 GlobalDataStorage에 저장하고 불러오는 방법에 대해 알아봅니다. # Data 생성 및 불러오기 GlobalDataStorage는 데이터의 저장과 불러오기를 할 수 있는 "보관소"라 할 수 있습니다. 우리는 데이터베이스에서 데이터를 저장하거나 불러올 일이 있을 때 이 "보관소"를 이용하면 됩니다. GlobalDataStorage는 `_DataStorageService:GetGlobalDataStorage`를 통해 생성하거나 불러오기가 가능합니다. GetGlobalDat

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | 제시된 HandleKeyDownEvent 코드에서 Q, W, E, R 키에 할당된 이펙트 ID와 매칭되는 4행 2열의 표로 출력해 주세요. [answer] | 제시된 `HandleKeyDownEvent` 코드에서 Q, W, E, R 키에 할당된 이펙트 ID를 정리한 표는 다음과 같습니다. | 키 | 이펙트 ID | | :--- | :--- | | Q | f396262ddb6e4d5581360496bb4e9f86 | | W | aae828e6daa342a996320e32dc5c2ab6 | | E | 0da34c3dd7ba4c2890107d743b8c7a97 | | R | 5f67e1efe0b84d9c9111a21ecfedc937 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 위에 이어서 이번에는 각 키를 입력할 때마다 다음의 스킬 이펙트가 호출되도록 만들어보겠습니다. 우선 **_EffectService**의 함수 중 `PlayEffect` 함수를 이용해 스크립트를 작성해보겠습니다. 1. **NewSkill** 컴포넌트의 **HandleKeyDownEvent**를 다음과 같이 수정해줍니다. ```lua [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { -- Parameters

[task] | single_turn [pass] | ⏳ 미판정 [title] | 데이터 편집 [question] | 스크립트에서 _DataService:GetTable() 함수를 사용할 때 매개변수로 데이터셋 이름 대신 다른 값을 넣으면 어떤 문제가 발생하나요? [answer] | `_DataService:GetTable()` 함수는 매개변수로 **데이터셋 이름**(문자열)을 반드시 요구합니다. 참고 문서에 따르면, 이 함수의 정의는 다음과 같습니다: > `_DataService:GetTable(string name)`: 데이터의 이름으로 데이터 테이블을 리턴하는 함수입니다. 매개 변수로 데이터 이름을 넘겨줍니다. 따라서 데이터셋 이름이 아닌 다른 값(예: 숫자, 잘못된 문자열, 존재하지 않는 이름 등)을 넣으면 해당 이름을 가진 데이터셋을 찾지 못하게 됩니다. 문서에는 잘못된 값을 넣었을 때 발생하는 구 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 데이터 셋을 이용해 데이터를 추가하거나 수정할 수 있습니다. 이번 가이드에서는 데이터의 생성 및 편집 방법, 스크립트로 데이터를 불러오는 방법에 대해 알아봅니다. # 데이터 셋 생성 및 데이터 에디터 열기 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create DataSet**을 클릭합니다. 2. 생성된 데이터를 더블클릭하여 데이터 에디터를 엽니다. # 데이터 에디터 | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | TriggerEnterEvent 핸들러에서 event.TriggerBodyEntity를 통해 접근한 InventoryComponent의 GetItemList()로 가져온 아이템을 _ItemService:RemoveItem()으로 삭제할 때, 인벤토리에 아무 아이템이 없거나 빈 테이블인 경우 에러가 발생하나요? [answer] | 제공된 참고 문서와 코드 예제를 분석한 결과, **인벤토리에 아무 아이템이 없거나 빈 테이블인 경우 에러가 발생하는지 여부는 명시되어 있지 않습니다.** 문서에 포함된 `ItemDelete` 스크립트 예제 코드는 다음과 같이 작성되어 있습니다. ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity --------------------- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Preset List**에서 임의의 엔티티를 배치합니다. 그리고 **ItemDelete**라는 이름의 스크립트 컴포넌트를 추가합니다. **ItemDelete** 스크립트를 열고, **TriggerEnterEvent**를 추가합니다. 그리고 아래와 같이 내용을 작성합니다. ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity

[task] | two_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | 아이템을 소모(먹기)한 후 5초 뒤에 원래 위치에서 다시 생성되도록 하는 타이머 로직은 어떻게 작성해야 하는가? [answer] | 아이템을 소모한 후 5초 뒤에 원래 위치에서 다시 생성되려면, 아이템이 제거되는 시점에 현재 위치를 저장하고 `_TimerService:SetTimerOnce`를 사용하여 5초 후 해당 위치에 아이템을 다시 스폰하는 로직을 구현해야 합니다. 참고 문서에 제공된 예제 코드에는 `_TimerService`나 `_SpawnService`의 사용법이 명시적으로 포함되어 있지 않아, 이 두 서비스의 정확한 메서드 시그니처(인자 순서 등)를 문서에서 확인할 수 없습니다. 그러나 mLua의 표준 규칙에 따라 `_TimerService:SetT [followup] | `_TimerService:SetTimerOnce()`를 사용하여 5초 후 특정 좌표에 아이템을 다시 스폰하는 `Method` 블록 코드를 작성해줘. [followup_answer] | 참고 문서에는 `_TimerService`와 `_SpawnService`에 대한 API 정보가 포함되어 있지 않습니다. 따라서 `_TimerService:SetTimerOnce()`의 정확한 시그니처나 `_SpawnService`를 통한 아이템 스폰 메서드를 문서 근거로만 작성할 수 없습니다. 문서에는 `_ItemService:CreateItem(ItemType, name, inventory)`와 `_ItemService:RemoveItem(item)`만 명시되어 있으며, 이는 인벤토리에 아이템을 추가/제거하는 용도입니다. 맵의 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 아이템 생성과 삭제 기능을 알아봅니다. 제작할 예제는 다음과 같습니다. * 맵에 놓인 아이템을 먹을 때마다 인벤토리에 랜덤한 아이템이 생성 * 아이템을 먹으면, 5초 뒤 아이템이 놓여있던 자리에 다시 생성 * 맵에 놓인 다른 아이템을 먹을 때마다 인벤토리에 있는 모든 아이템 삭제 # 아이템 테이블 만들기 먼저 개별 아이템을 만들어 봅시다. 개별 아이템은 아이템 테이블에서 정의할 수 있습니다. 아이템 테이블은 **DataSet**으로 만듭니다. **Workspace - MyDesk**에서 콘

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | Preset List에서 배치한 엔티티에 TriggerComponent와 ItemDelete 스크립트를 함께 붙였을 때, 캐릭터가 트리거 영역에 진입하는 순간에만 동작하도록 설정하려면 추가적인 조건 분기가 필요한가요? [answer] | 아니요, 추가적인 조건 분기가 필요하지 않습니다. `TriggerEnterEvent`는 캐릭터(또는 다른 엔티티)가 트리거 영역에 **진입하는 순간**에만 발생하도록 설계된 이벤트입니다. 따라서 `HandleTriggerEnterEvent` 핸들러 내에서 별도의 진입/비진입 조건을 체크할 필요가 없습니다. 참고 문서의 `ItemDelete` 스크립트 예제를 보면, `HandleTriggerEnterEvent` 함수 안에서 `event.TriggerBodyEntity`를 통해 진입한 엔티티를 얻은 후, 해당 엔티티의 `Invent [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Preset List**에서 임의의 엔티티를 배치합니다. 그리고 **ItemDelete**라는 이름의 스크립트 컴포넌트를 추가합니다. **ItemDelete** 스크립트를 열고, **TriggerEnterEvent**를 추가합니다. 그리고 아래와 같이 내용을 작성합니다. ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | 스킬 이펙트가 한 번만 재생된 후 사라지도록 하려면 isLoop 매개변수에 어떤 값을 설정해야 하며, 기본값은 무엇인가요? [answer] | 스킬 이펙트가 한 번만 재생된 후 사라지도록 하려면 `isLoop` 매개변수에 `false`를 설정해야 합니다. `PlayEffect`와 `PlayEffectAttached` 함수 모두에서 `isLoop`의 기본값은 `False`입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 메이플스토리에서 사용되었던 수많은 이펙트 리소스들을 제공하고 있습니다. 그리고 우리는 이러한 이펙트들을 적절한 시점과 위치에 호출해 줌으로써 한층 더 멋진 연출을 구사할 수 있습니다. 이번 과정에서는 특정 키를 누를 때마다 스킬 이펙트가 노출되는 예제를 진행해봄으로써 스크립트를 통해 이펙트를 호출하는 방법에 대해 알아보도록 합니다. 다음 가이드를 먼저 학습하면 이번 과정을 진행하는 데 많은 도움이 될 것입니다. [스크립트 에디터 오리엔테이션](https://mod-developers.

[task] | code [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | 서버 공간에서 "Inventory"라는 이름의 GlobalDataStorage를 불러와 아이템 ID "1001"의 수량을 확인하고, 수량이 0보다 크면 1을 차감한 후 다시 저장하는 스크립트를 작성해줘. [answer] | `_DataStorageService:GetGlobalDataStorage`를 사용하여 "Inventory"라는 이름의 GlobalDataStorage를 서버 공간에서 가져와야 합니다. 저장된 데이터는 문자열(string) 형태로 저장되므로, 아이템 ID "1001"에 해당하는 값을 불러올 때 콜백 함수 안에서 `tonumber`를 사용해 숫자로 변환해야 합니다. 수량이 0보다 크다면 1을 차감한 후, 다시 `SetAsync` 메서드를 통해 문자열 형태로 저장하는 로직을 구현할 수 있습니다. ```lua Method: [serv [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임 중 변경된 데이터 값을 GlobalDataStorage에 저장하고 불러오는 방법에 대해 알아봅니다. # Data 생성 및 불러오기 GlobalDataStorage는 데이터의 저장과 불러오기를 할 수 있는 "보관소"라 할 수 있습니다. 우리는 데이터베이스에서 데이터를 저장하거나 불러올 일이 있을 때 이 "보관소"를 이용하면 됩니다. GlobalDataStorage는 `_DataStorageService:GetGlobalDataStorage`를 통해 생성하거나 불러오기가 가능합니다. GetGlobalDat

[task] | two_turn [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | _EffectService의 PlayEffect 함수를 사용해 키 입력 시 스킬 이펙트를 호출하는 기본 구조가 궁금합니다 [answer] | `_EffectService`의 `PlayEffect` 함수를 사용하여 키 입력 시 스킬 이펙트를 호출하는 기본 구조는 `InputService`의 `HandleKeyDownEvent` 이벤트 핸들러를 구현하는 방식으로 구성됩니다. 이 구조에서는 이벤트 파라미터인 `event.key`를 통해 어떤 키가 눌렸는지 확인하고, 해당 키에 따라 `_EffectService:PlayEffect` 함수를 호출하여 특정 이펙트 ID를 실행합니다. 이펙트는 `self.Entity`를 기준으로 현재 위치(`self.Entity.TransformC [followup] | PlayEffect의 매개변수 중 `false` 값이 의미하는 바와, 이펙트가 사라지기 전 다른 키를 입력했을 때 발생하는 예외 상황은 무엇인가요? [followup_answer] | 제공된 참고 문서에는 `_EffectService:PlayEffect` 함수의 마지막 매개변수 `false` 값이 구체적으로 무엇을 의미하는지(예: 루프 여부, 즉시 삭제 여부 등)에 대한 명시적인 설명이 없습니다. 또한, 이펙트가 사라지기 전 다른 키를 입력했을 때 발생하는 예외 상황이나 충돌에 대한 내용도 문서에 포함되어 있지 않습니다. 따라서 해당 질문에 대해서는 참고 문서에 근거한 답변을 드릴 수 없습니다. [scores] | [judge_reason] | [source_doc] | 위에 이어서 이번에는 각 키를 입력할 때마다 다음의 스킬 이펙트가 호출되도록 만들어보겠습니다. 우선 **_EffectService**의 함수 중 `PlayEffect` 함수를 이용해 스크립트를 작성해보겠습니다. 1. **NewSkill** 컴포넌트의 **HandleKeyDownEvent**를 다음과 같이 수정해줍니다. ```lua [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { -- Parameters

[task] | two_turn [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | GetAsync 함수의 비동기 동작 원리와 콜백 함수가 필수적인 이유에 대해 설명해 주세요. [answer] | `GetAsync` 함수는 데이터를 불러오는 **비동기(Asynchronous)** 방식으로 동작합니다. 이를 통해 콜백 함수의 등록이 필수적인 이유는 다음과 같습니다. **1. 비동기 동작의 특성** `GetAsync`는 저장소에서 `key` 값에 해당하는 `value`를 요청하지만, 요청을 보낸 시점에 데이터를 즉시 반환하지 않습니다. 데이터가 언제 도착할지는 시스템 내부 처리에 따라 보장되지 않기 때문에, 함수 호출 후 바로 결과를 받아오는 동기 방식과 다릅니다. **2. 콜백 함수의 역할** 비동기 처리 특성상 `valu [followup] | value 값이 nil인 경우를 처리하는 구체적인 코드 예제를 작성해 주세요. [followup_answer] | `value` 값이 `nil`인 경우를 처리하는 구체적인 mLua 코드 예제는 다음과 같습니다. 콜백 함수 내부에서 `value`가 `nil`인지 확인하고, 해당 조건이 맞으면 기본값(예: 0)으로 대체한 뒤 프로퍼티에 저장하는 로직을 포함합니다. ```lua Property: [Sync] number Power = 0 Method: [server only] void OnBeginPlay() { local data = _DataStorageService:GetGlobalDataStorage("Data") [scores] | [judge_reason] | [source_doc] | `GetAsync`는 데이터를 불러오기 위한 함수로 value 값 저장 시 함께 저장된 key 값을 통해 value 값을 가져옵니다. 이때 GetAsync도 SetAsync와 마찬가지로 key 값에 해당하는 value 값을 요청하게 되는데, 요청한 value 값을 함수 내에서 직접 리턴 받는 것이 아닌 GetAsync에 등록한 콜백 함수의 매개 변수로 key 값과 함께 들어옵니다. 이유는 GetAsync 역시 비동기식으로 동작을 하기 때문에 불러오기 요청을 보냈을 때 value 값을 언제 보내줄지는 보장되지 않기 때문입니다. 따라서

[task] | two_turn [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | GlobalDataStorage의 SetAsync를 활용하여 데이터를 저장하는 기본 방법과 key, value 설정 원리가 궁금합니다. [answer] | GlobalDataStorage의 `SetAsync`를 통해 데이터를 저장하는 기본 방법과 key, value 설정 원리는 다음과 같습니다. **1. 데이터 저장 기본 방법** 데이터 저장은 `_DataStorageService:GetGlobalDataStorage("data")`로 GlobalDataStorage 인스턴스를 가져온 후, 해당 인스턴스의 `SetAsync` 메서드를 호출하여 수행합니다. `SetAsync`는 비동기 방식으로 동작하며, 매개변수로 `key`, `value`, 그리고 저장 완료 시점에 호출될 콜백 함수 [followup] | SetAsync 호출 시 콜백 함수를 nil로 넘기면 어떤 차이가 있으며, 비동기 특성상 저장 직후 값을 바로 읽으려 하면 어떤 문제가 발생하는지 코드 예시를 통해 설명해 주세요. [followup_answer] | `SetAsync` 호출 시 콜백 함수를 `nil`로 넘기면 저장 완료 시점에 추가적인 처리(로그 출력, 상태 변경 등)가 수행되지 않습니다. 단순히 DB에 저장을 요청만 보내고 끝나는 방식입니다. `SetAsync`는 비동기 방식이므로 요청이 실행된 시점에 데이터가 즉시 저장되지 않습니다. DB는 요청 순서대로 처리하기 때문에 실제 저장 완료 시점은 보장되지 않습니다. 따라서 `SetAsync` 호출 직후 동일한 key로 `GetAsync`를 호출하거나 저장된 값을 바로 읽으려 하면, 아직 DB에 저장되지 않은 상태이므로 이전 [scores] | [judge_reason] | [source_doc] | 데이터의 저장은 GlobalDataStorage의 SetAsync를 활용해 할 수 있습니다. `SetAsync`는 매개 변수로 key와 value, 그리고 콜백 함수를 받는데, 저장할 데이터가 있으면 key와 value 매개 변수로 값을 넘겨 저장하게 됩니다. key는 매번 변경되어 저장되는 value 값을 불러오기 위한 용도로 사용됩니다. 따라서 key 값으로는 프로퍼티 명이나 혹은 저장된 value 값이 의미하는 것으로 입력해 주는 것이 좋습니다. 예를 들어 power라는 프로퍼티(또는 스탯)의 값을 저장한다면 key에는 "Po

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | `_EffectService`의 `PlayEffect`와 `PlayEffectAttached` 함수의 매개변수 6개씩을 표로 정리해서 [answer] | `_EffectService`의 `PlayEffect`와 `PlayEffectAttached` 함수의 매개변수는 다음과 같습니다. ### `PlayEffect` 함수 매개변수 | 순서 | 매개변수 이름 | 타입 | 설명 | | :--- | :--- | :--- | :--- | | 1 | `animationClipRUID` | `string` | 호출하려는 이펙트 리소스의 RUID입니다. | | 2 | `instigator` | `Entity` | 맵 정보를 받아오기 위한 엔티티로, 이펙트가 호출될 맵과 동일한 맵에 존재하는 엔티 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 메이플스토리에서 사용되었던 수많은 이펙트 리소스들을 제공하고 있습니다. 그리고 우리는 이러한 이펙트들을 적절한 시점과 위치에 호출해 줌으로써 한층 더 멋진 연출을 구사할 수 있습니다. 이번 과정에서는 특정 키를 누를 때마다 스킬 이펙트가 노출되는 예제를 진행해봄으로써 스크립트를 통해 이펙트를 호출하는 방법에 대해 알아보도록 합니다. 다음 가이드를 먼저 학습하면 이번 과정을 진행하는 데 많은 도움이 될 것입니다. [스크립트 에디터 오리엔테이션](https://mod-developers.

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | FootholdComponent와 CustomFootholdComponent의 개념적 차이를 3문장 이내로 비교 설명하세요. [answer] | FootholdComponent는 맵 전체의 발판 정보를 저장하고 제공하는 역할을 하지만, 프로퍼티 에디터에서 값을 확인하더라도 직접 이용할 수 없습니다. 반면 CustomFootholdComponent는 원하는 모델에 직접 발판을 만들고 조정하기 위해 사용하는 컴포넌트입니다. 따라서 새로운 발판을 제작할 때는 FootholdComponent가 아닌 CustomFootholdComponent를 사용해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 여러 오브젝트를 사용해 발판을 만들어 게임의 보는 재미를 풍성하게 만들어봅시다. **FootholdComponent**와 **CustomFootholdComponent** 개념과 발판 편집 방법을 소개합니다. # Foothold 모델로 발판 만들기 **Foothold** 모델을 이용해 발판을 만드는 방법입니다. 타일이 아닌 **Foothold** 모델을 이용해 다채로운 길을 만들 수 있습니다. 1. **Preset List** 패널에서 **Foothold**를 선택합니다. 2. 원하는 모델을 선택해 **S

[task] | single_turn [pass] | ⏳ 미판정 [title] | 아이템 생성 및 삭제 [question] | 문서 예제에서 _ItemService:RemoveItem(item)을 호출할 때, 인자로 넘기는 item 객체가 어떤 형태여야 하며, 직접 생성한 아이템 ID나 인벤토리 슬롯 번호를 넘겨도 되는지 차이점이 있나요? [answer] | 제공된 참고 문서의 코드 예제를 분석하면, `_ItemService:RemoveItem(item)` 함수에 인자로 넘기는 `item` 객체는 **`InventoryComponent`의 `GetItemList()` 메서드가 반환한 목록에서 직접 추출한 아이템 객체**여야 합니다. 구체적인 차이점과 규칙은 다음과 같습니다. 1. **인자의 형태**: * `local items = inventory:GetItemList()`을 통해 리스트를 가져온 후, 해당 리스트의 요소(예: `items[1]` 또는 `for` 루프의 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Preset List**에서 임의의 엔티티를 배치합니다. 그리고 **ItemDelete**라는 이름의 스크립트 컴포넌트를 추가합니다. **ItemDelete** 스크립트를 열고, **TriggerEnterEvent**를 추가합니다. 그리고 아래와 같이 내용을 작성합니다. ```lua [self] HandleTriggerEnterEvent(TriggerEnterEvent event) { --Parameters local TriggerBodyEntity = event.TriggerBodyEntity

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | 이펙트 리소스를 스크립트로 호출하기 위해 필요한 animationClipRUID 값은 어디서 확인하고 어떻게 가져와야 하나요? [answer] | 제공된 참고 문서에는 `animationClipRUID` 값이 **어디서 확인하고 어떻게 가져와야 하는지**에 대한 설명이 없습니다. 문서에서는 `PlayEffect`와 `PlayEffectAttached` 함수의 매개변수로 `animationClipRUID`가 사용된다는 점과, 예제 코드에서 특정 문자열 값(예: `"01f39ee5971246ed8306bc471d44a1fd"`)이 사용된다는 사실만 언급하고 있을 뿐, 이 RUID 값을 탐색하거나 추출하는 구체적인 절차는 포함되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 메이플스토리에서 사용되었던 수많은 이펙트 리소스들을 제공하고 있습니다. 그리고 우리는 이러한 이펙트들을 적절한 시점과 위치에 호출해 줌으로써 한층 더 멋진 연출을 구사할 수 있습니다. 이번 과정에서는 특정 키를 누를 때마다 스킬 이펙트가 노출되는 예제를 진행해봄으로써 스크립트를 통해 이펙트를 호출하는 방법에 대해 알아보도록 합니다. 다음 가이드를 먼저 학습하면 이번 과정을 진행하는 데 많은 도움이 될 것입니다. [스크립트 에디터 오리엔테이션](https://mod-developers.

[task] | single_turn [pass] | ⏳ 미판정 [title] | 데이터 편집 [question] | 데이터 에디터에서 입력한 값이 모두 문자열로 저장된다는 점을 모르고 숫자 연산을 하려다 오류가 나는 원인은 무엇인가요? [answer] | 데이터 에디터에서 입력한 모든 데이터 값은 내부적으로 **문자열(string)** 타입으로 저장됩니다. 따라서 데이터셋에서 값을 불러와서 바로 숫자 연산(덧셈, 뺄셈, 비교 등)을 수행하려고 하면, mLua(Lua 5.3)는 문자열과 숫자 사이의 연산을 자동으로 변환해주지 않으므로 타입 오류가 발생하거나 의도하지 않은 결과가 나올 수 있습니다. 이 문제를 해결하려면 데이터셋에서 값을 가져온 후, **`tonumber()`** 함수를 사용해 명시적으로 숫자 타입으로 변환한 다음 연산을 수행해야 합니다. 아래는 데이터셋에서 값을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 데이터 셋을 이용해 데이터를 추가하거나 수정할 수 있습니다. 이번 가이드에서는 데이터의 생성 및 편집 방법, 스크립트로 데이터를 불러오는 방법에 대해 알아봅니다. # 데이터 셋 생성 및 데이터 에디터 열기 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create DataSet**을 클릭합니다. 2. 생성된 데이터를 더블클릭하여 데이터 에디터를 엽니다. # 데이터 에디터 | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합

[task] | code [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | _DataStorageService:GetGlobalDataStorage를 통해 "data" 저장소를 가져오고, SetAsync의 콜백 매개 변수로 nil을 전달하여 저장 완료 처리를 하지 않는 방식으로 Power 값을 저장하는 스크립트를 작성해줘 [answer] | 요청하신 내용대로 `_DataStorageService:GetGlobalDataStorage`로 "data" 저장소를 가져오고, `SetAsync`의 콜백으로 `nil`을 전달하여 저장 완료 시 추가 처리를 하지 않는 방식으로 Power 값을 저장하는 스크립트는 다음과 같습니다. ```lua Property: [Sync] number Power = 100 Method: [server only] void SetData() { local data = _DataStorageService:GetGlobalDataStorage [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터의 저장은 GlobalDataStorage의 SetAsync를 활용해 할 수 있습니다. `SetAsync`는 매개 변수로 key와 value, 그리고 콜백 함수를 받는데, 저장할 데이터가 있으면 key와 value 매개 변수로 값을 넘겨 저장하게 됩니다. key는 매번 변경되어 저장되는 value 값을 불러오기 위한 용도로 사용됩니다. 따라서 key 값으로는 프로퍼티 명이나 혹은 저장된 value 값이 의미하는 것으로 입력해 주는 것이 좋습니다. 예를 들어 power라는 프로퍼티(또는 스탯)의 값을 저장한다면 key에는 "Po

[task] | single_turn [pass] | ⏳ 미판정 [title] | 데이터 편집 [question] | 데이터셋의 행과 열 번호는 0부터 시작하는지 1부터 시작하는지 헷갈려서, GetCell() 함수에서 인덱스 범위를 벗어나면 어떻게 되는지 궁금합니다. [answer] | 데이터셋에서 `GetCell()` 함수의 행과 열 인덱스는 **1부터 시작**합니다. 문서에 명시된 `UserDataSet:GetCell(int row_1based, int col_based)` 함수 시그니처와 설명을 보면, 매개변수로 셀이 위치한 행과 열 번호를 입력하도록 되어 있으며, **행과 열은 1부터 시작합니다**라고 명확히 기재되어 있습니다. 인덱스 범위를 벗어나는 경우(예: 0 또는 행/열 수를 초과하는 숫자를 입력하는 경우)에 대한 구체적인 동작(예: 에러 발생, nil 반환 등)은 제공된 문서에 언급되어 있지 않 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 데이터 셋을 이용해 데이터를 추가하거나 수정할 수 있습니다. 이번 가이드에서는 데이터의 생성 및 편집 방법, 스크립트로 데이터를 불러오는 방법에 대해 알아봅니다. # 데이터 셋 생성 및 데이터 에디터 열기 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create DataSet**을 클릭합니다. 2. 생성된 데이터를 더블클릭하여 데이터 에디터를 엽니다. # 데이터 에디터 | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합

[task] | code [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | _DataStorageService:GetGlobalDataStorage와 SetAsync를 활용해 Power 프로퍼티 값을 변경한 후 저장 요청을 보내고, 콜백이 실행되는 시점에 "값이 저장되었다" 로그를 출력하며 SetAsync 호출 직후에는 "SetAsync 완료" 로그를 출력해 비동기 처리 흐름을 보여줄 수 있는 스크립트를 작성해줘 [answer] | 요청하신 비동기 처리 흐름을 보여주는 mLua 스크립트입니다. ```lua Property: [Sync] number Power = 100 Method: [server only] void FunctionExample() { local data = _DataStorageService:GetGlobalDataStorage("data") -- Power 프로퍼티 값 변경 self.Power = 20 -- 저장 완료 시점에 호출될 콜백 함수 정의 local callBack = f [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터의 저장은 GlobalDataStorage의 SetAsync를 활용해 할 수 있습니다. `SetAsync`는 매개 변수로 key와 value, 그리고 콜백 함수를 받는데, 저장할 데이터가 있으면 key와 value 매개 변수로 값을 넘겨 저장하게 됩니다. key는 매번 변경되어 저장되는 value 값을 불러오기 위한 용도로 사용됩니다. 따라서 key 값으로는 프로퍼티 명이나 혹은 저장된 value 값이 의미하는 것으로 입력해 주는 것이 좋습니다. 예를 들어 power라는 프로퍼티(또는 스탯)의 값을 저장한다면 key에는 "Po

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | 컴포넌트를 Worldspace에 추가했지만 DefaultPlayer의 프로퍼티 에디터에서 해당 컴포넌트가 보이지 않거나 추가가 안 될 때 원인은 무엇인가요? [answer] | 제공된 참고 문서에는 컴포넌트가 `DefaultPlayer`의 프로퍼티 에디터에서 보이지 않거나 추가되지 않을 때의 원인이나 해결책에 대한 정보가 포함되어 있지 않습니다. 문서에서는 단순히 **Workspace - DefaultPlayer**의 프로퍼티 에디터에서 **NewSkill** 컴포넌트를 추가하는 절차(4단계)만 설명하고 있으며, 추가가 실패할 수 있는 조건이나 오류 원인에 대해 언급하지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스킬 호출 기능에 앞서 간단하게 키 입력을 받는 기능을 먼저 만들어보겠습니다. 1. **Workspace**에서 새 컴포넌트를 추가하고, 이름으로 **NewSkill**을 입력합니다. 2. **NewSkill** 컴포넌트에 키 입력 이벤트를 처리할 핸들러를 추가합니다. **[+]** 버튼을 눌러 **KeyDownEvent**를 추가합니다. 3. **HandleKeyDownEvent**의 코드를 다음과 같이 작성해 줍니다. ```lua [service: InputService]

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | 키 입력 시 이펙트를 재생하는 HandleKeyDownEvent 함수의 전체 구현 코드만 출력하고, 설명은 -- 주석으로만 작성해 주세요. [answer] | ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { -- Parameters local key = event.key -------------------------------------------------------- local transform = self.Entity.TransformComponent local x = transform.Position.x local y = transf [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 위에 이어서 이번에는 각 키를 입력할 때마다 다음의 스킬 이펙트가 호출되도록 만들어보겠습니다. 우선 **_EffectService**의 함수 중 `PlayEffect` 함수를 이용해 스크립트를 작성해보겠습니다. 1. **NewSkill** 컴포넌트의 **HandleKeyDownEvent**를 다음과 같이 수정해줍니다. ```lua [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { -- Parameters

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | KeyboardKey.Q와 같은 상수 대신 숫자 코드를 직접 입력하는 것이 가능하고, 둘 사이에는 어떤 차이가 있나요? [answer] | 제공된 참고 문서에는 `KeyboardKey.Q`와 같은 상수 대신 숫자 코드를 직접 입력하는 방법에 대한 설명이나 둘 사이의 차이에 대한 정보가 포함되어 있지 않습니다. 따라서 주어진 문서 기준으로 이 질문에 답변할 수 없습니다. 문서에는 `KeyboardKey.Q`, `KeyboardKey.W`, `KeyboardKey.E`, `KeyboardKey.R`, `KeyboardKey.T`, `KeyboardKey.S`와 같은 상수 형태로 키를 비교하는 예제 코드만 제시되어 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스킬 호출 기능에 앞서 간단하게 키 입력을 받는 기능을 먼저 만들어보겠습니다. 1. **Workspace**에서 새 컴포넌트를 추가하고, 이름으로 **NewSkill**을 입력합니다. 2. **NewSkill** 컴포넌트에 키 입력 이벤트를 처리할 핸들러를 추가합니다. **[+]** 버튼을 눌러 **KeyDownEvent**를 추가합니다. 3. **HandleKeyDownEvent**의 코드를 다음과 같이 작성해 줍니다. ```lua [service: InputService]

[task] | code [pass] | ⏳ 미판정 [title] | Data DB 저장 및 불러오기 [question] | _DataStorageService:GetGlobalDataStorage와 SetAsync를 사용하여 [Sync] number 타입의 Power 프로퍼티를 "Power" 키로 저장하고, 콜백 함수에서 errorcode와 key를 출력하는 스크립트를 작성해줘 [answer] | 요청하신 기능은 `_DataStorageService:GetGlobalDataStorage`로 글로벌 데이터 스토리지에 접근한 후, `SetAsync` 메서드를 사용하여 `Power` 프로퍼티의 값을 문자열로 변환해 "Power" 키와 함께 저장하는 방식으로 구현됩니다. `SetAsync`는 비동기 방식으로 동작하므로, 데이터가 실제로 저장된 시점에 처리를 수행하기 위해 콜백 함수를 지정해야 합니다. 이 콜백 함수에서는 `errorcode`와 `key` 매개변수를 받아 로그를 출력합니다. ```lua Property: [Sync [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터의 저장은 GlobalDataStorage의 SetAsync를 활용해 할 수 있습니다. `SetAsync`는 매개 변수로 key와 value, 그리고 콜백 함수를 받는데, 저장할 데이터가 있으면 key와 value 매개 변수로 값을 넘겨 저장하게 됩니다. key는 매번 변경되어 저장되는 value 값을 불러오기 위한 용도로 사용됩니다. 따라서 key 값으로는 프로퍼티 명이나 혹은 저장된 value 값이 의미하는 것으로 입력해 주는 것이 좋습니다. 예를 들어 power라는 프로퍼티(또는 스탯)의 값을 저장한다면 key에는 "Po

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | HandleKeyDownEvent 함수 내에서 if-elseif 구조를 사용하는 대신 테이블 매핑으로 키를 처리하면 어떤 장점이 있나요? [answer] | 제공된 문서에는 `HandleKeyDownEvent` 함수 내에서 `if-elseif` 구조를 사용하는 대신 테이블 매핑을 사용하는 방법에 대한 내용이나 그 장점에 대한 설명이 포함되어 있지 않습니다. 문서에는 `if-elseif` 구조를 사용하여 특정 키(`KeyboardKey.Q`, `W`, `E`, `R`, `T`, `S` 등)를 판별하고 해당 동작(로그 출력, 스킬 호출 등)을 실행하는 코드 예제만 제시되어 있습니다. 따라서 문서의 근거만으로 테이블 매핑 방식의 장점을 설명할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스킬 호출 기능에 앞서 간단하게 키 입력을 받는 기능을 먼저 만들어보겠습니다. 1. **Workspace**에서 새 컴포넌트를 추가하고, 이름으로 **NewSkill**을 입력합니다. 2. **NewSkill** 컴포넌트에 키 입력 이벤트를 처리할 핸들러를 추가합니다. **[+]** 버튼을 눌러 **KeyDownEvent**를 추가합니다. 3. **HandleKeyDownEvent**의 코드를 다음과 같이 작성해 줍니다. ```lua [service: InputService]

[task] | code [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | InputService 의 KeyDownEvent 를 처리하여 E 키 입력 시 이펙트를 호출하는 NewSkill 스크립트를 작성해줘 [answer] | 참고 문서에 따르면, `InputService`의 `KeyDownEvent`를 처리하여 특정 키(예: E키) 입력 시 이펙트를 호출하는 구체적인 API나 메서드는 문서에 명시되어 있지 않습니다. 문서에는 키 입력 감지(`KeyboardKey.E` 비교)와 로그 출력(`log`) 예제는 있으나, 실제 이펙트를 생성하거나 호출하는 함수 명은 제공되지 않았습니다. 따라서 문서에 있는 정보만으로 **이펙트를 실제로 호출하는 부분**을 작성할 수 없습니다. 하지만 문서의 예제를 바탕으로 **E 키 입력을 감지하는 부분**까지만 작성해 드리 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스킬 호출 기능에 앞서 간단하게 키 입력을 받는 기능을 먼저 만들어보겠습니다. 1. **Workspace**에서 새 컴포넌트를 추가하고, 이름으로 **NewSkill**을 입력합니다. 2. **NewSkill** 컴포넌트에 키 입력 이벤트를 처리할 핸들러를 추가합니다. **[+]** 버튼을 눌러 **KeyDownEvent**를 추가합니다. 3. **HandleKeyDownEvent**의 코드를 다음과 같이 작성해 줍니다. ```lua [service: InputService]

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