[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | GetAsync와 GetByInfoAsync의 콜백 함수 시그니처를 비교하여 각 파라미터의 타입과 순서를 코드만 출력하고 설명은 주석으로 작성해 주세요. [answer] | ```lua -- GetAsync: (int32 errorCode, string key, string data) void GetAsync(string key, func<int32, string, string> callbackFunction) [ServerOnly] { -- 파라미터 순서: 1) 에러 코드(int32), 2) 조회 요청 시 전달한 키(string), 3) 조회된 데이터(string) } -- GetByInfoAsync: (int32 errorCode, DataStorageKeyInfo keyInfo, stri [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] | GetVersionsAndWait에서 사용할 수 있는 정렬 방향 및 시간 범위 필터링 옵션을 단계별 번호 목록으로 나열해 주세요. [answer] | `GetVersionsAndWait` 메서드에서 사용할 수 있는 정렬 방향 및 시간 범위 필터링 옵션은 다음과 같습니다. 1. **정렬 방향 (SortDirection)** - `sortDirection` 인자를 통해 데이터 버전 목록의 정렬 방식을 설정합니다. - `SortDirection.Ascending`: 오름차순으로 정렬합니다. - `SortDirection.Descending`: 내림차순으로 정렬합니다. 2. **시간 범위 필터링 (DateTime)** - `minDate` 인자: 조회할 버전의 [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] | SetAndWait를 호출하면 스크립트 실행이 어떻게 되나요? [answer] | `SetAndWait`는 `[Yield]` 속성이 있는 함수입니다. 이 함수를 호출하면 작업이 완료될 때까지 스크립트 실행이 중단됩니다. 데이터 저장 작업이 끝난 후에만 스크립트의 나머지 부분이 실행되며, 작업이 완료되면 에러 코드가 반환됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorageVersionPages [question] | LoadNextPageAndWait가 Yield 속성을 가지고 있어 스크립트 실행이 중단되는 동안 다른 이벤트 핸들러가 실행될 수 있는지, 그리고 이로 인해 데이터 일관성 문제가 발생할 수 있는지 궁금합니다. [answer] | 제공된 참고 문서에는 `LoadNextPageAndWait` 메서드가 `[Yield]` 속성을 가지고 있으며, "수행하는 동안 스크립트 실행을 중단합니다"라고 명시되어 있습니다. 그러나 **Yield(일시정지) 상태 동안 다른 이벤트 핸들러가 실행되는지** 또는 **이로 인해 데이터 일관성 문제가 발생하는지**에 대한 구체적인 기술적 설명이나 주의사항은 문서에 포함되어 있지 않습니다. 문서에서 확인할 수 있는 사실은 다음과 같습니다: 1. `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] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DeleteAndWait와 DeleteAsync의 차이점을 비동기 수행 여부 및 스크립트 실행 중단 여부 두 가지 기준으로 표로 정리해서 설명해 주세요. [answer] | `DeleteAndWait`와 `DeleteAsync`의 차이점을 요청하신 두 가지 기준으로 정리하면 다음과 같습니다. | 구분 | DeleteAndWait | DeleteAsync | | :--- | :--- | :--- | | **비동기 수행 여부** | 동기 수행 (동기) | 비동기 수행 (비동기) | | **스크립트 실행 중단 여부** | 수행하는 동안 스크립트 실행을 중단함 (Yield) | 스크립트 실행을 중단하지 않음 | 두 메서드 모두 입력한 키로 데이터를 삭제하는 기능을 제공하며, `DeleteAndWait`는 [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] | CreatorDataStorage [question] | _DataStorageService:GetCreatorDataStorage() 를 사용하여 DataStorageKeyInfo("HighScore", "v1", "Global") 키를 가진 데이터를 BatchGetByInfoAndWait 메서드로 일괄 조회하고, pages 객체의 GetPagesAndWait 로직을 참고하여 페이지를 순회하며 각 데이터의 Key, Version, Tag, Value 를 log 로 출력하는 스크립트를 작성해줘 [answer] | `_DataStorageService:GetCreatorDataStorage()`를 통해 크리에이터 데이터 저장소를 가져온 후, `DataStorageKeyInfo` 객체를 생성하여 `BatchGetByInfoAndWait` 메서드로 데이터를 일괄 조회합니다. 조회된 `pages` 객체를 이용하여 페이지를 순회하며, 각 페이지의 데이터를 `GetCurrentPageDatas()`로 가져오고 `DataStorageItem`의 `KeyInfo`와 `Value` 프로퍼티를 통해 Key, Version, Tag, Value 값을 로그로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorageKeyInfo를 통해 데이터를 일괄로 저장하는 예제입니다. ```lua local ds = _DataStorageService:GetCreatorDataStorage() local keyInfoValues = {} local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1") local keyInfo2 = DataStorageKeyInfo("Key2", "Version2", "Tag2") keyInfoValues[keyInfo1] = "Value1" k
[task] | single_turn [pass] | ⏳ 미판정 [title] | Foothold [question] | IsHorizontal()와 IsVertical() 메서드로 발판의 방향을 판별할 수 있는데, 이 두 메서드가 동시에 true를 반환하거나 모두 false를 반환하는 경우가 존재하나요? [answer] | 제공된 참고 문서에는 `IsHorizontal()`와 `IsVertical()` 메서드가 각각 "발판이 수평 Foothold인지 여부"와 "발판이 수직 발판인지 여부"를 반환한다고만 정의되어 있습니다. 하지만 두 메서드가 **동시에 true**를 반환하거나 **동시에 false**를 반환하는 경우의 존재 여부에 대한 명시적인 논리 관계나 제약 조건(예: "발판은 항상 수평이거나 수직 중 하나이다" 또는 "수평과 수직이 아닌 발판도 존재한다" 등)에 대한 설명은 문서에 포함되어 있지 않습니다. 따라서 주어진 정보만으로는 두 메서드 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발판의 여러 정보를 나타냅니다. # Properties - **Vector2 EndPoint [ReadOnly]** 발판의 끝점을 나타냅니다. 항상 StartPoint보다 오른쪽에 있습니다. - **float FootholdDrag** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 적용되는 마찰력입니다. 값이 클수록 빠르게 감속합니다. - **float FootholdForce** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 가해지는 힘입니다. 값이 양수면 오른쪽,
[task] | single_turn [pass] | ⏳ 미판정 [title] | Foothold [question] | 기울어진 발판에서 특정 X 좌표 기준의 Y 좌표를 계산해서 캐릭터를 정밀하게 배치하려면 어떤 메서드를 사용해야 하나요? [answer] | 기울어진 발판에서 특정 X 좌표에 해당하는 Y 좌표를 구하려면 `GetYByX(float x)` 메서드를 사용합니다. 이 메서드는 발판의 X축 값이 `x`일 때의 Y축 값을 반환하므로, 캐릭터를 해당 지점에 정밀하게 배치할 수 있습니다. ```lua Method: [server only] void PlaceCharacterOnFoothold() { local targetX = 5.0 local foothold = self.Entity.FootholdComponent -- 참고: 실제 접근 경로는 프로젝트 구조에 따라 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발판의 여러 정보를 나타냅니다. # Properties - **Vector2 EndPoint [ReadOnly]** 발판의 끝점을 나타냅니다. 항상 StartPoint보다 오른쪽에 있습니다. - **float FootholdDrag** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 적용되는 마찰력입니다. 값이 클수록 빠르게 감속합니다. - **float FootholdForce** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 가해지는 힘입니다. 값이 양수면 오른쪽,
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | SetAndWait와 SetAsync의 차이점을 3문장 이내로 설명하세요. [answer] | `SetAndWait`는 작업 완료 시까지 스크립트 실행을 중단한 후 에러 코드를 반환하는 동기 방식입니다. 반면 `SetAsync`는 비동기로 수행되며 완료 시점에 콜백 함수를 통해 결과를 전달합니다. 따라서 즉각적인 결과 확인이 필요하면 전자, 다른 처리를 병행해야 하면 후자를 사용합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | single_turn [pass] | ⏳ 미판정 [title] | Foothold [question] | 발판의 StartPoint와 EndPoint는 읽기 전용(ReadOnly)인데, 발판의 시작점과 끝점 좌표를 직접 변경해서 발판 위치를 이동시킬 수 있나요? [answer] | 아니요, 발판의 시작점과 끝점 좌표를 직접 변경하여 발판의 위치를 이동시킬 수 없습니다. `StartPoint`와 `EndPoint` 프로퍼티는 모두 **ReadOnly** (읽기 전용) 속성으로 정의되어 있기 때문에, 스크립트에서 값을 직접 할당하거나 수정하는 것은 불가능합니다. 또한, 발판(Foothold) 객체의 좌표를 직접 이동시키는 메서드(예: `Move`, `SetPosition` 등)도 문서에 명시되어 있지 않습니다. 발판의 위치를 변경하려면 발판을 소유하고 있는 엔티티(예: `TileMapComponent` 또는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발판의 여러 정보를 나타냅니다. # Properties - **Vector2 EndPoint [ReadOnly]** 발판의 끝점을 나타냅니다. 항상 StartPoint보다 오른쪽에 있습니다. - **float FootholdDrag** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 적용되는 마찰력입니다. 값이 클수록 빠르게 감속합니다. - **float FootholdForce** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 가해지는 힘입니다. 값이 양수면 오른쪽,
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | TransactSetAsync 작업이 완료되면 callbackFunction에 어떤 데이터가 전달되나요? [answer] | `TransactSetAsync` 작업이 완료되면 `callbackFunction`에 다음 데이터가 전달됩니다: 1. **에러 코드** (`int32`): 작업의 성공 여부를 나타내는 코드입니다. 2. **저장 성공 키 목록** (`List<string>`): 저장에 성공한 키들의 리스트입니다. 참고로, 호출에 포함된 모든 작업이 성공해야만 이 콜백 함수가 호출됩니다. 작업 중 하나라도 실패하면 함수 호출 자체가 실패하며 콜백이 호출되지 않습니다. 또한, 한 번에 최대 20개 Key까지 조작할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DataStorageKeyInfo를 사용한 조회와 일반 키 문자열을 사용한 조회의 차이점은 무엇인가요? [answer] | `DataStorageKeyInfo`를 사용한 조회와 일반 키 문자열(`string`)을 사용한 조회의 차이는 **데이터를 식별하는 정보의 정밀도**와 **사용 가능한 메서드**에 있습니다. ### 1. 식별 정보의 차이 * **일반 키 문자열 (`string`)**: * 단순히 **키(Key)** 값만으로 데이터를 식별합니다. * 버전(Version)이나 태그(Tag) 정보는 포함하지 않습니다. * 동일한 키를 가진 데이터가 여러 버전으로 존재할 경우, 특정 버전을 명시적으로 지정하여 조회하기 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다목적 데이터를 관리할 수 있는 저장소입니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 GlobalDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. -
[task] | single_turn [pass] | ⏳ 미판정 [title] | Foothold [question] | 발판의 Id와 GroupId는 저장 시에만 부여되는 읽기 전용 값인데, 런타임에 생성된 동적 발판의 경우 이 값들이 어떻게 처리되는지 궁금합니다. [answer] | 제공된 참고 문서에는 발판의 `Id`와 `GroupId`가 "발판을 저장할 때 부여됩니다"라고 명시되어 있을 뿐, **런타임에 생성된 동적 발판**의 경우 이 값들이 어떻게 처리되는지(예: 0으로 초기화되는지, 임시 ID가 부여되는지, 또는 에러가 나는지)에 대한 구체적인 설명은 포함되어 있지 않습니다. 따라서 문서에 근거하여 런타임 동적 발판의 `Id`와 `GroupId` 처리 방식을 설명하는 것은 불가능합니다. 다만, 문서에 명시된 사실만 정리하면 다음과 같습니다: 1. `Id`와 `GroupId`는 모두 **ReadOnl [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발판의 여러 정보를 나타냅니다. # Properties - **Vector2 EndPoint [ReadOnly]** 발판의 끝점을 나타냅니다. 항상 StartPoint보다 오른쪽에 있습니다. - **float FootholdDrag** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 적용되는 마찰력입니다. 값이 클수록 빠르게 감속합니다. - **float FootholdForce** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 가해지는 힘입니다. 값이 양수면 오른쪽,
[task] | two_turn [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | CreatorDataStorage에서 데이터를 저장할 때 동기 방식과 비동기 방식의 차이점이 무엇이며, 어떤 상황에서 각각을 사용하는 것이 적합한가요? [answer] | CreatorDataStorage에서 데이터를 저장할 때 동기(Synchronous) 방식과 비동기(Asynchronous) 방식은 **스�크립트 실행 흐름의 중단 여부**와 **결과 처리 방식**에서 차이가 있습니다. ### 1. 동기 방식 (Sync) * **특징**: 함수 호출 시 스크립트 실행이 **중단**됩니다. 모든 저장 작업이 완료되고 결과가 반환된 후에야 다음 코드가 실행됩니다. * **반환 값**: 함수가 직접 에러 코드와 저장된 데이터를 반환합니다. * **주요 함수**: `SetByInfoAndWai [followup] | TransactSetByInfoAsync를 사용할 때 callbackFunction 내에서 에러 코드를 확인하여 실패 시 재시도 로직을 구현하는 mLua 코드 예시를 작성해 주세요. [followup_answer] | `TransactSetByInfoAsync`는 여러 개의 `DataStorageKeyInfo`와 값의 쌍을 담은 `Dictionary`를 받아 비동기로 데이터를 저장합니다. 모든 작업이 성공해야만 콜백 함수가 호출되며, 하나라도 실패하면 함수 호출 자체가 실패하여 콜백이 호출되지 않는다는 점에 주의해야 합니다. (참고 문서: "모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다.") 따라서 **콜백 함수 내부에서 에러 코드를 확인하여 재시도하는 로직**은 문서의 설명상 `TransactSetByInfoAsync`의 동작 방 [scores] | [judge_reason] | [source_doc] | ndWait(Dictionary<DataStorageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictio
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | TransactDeleteAndWait와 TransactSetAndWait에서 허용되는 최대 Key 수와 실패 시 동작 방식을 2열 3행 표로 정리하세요. [answer] | 요청하신 정보에 따라 `TransactDeleteAndWait`와 `TransactSetAndWait`의 허용되는 최대 Key 수와 실패 시 동작 방식을 정리한 표는 다음과 같습니다. | 함수명 | 허용되는 최대 Key 수 | 실패 시 동작 방식 | | :--- | :---: | :--- | | `TransactDeleteAndWait` | 20개 | 함수 호출이 실패함 | | `TransactSetAndWait` | 20개 | 함수 호출이 실패함 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageKeyInfo [question] | DataStorageKeyInfo 클래스를 사용하여 Key가 "player_name", Version이 "1.0", Tag가 "profile"인 인스턴스를 생성하고, 생성된 인스턴스의 Key 속성 값을 log 함수로 출력하는 스크립트를 작성해줘. [answer] | ```lua [server only] void CreateAndLogKeyInfo() { local keyInfo = DataStorageKeyInfo("player_name", "1.0", "profile") log(keyInfo.Key) } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터를 식별하는 데 사용하는 정보입니다. # Properties - **string Key** DataStorage 데이터의 키입니다. - **string Tag** DataStorage 데이터의 태그입니다. 설정한 값을 저장할 데이터의 태그로 지정할 수 있습니다. - **string Version** DataStorage의 데이터의 버전입니다. 설정한 값을 저장할 데이터의 버전으로 지정할 수 있습니다. # Constructors - **DataStorageKeyInfo()** 기본값으
[task] | instruction_following [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | DataStorageKeyInfo를 사용하는 SetByInfoAndWait와 SetByInfoAsync의 시그니처만 출력하고, 각 함수의 동작 방식은 주석으로만 설명하세요. [answer] | ```lua -- SetByInfoAndWait: DataStorageKeyInfo를 사용하여 데이터를 저장합니다. -- 작업이 완료되면 에러 코드를 반환하며, 수행하는 동안 스크립트 실행을 중단합니다. int32 SetByInfoAndWait(DataStorageKeyInfo keyInfo, string value) -- SetByInfoAsync: DataStorageKeyInfo를 사용하여 데이터를 비동기로 저장합니다. -- 작업이 완료되면 에러 코드와 DataStorageKeyInfo가 포함된 callbackFunction [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageKeyInfo [question] | DataStorageKeyInfo(string key, string version, string tag) 생성자를 이용하여 Key "setting", Version "stable", Tag "config"로 객체를 생성하고, 생성된 객체의 Version 속성 값이 "stable"인지 boolean 타입으로 확인하여 log로 출력하는 스크립트를 작성해줘. [answer] | ```lua [server only] void CheckVersion() { local keyInfo = DataStorageKeyInfo("setting", "stable", "config") log(keyInfo.Version == "stable") } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터를 식별하는 데 사용하는 정보입니다. # Properties - **string Key** DataStorage 데이터의 키입니다. - **string Tag** DataStorage 데이터의 태그입니다. 설정한 값을 저장할 데이터의 태그로 지정할 수 있습니다. - **string Version** DataStorage의 데이터의 버전입니다. 설정한 값을 저장할 데이터의 버전으로 지정할 수 있습니다. # Constructors - **DataStorageKeyInfo()** 기본값으
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorageVersionPages [question] | DataStorageVersionPages의 LoadNextPageAndWait와 MoveToNextPageAndWait를 동시에 호출해도 되는지, 아니면 반드시 순서대로 실행해야 하는지 궁금합니다. [answer] | `LoadNextPageAndWait`와 `MoveToNextPageAndWait`는 반드시 순서대로 실행해야 합니다. 동시에 호출하거나 순서를 바꿔서 호출하는 것은 정상적인 페이지 순회를 위해 권장되지 않으며, 문서의 예제와 메서드 설명에 따르면 다음 순서를 따라야 합니다. 1. **`LoadNextPageAndWait` 호출**: 다음 페이지의 데이터를 미리 불러옵니다. 이 함수는 수행하는 동안 스크립트 실행을 중단하며(Yield), 성공 시 0, 실패 시 에러 코드를 반환합니다. 2. **에러 코드 확인**: `LoadN [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] | CreatorDataStorage [question] | _DataStorageService:GetCreatorDataStorage() 의 SetByInfoAndWait 와 GetByInfoAndWait 를 조합하여, 특정 KeyInfo 의 기존 버전 값을 가져와서 새로운 버전으로 복사 저장하는 데이터 마이그레이션 스크립트를 작성해줘 [answer] | `SetByInfoAndWait`는 기존 데이터를 덮어쓰는 것이 아니라, `DataStorageKeyInfo`에 지정된 **버전**을 기준으로 새 레코드를 저장합니다. 따라서 `GetByInfoAndWait`로 특정 버전의 값을 가져온 뒤, 다른 버전의 `DataStorageKeyInfo`를 생성하여 `SetByInfoAndWait`에 전달하면 데이터를 복사(마이그레이션)할 수 있습니다. 아래는 특정 `KeyInfo`의 기존 버전 값을 가져와서 새로운 버전으로 복사 저장하는 mLua 스크립트 예제입니다. ```lua Method [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 태그 값을 통해 데이터를 조회하는 예제입니다. ```lua local ds = _DataStorageService:GetCreatorDataStorage() local getResultCode, pages = ds:GetPagesAndWait("Tag") if getResultCode ~= 0 then error("Failed to GetPagesAndWait. Error : " + tostring(getResultCode)) return end while true do -- 현재 페이지의 목록을 가져
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorageVersionPages [question] | IsLastPage가 true일 때 LoadNextPageAndWait를 호출하면 어떤 에러 코드가 반환되며, 예제처럼 미리 체크하지 않고 무조건 호출해도 안전한지 알고 싶습니다. [answer] | 제공된 문서와 예제를 바탕으로 답변드립니다. **1. `IsLastPage`가 true일 때 `LoadNextPageAndWait` 호출 시 반환되는 에러 코드** 문서에 따르면 `LoadNextPageAndWait`는 "다음 페이지가 유효하지 않은 경우" 에러 코드를 반환한다고 명시되어 있습니다. 하지만 **구체적으로 어떤 숫자 값(예: 1, -1 등)이 반환되는지 정의되어 있지 않습니다.** 다만, 예제 코드들을 살펴보면 에러 여부를 판단할 때 `loadResultCode ~= 0` (0이 아님) 조건을 사용하고 있습니다. 즉 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터의 버전들을 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageVersionInfo> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 버전 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드
[task] | single_turn [pass] | ⏳ 미판정 [title] | Foothold [question] | RigidbodyComponent가 있는 캐릭터가 발판 위에서 미끄러지지 않도록 마찰력을 조절할 때 FootholdDrag 값을 어떻게 설정해야 하나요? [answer] | `FootholdDrag` 값은 `RigidbodyComponent`가 포함된 엔티티가 발판 위에 있을 때 적용되는 마찰력을 결정합니다. 문서에 따르면 **값이 클수록 빠르게 감속합니다**. 따라서 캐릭터가 발판 위에서 미끄러지지 않도록하려면 `FootholdDrag` 값을 충분히 크게 설정해야 합니다. 참고로 `FootholdDrag`는 읽기 전용(ReadOnly)이 아닌 일반 프로퍼티이므로, 런타임에 다음과 같이 직접 값을 수정하여 마찰력을 조절할 수 있습니다. ```lua Method: [server only] void [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 발판의 여러 정보를 나타냅니다. # Properties - **Vector2 EndPoint [ReadOnly]** 발판의 끝점을 나타냅니다. 항상 StartPoint보다 오른쪽에 있습니다. - **float FootholdDrag** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 적용되는 마찰력입니다. 값이 클수록 빠르게 감속합니다. - **float FootholdForce** RigidbodyComponent가 포함된 엔티티가 발판 위에 있을 때 가해지는 힘입니다. 값이 양수면 오른쪽,
[task] | single_turn [pass] | ⏳ 미판정 [title] | GlobalDataStorage [question] | SetAndWait와 SetAsync의 가장 큰 차이점이 뭔가요? [answer] | `SetAndWait`와 `SetAsync`의 가장 큰 차이점은 **스크립트 실행이 중단되는지(동기 처리) 아니면 계속 진행하는지(비동기 처리)** 입니다. 1. **`SetAndWait` (동기 처리)** * 데이터 저장 작업이 완료될 때까지 **현재 스크립트의 실행을 중단(중단/Block)합니다**. * 작업이 완료되면 즉시 **에러 코드**를 반환합니다. * 코드 흐름이 순서대로 진행되므로, 저장 결과가 필요한 후속 작업이 있을 때 직관적으로 사용할 수 있습니다. 2. **`SetAsync` (비동기 처리) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | . sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에러 코드를 반환합니다. 수행하는 동안 스크립트
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageKeyInfo [question] | DataStorageKeyInfo의 기본 생성자를 사용하여 객체를 초기화한 후, Key 속성에 "inventory", Tag 속성에 "items", Version 속성에 "v2" 값을 직접 할당하여 데이터 식별 정보를 구성하는 스크립트를 작성해줘. [answer] | DataStorageKeyInfo는 DataStorage에 저장할 데이터를 식별하기 위해 `Key`, `Tag`, `Version` 속성을 가집니다. 기본 생성자 `DataStorageKeyInfo()`를 사용하여 객체를 만든 뒤, 각 속성에 값을 직접 할당하여 식별 정보를 구성할 수 있습니다. 요청하신 값(`Key`: "inventory", `Tag`: "items", `Version`: "v2")을 할당하는 스크립트는 다음과 같습니다. ```lua local keyInfo = DataStorageKeyInfo() keyInf [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터를 식별하는 데 사용하는 정보입니다. # Properties - **string Key** DataStorage 데이터의 키입니다. - **string Tag** DataStorage 데이터의 태그입니다. 설정한 값을 저장할 데이터의 태그로 지정할 수 있습니다. - **string Version** DataStorage의 데이터의 버전입니다. 설정한 값을 저장할 데이터의 버전으로 지정할 수 있습니다. # Constructors - **DataStorageKeyInfo()** 기본값으
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorageItemPages [question] | 예제 코드에서 loadResultCode가 0이 아닌 경우에만 break를 하도록 되어 있는데, 에러 코드가 특정 값일 때만 중단하고 나머지는 무시하는 로직으로 수정할 수 있는지요? [answer] | 참고 문서에 명시된 `LoadNextPageAndWait()` 함수는 다음 페이지를 불러오지 못했을 때 에러 코드를 반환하며, 예제에서는 이 값이 `0`이 아닌 모든 경우를 실패로 간주하여 `break`를 수행하도록 작성되어 있습니다. 문서에는 특정 에러 코드 값을 필터링하거나 무시하는 별도의 API나 프로퍼티가 제공되지 않습니다. `LoadNextPageAndWait()`는 단순히 에러 코드(`int32`)를 반환할 뿐, 반환된 코드에 대해 추가적인 처리 로직(예: 특정 코드 무시)을 지원하는 기능은 문서에 언급되어 있지 않습니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage에 저장된 데이터를 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageItem> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 데이터 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드를 반환합니다
[task] | single_turn [pass] | ⏳ 미판정 [title] | DataStorageVersionPages [question] | GetCurrentPageDatas가 ServerOnly로 지정되어 있는데, 클라이언트에서 DataStorage 버전 정보를 조회하려면 어떤 방식으로 처리해야 하나요? [answer] | `GetCurrentPageDatas`가 `[ServerOnly]`로 지정되어 있으므로, 클라이언트 스크립트에서는 직접 이 메서드를 호출할 수 없습니다. 클라이언트에서 DataStorage 버전 정보를 조회하려면 서버 스크립트에서 데이터를 조회한 후, 클라이언트로 전송하거나 서버에서 필요한 로직을 처리해야 합니다. 일반적인 처리 방식은 다음과 같습니다. 1. **서버 스크립트에서 조회 및 전송:** * 서버 스크립트에서 `_DataStorageService`를 사용하여 `GetVersionsAndWait`를 호출하고 [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] | DataStorageKeyInfo [question] | DataStorageKeyInfo 객체 2개를 생성하여 각각 Key "a"와 "b"를 지정하고, 이 두 객체의 Tag 속성에 동일한 값 "shared"를 설정하여 태그 기반 데이터 분류가 가능한 구조를 만드는 스크립트를 작성해줘. [answer] | `DataStorageKeyInfo` 객체를 두 개 생성하여 각각의 `Key`를 `"a"`와 `"b"`로 지정하고, 두 객체의 `Tag` 속성에 모두 `"shared"`를 설정하는 스크립트는 다음과 같습니다. ```lua [server only] void CreateTaggedDataStorageKeys() { -- 첫 번째 DataStorageKeyInfo 객체 생성 및 설정 local keyInfoA = DataStorageKeyInfo() keyInfoA.Key = "a" keyInfoA.Tag [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage의 데이터를 식별하는 데 사용하는 정보입니다. # Properties - **string Key** DataStorage 데이터의 키입니다. - **string Tag** DataStorage 데이터의 태그입니다. 설정한 값을 저장할 데이터의 태그로 지정할 수 있습니다. - **string Version** DataStorage의 데이터의 버전입니다. 설정한 값을 저장할 데이터의 버전으로 지정할 수 있습니다. # Constructors - **DataStorageKeyInfo()** 기본값으
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageItemPages [question] | DataStorageItemPages 컴포넌트에서 GetCurrentPageDatas를 통해 현재 페이지 데이터를 가져와 table<DataStorageItem> 형식으로 반환받은 후, 각 항목의 KeyInfo.Tag와 KeyInfo.Version을 추출하여 특정 조건에 맞는 데이터를 필터링하는 스크립트를 작성해줘 [answer] | DataStorageItemPages 객체를 사용하여 현재 페이지의 데이터를 조회하고, 각 데이터의 `KeyInfo.Tag`와 `KeyInfo.Version`을 기준으로 필터링하는 로직은 `GetCurrentPageDatas()` 메서드를 호출한 후 반환된 테이블을 순회하면서 조건을 검사하는 방식으로 구현할 수 있습니다. 아래 코드는 `Tag`가 "Important"이고 `Version`이 "1.0"인 데이터를 찾는 예제입니다. ```lua [server only] void FilterDataStorageItems(DataSto [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage에 저장된 데이터를 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageItem> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 데이터 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드를 반환합니다
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageItemPages [question] | DataStorageItemPages 컴포넌트를 사용하여 LoadNextPageAndWait와 MoveToNextPageAndWait를 호출하며, GetCurrentPageDatas에서 조회한 DataStorageItem의 KeyInfo.Key와 Value를 로그로 출력하고 IsLastPage가 true가 될 때까지 순회하는 스크립트를 작성해줘 [answer] | DataStorageItemPages 객체를 통해 페이지를 순회하는 로직은 `while` 루프 안에서 현재 페이지 데이터를 조회하고, 마지막 페이지 여부를 확인한 후 다음 페이지로 이동하는 방식으로 구성됩니다. 요청하신 조건에 맞춰 작성한 스크립트는 다음과 같습니다. ```lua Method: [server only] void PrintDataStoragePages(DataStorageItemPages pages) { while true do -- 현재 페이지의 데이터 목록을 가져옵니다. lo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage에 저장된 데이터를 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageItem> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 데이터 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드를 반환합니다
[task] | code [pass] | ⏳ 미판정 [title] | DataStorageItemPages [question] | DataStorageItemPages 컴포넌트를 활용하여 LoadNextPageAndWait의 에러 코드 반환 값을 확인하고, 0이 아닌 경우 즉시 조회를 중단하는 예외 처리 로직을 포함해 다음 페이지로 이동하는 스크립트를 작성해줘 [answer] | DataStorage에서 데이터를 페이지 단위로 조회할 때 `DataStorageItemPages` 객체를 사용하여 순회합니다. 다음 페이지로의 이동을 위해 `LoadNextPageAndWait()`를 호출하면 데이터 로딩이 완료됩니다. 이 함수는 성공 시 0, 실패 시 0이 아닌 에러 코드를 반환하므로, 반환 값을 확인하여 오류 발생 시 즉시 루프를 빠져나와야 합니다. 요청하신 예외 처리 로직을 포함한 mLua 스크립트 예제는 다음과 같습니다. ```lua [server only] void FetchDataStoragePage [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DataStorage에 저장된 데이터를 조회하는 기능을 제공합니다. # Properties - **boolean IsLastPage [ReadOnly]** 현재 페이지가 마지막 페이지인지 확인합니다. # Methods - **table<DataStorageItem> GetCurrentPageDatas() [ServerOnly]** 현재 페이지의 데이터 목록을 가져옵니다. - **int32 LoadNextPageAndWait() [ServerOnly] [Yield]** 다음 페이지를 불러오고, 에러 코드를 반환합니다