[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | "globalDS" GlobalDataStorage에서 "TempData" 키의 값을 삭제한 후, 삭제 성공 여부를 확인하기 위해 다시 값을 조회하여 유효한 값이 아닌 경우 로그로 "데이터 삭제됨"을 출력하는 스크립트를 작성해줘 [answer] | GlobalDataStorage에서 특정 키의 값을 삭제한 뒤, 다시 조회하여 유효한 값이 존재하지 않는지 확인하는 로직입니다. `DeleteAndWait` 함수로 삭제 작업을 수행하고, 이후 `GetAndWait` 함수로 해당 키의 값을 조회합니다. 조회 결과에서 에러 코드가 정상(0)이 아니거나 값이 유효하지 않다면 삭제에 성공했다고 판단하여 로그를 출력합니다. ```lua Method: [server only] void DeleteAndCheckTempData() { local globalDataStorage = _D [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorageService를 통해 저장된 DataStorage 목록을 조회할 때, 어떤 함수를 사용해야 하며 CreatorDataStorage와 다른 타입의 차이점이 있나요? [answer] | DataStorage 목록을 조회하기 위해 `DataStorageService`에서 제공하는 함수는 **AndWait** 및 **Async** 버전을 모두 지원합니다. 조회 대상에 따라 다음 함수를 사용합니다: * **GlobalDataStorage**: `GetGlobalDataStoragePagesAndWait()` 또는 `GetGlobalDataStoragePagesAsync()` * **SortableDataStorage**: `GetSortableDataStoragePagesAndWait()` 또는 `GetSort [followup] | GetGlobalDataStoragePagesAndWait로 조회한 pages를 순회하며 특정 이름의 DataStorage를 찾는 코드 작성법을 알려주세요. [followup_answer] | 참고 문서에는 `GetGlobalDataStoragePagesAndWait` 함수를 호출하여 `GlobalDataStoragePages`를 받는 방법은 제시되어 있으나, 반환된 **pages 객체를 어떻게 순회(iterate)하는지**에 대한 구체적인 API나 코드 예제는 제공되지 않습니다. 문서에는 "#### pages 순회하기"라는 제목만 존재하고 그 아래에 실제 순회 코드가 포함되어 있지 않기 때문에, pages 객체의 내부 구조나 순회를 위한 메서드(예: `GetNextPage`, `GetEnumerator` 등)를 지어낼 [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorageKeyInfo 객체의 Key 와 Version 속성을 설정하여 SetByInfoAndWait 와 GetByInfoAndWait 를 호출하는 변수 선언 및 함수 호출 순서만 3문장 이내로 설명하세요. [answer] | `DataStorageKeyInfo()` 객체를 생성한 뒤 `Key`와 `Version` 속성에 값을 할당합니다. 저장 시에는 설정한 키 정보를 인자로 `SetByInfoAndWait`를 호출합니다. 조회 시에는 동일한 키 정보로 `GetByInfoAndWait`를 호출해 값을 가져옵니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") keyInfo = DataStorageKeyInfo() keyInfo.Key = "Key" keyInfo.Version = "Version1" globalDataStorage:SetByInfoAndWait(keyInfo, "Value") -- 기존 버전의 "Value" 값을 덮어 쓰는 대신 새로운 버전을 만들어 저장합니다. keyInfo.Key = "Key" keyInfo.
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage를 통해 데이터를 조회할 때 IsLastPage 프로퍼티가 false인데 다음 페이지로 넘어가지 않으면 어떤 문제가 발생하며, 이를 방지하기 위한 올바른 로직은 무엇인가요? [answer] | GlobalDataStorage 목록을 페이지 단위로 조회할 때 `IsLastPage` 프로퍼티가 `false`인데 다음 페이지로 넘어가는 로직(`MoveToNextPageAndWait()`)이 없으면, 현재 페이지의 데이터만 반복적으로 처리하는 **무한 루프**가 발생하게 됩니다. `IsLastPage`가 `false`라는 것은 아직 다음 페이지가 존재한다는 의미이므로, 반드시 페이지를 넘겨야 전체 데이터를 조회할 수 있습니다. 다음 페이지로 넘어가지 않으면 `while true` 루프가 종료 조건(`break`)에 도달할 수 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage 목록 또는 데이터 목록을 받을 때 페이지 단위로 목록을 조회할 수 있는 객체인 Pages 형태로 값을 받습니다. ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() --GetCurrentPageDatas()로 현
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage 에서 기존 데이터를 덮어쓰지 않고 새로운 버전으로 저장하고 과거 버전 값을 가져와 최신 버전에 덮어쓰는 과정을 5줄 이내의 mLua 코드로만 출력하세요. [answer] | ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") local keyInfo = DataStorageKeyInfo() keyInfo.Key, keyInfo.Version = "Key", "V1" globalDataStorage:SetByInfoAndWait(keyInfo, "Value1") keyInfo.Version = "V2" globalDataStorage:SetByInfoAndWait(keyInfo, "Value2") loc [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") keyInfo = DataStorageKeyInfo() keyInfo.Key = "Key" keyInfo.Version = "Version1" globalDataStorage:SetByInfoAndWait(keyInfo, "Value") -- 기존 버전의 "Value" 값을 덮어 쓰는 대신 새로운 버전을 만들어 저장합니다. keyInfo.Key = "Key" keyInfo.
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorage에서 페이지를 이동할 때 MoveToNextPageAndWait와 일반적인 페이지 이동 메서드의 차이점이 무엇이며, 어떤 상황에서 각각을 사용해야 하나요? [answer] | 제공된 참고 문서에는 `MoveToNextPageAndWait` 메서드에 대한 정보만 포함되어 있으며, "일반적인 페이지 이동 메서드"(예: 비동기 버전인 `MoveToNextPageAsync` 등)에 대한 설명이나 코드 예제는 없습니다. 따라서 문서에 근거하여 두 메서드의 차이점이나 일반적인 페이지 이동 메서드의 사용 상황을 비교 설명하는 것은 불가능합니다. 문서에 존재하는 정보만으로는 `MoveToNextPageAndWait`가 다음 페이지로 넘어가기 위해 사용되는 메서드이며, `IsLastPage` 프로퍼티를 통해 마지막 페 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage 목록 또는 데이터 목록을 받을 때 페이지 단위로 목록을 조회할 수 있는 객체인 Pages 형태로 값을 받습니다. ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() --GetCurrentPageDatas()로 현
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | 페이지네이션 처리 시 다음 페이지로 이동하기 전에 반드시 확인해야 하는 조건부 속성은 무엇인가요? [answer] | 페이지네이션 처리 시 다음 페이지로 이동하기 전에 반드시 확인해야 하는 조건부 속성은 `pages.IsLastPage`입니다. `pages.IsLastPage == true`인 경우 마지막 페이지이므로 `pages:MoveToNextPageAndWait()`를 호출하지 않고 루프를 빠져나와야 합니다. ```lua if pages.IsLastPage == true then break end pages:MoveToNextPageAndWait() ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") keyInfo = DataStorageKeyInfo() keyInfo.Key = "Key" keyInfo.Version = "Version1" globalDataStorage:SetByInfoAndWait(keyInfo, "Value") -- 기존 버전의 "Value" 값을 덮어 쓰는 대신 새로운 버전을 만들어 저장합니다. keyInfo.Key = "Key" keyInfo.
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | Pages 객체를 사용해서 DataStorage 목록을 조회할 때, 모든 페이지를 순회하며 데이터를 처리하는 코드를 어떻게 작성해야 하나요? [answer] | `Pages` 객체를 사용해서 DataStorage 목록을 조회하고 모든 페이지를 순회하며 데이터를 처리하려면, `while true` 루프 안에서 현재 페이지의 데이터를 가져와 처리한 후 마지막 페이지인지 확인하고, 마지막이 아니면 다음 페이지로 이동하는 방식으로 코드를 작성합니다. 아래는 해당 로직을 구현한 mLua 스크립트 예제입니다. ```lua Method: void ProcessAllDataStoragePages() { -- 1. DataStorage 목록을 페이지 단위로 조회합니다. local erro [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage 목록 또는 데이터 목록을 받을 때 페이지 단위로 목록을 조회할 수 있는 객체인 Pages 형태로 값을 받습니다. ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() --GetCurrentPageDatas()로 현
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | "globalDS" GlobalDataStorage에 "PlayerScore" 키가 없으면 100으로 생성하고, 있으면 50을 증가시킨 후 결과를 로그로 출력하는 스크립트를 작성해줘 [answer] | `GlobalDataStorage`는 키가 존재하지 않을 때 기본값을 지정하여 생성하는 기능이 제공되지 않습니다. `IncreaseAndWait`와 같은 증가 함수는 `SortableDataStorage`에만 존재하며, `GlobalDataStorage`에서는 사용할 수 없습니다. 따라서 요청하신 "없으면 100으로 생성, 있으면 50 증가" 로직을 구현하려면 `GlobalDataStorage`의 `GetAndWait`와 `SetAndWait` 함수를 조합해야 합니다. ```lua Method: [server only] void [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage에 테이블 타입의 데이터를 저장하고 다시 가져오는 과정은 어떻게 이루어지나요? [answer] | GlobalDataStorage는 문자열(string) 타입의 값만 직접 저장 및 가져올 수 있기 때문에, 테이블(table) 타입의 데이터를 처리하려면 **저장할 때 테이블을 문자열로 변환**하고, **가져올 때 문자열을 다시 테이블로 변환**하는 과정을 거칩니다. 이 과정을 수행하는 데에는 `_UtilLogic` 서비스의 함수 두 가지가 필요합니다. 1. **저장 시:** `_UtilLogic:TableToString()` 함수를 사용하여 테이블 데이터를 문자열로 변환한 뒤, DataStorage에 저장합니다. 2. ** [followup] | `_UtilLogic:TableToString()`으로 변환하여 저장한 후, `GetAndWait`로 문자열을 받은 뒤 `_UtilLogic:StringToTable()`로 복원하는 전체 코드 예시를 보여주세요. [followup_answer] | GlobalDataStorage에 테이블 데이터를 저장하고 가져오는 전체 과정은 다음과 같습니다. 저장 시 `_UtilLogic:TableToString()`으로 테이블을 문자열로 변환해 저장하고, 가져오기 시 `GetAndWait`로 문자열을 받은 뒤 `_UtilLogic:StringToTable()`로 원래의 테이블 형태로 복원합니다. ```lua Property: [None] table testTable = {} Method: [server only] void OnBeginPlay() { -- 1. 저장할 테이블 데 [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorageKeyInfo 객체에서 Key와 Version 필드를 설정하는 과정 없이 바로 값을 저장하려고 하면 어떤 문제가 발생하나요? [answer] | DataStorageKeyInfo 객체에서 Key와 Version 필드를 설정하지 않고 `SetByInfoAndWait`와 같은 저장 함수를 호출하면, 저장 대상이 되는 데이터의 식별 정보(Key)와 버전 정보가 부재한 상태가 됩니다. DB DataStorage는 특정 Key와 Version의 조합으로 데이터를 구분하여 관리하며, 특히 버전 관리 기능(예: 과거 버전 조회, 특정 버전 덮어쓰기)을 위해 Version 필드가 필수적입니다. 따라서 이 필드들이 올바르게 설정되지 않으면 의도하지 않은 데이터가 저장되거나, 버전 관리 로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") keyInfo = DataStorageKeyInfo() keyInfo.Key = "Key" keyInfo.Version = "Version1" globalDataStorage:SetByInfoAndWait(keyInfo, "Value") -- 기존 버전의 "Value" 값을 덮어 쓰는 대신 새로운 버전을 만들어 저장합니다. keyInfo.Key = "Key" keyInfo.
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage 'globalDS'에서 `DataStorageKeyInfo`를 이용해 'Key'의 'Version1' 버전을 `GetByInfoAndWait`로 가져와 출력하고, 최신 버전 값도 `GetAndWait`로 비교하여 출력하는 스크립트를 작성해줘 [answer] | GlobalDataStorage 'globalDS'에서 `DataStorageKeyInfo`를 사용해 특정 버전과 최신 버전의 값을 각각 가져오는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") -- 특정 버전(Version1)의 값을 가져오기 위한 DataStorageKeyInfo 설정 lo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GetSortedAndWait 함수의 파라미터 구성과 페이지 이동 로직을 표로 정리해서 설명하세요. [answer] | `GetSortedAndWait` 함수는 `SortableDataStorage` 객체에서 데이터를 정렬하여 페이지 단위로 가져올 때 사용합니다. ### 1. GetSortedAndWait 파라미터 구성 함수 호출 시 전달하는 파라미터는 다음과 같습니다. | 파라미터 순서 | 이름 (예시) | 설명 | | :--- | :--- | :--- | | 1 | `SortDirection` | 정렬 방향을 지정합니다. `SortDirection.Ascending`(오름차순) 또는 `SortDirection.Descending`(내림차순) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 GetSortedAndWait 및 GetSortedAsync 함수로 데이터를 정렬할 수 있습니다. 데이터를 정렬하여 가져올 때 오름차순으로 정렬할지 내림차순으로 정렬할지 지정할 수 있으며 최솟값과 최댓값을 지정하여 원하는 범위의 값 목록을 정렬하여 가져올 수 있습니다. SortableDataStorage에 저장된 데이터를 정렬해 가져오는 예제입니다. ```lua local sortableDataStorage = _DataStorageService:GetSortableDataStorage("s
[task] | two_turn [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | `ToFormattedString`에서 "tt" 지정자만으로 AM/PM을 구분할 때, 12시간제 기준의 경계 시간(0:00:00, 11:59:59, 12:00:00, 23:59:59)에서 각각 어떤 문자열이 출력되는지 알려주세요 [answer] | `ToFormattedString` 메서드의 `"tt"` 지정자는 12시간제 기준의 AM/PM 표기를 반환합니다. 주어진 경계 시간에서의 출력 결과는 다음과 같습니다. * **0:00:00**: `AM` (0:00:00부터 11:59:59.999까지는 AM) * **11:59:59**: `AM` (0:00:00부터 11:59:59.999까지는 AM) * **12:00:00**: `PM` (12:00:00부터 23:59:59.999까지는 PM) * **23:59:59**: `PM` (12:00:00부터 23:59:59 [followup] | 11:59:59.999와 12:00:00 사이의 미세한 차이를 테스트하기 위해 `DateTime` 생성 시 밀리초(023)를 포함한 구체적인 코드 예시를 작성해 주세요 [followup_answer] | 11:59:59.999와 12:00:00 사이의 경계값을 테스트하기 위한 `DateTime` 생성 및 `ToFormattedString` 호출 예제는 다음과 같습니다. `DateTime` 생성 시 인자 순서는 `년, 월, 일, 시, 분, 초, 밀리초`입니다. 11:59:59.999는 `AM`으로, 12:00:00.000은 `PM`으로 출력되어야 합니다. ```lua Method: [client only] void TestBoundaryTime() { -- 11:59:59.999 (AM의 마지막 순간) -- Date [scores] | [judge_reason] | [source_doc] | "tt" 사용자 지정 서식 지정자는 AM/PM 지정자를 나타냅니다. AM 지정자는 0:00:00부터 11:59:59.999까지의 모든 시간에 사용되고 PM 지정자는 12:00:00부터 23:59:59.999까지의 모든 시간에 사용됩니다. ```lua local date = DateTime(2022, 8, 29, 19, 7, 5, 023) log(date:ToFormattedString("tt")) -- PM ``` #### "y" "y" 사용자 지정 서식 지정자는 연도를 한자리 또는 두 자리 숫자로 나타냅니다. 연도가 두 자리를
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | `_DataStorageService`의 `SetByInfoAndWait`와 `GetByInfoAndWait`를 통해 키(Key)와 버전(Version)을 지정해 데이터를 저장 및 조회하는 기본 원리는 무엇인가요? [answer] | `_DataStorageService`의 `SetByInfoAndWait`와 `GetByInfoAndWait`는 키(Key)와 버전(Version)을 조합하여 데이터를 관리하는 원리를 사용합니다. **1. 저장 원리 (`SetByInfoAndWait`)** - `DataStorageKeyInfo` 객체를 생성하여 `Key`와 `Version` 필드를 설정합니다. - `SetByInfoAndWait(keyInfo, value)`를 호출하면 해당 `Key`와 `Version` 조합에 해당하는 데이터를 저장합니다. - **중요:** 동 [followup] | `GetVersionsAndWait`에서 `SortDirection.Ascending`과 날짜 범위(`minDate`, `maxDate`)를 지정하여 특정 기간 내의 버전 목록을 페이징 처리하며 가져오는 구체적인 코드 예시를 보여주세요. [followup_answer] | `GetVersionsAndWait`를 사용하여 특정 날짜 범위 내의 버전 목록을 페이징 처리하며 가져오는 코드는 다음과 같습니다. ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") -- 4월 20일부터 5월 20일까지의 버전 목록만 가져옵니다. local minDate = DateTime(2022, 4, 20) local maxDate = DateTime(2022, 5, 20) local errorCode, pages = [scores] | [judge_reason] | [source_doc] | ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") keyInfo = DataStorageKeyInfo() keyInfo.Key = "Key" keyInfo.Version = "Version1" globalDataStorage:SetByInfoAndWait(keyInfo, "Value") -- 기존 버전의 "Value" 값을 덮어 쓰는 대신 새로운 버전을 만들어 저장합니다. keyInfo.Key = "Key" keyInfo.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | SetPixelTest 엔티티에 추가해야 하는 컴포넌트와 Scale 프로퍼티 값(X, Y)을 표로 정리해서 작성하세요. [answer] | SetPixelTest 엔티티에 추가해야 하는 컴포넌트와 Scale 프로퍼티 값은 다음과 같습니다. | 컴포넌트 | 프로퍼티 | 값 | | :---: | :---: | :---: | | TransformComponent | Scale X | 10 | | TransformComponent | Scale Y | 10 | | PixelRendererComponent | - | - | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetPixel` 함수를 활용해 스프라이트에서 원하는 위치의 픽셀 색상을 변경할 수 있습니다. 버튼을 누르면 스프라이트의 랜덤한 위치에 랜덤한 색상의 픽셀이 표시되도록 해봅시다. 1. **Hierarchy - map01 - Create Entity - Create Empty**를 눌러 새로운 **SetPixelTest**를 생성합니다. 2. **SetPixelTest** 엔티티에 **TransformComponent**를 추가하고 **Scale** 프로퍼티에 **X = 10, Y = 10**을 입력합니다. 그리
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | PixelRendererTest 스크립트의 Property 블록에 선언된 변수 네 가지의 이름과 초기값을 단계별 번호 목록으로 나열하세요. [answer] | PixelRendererTest 스크립트의 Property 블록에 선언된 변수 네 가지의 이름과 초기값은 다음과 같습니다. 1. `color` : `Color(0,0,0,0)` 2. `lastColor` : `Color(0,0,0,0)` 3. `lastX` : `0` 4. `lastY` : `0` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetPixel` 함수를 활용해 스프라이트에서 원하는 위치의 픽셀 색상을 변경할 수 있습니다. 버튼을 누르면 스프라이트의 랜덤한 위치에 랜덤한 색상의 픽셀이 표시되도록 해봅시다. 1. **Hierarchy - map01 - Create Entity - Create Empty**를 눌러 새로운 **SetPixelTest**를 생성합니다. 2. **SetPixelTest** 엔티티에 **TransformComponent**를 추가하고 **Scale** 프로퍼티에 **X = 10, Y = 10**을 입력합니다. 그리
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GlobalDataStorage 'globalDS'의 'Score' 키에 정수 값 100을 저장하고, `_UtilLogic:TableToString()`으로 변환된 테이블을 'Config' 키에 저장한 뒤 `GetAndWait`로 가져와 `_UtilLogic:StringToTable()`로 복원하여 출력하는 스크립트를 작성해줘 [answer] | GlobalDataStorage는 문자열 타입의 값만 저장 및 가져올 수 있으므로, 정수 값 100을 문자열로 변환하여 저장하고, 테이블은 `_UtilLogic:TableToString()`으로 문자열화한 뒤 저장해야 합니다. 가져올 때는 `GetAndWait`로 문자열을 받은 후 `_UtilLogic:StringToTable()`로 원형 테이블로 복원합니다. ```lua Method: [server only] void OnBeginPlay() { local globalDataStorage = _DataStorageServ [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | 여러 개의 데이터를 동시에 저장할 때 BatchSetAndWait를 사용했는데, 일부 키만 저장에 실패한 경우 이를 어떻게 감지하고 처리해야 하나요? [answer] | `BatchSetAndWait()` 함수는 실행 결과로 **에러 코드(`errorCode`)**와 **성공한 값의 키를 담은 테이블(`successKeys`)**을 반환합니다. 일부 키만 실패한 경우를 감지하고 처리하는 방법은 다음과 같습니다. 1. **성공 키 확인:** 반환받은 `successKeys` 테이블에 요청했던 모든 키가 포함되어 있는지 확인합니다. 2. **실패 키 추출:** 요청한 전체 키 목록(`keyValues`의 키)에서 `successKeys`에 없는 키를 찾아냅니다. 3. **오류 처리:** 추출된 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage 목록 또는 데이터 목록을 받을 때 페이지 단위로 목록을 조회할 수 있는 객체인 Pages 형태로 값을 받습니다. ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() --GetCurrentPageDatas()로 현
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | _DataStorageService를 통해 현재 존재하는 모든 SortableDataStorage 목록을 조회하고, 각 페이지의 이름을 순회하며 로그로 출력하는 스크립트를 작성해줘 [answer] | `_DataStorageService:GetSortableDataStoragePagesAndWait()` 함수를 호출하여 SortableDataStorage 목록을 페이지 객체(`SortableDataStoragePages`) 형태로 가져온 후, 해당 페이지의 이름을 순회하며 로그로 출력하는 스크립트는 다음과 같습니다. 참고 문서에 명시된 `GetSortableDataStoragePagesAndWait` 호출 방식과 `GlobalDataStoragePages`와 동일한 Pages 구조를 가진다는 설명을 근거로 작성했습니다. `` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 IncreaseAndWait, IncreaseAsync 함수를 활용해 값을 증가시킬 수 있습니다. 각 함수의 delta 입력 값만큼 해당 매개 변수의 값이 증가하거나 감소합니다. 매개 변수로 들어온 값이 양수일 때는 증가, 음수일 때는 감소합니다. 만약, 증가시키고자 하는 값이 DataStorage에 존재하지 않는다면 기본값 0으로 저장하고 delta만큼 증가하게 됩니다. IncreaseAndWait 및 IncreaseAsync 함수는 에러 코드와 증가된 후의 값을 제공합니다. DataStor
[task] | two_turn [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | ":"과 "/" 사용자 지정 서식 지정자가 각각 시간 구분 기호와 날짜 구분 기호로 사용될 때, 단독 사용 시 "%"를 붙여야 하는 경우와 `DateTime` 생성 시 파싱에 사용되는 경우의 차이를 설명해 주세요 [answer] | `":"`와 `"/"` 사용자 지정 서식 지정자는 `DateTime` 객체의 문자열 변환(`ToFormattedString`)과 문자열로부터 `DateTime` 객체 생성(파싱)이라는 두 가지 전혀 다른 목적에 사용됩니다. 이 두 용도에서 단독 사용 시 `"%"` 접두사 필요 여부가 다릅니다. **1. `ToFormattedString`에서 서식 문자열로 단독 사용 시** `":"`나 `"/"`를 `ToFormattedString` 메서드의 서식 문자열로 **단독으로만** 사용할 때는 반드시 앞에 `"%"`를 붙여야 합니다. * [followup] | "h:mm:ss" 형식으로 "3:32:22"를 파싱하여 `DateTime` 객체를 생성하고, 이를 다시 `ToFormattedString`으로 출력할 때 원래 입력과 출력의 형식 차이가 발생하는 이유를 코드와 함께 설명해 주세요 [followup_answer] | `DateTime("3:32:22", "h:mm:ss")`로 객체를 생성한 후 `log(date)` 또는 기본 서식으로 출력할 때 원래 입력 문자열("3:32:22")과 출력 결과가 달라지는 이유는, **`DateTime` 객체가 생성되면 문자열 형태가 아닌 내부적으로 표준화된 날짜/시간 데이터로 저장되기 때문**입니다. 참고 문서의 예시를 보면, `DateTime("3:32:22", "h:mm:ss")`로 생성된 객체를 `log(date)`로 출력했을 때 결과는 `05/17/2022 03:32:22`입니다. 여기서 두 가지 변화 [scores] | [judge_reason] | [source_doc] | "tt" 사용자 지정 서식 지정자는 AM/PM 지정자를 나타냅니다. AM 지정자는 0:00:00부터 11:59:59.999까지의 모든 시간에 사용되고 PM 지정자는 12:00:00부터 23:59:59.999까지의 모든 시간에 사용됩니다. ```lua local date = DateTime(2022, 8, 29, 19, 7, 5, 023) log(date:ToFormattedString("tt")) -- PM ``` #### "y" "y" 사용자 지정 서식 지정자는 연도를 한자리 또는 두 자리 숫자로 나타냅니다. 연도가 두 자리를
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | pages:GetCurrentPageDatas()로 가져온 item에서 KeyInfo.Key와 Value를 로그로 출력할 때, Value가 테이블 타입인 경우에도 그대로 log로 출력 가능한가요? [answer] | 제공된 참고 문서에는 `Value`가 테이블 타입인 경우 `log` 함수로 출력할 수 있는지에 대한 설명이 없습니다. 문서에서 `log(item.Value)`를 호출하는 예제는 제공되고 있지만, `Value`의 허용 타입(문자열, 숫자, 테이블 등)이나 `log` 함수가 테이블을 어떻게 처리하는지에 대한 구체적인 사양은 기재되어 있지 않습니다. 따라서 해당 기능이 지원되는지 여부는 확답할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SortableDataStorage는 GetSortedAndWait 및 GetSortedAsync 함수로 데이터를 정렬할 수 있습니다. 데이터를 정렬하여 가져올 때 오름차순으로 정렬할지 내림차순으로 정렬할지 지정할 수 있으며 최솟값과 최댓값을 지정하여 원하는 범위의 값 목록을 정렬하여 가져올 수 있습니다. SortableDataStorage에 저장된 데이터를 정렬해 가져오는 예제입니다. ```lua local sortableDataStorage = _DataStorageService:GetSortableDataStorage("s
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | 데이터 저장, 불러오기, 제거 작업을 일괄 수행하기 위해 `Batch` 접두사 함수를 사용할 때의 장점과 주의사항은 무엇인가요? [answer] | 데이터 저장, 불러오기, 제거 작업을 일괄 수행할 때 `Batch` 접두사 함수를 사용하는 것의 장점과 주의사항은 다음과 같습니다. **장점** * **성능 향상:** 여러 개의 값을 동시에 저장하거나 가져오거나 제거할 때, 개별 함수를 반복 호출하는 것보다 `Batch` 접두사 함수를 활용하는 것이 훨씬 빠르게 많은 요청을 수행할 수 있습니다. **주의사항** * **부분 성공 처리 필요:** `Batch` 함수는 요청한 작업들 중 일부만 성공하는 상황이 발생할 수 있습니다. * **결괏값 확인 및 오류 처리:** [followup] | `BatchSetAsync()`를 사용했을 때 비동기 처리로 인한 에러 코드 처리와 성공한 키의 확인 방법을 구체적으로 설명해 주세요. [followup_answer] | 참고 문서에 `BatchSetAsync()` 함수가 `BatchSetAndWait()`와 마찬가지로 **에러 코드와 요청이 성공한 값의 키 테이블을 제공**한다고 명시되어 있습니다. 따라서 `BatchSetAsync()`를 사용할 때도 `BatchSetAndWait()`와 동일한 방식으로 반환값을 받아서 처리해야 합니다. 다만, 문서에는 `BatchSetAsync()`의 구체적인 비동기 콜백 형태나 Promise/Await 구문 등 비동기 처리를 위한 mLua 문법 예제가 포함되어 있지 않습니다. 문서에 근거할 수 있는 내용만 [scores] | [judge_reason] | [source_doc] | DataStorage 목록 또는 데이터 목록을 받을 때 페이지 단위로 목록을 조회할 수 있는 객체인 Pages 형태로 값을 받습니다. ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() --GetCurrentPageDatas()로 현
[task] | two_turn [pass] | ⏳ 미판정 [title] | 날짜와 시간 활용하기 [question] | "y" 지정자를 단독으로 사용할 때 표준 서식 문자열로 잘못 해석되지 않도록 "%"를 앞에 붙여야 하는 이유와, "yy", "yyy", "yyyy" 지정자 각각이 연도의 십의 자리가 0이거나 자릿수가 부족할 때 어떻게 처리되는지 비교해서 설명해 주세요 [answer] | "y" 지정자를 단독으로 사용할 때 앞에 "%"를 붙여야 하는 이유는, "y" 문자만 단독으로 사용되면 시스템이 이를 표준 서식 문자열(Standard Format String)로 잘못 해석할 수 있기 때문입니다. 이를 방지하기 위해 "%" 사용자 지정 서식 지정자를 앞에 붙여야 합니다. 각 연도 지정자("yy", "yyy", "yyyy")가 연도의 십의 자리가 0이거나 자릿수가 부족할 때의 처리 방식은 다음과 같이 다릅니다. * **"yy" (두 자리 연도)**: 연도가 두 자리를 넘으면 끝의 두 자릿수만 결과에 나타납니다 [followup] | 연도가 2008인 경우 "y"와 "yy"의 출력 차이가 왜 발생하는지, 그리고 999년 이전의 연도에서 "yyy" 지정자가 어떻게 0을 채워 나타나는지 확인하기 위한 테스트 코드를 작성해 주세요 [followup_answer] | 연도가 2008인 경우 "y"와 "yy"의 출력 차이가 발생하는 이유는 각 지정자의 자릿수 처리 규칙이 다르기 때문입니다. * **"y" 지정자**: 연도의 **십의 자리가 0인 경우 0을 표시하지 않습니다**. 따라서 2008년은 끝 두 자리가 '08'이지만, 십의 자리가 0이므로 앞의 0이 생략되어 **8**만 출력됩니다. * **"yy" 지정자**: 연도를 두 자리 숫자로 나타내며, **십의 자리가 0이라면 그대로 0을 포함하여 나타냅니다**. 따라서 2008년은 **08**로 출력됩니다. 999년 이전의 연도(예: [scores] | [judge_reason] | [source_doc] | "tt" 사용자 지정 서식 지정자는 AM/PM 지정자를 나타냅니다. AM 지정자는 0:00:00부터 11:59:59.999까지의 모든 시간에 사용되고 PM 지정자는 12:00:00부터 23:59:59.999까지의 모든 시간에 사용됩니다. ```lua local date = DateTime(2022, 8, 29, 19, 7, 5, 023) log(date:ToFormattedString("tt")) -- PM ``` #### "y" "y" 사용자 지정 서식 지정자는 연도를 한자리 또는 두 자리 숫자로 나타냅니다. 연도가 두 자리를
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorage에서 데이터를 가져올 때 비동기와 동기 함수의 차이가 무엇이며, 어떤 상황에서 각각을 사용해야 하나요? [answer] | DataStorage에서 데이터를 가져올 때 비동기(Async)와 동기(AndWait) 함수의 차이는 실행 방식과 스크립트 흐름에 대한 영향에 있습니다. ### 1. 비동기 (Async) * **동작 방식:** 함수가 호출되면 즉시 반환되고, 실제 데이터 가져오기 작업은 백그라운드에서 수행됩니다. * **완료 시점:** 데이터 가져오기가 완료되면 `callbackFunction` 매개변수로 전달한 함수가 호출됩니다. * **스크립트 흐름:** 현재 스크립트의 실행이 중단되지 않고 연속적으로 진행됩니다. * **사용 [followup] | `GetAndWait`와 `GetAsync`의 callbackFunction 처리 방식이 다르고, `wait()`와 함께 사용할 때의 주의사항이 궁금합니다. [followup_answer] | `GetAndWait`와 `GetAsync`의 처리 방식 차이는 다음과 같습니다. 1. **`GetAndWait` (동기)**: 함수 호출 시 데이터가 완전히 가져와질 때까지 스크립트 실행이 중단됩니다. 함수가 반환되면 `errorCode`와 데이터 값을 즉시 반환받습니다. 2. **`GetAsync` (비동기)**: 함수 호출 시 즉시 반환되고, 데이터 가져오기 작업은 백그라운드에서 진행됩니다. 작업이 완료되면 `callbackFunction` 매개변수로 전달한 함수가 호출되어 데이터를 처리합니다. ### `wait()`와 [scores] | [judge_reason] | [source_doc] | 데이터를 가져올 때는 GetAndWait, GetAsync 함수를 사용합니다. GlobalDataStorage, UserDataStorage, CreatorDataStorage는 문자열 타입의 값만 가져올 수 있습니다. 만약 데이터를 저장할 때 `_UtilLogic:TableToString()` 함수를 사용해 데이터를 문자열로 변환했다면, 데이터를 가져올 때는 `_UtilLogic:StringToTable()` 함수를 사용해 기존 타입으로 변환하여 사용할 수 있습니다. SortableDataStorage는 정수 타입의 값만 가져올
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | PixelRendererComponent를 사용하여 픽셀 단위로 색상 지정 시 사용할 수 있는 기능 3가지를 단계별 번호 목록으로 [answer] | PixelRendererComponent를 사용하여 픽셀 단위로 색상을 지정할 때 사용할 수 있는 주요 기능 3가지는 다음과 같습니다. 1. **전체 스프라이트 색상 및 크기 초기화 (`ResetWithColor`)** 스프라이트의 가로(`newWidth`)와 세로(`newHeight`) 크기를 지정하고, 전체 영역을 단일 색상(`Color`)으로 채우며 초기화합니다. ```lua [client only] void ResetColorTest() { local newWidth = _UtilLo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **PixelRendererComponent**를 활용하면 크리에이터가 비어있는 스프라이트에 픽셀 단위로 원하는 색을 지정할 수 있습니다. 특정 위치의 픽셀 색상만 바꾸거나 전체 스프라이트 색상을 지정할 수도 있고, 랜덤한 색상으로 변경할 수도 있습니다. 먼저 **PixelRendererComponent**의 프로퍼티를 살펴보고 예제를 통해 활용법을 알아봅시다. ##### 참고 API Reference [PixelRendererComponent](https://mod-developers.nexon.com/api
[task] | instruction_following [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | GetVersionsAndWait 함수를 사용하여 특정 기간의 버전 목록을 페이지네이션으로 순회하며 CreateTime 과 Version 을 로그로 출력하는 코드를 단계별 번호 목록 형식으로 작성하세요. [answer] | 1. `_DataStorageService:GetGlobalDataStorage("globalDS")`를 호출하여 `globalDataStorage` 객체를 가져옵니다. 2. `DateTime` 생성자를 사용하여 조회 시작일(`minDate`)과 종료일(`maxDate`)을 정의합니다. 3. `globalDataStorage:GetVersionsAndWait("Key", SortDirection.Ascending, minDate, maxDate)`를 호출하여 `errorCode`와 `pages` 객체를 반환받습니다. 4. `whil [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") keyInfo = DataStorageKeyInfo() keyInfo.Key = "Key" keyInfo.Version = "Version1" globalDataStorage:SetByInfoAndWait(keyInfo, "Value") -- 기존 버전의 "Value" 값을 덮어 쓰는 대신 새로운 버전을 만들어 저장합니다. keyInfo.Key = "Key" keyInfo.
[task] | two_turn [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | DataStorage에서 데이터를 페이지 단위로 조회할 때 `Pages` 객체의 구조와 순환 처리 방식이 어떻게 되나요? [answer] | DataStorage에서 데이터를 페이지 단위로 조회할 때, `Pages` 객체를 통해 결과를 받습니다. 이 객체는 다음 두 가지 주요 프로퍼티와 메서드를 제공합니다. 1. **`GetCurrentPageDatas()`**: 현재 페이지에 포함된 데이터 목록을 가져오는 메서드입니다. 2. **`IsLastPage`**: 현재 페이지가 마지막 페이지인지 여부를 나타내는 프로퍼티입니다. `true`이면 마지막 페이지입니다. 3. **`MoveToNextPageAndWait()`**: 다음 페이지로 이동하기 위해 호출하는 메서드입 [followup] | `IsLastPage` 프로퍼티와 `MoveToNextPageAndWait()`를 함께 사용할 때, 마지막 페이지가 아닌 경우 다음 페이지로 넘어가는 로직이 올바르게 작성되었는지 확인해 주세요. [followup_answer] | 참고 문서에 제시된 순환 처리 로직은 `IsLastPage` 프로퍼티와 `MoveToNextPageAndWait()` 메서드를 올바르게 결합하고 있습니다. 정확한 처리 순서는 다음과 같습니다: 1. `GetCurrentPageDatas()`를 호출하여 현재 페이지 데이터를 처리합니다. 2. `IsLastPage` 프로퍼티가 `true`인지 확인합니다. 3. **마지막 페이지가 아니면** (`IsLastPage == false`) `MoveToNextPageAndWait()`를 호출하여 다음 페이지로 이동합니다. 4. **마 [scores] | [judge_reason] | [source_doc] | DataStorage 목록 또는 데이터 목록을 받을 때 페이지 단위로 목록을 조회할 수 있는 객체인 Pages 형태로 값을 받습니다. ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() --GetCurrentPageDatas()로 현
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage 활용하기 [question] | _DataStorageService:GetGlobalDataStoragePagesAndWait() 로 GlobalDataStorage 목록을 페이지 단위로 조회하면서 각 페이지의 데이터를 log() 로 출력하고 IsLastPage 프로퍼티를 이용해 마지막 페이지까지 반복 처리하는 스크립트를 작성해줘 [answer] | ```lua Method: void OnBeginPlay() { local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() for _, globalDataStorage in pairs(globalDat [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage 목록 또는 데이터 목록을 받을 때 페이지 단위로 목록을 조회할 수 있는 객체인 Pages 형태로 값을 받습니다. ```lua local errorCode, globalDataStoragePages = _DataStorageService:GetGlobalDataStoragePagesAndWait() while true do local globalDataStorages = globalDataStoragePages:GetCurrentPageDatas() --GetCurrentPageDatas()로 현
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | ButtonClick_SetPixel 스크립트의 HandleButtonClickEvent 이벤트 핸들러 코드를 추출하여 주석으로만 설명을 포함해 출력하세요. [answer] | ```lua Event Handler: HandleButtonClickEvent (ButtonClickEvent event) { -- Parameters local Entity = event.Entity -------------------------------------------------------- -- 버튼을 클릭하면 SetRandomPixel 함수를 호출합니다. self.PR.PixelRendererTest:SetRandomPixel() } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. **ButtonClick_SetPixel** 스크립트에 **ButtonClickEvent**도 추가합니다. ```lua Event Handler: HandleButtonClickEvent (ButtonClickEvent event) { -- Parameters local Entity = event.Entity -------------------------------------------------------- -- 버튼을 클릭하면 SetRa