[task] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | GetTypeAndWait 메서드의 반환 타입과 예제 코드만 출력하세요. [answer] | ```lua Method: void OnBeginPlay() { -- sprite local type = _ResourceService:GetTypeAndWait('f55cd1b715c14593a97caff8b147d544') log(type) -- animationclip local type2 = _ResourceService:GetTypeAndWait('235ede11f6a24ecb85f6271833d06ba0') log(type2) } ``` [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 핸들러가 등록되는 서비스 이름과 실행 공간(Execution Space)을 표로 정리하세요. [answer] | 제공된 문서를 바탕으로 `HandleResourceUploadEvent` 핸들러의 서비스 이름과 실행 공간을 정리하면 다음과 같습니다. | 항목 | 값 | | :--- | :--- | | **서비스 이름** | `ResourceService` | | **실행 공간** | `server only` | [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] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | RemoveCaches 예제에서 호출 순서가 중요한 3가지 메서드를 표로 정리해서 나열하세요. [answer] | `RemoveCaches` 예제에서 호출 순서가 중요한 3가지 메서드는 다음과 같습니다. | 순서 | 메서드 | 역할 | | :--- | :--- | :--- | | 1 | `_ResourceService:RemoveCaches(oldRuids)` | 이전 스킬에서 사용하던 리소스들을 캐시에서 해제합니다. | | 2 | `_ResourceService:UnloadUnusedResources(0)` | 캐싱되지 않고 사용하지도 않는 리소스들을 메모리에서 해제합니다. | | 3 | `_ResourceService:PreloadAsyn [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] | RUID와 UserId 변수를 사용하여 자기가 정의한 RecordUploadedResource 메서드를 호출하는 코드만 출력하고, 나머지 로직은 주석으로만 작성하세요. [answer] | ```lua Event Handler: [server only] [service: ResourceService] HandleResourceUploadEvent { -- Parameters local RUID = event.RUID local UserId = event.UserId -------------------------------------------------------- -- 리소스 업로드에 성공했을 때 서버에서 발생하는 이벤트입니다. local userEntity = _UserService:GetUse [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] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | `ResourceUploadEvent` 처리 시 주의해야 할 점과 중복 기록 방지 방안을 표로 정리해서 3문장 이내로 요약하세요. [answer] | `ResourceUploadEvent`는 리소스가 업로드된 **모든 서버**에서 발생하므로, 이벤트 처리 시 해당 유저가 현재 서버에 접속해 있는지 반드시 확인해야 합니다. 이를 통해 여러 서버에서 동시에 이벤트가 처리될 때 발생하는 **중복 기록**을 방지할 수 있습니다. | 구분 | 내용 | | :--- | :--- | | **주의 사항** | `ResourceUploadEvent`는 리소스가 업로드된 월드의 **모든 서버**에서 발생함 | | **중복 방지 방안** | 이벤트 수신 시 `UserId`에 해당하는 유저가 **현 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | two_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 리소스 업로드 성공 시 서버에서 발생하는 HandleResourceUploadEvent를 어떻게 처리하나요? [answer] | 리소스 업로드 성공 시 서버에서 발생하는 `HandleResourceUploadEvent`는 `ResourceService`의 이벤트 핸들러로 등록하여 처리합니다. 이 이벤트가 발생하면 `event.RUID` (리소스 고유 ID)와 `event.UserId` (업로드한 사용자 ID)를 파라미터로 받을 수 있습니다. 일반적인 처리 흐름은 다음과 같습니다: 1. `event.UserId`를 사용하여 해당 사용자의 엔티티를 조회합니다. (`_UserService:GetUserEntityByUserId(UserId)`) 2. 조회된 [followup] | userEntity가 유효하지 않을 경우 예외 처리나 로그 출력은 어떻게 하면 좋을까요? [followup_answer] | 참고 문서에 제시된 `HandleResourceUploadEvent` 예제에서는 `userEntity`가 유효하지 않은 경우를 위한 `else` 블록이나 예외 처리 코드가 명시적으로 포함되어 있지 않습니다. 제공된 문서 범위 내에서는 유효하지 않을 때의 구체적인 처리 방식(예: 특정 로그 메시지, 대체 동작 등)을 확인할 수 없습니다. 다만, mLua의 표준 기능으로 `log(...)` 함수를 사용하여 상황을 기록할 수는 있습니다. 참고 문서의 코드 구조를 기반으로, 유효하지 않을 때 로그를 출력하도록 확장한다면 다음과 같은 형태 [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] | WorldShopProductPages [question] | GetCurrentPageDatas() 함수가 최대 25개만 반환한다고 하는데, 검색 결과가 26개 이상일 때 2번째 페이지로 넘어가는 로직을 어떻게 구현해야 하나요? [answer] | `WorldShopProductPages` 객체는 페이지 단위로 검색 결과를 관리하므로, 26개 이상의 결과가 있을 때 2번째 페이지로 넘어가려면 `IsLastPage` 프로퍼티와 `MoveToNextPageAndWait()` 메서드를 조합하여 반복 루프를 구성해야 합니다. 구체적인 구현 로직은 다음과 같습니다: 1. `_WorldShopService:GetProductsAndWait()` 등으로 `WorldShopProductPages` 객체를 조회합니다. 2. `while true` 루프를 시작하여 `GetCurrentP [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 검색한 상품 목록을 페이지 단위로 조회합니다. # Properties - **boolean IsLastPage** 현재 페이지가 검색 결과의 마지막 페이지인지 확인합니다. # Methods - **table<WorldShopProduct> GetCurrentPageDatas()** 검색 결과 중 현재 페이지의 상품 정보 목록을 구합니다. 한 페이지에는 최대 25개의 검색 결과가 포함됩니다. - **void MoveToNextPageAndWait() [Yield]** 검색 결과의 다
[task] | code [pass] | ⏳ 미판정 [title] | DataStorage [question] | DataStorageService의 GetSortableDataStorage(string)로 정렬 가능한 데이터를 저장하고, SetAndWait(key, value)로 항목을 추가한 후, GetAndWait(key)로 데이터를 가져와서 _EntityService:GetEntityByPath("/maps/map01/obj")로 엔티티를 찾고 그 엔티티의 속성을 수정하는 스크립트를 작성해줘. [answer] | 제시된 참고 문서에는 `DataStorageService`의 `GetSortableDataStorage(string)` 메서드와 `SetAndWait`, `GetAndWait` 함수의 존재만 언급되어 있으며, 정렬 가능한 데이터 저장소(`SortableDataStorage`)의 구체적인 메서드 시그니처나 반환값 구조에 대한 정보가 없습니다. 또한 `_EntityService:GetEntityByPath`로 찾은 엔티티의 어떤 속성을 어떻게 수정하는지에 대한 구체적인 요구사항이나 대상 컴포넌트 정보가 제공되지 않았습니다. 따라서 요 [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] | RectTileInfo [question] | RectTileInfo 컴포넌트의 IsCollidable 속성을 확인하여 충돌이 불가능한(false) 타일들의 Name과 SpriteRUID를 목록으로 정리해 출력하는 스크립트를 작성해줘 [answer] | RectTileInfo는 타일셋에 정의된 각 타일의 정보를 나타내는 데이터 구조이며, `IsCollidable` 속성은 충돌 여부를 나타냅니다. `IsCollidable`가 `false`인 경우 플레이어는 해당 타일 위를 지나갈 수 있습니다. 요청하신 조건에 따라 `IsCollidable`가 `false`인 타일들의 `Name`과 `SpriteRUID`를 확인하여 출력하는 스크립트는 다음과 같습니다. 참고로 `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] | code [pass] | ⏳ 미판정 [title] | RectTileInfo [question] | RectTileInfo 컴포넌트의 Index, IsCollidable, Name, SpriteRUID 속성을 활용해 특정 인덱스나 이름의 타일 정보를 조회하고 로그로 출력하는 스크립트를 작성해줘 [answer] | RectTileInfo 는 타일셋에 정의된 각 타일의 정보를 나타내는 구조이며, `Index`, `IsCollidable`, `Name`, `SpriteRUID` 속성은 모두 읽기 전용(ReadOnly)입니다. 따라서 스크립트에서 직접 수정할 수 없고, 조회하여 로그로 출력하는 용도로만 사용할 수 있습니다. 특정 인덱스나 이름의 타일 정보를 조회하려면 해당 타일셋에서 `RectTileInfo` 객체를 가져와야 합니다. 제공된 문서에는 타일셋에서 특정 타일 정보를 가져오는 구체적인 서비스나 메서드 API가 명시되어 있지 않으므로, [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] | ResourceService [question] | 타일 셋에 포함된 모든 스프라이트를 한 번에 미리 로드하려면 어떤 함수를 사용하며, 필요한 매개변수는 무엇인가요? [answer] | 타일 셋에 포함된 모든 스프라이트를 한 번에 미리 로드하려면 `_ResourceService`의 `PreloadTileSetAsync` 함수를 사용합니다. 이 함수는 비동기로 실행되며, 완료 시점에 전달된 콜백 함수가 호출됩니다. 필요한 매개변수는 다음과 같습니다. 1. **tileSetId** (string): 로드할 타일 셋의 ID입니다. 이는 `TileDataSet` 엔트리의 Id 값이어야 합니다. 2. **completeCallback** (func<PreloadResultStatus>): 로드가 완료되었을 때 호출될 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | SetProcessPurchaseCallback 메서드의 callback이 false를 반환했을 때 발생하는 동작을 3문장 이내로 설명하세요. [answer] | callback이 false를 반환하면 상품 지급에 실패한 것으로 처리됩니다. 이 경우 구매 유저가 월드에 재입장했을 때 상품 지급 callback이 다시 실행됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | SendEvent로 이벤트를 보낸 직후 DisconnectEvent를 호출하면 이미 큐에 들어간 이벤트는 여전히 핸들러에 전달되나요? [answer] | 제시된 참고 문서에는 `SendEvent`와 `DisconnectEvent`의 실행 순서, 이벤트 큐 처리 방식, 또는 이벤트 전달 시점에 대한 정보가 포함되어 있지 않습니다. 문서에는 각 메서드의 기능만 다음과 같이 설명되어 있을 뿐입니다. * `SendEvent`: 이벤트를 발생시킵니다. * `DisconnectEvent`: 지정된 이벤트와 핸들러 간의 연결을 끊습니다. 따라서 "큐에 들어간 이벤트가 여전히 전달되는지"에 대한 정확한 동작 방식은 문서 기준으로 답변할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | EventHandlerBase 타입으로 반환되는 핸들러 객체를 저장해두지 않고 ConnectEvent만 호출하면 메모리 누수가 발생하거나 이벤트 연결이 자동으로 해제되나요? [answer] | 제시된 참고 문서에는 `EventHandlerBase` 타입의 반환값을 저장하지 않았을 때의 메모리 관리 정책(메모리 누수 여부)이나 이벤트 연결의 자동 해제(자동 디스커넥트) 메커니즘에 대한 정보가 포함되어 있지 않습니다. 문서에는 오직 `ConnectEvent`를 통해 핸들러를 연결하고, `DisconnectEvent`를 통해 명시적으로 연결을 끊는 API의 존재만 설명하고 있을 뿐, 반환된 `EventHandlerBase` 객체의 생명주기나 참조 유지 여부와 관련된 세부 동작 원리는 다루지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopProductPages [question] | WorldShopProductPages 컴포넌트의 IsLastPage 속성을 확인하여 마지막 페이지까지 도달했는지 판단하는 로직을 포함하는 스크립트를 작성해줘. [answer] | WorldShopProductPages 객체의 `IsLastPage` 속성은 현재 페이지가 검색 결과의 마지막 페이지인지를 나타내는 boolean 타입입니다. 이 속성을 사용하여 더 이상 다음 페이지로 이동할 필요가 없는지 판단할 수 있습니다. 상품 목록을 페이지 단위로 순회하며 각 페이지의 상품 정보를 출력하고, 마지막 페이지에 도달하면 루프를 종료하는 로직은 다음과 같이 구현할 수 있습니다. ```lua Method: [server only] void PrintAllWorldShopProducts () { -- 상품 [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] | WorldShopService [question] | SetProcessPurchaseCallback의 콜백에서 false를 반환하면 어떤 일이 발생하나요? [answer] | `SetProcessPurchaseCallback`의 콜백에서 `false`를 반환하면, 해당 구매 건의 상품 지급이 성공하지 않은 것으로 처리됩니다. 이 경우 구매 유저가 월드에 다시 입장했을 때, 미완료된 상품 지급을 위해 같은 콜백이 다시 실행됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | 제작 중인 월드에서 UserHasPassAndWait를 사용하면 이용권 보유 상태가 어떻게 처리되나요? [answer] | 제작 중인 월드에서는 `UserHasPassAndWait` 메서드를 호출하더라도 모든 이용권을 보유하지 않은 상태로 실행됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | 서버에서 스프라이트 업로드 허용 여부를 판단하는 콜백 등록 및 검증 로직을 단계별 번호 목록으로 정리하세요. [answer] | 서버에서 스프라이트 업로드 허용 여부를 판단하는 콜백 등록 및 검증 로직은 다음과 같은 단계로 구성됩니다. 1. **콜백 등록**: 서버 측 스크립트의 `OnBeginPlay()` 함수에서 `_ResourceService:SetSpriteUploadValidationCallback(self.ValidateSpriteUpload)`를 호출하여 업로드 허용 여부 결정 콜백을 등록합니다. 2. **검증 함수 구현**: `ValidateSpriteUpload(string userId)` 함수를 구현하여 전달받은 `userId`에 대한 허 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopProductPages [question] | WorldShopProductPages 컴포넌트의 GetCurrentPageDatas() 메서드가 반환하는 table<WorldShopProduct> 내의 최대 25개 상품 정보를 처리하는 스크립트를 작성해줘. [answer] | WorldShopProductPages 객체의 `GetCurrentPageDatas()` 메서드는 한 페이지에 포함된 최대 25개의 `WorldShopProduct` 객체 목록을 반환합니다. 이 목록을 처리하려면 `ipairs` 또는 `pairs`를 사용하여 반복문을 구성하고, 각 상품 객체의 `Id`, `Name`, `Price` 등의 프로퍼티에 접근할 수 있습니다. 검색 결과를 페이지 단위로 조회하면서 현재 페이지의 모든 상품을 처리하는 전체 로직은 다음과 같습니다. ```lua Method: void ProcessWorld [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 검색한 상품 목록을 페이지 단위로 조회합니다. # Properties - **boolean IsLastPage** 현재 페이지가 검색 결과의 마지막 페이지인지 확인합니다. # Methods - **table<WorldShopProduct> GetCurrentPageDatas()** 검색 결과 중 현재 페이지의 상품 정보 목록을 구합니다. 한 페이지에는 최대 25개의 검색 결과가 포함됩니다. - **void MoveToNextPageAndWait() [Yield]** 검색 결과의 다
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | ResourceService의 ConnectEvent 메서드를 사용해 string key로 이벤트를 연결하고, 이벤트 발생 시 로그를 출력하는 스크립트를 작성해줘 [answer] | ResourceService의 `ConnectEvent(string key, IScriptFunction eventHandler)` 메서드를 사용하여 특정 문자열 키(key)를 가진 이벤트를 연결하고, 해당 이벤트가 발생했을 때 로그를 출력하는 스크립트입니다. 참고로, 이벤트 핸들러는 `Event Handler` 블록으로 작성해야 하며, 연결할 이벤트의 키 이름(예: `"MyCustomEvent"`)을 지정해야 합니다. 아래 예시에서는 `"TestEvent"`라는 키를 가진 이벤트를 연결하는 것으로 가정합니다. ```lua Pr [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | GetProductAndWait 메서드는 어떤 상태의 상품 정보만 조회할 수 있나요? [answer] | `GetProductAndWait` 메서드는 월드의 배포 상태에 따라 조회 가능한 상품 상태가 다릅니다. 1. **출시된 월드**: `Waiting`, `Ing`, `End` 상태의 상품 정보만 조회할 수 있습니다. 2. **제작 중인 월드**: `Register`, `Waiting`, `Ing`, `End` 상태의 상품 정보를 조회할 수 있습니다. 이 메서드는 비동기(Yield) 방식으로 동작하므로, 호출 시 스크립트 실행이 중단됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | instruction_following [pass] | ⏳ 미판정 [title] | ResourceService [question] | 클라이언트에서 스크린샷을 캡처하여 스프라이트 리소스로 업로드하는 전 과정의 코드만 출력하고, 각 단계의 설명은 주석으로만 작성하세요. [answer] | ```lua [client only] void CaptureScreenshotAndUpload() { -- 스크린샷을 찍어 데이터화합니다. local screenshotError, pixelData = _ScreenshotService:CaptureFullScreenAsPixelDataAndWait() -- 스크린샷을 찍는 과정에서 오류가 발생했는지 확인합니다. if screenshotError ~= ScreenshotError.Success then log_error("Failed to capture screens [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | PromptPurchase 함수를 서버 스크립트에서 호출하면 어떻게 되나요? [answer] | `PromptPurchase` 함수는 **[ClientOnly]** 속성을 가지고 있어 클라이언트(유저 기기)에서만 실행되도록 설계되어 있습니다. 따라서 서버 스크립트에서 이 함수를 호출하면 **에러가 발생하거나 함수가 실행되지 않습니다.** 상품 구매 창을 출력하려면 반드시 클라이언트 쪽 스크립트(예: `[client only]` 메서드나 클라이언트 이벤트 핸들러)에서 호출해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | HandleResourceUploadEvent 이벤트 핸들러가 실행되는 실행 공간은 어디인가요? [answer] | `HandleResourceUploadEvent` 이벤트 핸들러는 **서버(server only)** 실행 공간에서 실행됩니다. [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] | code [pass] | ⏳ 미판정 [title] | WorldShopProductPages [question] | WorldShopProductPages 컴포넌트의 MoveToNextPageAndWait() 메서드를 사용하여 WorldShopService 검색 결과의 모든 페이지를 순회하며 GetCurrentPageDatas()로 상품을 수집하는 스크립트를 작성해줘. [answer] | WorldShopService 검색 결과의 모든 페이지를 순회하며 상품 정보를 수집하는 스크립트는 아래처럼 작성할 수 있습니다. 1. `_WorldShopService:GetProductsAndWait()`를 호출하여 `WorldShopProductPages` 객체를 얻습니다. 2. `while true` 루프 내에서 `GetCurrentPageDatas()`를 호출해 현재 페이지의 상품 목록을 가져옵니다. 3. 가져온 상품 목록을 순회하며 필요한 정보(예: Id, Name, Price)를 로그로 출력합니다. 4. `IsLastP [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WorldShopService에서 검색한 상품 목록을 페이지 단위로 조회합니다. # Properties - **boolean IsLastPage** 현재 페이지가 검색 결과의 마지막 페이지인지 확인합니다. # Methods - **table<WorldShopProduct> GetCurrentPageDatas()** 검색 결과 중 현재 페이지의 상품 정보 목록을 구합니다. 한 페이지에는 최대 25개의 검색 결과가 포함됩니다. - **void MoveToNextPageAndWait() [Yield]** 검색 결과의 다
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | PromptPurchase와 UserHasPassAndWait 메서드의 실행 공간([ClientOnly]/[Yield]) 및 주요 기능을 단계별 번호 목록으로 나열하세요. [answer] | WorldShopService의 `PromptPurchase`와 `UserHasPassAndWait` 메서드에 대한 정보는 다음과 같습니다. **1. PromptPurchase** * **실행 공간:** `[ClientOnly]` * **주요 기능:** * 상품 구매 창을 출력합니다. * 구매할 수 없는 상품인 경우, 구매 불가 사유를 함께 출력합니다. **2. UserHasPassAndWait** * **실행 공간:** `[Yield]` * **주요 기능:** * 특정 유저가 특정 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | GetProductsAndWait 메서드의 productType과 productStatus 인자별 nil 지정 시 검색 범위를 표로 정리해서 보여주세요. [answer] | `GetProductsAndWait` 메서드의 `productType`과 `productStatus` 인자에 `nil`을 지정할 경우의 검색 범위는 다음과 같습니다. | productType | productStatus | 검색 범위 | | :--- | :--- | :--- | | 특정 종류 | nil | 해당 종류의 상품 중, **검색 가능한 모든 상태**의 상품 | | nil | 특정 상태 | **모든 종류**의 상품 중, 해당 상태의 상품 | | nil | nil | **모든 종류**의 상품 중, **검색 가능한 모든 상태* [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | ConnectEvent(string key, ...)와 ConnectEvent(Type eventType, ...) 두 가지 오버로드의 차이점과 각각 어떤 상황에서 사용하는 것이 권장되는지 알려주세요. [answer] | `ResourceService`의 `ConnectEvent` 메서드는 두 가지 오버로드를 제공하며, 이벤트 연결 시 사용할 매개변수의 형태에 따라 차이를 보입니다. 1. **`ConnectEvent(string key, IScriptFunction eventHandler)`** * **차이점**: 이벤트의 **이름(문자열)**을 매개변수로 전달하여 연결합니다. * **권장 상황**: 이벤트의 타입 정보를 직접 참조하기보다는, 이벤트 이름을 문자열로 알고 있거나 동적으로 이벤트 이름을 구성하여 연결해야 하는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | GetProductsAndWait에서 productType과 productStatus를 모두 nil로 지정하면 어떤 결과가 나와요? [answer] | `GetProductsAndWait` 메서드에서 `productType`과 `productStatus`를 모두 `nil`로 지정하면, **검색 가능한 모든 종류**의 상품과 **검색 가능한 모든 상태**의 상품이 검색됩니다. 구체적으로 월드의 상태에 따라 검색 범위는 다음과 같습니다. 1. **출시된 월드**: `Waiting`, `Ing`, `End` 상태의 모든 종류의 상품이 검색됩니다. 2. **제작 중인 월드**: `Register`, `Waiting`, `Ing`, `End` 상태의 모든 종류의 상품이 검색됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유료 재화를 통한 월드 내 상품 구매 관련 기능을 제공합니다. # Methods - **WorldShopProduct GetProductAndWait(string productId) [Yield]** 상품의 정보를 얻습니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시된 월드에서는 Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있고, 제작 중인 월드에서는 Register, Waiting, Ing, End 상태의 상품의 정보를 얻을 수 있습니다. - **WorldShopProductPages GetProdu
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | self:RecordUploadedResource 메서드 호출 시 self가 가리키는 대상은 무엇이며, 이 메서드가 정의되지 않았을 때 발생하는 에러 유형은 어떤 것인가요? [answer] | `self`는 해당 스크립트가 부착된 **스크립트 컴포넌트 자체**를 가리킵니다. 즉, `HandleResourceUploadEvent` 이벤트 핸들러가 속한 스크립트 인스턴스를 의미하며, `self:RecordUploadedResource(RUID, UserId)`는 해당 스크립트 내부에서 정의된 `RecordUploadedResource` 메서드를 호출하는 것입니다. `RecordUploadedResource` 메서드가 스크립트 내에 정의되지 않은 상태에서 호출되면, **nil 값을 함수로 호출할 수 없다**는 런타임 에러(예 [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