[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | SetByInfoAsync에서 DataStorageKeyInfo를 사용하면 어떤 장점이 있나요? [answer] | `SetByInfoAsync` 메서드에서 `DataStorageKeyInfo` 객체를 사용하면, 단순히 문자열 형태의 키(`string key`)만 전달하는 `SetAsync`와 달리 데이터의 **버전(Version)**과 **태그(Tag)** 등 추가적인 메타데이터를 함께 설정할 수 있다는 장점이 있습니다. 참고 문서에 따르면, `DataStorageKeyInfo`를 통해 자세한 정보를 설정할 수 있으며, 이는 특히 **버전 관리**가 필요한 상황에서 유용합니다. `DataStorageKeyInfo`의 `Version` 필드를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | two_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage 컴포넌트의 기본 구조와 메이커/출시 환경 간 저장소 분리 특성에 대해 설명해 주세요. [answer] | GlobalDataStorage는 다목적 데이터를 관리하는 저장소입니다. 이 컴포넌트는 메이커 환경과 출시 환경이 서로 다른 저장소를 사용하도록 설계되어 있어, 두 환경 간에 데이터가 공유되지 않습니다. 즉, 메이커에서 저장한 데이터는 출시 환경에서 조회할 수 없으며, 출시 환경의 데이터 역시 메이커에서 접근할 수 없습니다. 컴포넌트의 기본 구조는 다음과 같습니다: ### Properties * **Name (string, [ReadOnly])**: 해당 GlobalDataStorage의 이름을 나타냅니다. 읽기 전용 프로퍼 [followup] | BatchSetAndWait 메서드 사용 시 에러 코드가 0이 아닌 경우, 반환되는 List<string>에 포함된 키들을 어떻게 처리해야 하며, 해당 메서드가 [Yield] 속성을 가진 점에 유의하여 스크립트 흐름을 제어하는 구체적인 예제 코드를 작성해 주세요. [followup_answer] | `BatchSetAndWait` 메서드는 동기 방식(`[Yield]`)으로 데이터를 저장하며, 완료 시 에러 코드(`int32`)와 저장에 성공한 키 목록(`List<string>`)을 반환합니다. ### 에러 코드 처리 및 성공 키 목록 활용 에러 코드가 0이 아닌 경우, 저장 작업에 실패했음을 의미합니다. 이때 반환되는 `List<string>`는 **저장에 성공한 키들**만 포함합니다. 따라서 에러가 발생했더라도 일부 키는 정상적으로 저장되었을 수 있으므로, 반환된 성공 키 목록을 확인하여 부분 성공 여부를 파악하고 로깅하 [scores] | [judge_reason] | [source_doc] | 다목적 데이터를 관리할 수 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 GlobalDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. -
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageVersionPages [question] | DataStorageVersionPages 컴포넌트의 LoadNextPageAndWait 메서드 반환값을 검사하여 에러 코드가 0이 아니면 즉시 종료하고, 0이라면 MoveToNextPageAndWait로 이동하여 다음 페이지의 첫 번째 버전 데이터를 조회하는 스크립트를 작성해줘 [answer] | DataStorageVersionPages 객체를 받아 처리하는 로직입니다. `LoadNextPageAndWait()`의 반환값(에러 코드)이 0이 아니면 스크립트를 종료하고, 0이라면 `MoveToNextPageAndWait()`를 호출하여 페이지를 이동한 뒤 `GetCurrentPageDatas()`로 가져온 목록에서 첫 번째 데이터를 조회합니다. 참고: 페이지 순회 시 `LoadNextPageAndWait()`는 다음 페이지 데이터를 **미리** 불러오고, `MoveToNextPageAndWait()`는 실제로 그 페이지로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터의 버전들을 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageVersionInfo> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 버전 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 BatchSetAndWait와 BatchGetAndWait 메서드를 사용하여 서버에서 특정 키로 데이터를 저장한 후 즉시 조회하여 로그에 출력하는 스크립트를 작성해줘 [answer] | ```lua [server only] void OnBeginPlay() { local ds = _DataStorageService:GetCreatorDataStorage() -- 저장할 데이터 사전(Dictionary) 생성 local keyValues = {} keyValues["TestKey"] = "TestValue" -- 데이터를 저장합니다. local setErrorCode, savedKeys = ds:BatchSetAndWait(keyValues) if [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다목적 데이터를 관리할 수 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 GlobalDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. -
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | SetAndWait와 GetAndWait 메서드의 차이점을 3문장 이내로 설명하세요. [answer] | `SetAndWait`는 지정된 키에 값을 저장하는 동기 메서드이고, `GetAndWait`는 지정된 키에 저장된 값을 불러오는 동기 메서드입니다. 두 메서드는 모두 작업이 완료될 때까지 대기하며, 성공 여부와 결과 값을 반환합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Examples #### SetAndWait 데이터를 저장하는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local errorCode = ds:SetAndWait("key", "value") ``` #### GetAndWait 데이터를 불러오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local errorCo
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | BatchSetAndWait 메서드와 BatchSetAsync 메서드의 가장 큰 차이점은 무엇이며 어떤 상황에서 각각을 사용해야 하나요? [answer] | `BatchSetAndWait`와 `BatchSetAsync`의 가장 큰 차이는 **실행 방식(동기 vs 비동기)** 과 **스크립트 실행 흐름의 중단 여부**입니다. 1. **BatchSetAndWait (동기 처리)** * **차이점:** 데이터를 저장하는 작업이 완료될 때까지 **스크립트 실행을 즉시 중단**(Yield)합니다. * **반환 값:** 작업이 끝나면 에러 코드(`int32`)와 저장에 성공한 키 목록(`List<string>`)을 **직접 반환**합니다. * **사용 상황:** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다목적 데이터를 관리할 수 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 GlobalDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. -
[task] | two_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DataStorageKeyInfo를 사용해 특정 조건으로 데이터를 조회하는 GetByInfoAndWait 메서드의 동작 방식은 무엇인가요? [answer] | `GetByInfoAndWait` 메서드는 `DataStorageKeyInfo` 객체를 인자로 받아, 해당 객체에 설정된 상세 조건(키, 버전 등)에 부합하는 데이터를 조회합니다. 이 메서드는 서버에서만 실행되며, 동기(Blocking) 방식입니다. 즉, 데이터 조회가 완료될 때까지 스크립트 실행이 중단되고, 작업이 끝난 후 에러 코드와 조회된 데이터(문자열)를 반환합니다. `DataStorageKeyInfo`는 `Key`와 `Version` 등 조회할 데이터의 세부 조건을 설정할 수 있는 객체입니다. 단순히 키만 지정하여 최신 [followup] | GetByInfoAsync의 콜백에서 DataStorageKeyInfo 객체를 다시 받아 처리하는 코드를 작성해 주세요. [followup_answer] | `GetByInfoAsync` 메서드를 사용하면 비동기로 데이터를 조회하고, 작업이 완료되면 콜백 함수가 호출됩니다. 이 콜백 함수에는 에러 코드, 조회에 사용된 `DataStorageKeyInfo` 객체, 그리고 조회된 데이터(문자열)가 전달됩니다. 아래는 `GetByInfoAsync`를 호출하고, 콜백에서 전달받은 `DataStorageKeyInfo` 객체를 활용해 조회된 데이터와 함께 처리하는 예시입니다. ```lua Method: [server only] void OnBeginPlay() { local global [scores] | [judge_reason] | [source_doc] | eKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void DeleteAsync(string key, func<int32, string> callback
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | TransactSetByInfoAsync 함수의 비동기 성공 및 실패 시 callbackFunction으로 전달되는 매개변수 구성을 3문장 이내로 설명하세요. [answer] | 성공 시 callbackFunction에는 에러 코드와 저장에 성공한 DataStorageKeyInfo들이 전달됩니다. 실패 시 함수 호출 자체가 실패하며, 성공한 항목이 없으므로 callbackFunction이 호출되지 않습니다. 따라서 비동기 작업의 성공 여부는 callbackFunction이 실행되는지 여부만으로 판단할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 GetAsync와 callbackFunction을 활용하여 비동기로 데이터를 조회하고 에러 코드가 0일 경우 로그에 저장된 데이터를 출력하는 스크립트를 작성해줘 [answer] | GlobalDataStorage의 `GetAsync` 메서드는 비동기로 데이터를 조회하며, 작업이 완료되면 전달된 `callbackFunction`에 에러 코드, 키, 데이터가 전달됩니다. 에러 코드가 0인 경우에만 로그에 저장된 데이터를 출력하도록 작성한 스크립트는 다음과 같습니다. ```lua Property: [None] string TargetKey = "TargetKey" Method: [server only] void OnBeginPlay() { local globalDataStorage = _DataStora [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | eKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void DeleteAsync(string key, func<int32, string> callback
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | 문서에 등장하는 비동기 메서드(Async) 3개를 표로 정리하되, 열은 '메서드명', '동기/비동기', '콜백 파라미터'로 구성하세요. [answer] | 문서에 등장하는 비동기 메서드 3개는 다음과 같습니다. | 메서드명 | 동기/비동기 | 콜백 파라미터 | | :--- | :--- | :--- | | `SetAsync` | 비동기 | `errorCode`, `key` | | `GetAsync` | 비동기 | `errorCode`, `key`, `value` | | `DeleteAsync` | 비동기 | `errorCode`, `key` | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Examples #### SetAndWait 데이터를 저장하는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local errorCode = ds:SetAndWait("key", "value") ``` #### GetAndWait 데이터를 불러오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local errorCo
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GetByInfoAndWait에서 사용하는 DataStorageKeyInfo 객체를 통해 데이터 조회 조건을 어떻게 설정할 수 있는지 구체적인 예시가 있을까요? [answer] | 참고 문서에 따르면 `DataStorageKeyInfo` 객체를 통해 `Key`와 `Version`을 설정하여 특정 조건(키와 특정 버전)의 데이터를 조회할 수 있습니다. 구체적인 설정 방법과 `GetByInfoAndWait`를 사용하는 예시는 다음과 같습니다. ```lua -- 1. DataStorageKeyInfo 객체 생성 local getterKeyInfo = DataStorageKeyInfo() -- 2. 조회 조건 설정 getterKeyInfo.Key = "TargetKey" -- 조회할 데이터의 키 ge [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | eKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void DeleteAsync(string key, func<int32, string> callback
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DataStorageKeyInfo를 활용한 저장 예제 코드를 출력하되, 설명은 주석으로만 작성하세요. [answer] | ```lua Method: [server only] void SaveWithKeyInfo() { -- GlobalDataStorage 인스턴스를 가져옵니다. local ds = _DataStorageService:GetGlobalDataStorage("StorageName") -- Key, Version, Tag를 가진 DataStorageKeyInfo 객체를 생성합니다. local keyInfo = DataStorageKeyInfo("Key", "Version1", "TestTag") [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Examples #### SetAndWait 데이터를 저장하는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local errorCode = ds:SetAndWait("key", "value") ``` #### GetAndWait 데이터를 불러오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local errorCo
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DeleteAndWait 메서드에서 반환되는 에러 코드가 0이 아닌 경우, 데이터 삭제 실패의 원인은 무엇이며 어떻게 처리해야 하는지 알고 싶습니다. [answer] | 제공된 참고 문서에는 `DeleteAndWait` 메서드가 "입력한 키로 데이터를 삭제하고 에러 코드를 반환한다"고만 명시되어 있습니다. 하지만 **에러 코드가 0이 아닐 때의 구체적인 원인(예: 키가 존재하지 않는 경우, 권한 문제 등)이나, 각 에러 코드에 대한 정의 및 처리 방법에 대한 정보는 문서에 포함되어 있지 않습니다.** 문서에서 확인할 수 있는 사실은 다음과 같습니다: 1. `DeleteAndWait(string key)`는 `[ServerOnly]` 및 `[Yield]` 속성을 가진 메서드입니다. 2. 수행되는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | eKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void DeleteAsync(string key, func<int32, string> callback
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageVersionPages [question] | DataStorageVersionPages 컴포넌트를 통해 서버에서 전체 페이지를 순회하며 각 페이지의 데이터 개수를 누적하고, 마지막 페이지 도달 시 총 버전 수를 로그로 출력하는 스크립트를 작성해줘 [answer] | DataStorageVersionPages는 `_DataStorageService`를 통해 `GetVersionsAndWait` 메서드를 호출하여 얻어지는 객체입니다. 이 객체를 받아 `while` 루프를 통해 페이지를 순회하며, 각 페이지에서 `GetCurrentPageDatas()`로 가져온 테이블의 크기를 누적합니다. `IsLastPage` 프로퍼티가 `true`가 되면 루프를 종료하고 최종 누적된 총 버전 수를 로그로 출력합니다. ```lua [server only] void LogTotalVersionCount() { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터의 버전들을 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageVersionInfo> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 버전 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageVersionPages [question] | DataStorageVersionPages 컴포넌트의 IsLastPage 프로퍼티와 GetCurrentPageDatas 메서드를 활용해 서버에서 현재 페이지의 마지막 DataStorageVersionInfo 객체를 찾아 그 CreateTime을 로그로 남기는 스크립트를 작성해줘 [answer] | `DataStorageVersionPages` 객체를 전달받아 현재 페이지의 데이터를 조회하고, 마지막 항목의 `CreateTime`을 로그로 남기는 스크립트입니다. `GetCurrentPageDatas()`는 `table<DataStorageVersionInfo>`를 반환하므로, 테이블의 마지막 요소를 찾기 위해 `ipairs` 또는 테이블 길이 연산자를 사용할 수 있습니다. 서버에서만 실행되도록 `[server only]` 어노테이션을 적용했습니다. ```lua Method: [server only] void LogLastV [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터의 버전들을 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageVersionInfo> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 버전 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | BatchGetAndWait 메서드에서 페이지 처리를 완료하기까지 필요한 while 루프 조건과 종료 로직을 3문장 이내로 설명하세요. [answer] | `itemPages:GetCurrentPageDatas()`로 현재 페이지 데이터를 처리한 후 `itemPages.IsLastPage`가 `true`인지 확인하여 마지막 페이지라면 루프를 종료합니다. 마지막 페이지가 아니라면 `itemPages:MoveToNextPageAndWait()`를 호출하여 다음 페이지로 이동합니다. 이 과정을 마지막 페이지가 될 때까지 반복합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages = ds:BatchGetAndWait(keys) while true do -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다. lo
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageVersionPages [question] | DataStorageVersionPages 컴포넌트의 GetCurrentPageDatas, LoadNextPageAndWait, MoveToNextPageAndWait 메서드와 IsLastPage 프로퍼티를 사용하여 서버에서 DataStorage의 모든 버전 정보를 순회하며 각 버전의 Version 값을 로그에 출력하는 스크립트를 작성해줘 [answer] | DataStorage의 버전 정보를 페이지 단위로 순회하는 로직은 `DataStorageService`에서 `GetVersionsAndWait` 메서드를 호출하여 `DataStorageVersionPages` 객체를 먼저 획득한 후, 이 객체의 메서드와 프로퍼티를 조합하여 수행합니다. 제시된 문서에 따르면, `GetVersionsAndWait` 호출 시에는 특정 키, 정렬 방향, 그리고 조회할 날짜 범위를 지정해야 하며, 값 저장 시 버전 값을 함께 지정한 경우에만 조회가 가능합니다. 페이지 순회 시에는 `GetCurrentPag [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터의 버전들을 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageVersionInfo> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 버전 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageItemPages [question] | DataStorageItemPages 컴포넌트의 IsLastPage 속성을 실시간으로 확인하며, 마지막 페이지가 아닐 때만 MoveToNextPageAndWait를 호출하는 while 루프 구조로 DataStorage 전체 데이터를 순차적으로 조회하는 스크립트를 작성해줘 [answer] | DataStorageItemPages는 DataStorage에서 조회한 데이터를 페이지 단위로 순회하기 위해 사용하는 객체입니다. `IsLastPage` 속성은 현재 페이지가 마지막 페이지인지 여부를 `boolean` 타입으로 반환하며, 읽기 전용(ReadOnly)입니다. 요청하신 조건(마지막 페이지가 아닐 때만 다음 페이지로 이동)을 만족하는 while 루프 구조의 mLua 스크립트는 다음과 같습니다. ```lua [server only] void QueryAllDataStorage() { local ds = _Data [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage에 저장된 데이터를 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageItem> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 데이터 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드를 반환합니다
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | TransactSet 계열 함수와 Update 계열 함수 중 한 번에 최대 20개 Key까지 조작이 가능한 함수와 그렇지 않은 함수를 구분하여 단계별 번호 목록으로 작성하세요. [answer] | 참고 문서에 포함된 정보에 따라, 한 번에 최대 20개 Key까지 조작이 가능한 함수와 그렇지 않은 함수를 구분하여 정리하면 다음과 같습니다. **한 번에 최대 20개 Key까지 조작이 가능한 함수** 1. `TransactSetByInfoAsync` **한 번에 최대 20개 Key까지 조작 제한이 명시되지 않은 함수 (단일 Key 대상)** 1. `UpdateAndWait` 2. `UpdateAsync` 3. `UpdateByInfoAndWait` 4. `UpdateByInfoAsync` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | BatchDeleteAndWait 예제 코드만 출력하고, 각 줄의 역할을 설명하는 주석만 포함하세요. [answer] | ```lua -- 전역 데이터 스토리지 인스턴스를 가져옵니다. local ds = _DataStorageService:GetGlobalDataStorage("StorageName") -- 삭제할 키 목록을 담을 테이블을 생성합니다. local keys = {} -- 삭제할 첫 번째 키를 목록에 추가합니다. table.insert(keys, "Key1") -- 삭제할 두 번째 키를 목록에 추가합니다. table.insert(keys, "Key2") -- 지정된 키 목록의 데이터를 일괄 삭제하고, 오류 코드와 삭제된 키 정보를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 데이터를 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages = ds:BatchGetAndWait(keys) while true do -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다. lo
[task] | two_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage에서 데이터를 일괄로 가져오는 BatchGetAndWait의 기본 사용법이 궁금합니다. [answer] | GlobalDataStorage에서 데이터를 일괄로 가져오기 위해서는 `_DataStorageService:GetGlobalDataStorage` 메서드를 사용해 스토리지 인스턴스를 얻고, 이 인스턴스의 `BatchGetAndWait` 메서드를 호출합니다. `BatchGetAndWait` 메서드는 조회할 키(Key) 목록을 배열로 전달받으며, 실행 결과로 에러 코드(`errorCode`)와 페이지네이션된 데이터 객체(`itemPages`)를 반환합니다. 데이터는 페이지 단위로 처리됩니다. 반환된 `itemPages` 객체를 통해 [followup] | BatchGetAndWait로 가져온 itemPages에서 데이터를 페이지 단위로 처리할 때, IsLastPage가 true가 아닌 경우 MoveToNextPageAndWait를 호출해야 하는 구체적인 로직과 예외 처리가 어떻게 되나요? [followup_answer] | `BatchGetAndWait`로 반환된 `itemPages` 객체는 페이지 단위로 데이터를 처리하도록 설계되어 있으며, 문서에 명시된 표준 처리 로직은 `while true` 루프를 사용하는 것입니다. 구체적인 로직은 다음과 같습니다: 1. **현재 페이지 데이터 조회**: `GetCurrentPageDatas()` 메서드를 호출하여 현재 페이지에 포함된 `DataStorageItem` 목록을 가져옵니다. 2. **데이터 처리**: 가져온 목록을 `pairs` 또는 `ipairs`로 반복하며 각 항목의 `KeyInfo`와 [scores] | [judge_reason] | [source_doc] | 데이터를 일괄로 가져오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keys = {} table.insert(keys, "Key1") table.insert(keys, "Key2") local errorCode, itemPages = ds:BatchGetAndWait(keys) while true do -- GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다. lo
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 BatchSetAsync와 BatchGetAsync 메서드를 활용하여 비동기로 데이터를 저장하고, 저장 완료 콜백에서 다시 비동기 조회를 수행하여 결과를 처리하는 스크립트를 작성해줘 [answer] | GlobalDataStorage의 `BatchSetAsync`와 `BatchGetAsync` 메서드를 사용하여 비동기 데이터 저장 및 조회를 처리하는 스크립트입니다. `BatchSetAsync`의 콜백 함수 내에서 저장 결과를 확인한 후, 성공적인 경우 `BatchGetAsync`를 호출하여 데이터를 조회하고 최종 결과를 로그로 출력합니다. ```lua Property: [None] string StorageName = "MyGlobalStorage" Method: [server only] void OnBeginPlay() { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다목적 데이터를 관리할 수 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 GlobalDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. -
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | UpdateAndWait, UpdateAsync, UpdateByInfoAndWait, UpdateByInfoAsync 함수들의 기존 값 불일치 시 반환되는 공통 에러 코드와 그 의미를 표로 정리해서 제시하세요. [answer] | `UpdateAndWait`, `UpdateAsync`, `UpdateByInfoAndWait`, `UpdateByInfoAsync` 함수 모두 기존 값이 기대했던 값(`expectedValue`)과 일치하지 않을 경우 동일한 에러 코드를 반환하거나 전달합니다. | 함수 이름 | 불일치 시 반환/전달되는 에러 코드 | 에러 코드 의미 | | :--- | :--- | :--- | | `UpdateAndWait` | `UpdateApiFailed` (2000000) | 기존 값이 `expectedValue`와 다름 | | `Updat [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GetVersionsAndWait에서 minDate와 maxDate 파라미터를 통해 특정 시간대의 버전만 필터링할 때, 시간 형식은 어떻게 지정해야 하며 정렬 방향(SortDirection) 설정이 결과에 미치는 영향은 무엇인가요? [answer] | `GetVersionsAndWait` 메서드에서 시간 형식은 `DateTime` 타입으로 지정해야 합니다. `DateTime` 객체는 연도, 월, 일 인수를 받아 생성하며, 필요에 따라 시간, 분, 초 인수를 추가할 수 있습니다. 제공된 예제 코드에 따르면 `DateTime(2022, 4, 20)`과 같이 최소 3개의 인자(연, 월, 일)를 사용하여 특정 날짜의 시작 시점을 나타냅니다. 정렬 방향(`SortDirection`) 설정은 조회된 버전 목록이 반환되는 순서를 결정합니다. * `SortDirection.Ascendin [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | eKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void DeleteAsync(string key, func<int32, string> callback
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DataStorageKeyInfo를 이용해 데이터를 저장할 때 한 번에 최대 20개 Key 제한을 초과하게 되면 어떤 결과가 발생하나요? [answer] | DataStorageKeyInfo를 이용해 데이터를 저장할 때 한 번에 최대 20개 Key 제한을 초과하면 함수 호출이 실패합니다. 이는 `TransactSetByInfoAsync`와 같은 대량 저장 함수에 적용되는 제한으로, 한 번에 최대 20개 Key까지 조작할 수 있으며 이 범위를 벗어나면 작업이 정상적으로 수행되지 않고 실패하게 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 GetAndWait와 DeleteAndWait를 사용하여 특정 키의 데이터를 조회한 후 성공 시 해당 데이터를 삭제하는 스크립트를 작성해줘 [answer] | GlobalDataStorage의 `GetAndWait`와 `DeleteAndWait`를 사용하여 특정 키의 데이터를 조회하고, 조회가 성공한 경우 해당 데이터를 삭제하는 스크립트는 다음과 같습니다. `GetAndWait`와 `DeleteAndWait`는 모두 `[ServerOnly]` 및 `[Yield]` 속성을 가지므로, 반드시 서버에서만 실행되는 메서드 내에서 호출해야 하며, 호출 시점에는 스크립트 실행이 일시 중단됩니다. ```lua Property: [None] string TargetKey = "MyKey" Meth [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | eKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void DeleteAsync(string key, func<int32, string> callback
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | 기존 값이 expectedValue와 일치하지 않아 갱신 실패 시, UpdateAndWait 함수가 반환하는 두 번째 값의 의미는 무엇인가요? [answer] | `UpdateAndWait` 함수는 갱신 작업이 실패할 경우, 두 번째 반환 값으로 **기존 값**을 반환합니다. 구체적으로, 기존 값이 `expectedValue`와 일치하지 않아 에러 코드 `UpdateApiFailed(2000000)`가 반환될 때, 함께 반환되는 두 번째 값은 데이터 저장소에 현재 실제로 저장되어 있는 값입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, s
[task] | two_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | 여러 개의 데이터를 한 번에 처리하는 BatchSetAndWait 사용법을 알려주세요 [answer] | `BatchSetAndWait`는 여러 개의 키와 값을 담은 테이블을 전달하여 데이터를 일괄로 저장하는 메서드입니다. 사용법은 다음과 같습니다: 1. `_DataStorageService:GetGlobalDataStorage("StorageName")`을 호출하여 GlobalDataStorage 객체를 얻습니다. 2. 저장할 데이터를 `key: value` 형태로 담은 테이블을 생성합니다. 3. `ds:BatchSetAndWait(keyValues)`를 호출합니다. 4. 반환 값으로 `errorCode`와 처리된 `key [followup] | keyValues 테이블에 여러 키와 값을 넣고 BatchSetAndWait로 일괄 저장하는 코드 예시를 작성해 주세요. [followup_answer] | `BatchSetAndWait`를 사용하여 여러 데이터를 일괄 저장하는 코드는 다음과 같습니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local keyValues = {} keyValues["Key1"] = "Value1" keyValues["Key2"] = "Value2" local errorCode, keys = ds:BatchSetAndWait(keyValues) ``` 이 코드에서는 `keyValues` 테이블에 `"Key1 [scores] | [judge_reason] | [source_doc] | # Examples #### SetAndWait 데이터를 저장하는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local errorCode = ds:SetAndWait("key", "value") ``` #### GetAndWait 데이터를 불러오는 예제입니다. ```lua local ds = _DataStorageService:GetGlobalDataStorage("StorageName") local errorCo
[task] | code [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GlobalDataStorage의 BatchDeleteAndWait 메서드를 사용하여 서버에서 주어진 키 목록의 데이터를 일괄 삭제하고, 삭제 성공 여부를 확인하는 스크립트를 작성해줘 [answer] | GlobalDataStorage의 `BatchDeleteAndWait` 메서드는 서버에서 실행되며, 삭제 작업이 완료될 때까지 스크립트 실행을 중단합니다(Yield). 이 메서드는 삭제 작업의 결과로 에러 코드(`int32`)와 삭제에 성공한 키들의 목록(`List<string>`)을 반환합니다. 주어진 키 목록을 삭제하고 성공 여부를 확인하는 mLua 스크립트는 다음과 같습니다. ```lua Method: [server only] void DeleteDataByKeys(List<string> keysToDelete) { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다목적 데이터를 관리할 수 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 GlobalDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. -
[task] | code [pass] | ⏳ 미판정 [title] | Foothold [question] | Foothold 의 GroupId 와 Id 프로퍼티를 읽어서 발판의 그룹 소속과 고유 식별자를 로그로 출력하고, PreviousFootholdId 와 NextFootholdId 가 -1 이 아닌 경우(즉, 인접 발판이 존재하는 경우)에만 해당 인접 발판의 ID를 함께 로그로 출력하는 스크립트를 작성해줘 [answer] | Foothold 컴포넌트에서 `GroupId`, `Id`, `PreviousFootholdId`, `NextFootholdId` 프로퍼티는 모두 `[ReadOnly]` 속성이므로 읽기만 가능합니다. 이 값들을 기반으로 발판의 고유 식별자와 그룹 번호를 로그로 출력하고, 인접 발판 ID가 `-1`이 아닐 때만 해당 인접 발판 ID를 추가로 출력하는 로직을 `OnBeginPlay` 메서드 내에 구현할 수 있습니다. ```lua Method: [server only] void OnBeginPlay() { local groupId [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발판의 여러 정보를 나타냅니다. # Properties - **Vector2 EndPoint [ReadOnly]** 발판의 끝점을 나타냅니다. 항상 StartPoint보다 오른쪽에 있습니다. - **float FootholdDrag** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 적용되는 마찰력입니다. 값이 클수록 빠르게 감속합니다. - **float FootholdForce** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 가해지는 힘입니다. 값이 양수면 오른쪽,