[task] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | PreloadAsync 메서드의 completeCallback이 수신하는 로드 결과의 데이터 구조와 순서 보장 방식을 표로 정리해서 제시하세요. [answer] | `PreloadAsync` 메서드의 `completeCallback`이 수신하는 로드 결과 데이터 구조와 순서 보장 방식은 다음과 같습니다. | 구분 | 내용 | | :--- | :--- | | **데이터 구조** | `table<PreloadResultStatus>`<br>각 요소는 `PreloadResultStatus` 타입의 값입니다. | | **순서 보장** | `ruidList`에 지정한 리소스 RUID의 **동일한 순서**대로 반환됩니다. | 즉, `PreloadAsync(ruidList, callback)` 호출 시 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopProduct [question] | WorldShopProduct의 Status와 Price 프로퍼티를 읽어서 가격 1000원 미만인 상품 목록을 생성하고 Description을 로그에 출력하는 스크립트를 작성해줘 [answer] | WorldShopService의 `GetProductsAndWait` 메서드를 사용하여 상품 목록을 페이지별로 조회한 후, 각 상품(`WorldShopProduct`)의 `Price` 프로퍼티가 1000 미만인지 확인합니다. 조건에 부합하는 상품은 `Description` 프로퍼티 값을 로그에 출력합니다. 참고로 `Status` 프로퍼티는 상품의 판매 상태를 나타내며, `Price`는 `int32` 타입입니다. 아래 코드에서는 `WorldShopProductType.Item` 타입의 상품을 대상으로 검색하며, 실제 필요한 상품 종 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService를 통해 얻은 상품의 정보입니다. # Properties - **string Description** 상품의 설명입니다. - **DateTime EndSalesPeriod** 판매 종료 일시입니다. HasSalesPeriod가 true일 때만 유효한 값을 가집니다. - **boolean HasSalesPeriod** 판매 기간이 설정되어 있는지 확인합니다. - **string Id** 상품의 식별자입니다. - **string Name** 상품의 이름입니다. - **int32 Pric
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopProduct [question] | WorldShopProduct의 EndSalesPeriod 값이 0으로 나오는데, HasSalesPeriod가 true여도 판매 기간이 없는 경우 어떻게 처리해야 하나요? [answer] | WorldShopProduct의 `EndSalesPeriod` 값이 0으로 나오는 경우, `HasSalesPeriod`가 `true`여도 판매 기간이 실제로 설정되어 있지 않거나 유효하지 않은 값으로 취급될 수 있습니다. `HasSalesPeriod`가 `true`일 때만 `StartSalesPeriod`와 `EndSalesPeriod`가 유효한 값을 가진다고 명시되어 있으므로, `HasSalesPeriod`가 `true`여도 `EndSalesPeriod`가 0(또는 유효하지 않은 DateTime)인 상황은 비정상적인 데이터 상태 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService를 통해 얻은 상품의 정보입니다. # Properties - **string Description** 상품의 설명입니다. - **DateTime EndSalesPeriod** 판매 종료 일시입니다. HasSalesPeriod가 true일 때만 유효한 값을 가집니다. - **boolean HasSalesPeriod** 판매 기간이 설정되어 있는지 확인합니다. - **string Id** 상품의 식별자입니다. - **string Name** 상품의 이름입니다. - **int32 Pric
[task] | code [pass] | ⏳ 미판정 [title] | EntityRef [question] | HandleTouchEvent 이벤트 핸들러에서 터치된 엔티티를 EntityRef로 변환하여 저장하고, 이후 OnUpdate에서 저장된 참조를 통해 엔티티의 TransformComponent.Position을 수정하는 스크립트를 작성해줘. [answer] | `EntityRef`는 엔티티의 Id를 저장해 두고, 실제 접근 시점에 엔티티를 찾도록 설계된 참조 타입입니다. 하지만 제공된 `EntityRef` 문서에는 저장된 `EntityRef`에서 실제 `Entity` 객체(또는 `TransformComponent`)를 가져오는 메서드나 프로퍼티(예: `GetEntity()`, `Entity` 프로퍼티 등)가 정의되어 있지 않습니다. 따라서 `EntityRef`를 통해 직접 `TransformComponent.Position`을 수정하는 코드를 작성할 수 있는 API가 문서에 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티를 참조합니다. 엔티티의 Id를 갖고 있다가 실제로 접근이 필요할 때 엔티티를 찾습니다. # Properties - **string EntityId [ReadOnly]** 참조하고 있는 Entity의 Id입니다. - **string EntityPath [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. # Constructors - **EntityRef(Entity entity)** 지정한 entity를 참조하는 EntityRef를 초기화합니다. - **EntityRef(stri
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage [question] | DataStorageService의 GetGlobalDataStorage(string)를 사용해 전역 카운터를 관리하고, SetAndWait(key, value)로 증가된 값을 저장한 후, GetAndWait(key)로 값을 가져와서 log() 함수로 출력하는 스크립트를 작성해줘. [answer] | 요청하신 전역 카운터 관리 스크립트입니다. `_DataStorageService:GetGlobalDataStorage()`를 통해 전역 데이터를 얻고, `GetAndWait()`로 현재 값을 조회한 후 증가시켜 `SetAndWait()`로 다시 저장하는 로직으로 구현했습니다. ```lua Property: [None] integer globalCounter = 0 Method: [server only] void OnBeginPlay() { -- 전역 데이터 스토리지 획득 local globalStorage = _D [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 더는 사용하지 않는 타입입니다. 용도에 맞게 DataStorageService의 GetGlobalDataStorage(string), GetUserDataStorage(string), GetCreatorDataStorage(), GetSortableDataStorage(string)를 사용하세요. # Methods - **string GetAndWait(string key) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. 용도에 맞게 GlobalDataStorage, UserD
[task] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | `PreloadAsync` 예제 코드를 그대로 출력하되, 설명은 코드 주석으로만 작성하세요. [answer] | ```lua Method: [client only] void ResourceLoadWithLoadingScreen() { -- 유저에게 로딩 화면을 보여줍니다. self:ShowLoadingScreen() -- 로드할 리소스 목록입니다. local ruids = { "6d1a308b27164b02921d812b05c78cba", "0516d7594a394561893e04de713cfb6a", "ce55606c96d94c059227f2956a1ae786", "b64e41d2e3774276aa7db7 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | SetSpriteUploadValidationCallback과 RequestSpriteUploadAsync의 실행 공간 제약 및 콜백 매개변수 차이를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void OnBeginPlay() { -- SetSpriteUploadValidationCallback은 [ServerOnly] 제약이 있어 서버에서만 실행됩니다. -- 클라이언트가 스프라이트 업로드를 요청했을 때, 서버에서 이를 허용할지 여부를 결정하는 콜백을 등록합니다. -- 콜백 매개변수: RUID(string) 또는 관련 식별자 정보를 받아 boolean을 반환해야 합니다. -- true를 반환하면 업로드를 허가하고, false를 반환하면 거부합 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | code [pass] | ⏳ 미판정 [title] | RectTileInfo [question] | RectTileInfo 컴포넌트의 SpriteRUID 속성을 이용하여 타일 인덱스 1부터 5까지의 스프라이트 RUID를 연속으로 로그로 기록하는 스크립트를 작성해줘 [answer] | RectTileInfo의 `SpriteRUID` 속성을 이용하여 타일 인덱스 1부터 5까지의 스프라이트 RUID를 로그로 기록하는 스크립트는 다음과 같습니다. ```lua [client only] void LogTileSpriteRUIDs() { for index = 1, 5 do -- RectTileInfo의 Index와 SpriteRUID 접근 local tileInfo = self.Entity.RectTileInfo local ruid = tileInfo[index].Spri [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 타일셋에 정의된 각 타일의 정보를 나타냅니다. # Properties - **int32 Index [ReadOnly]** 자동으로 부여되는 타일셋의 인덱스 번호입니다. 1부터 시작합니다. - **boolean IsCollidable [ReadOnly]** 충돌 여부입니다. true일 경우 플레이어는 타일 위를 지나갈 수 없습니다. - **string Name [ReadOnly]** 타일의 이름입니다. - **string SpriteRUID [ReadOnly]** 스프라이트의 RUID입니다.
[task] | code [pass] | ⏳ 미판정 [title] | UserDataSet [question] | 테이블의 특정 행 번호와 열 이름을 인자로 받아 해당 셀의 값을 가져오되, 범위 밖 접근 시 nil 반환을 확인하며 에러 처리 로직을 포함하는 스크립트를 작성해줘 [answer] | 요청하신 기능은 `UserDataSet`의 `GetCell` 메서드를 사용합니다. `GetCell(int32 row_1based, string columnName)`은 행 번호(1부터 시작)와 열 이름을 인자로 받아 해당 셀의 문자열 값을 반환하며, 요청한 행이나 열이 테이블 범위를 벗어나면 `nil`을 반환합니다. 아래 스크립트는 `OnBeginPlay` 시점에 테스트 데이터를 설정하고, 범위를 벗어난 접근 시 `nil` 반환을 확인하며 에러를 처리하는 로직을 포함합니다. ```lua Property: [None] number [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저가 제작한 데이터 테이블입니다. # Properties - **ReadOnlyList<string> Columns [ReadOnly] [HideFromInspector]** 데이터 테이블의 각 열의 내용을 담고 있는 리스트입니다. - **string Id [ReadOnly] [HideFromInspector]** 데이터 테이블의 Id입니다. - **string Name [ReadOnly] [HideFromInspector]** 데이터 테이블의 이름입니다. - **boolean ServerOnly [ReadOnly]
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopProduct [question] | WorldShopService를 통해 WorldShopProduct 객체를 받아 HasSalesPeriod가 true이고 현재 시간이 StartSalesPeriod와 EndSalesPeriod 사이인지 확인하여 판매 기간 내 상품인지 판별하는 스크립트를 작성해줘 [answer] | `WorldShopProduct` 객체의 `HasSalesPeriod`, `StartSalesPeriod`, `EndSalesPeriod` 프로퍼티와 `DateTime` 타입의 `Elapsed` 속성을 사용하여 판매 기간 내 상품인지 판별하는 스크립트입니다. ```lua Method: [server only] void CheckProductSalesPeriod() { -- 예시: WorldShopProductType.Item 타입의 상품을 검색합니다. local pages = _WorldShopService:GetP [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService를 통해 얻은 상품의 정보입니다. # Properties - **string Description** 상품의 설명입니다. - **DateTime EndSalesPeriod** 판매 종료 일시입니다. HasSalesPeriod가 true일 때만 유효한 값을 가집니다. - **boolean HasSalesPeriod** 판매 기간이 설정되어 있는지 확인합니다. - **string Id** 상품의 식별자입니다. - **string Name** 상품의 이름입니다. - **int32 Pric
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopPurchaseInfo [question] | WorldShopPurchaseInfo 객체의 OrderNumber 프로퍼티가 0인지 확인하여 무료 상품 구매 여부(boolean)를 반환하는 스크립트를 작성해줘 [answer] | `WorldShopPurchaseInfo` 객체의 `OrderNumber` 프로퍼티가 0이면 무료 상품 구매를 의미합니다. 이를 확인하여 `boolean` 값을 반환하는 스크립트는 다음과 같습니다. ```lua Method: [server only] boolean IsFreePurchase(any purchaseInfo) { return purchaseInfo.OrderNumber == 0 } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 사용하는 상품의 구매 정보입니다. # Properties - **integer OrderNumber** 주문번호입니다. 무료 상품 구매 시 0으로 지정됩니다. - **string ProductId** 구매한 상품의 Id입니다. - **string PurchaseId** 처리할 구매 Id입니다. - **string UserId** 상품을 구매한 유저 Id입니다. # Methods - **WorldShopPurchaseInfo Clone()** 복사본을 생성합니다.
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopPurchaseInfo [question] | WorldShopPurchaseInfo 객체의 UserId 프로퍼티 값을 추출하여 문자열로 반환하는 스크립트를 작성해줘 [answer] | `WorldShopPurchaseInfo` 객체의 `UserId` 프로퍼티는 문자열(`string`) 타입입니다. 따라서 해당 객체를 파라미터로 받아 `UserId` 값을 그대로 반환하는 메서드를 작성할 수 있습니다. ```lua Method: [server only] string GetPurchaseUserId(WorldShopPurchaseInfo purchaseInfo) { return purchaseInfo.UserId } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 사용하는 상품의 구매 정보입니다. # Properties - **integer OrderNumber** 주문번호입니다. 무료 상품 구매 시 0으로 지정됩니다. - **string ProductId** 구매한 상품의 Id입니다. - **string PurchaseId** 처리할 구매 Id입니다. - **string UserId** 상품을 구매한 유저 Id입니다. # Methods - **WorldShopPurchaseInfo Clone()** 복사본을 생성합니다.
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage [question] | DataStorageService의 GetUserDataStorage(string)로 유저별 데이터를 저장하고, SetAndWait(key, value)로 점수를 저장하며, GetAndWait(key)로 점수를 불러와 엔티티의 TransformComponent.Position을 조정하는 스크립트를 작성해줘. [answer] | 요청하신 기능(유저별 데이터 저장, 점수 기반 위치 조정)을 구현하기 위해 `DataStorageService`의 `GetUserDataStorage`와 해당 스토리지 객체의 `SetAndWait`, `GetAndWait` 메서드를 사용했습니다. 참고 문서에 따르면, `GetUserDataStorage`는 `UserId`를 인자로 받아야 하며, 반환된 객체에서 `GetAndWait`와 `SetAndWait`를 호출할 때 `errorCode`와 값을 함께 반환받는 구조입니다. 점수를 불러와 `TransformComponent.Pos [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 더는 사용하지 않는 타입입니다. 용도에 맞게 DataStorageService의 GetGlobalDataStorage(string), GetUserDataStorage(string), GetCreatorDataStorage(), GetSortableDataStorage(string)를 사용하세요. # Methods - **string GetAndWait(string key) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. 용도에 맞게 GlobalDataStorage, UserD
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopProduct [question] | WorldShopProduct의 Type과 Name 프로퍼티를 활용하여 특정 종류의 상품만 필터링하고 ThumbnailRUID를 반환하는 스크립트를 작성해줘 [answer] | WorldShopProduct의 `Type` 프로퍼티로 특정 상품 종류를 지정하고, `Name` 프로퍼티로 상품 이름이 특정 문자열을 포함하는지 확인하여 필터링할 수 있습니다. 조건에 맞는 상품의 `ThumbnailRUID`를 반환하는 로직은 다음과 같이 작성할 수 있습니다. ```lua Property: [None] string TargetProductType = "Item" -- WorldShopProductType enum 값 또는 해당 타입 문자열 (문서 예제 기준 WorldShopProductType.Item 사용 권장) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService를 통해 얻은 상품의 정보입니다. # Properties - **string Description** 상품의 설명입니다. - **DateTime EndSalesPeriod** 판매 종료 일시입니다. HasSalesPeriod가 true일 때만 유효한 값을 가집니다. - **boolean HasSalesPeriod** 판매 기간이 설정되어 있는지 확인합니다. - **string Id** 상품의 식별자입니다. - **string Name** 상품의 이름입니다. - **int32 Pric
[task] | code [pass] | ⏳ 미판정 [title] | EntityRef [question] | EntityRef 생성자를 활용하여 런타임에 생성된 스폰 엔티티의 Id를 받아 참조 객체를 초기화하고, OnBeginPlay에서 해당 엔티티가 존재하는지 확인하는 스크립트를 작성해줘. [answer] | EntityRef는 엔티티의 Id를 저장해두고 필요할 때 실제 엔티티를 참조하는 객체입니다. 런타임에 생성된 스폰 엔티티를 참조하기 위해 `EntityRef(string entityId)` 생성자를 사용할 수 있습니다. 참고 문서에 따르면 `EntityRef`는 `EntityId` 프로퍼티를 가지며, `EntityRefProperty`와 같이 Property 블록에서 선언할 수 있습니다. `OnBeginPlay`에서 해당 엔티티가 존재하는지 확인하려면 `_EntityService:GetEntityByPath()`나 유사한 메서드를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티를 참조합니다. 엔티티의 Id를 갖고 있다가 실제로 접근이 필요할 때 엔티티를 찾습니다. # Properties - **string EntityId [ReadOnly]** 참조하고 있는 Entity의 Id입니다. - **string EntityPath [Deprecated] [ReadOnly]** 더는 사용하지 않는 프로퍼티입니다. # Constructors - **EntityRef(Entity entity)** 지정한 entity를 참조하는 EntityRef를 초기화합니다. - **EntityRef(stri
[task] | code [pass] | ⏳ 미판정 [title] | RectTileInfo [question] | RectTileInfo 컴포넌트의 Name 속성을 통해 지정된 이름의 타일이 존재하는지 확인하고, 해당 타일의 Index와 IsCollidable 상태를 반환하는 스크립트를 작성해줘 [answer] | RectTileInfo는 타일셋에 정의된 각 타일의 정보를 나타내는 구조이며, `Name`, `Index`, `IsCollidable` 속성은 모두 읽기 전용(ReadOnly)입니다. 주어진 정보만으로는 **타일셋 전체를 순회하며 특정 이름의 타일을 찾아야 하는 구조**가 어떻게 접근되는지(예: 어떤 서비스나 프로퍼티를 통해 타일 목록을 가져오는지)에 대한 API 정보가 제공되지 않았습니다. 따라서 `RectTileInfo` 배열을 직접 순회하는 방법을 알 수 없으므로, 특정 타일셋 내 타일을 동적으로 검색하는 완전한 코드를 작성 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 타일셋에 정의된 각 타일의 정보를 나타냅니다. # Properties - **int32 Index [ReadOnly]** 자동으로 부여되는 타일셋의 인덱스 번호입니다. 1부터 시작합니다. - **boolean IsCollidable [ReadOnly]** 충돌 여부입니다. true일 경우 플레이어는 타일 위를 지나갈 수 없습니다. - **string Name [ReadOnly]** 타일의 이름입니다. - **string SpriteRUID [ReadOnly]** 스프라이트의 RUID입니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopProductPages [question] | 페이지 이동 중에 네트워크 오류가 발생하면 MoveToNextPageAndWait()가 무한 대기 상태로 빠지는 현상이 있는데, 이를 방지하기 위한 타임아웃 처리를 mLua에서 어떻게 해야 하나요? [answer] | 제공된 참고 문서에는 `MoveToNextPageAndWait()` 함수의 동작(다음 페이지로 이동하고 실행 중단)과 `WorldShopProductPages` 객체의 프로퍼티·메서드만 설명되어 있습니다. 문서에 따르면, `MoveToNextPageAndWait()` 함수에는 **타임아웃 매개변수가 존재하지 않으며**, 네트워크 오류 발생 시 무한 대기 상태를 방지하거나 처리하기 위한 별도의 API나 이벤트 핸들러가 제공되지 않습니다. 따라서 주어진 문서 범위 내에서 네트워크 오류에 대한 타임아웃 처리를 구현할 수 있는 방법은 없 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 검색한 상품 목록을 페이지 단위로 조회합니다. # Properties - **boolean IsLastPage** 현재 페이지가 검색 결과의 마지막 페이지인지 확인합니다. # Methods - **table<WorldShopProduct> GetCurrentPageDatas()** 검색 결과 중 현재 페이지의 상품 정보 목록을 구합니다. 한 페이지에는 최대 25개의 검색 결과가 포함됩니다. - **void MoveToNextPageAndWait() [Yield]** 검색 결과의 다
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopProductPages [question] | MoveToNextPageAndWait()는 [Yield] 태그가 붙어 있는데, 이 함수를 호출하면 스크립트 실행이 중단되는 동안 다른 이벤트 핸들러는 정상적으로 동작하나요? [answer] | `MoveToNextPageAndWait()`는 `[Yield]` 태그가 붙어 있어 호출 시 해당 스크립트 함수의 실행이 일시적으로 중단됩니다. 이 함수는 비동기 방식으로 동작하며, 페이지 데이터를 가져오는 동안 현재 함수의 실행 흐름은 멈추지만 스크립트 전체가 종료되거나 다른 코드의 실행을 방해하지는 않습니다. 따라서 `MoveToNextPageAndWait()` 호출로 인한 대기 시간 동안 다른 이벤트 핸들러(Event Handler)는 정상적으로 동작합니다. 예를 들어, 페이지 이동 대기 중에도 다른 곳에서 발생하는 `Han [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 검색한 상품 목록을 페이지 단위로 조회합니다. # Properties - **boolean IsLastPage** 현재 페이지가 검색 결과의 마지막 페이지인지 확인합니다. # Methods - **table<WorldShopProduct> GetCurrentPageDatas()** 검색 결과 중 현재 페이지의 상품 정보 목록을 구합니다. 한 페이지에는 최대 25개의 검색 결과가 포함됩니다. - **void MoveToNextPageAndWait() [Yield]** 검색 결과의 다
[task] | single_turn [pass] | ⏳ 미판정 [title] | UserDataSet [question] | GetAllRow와 GetColumn 메서드가 각각 반환하는 데이터 타입의 차이점과 어떤 상황에 각각이 더 효율적인가요? [answer] | `GetAllRow`와 `GetColumn` 메서드는 반환하는 데이터 구조와 접근 방식에서 명확한 차이가 있으며, 이는 각 메서드의 용도와 효율적인 사용 시기를 결정합니다. ### 1. 반환 데이터 타입의 차이 * **`GetAllRow()`** * **반환 타입:** `table<UserDataRow>` * **설명:** 데이터 테이블의 **모든 행**을 `UserDataRow` 객체 형태의 테이블로 반환합니다. 각 `UserDataRow`는 해당 행에 포함된 모든 열의 데이터를 포함하고 있어, 행 단 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저가 제작한 데이터 테이블입니다. # Properties - **ReadOnlyList<string> Columns [ReadOnly] [HideFromInspector]** 데이터 테이블의 각 열의 내용을 담고 있는 리스트입니다. - **string Id [ReadOnly] [HideFromInspector]** 데이터 테이블의 Id입니다. - **string Name [ReadOnly] [HideFromInspector]** 데이터 테이블의 이름입니다. - **boolean ServerOnly [ReadOnly]
[task] | two_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | ResourceService의 PreloadAsync() 함수를 사용하여 리소스를 로드하고 로딩 화면을 제어하는 기본 구조는 무엇인가요? [answer] | `ResourceService`의 `PreloadAsync()` 함수를 이용해 리소스를 로드하고 로딩 화면을 제어하는 기본 구조는 다음과 같습니다. 1. **로딩 화면 표시**: 리소스 로드가 시작되기 전에 유저에게 로딩 화면을 표시하는 함수(예: `ShowLoadingScreen()`)를 호출합니다. 2. **리소스 목록 정의**: 로드할 리소스 ID(`ruid`)들을 테이블로 정의합니다. 3. **비동기 로드 시작**: `_ResourceService:PreloadAsync()`를 호출하여 리소스 로드를 시작합니다. 이 [followup] | PreloadAsync()의 콜백에서 실행되는 로딩 화면 숨김 처리를 OnEndPlay() 시점에 안전하게 해제하기 위한 예외 처리 코드 패턴은 어떻게 작성하나요? [followup_answer] | 제공된 참고 문서에는 `PreloadAsync()`의 콜백에서 로딩 화면을 숨기는 기본적인 구조는 설명되어 있으나, `OnEndPlay()` 시점에 콜백 실행을 안전하게 해제하거나 예외를 처리하는 구체적인 코드 패턴이나 API(예: 콜백 취소 함수, 플래그 기반 제어 등)에 대한 정보는 포함되어 있지 않습니다. 따라서 제공된 문서만으로는 `OnEndPlay()` 시점에 안전하게 해제하기 위한 예외 처리 코드 패턴을 작성할 수 없습니다. [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | PreloadAsync로 여러 리소스를 미리 불러왔을 때, 완료 콜백에서 반환되는 결과 순서는 어떻게 결정되나요? [answer] | `PreloadAsync` 메서드에서 완료 콜백으로 전달되는 결과의 순서는 **`ruidList`에 리소스 RUID를 지정한 순서와 동일하게** 결정됩니다. 즉, `PreloadAsync`에 전달한 리스트에서 첫 번째 RUID에 해당하는 로드 결과가 콜백의 첫 번째 인수로, 두 번째 RUID에 해당하는 결과가 두 번째 인수로 순서대로 반환됩니다. 예를 들어, `{"ruid_A", "ruid_B", "ruid_C"}` 순서로 전달했다면, 완료 콜백에서 받는 결과 테이블도 `ruid_A`, `ruid_B`, `ruid_C` 순서로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopPurchaseInfo [question] | WorldShopPurchaseInfo 객체의 ProductId와 PurchaseId 값을 결합하여 "ProductId: [값], PurchaseId: [값]" 형식의 문자열을 생성하는 스크립트를 작성해줘 [answer] | `WorldShopPurchaseInfo` 객체의 `ProductId`와 `PurchaseId` 프로퍼티는 각각 `string` 타입입니다. 이 두 값을 문자열 연결 연산자(`..`)를 사용해 요청하신 형식의 문자열로 조합할 수 있습니다. 아래는 상품 구매 처리 콜백에서 해당 문자열을 생성하고 로그로 출력하는 예제 스크립트입니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurch [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 사용하는 상품의 구매 정보입니다. # Properties - **integer OrderNumber** 주문번호입니다. 무료 상품 구매 시 0으로 지정됩니다. - **string ProductId** 구매한 상품의 Id입니다. - **string PurchaseId** 처리할 구매 Id입니다. - **string UserId** 상품을 구매한 유저 Id입니다. # Methods - **WorldShopPurchaseInfo Clone()** 복사본을 생성합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopProductPages [question] | WorldShopProductPages의 IsLastPage 프로퍼티가 true로 반환되는 시점이 정확히 언제인지 궁금합니다. [answer] | `WorldShopProductPages`의 `IsLastPage` 프로퍼티가 `true`로 반환되는 시점은 **현재 페이지가 검색 결과의 마지막 페이지일 때**입니다. 이 프로퍼티는 현재 보고 있는 페이지가 전체 검색 결과 중 최종 페이지인지 여부를 나타내며, `true`인 경우 더 이상 다음 페이지로 이동할 데이터가 없음을 의미합니다. 따라서 페이지를 순회하는 로직에서 `IsLastPage`가 `true`로 확인되면 루프를 종료(`break`)하는 것이 일반적인 사용 패턴입니다. 참고로 페이지 이동을 담당하는 `MoveToN [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 검색한 상품 목록을 페이지 단위로 조회합니다. # Properties - **boolean IsLastPage** 현재 페이지가 검색 결과의 마지막 페이지인지 확인합니다. # Methods - **table<WorldShopProduct> GetCurrentPageDatas()** 검색 결과 중 현재 페이지의 상품 정보 목록을 구합니다. 한 페이지에는 최대 25개의 검색 결과가 포함됩니다. - **void MoveToNextPageAndWait() [Yield]** 검색 결과의 다
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 클라이언트에서 스프라이트 업로드를 요청했을 때 서버가 이를 무조건 허용하도록 설정하려면 어떤 함수를 어떻게 사용해야 하나요? [answer] | `_ResourceService`의 `SetSpriteUploadValidationCallback` 함수를 사용해 클라이언트에서 스프라이트 업로드 요청을 처리하는 콜백을 등록합니다. 이 콜백 함수에서 항상 `true`를 반환하도록 구현하면 서버는 모든 스프라이트 업로드 요청을 허용합니다. 이 함수는 서버에서만 실행되어야 하므로 `[server only]` 실행 공간 지정자를 사용합니다. ```lua Method: [server only] void OnBeginPlay() { -- 클라이언트의 스프라이트 업로드 요청을 무조건 허 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage [question] | DataStorageService의 GetCreatorDataStorage()로 크리에이터 설정 데이터를 저장하고, SetAndWait(key, value)로 설정 값을 업데이트하며, GetAndWait(key)로 설정을 읽어 _UserService의 UserEnterEvent 핸들러에서 신규 유저에게 적용하는 스크립트를 작성해줘. [answer] | 요청하신 `DataStorageService`의 `GetCreatorDataStorage()`와 `SetAndWait()`, `GetAndWait()`를 사용하여 크리에이터 설정 데이터를 관리하고, 유저 입장 시 해당 설정을 적용하는 스크립트를 아래에 작성했습니다. 참고로 `SetAndWait`와 `GetAndWait`는 모두 `[ServerOnly]` 및 `[Yield]` 속성이 있으므로, 서버에서 실행되며 호출 시 코드가 일시 정지(Yield)됩니다. ```lua Property: [None] boolean isInitial [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 더는 사용하지 않는 타입입니다. 용도에 맞게 DataStorageService의 GetGlobalDataStorage(string), GetUserDataStorage(string), GetCreatorDataStorage(), GetSortableDataStorage(string)를 사용하세요. # Methods - **string GetAndWait(string key) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. 용도에 맞게 GlobalDataStorage, UserD
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopProductPages [question] | WorldShopService로 상품을 검색한 후 WorldShopProductPages 객체를 어떻게 생성하거나 참조하는지 문서를 찾지 못했는데, 이 객체를 획득하는 방법이 무엇인가요? [answer] | `WorldShopProductPages` 객체는 `_WorldShopService`의 `GetProductsAndWait` 메서드를 호출하여 반환값으로 직접 획득합니다. 참고 문서의 예제 코드에서 확인하듯, `_WorldShopService:GetProductsAndWait(WorldShopProductType.Item, WorldShopProductStatus.Ing)`와 같이 상품 종류와 판매 상태 필터를 인자로 전달하면, 해당 검색 결과를 페이지 단위로 조회할 수 있는 `WorldShopProductPages` 객체가 반환 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 검색한 상품 목록을 페이지 단위로 조회합니다. # Properties - **boolean IsLastPage** 현재 페이지가 검색 결과의 마지막 페이지인지 확인합니다. # Methods - **table<WorldShopProduct> GetCurrentPageDatas()** 검색 결과 중 현재 페이지의 상품 정보 목록을 구합니다. 한 페이지에는 최대 25개의 검색 결과가 포함됩니다. - **void MoveToNextPageAndWait() [Yield]** 검색 결과의 다
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopPurchaseInfo [question] | WorldShopPurchaseInfo의 Clone() 메서드를 호출하여 원본 객체의 OrderNumber, ProductId, PurchaseId, UserId 값을 복사한 새 인스턴스를 반환하는 스크립트를 작성해줘 [answer] | WorldShopPurchaseInfo의 `Clone()` 메서드는 호출한 객체의 복사본을 생성합니다. 따라서 원본 객체의 `OrderNumber`, `ProductId`, `PurchaseId`, `UserId` 값을 모두 포함하는 새로운 `WorldShopPurchaseInfo` 인스턴스를 반환합니다. 아래는 `ProcessPurchase` 콜백에서 `purchaseInfo` 객체의 `Clone()` 메서드를 호출하여 복사본을 생성하고, 복사본의 프로퍼티 값을 로그로 출력하는 예시 스크립트입니다. ```lua Method: [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 사용하는 상품의 구매 정보입니다. # Properties - **integer OrderNumber** 주문번호입니다. 무료 상품 구매 시 0으로 지정됩니다. - **string ProductId** 구매한 상품의 Id입니다. - **string PurchaseId** 처리할 구매 Id입니다. - **string UserId** 상품을 구매한 유저 Id입니다. # Methods - **WorldShopPurchaseInfo Clone()** 복사본을 생성합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | ClearCaches 사용 예제의 코드만 출력하고 맵 이동 시 자동 처리되는 내용을 주석으로 설명하세요. [answer] | ```lua Method: [client only] void BeforeMoveLobbyMap() { -- 캐싱된 모든 리소스를 캐시에서 해제합니다. _ResourceService:ClearCaches() -- 맵 이동 시 UnloadUnusedResources()는 내부적으로 자동 호출됩니다. -- _ResourceService:UnloadUnusedResources(0) } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetTypeAndWait 리소스 타입을 확인하는 예제입니다. ```lua Method: void OnBeginPlay() { -- sprite local type = _ResourceService:GetTypeAndWait('f55cd1b715c14593a97caff8b147d544') log(type) -- animationclip local type2 = _ResourceService:GetTypeAndWait('235ede11f6a24ecb85f6271833d06ba0') log(type2) }
[task] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | HandleResourceUploadEvent 핸들러에서 userEntity 유효성 검사를 위한 API와 메서드를 3문장 이내로 설명하세요. [answer] | `_UserService:GetUserEntityByUserId(UserId)`를 호출하여 해당 유저의 엔티티를 조회합니다. 이후 `_EntityService:IsValid(userEntity)` 메서드를 통해 반환된 엔티티가 유효한지 검사합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Event Handler: [server only] [service: ResourceService] HandleResourceUploadEvent { -- Parameters local RUID = event.RUID local UserId = event.UserId -------------------------------------------------------- -- 리소스 업로드에 성공했을 때 서버에서 발생하는 이벤트입니다. local userEntity = _UserService:GetUse
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 캐시에서 리소스를 제거한 뒤에도 메모리가 줄지 않는다면 어떤 함수를 추가로 호출해야 하나요? [answer] | 캐시에서 리소스를 제거한 뒤에도 메모리가 줄어들지 않는다면, `UnloadUnusedResources(pendingTimeSeconds)` 함수를 추가로 호출해야 합니다. `ClearCaches()` 또는 `RemoveCaches(ruidList)`는 리소스를 캐시 목록에서 제거하는 역할만 하며, 실제 메모리 해제는 `UnloadUnusedResources`를 통해 이루어집니다. 이 함수는 지정된 시간(`pendingTimeSeconds`, 단위: 초) 동안 사용되지 않았고 캐시에서도 제거된 리소스를 메모리에서 해제합니다. 예를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string