[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | ResourceService:ClearCaches 를 사용하여 로비 맵으로 이동하기 전에 캐싱된 모든 리소스를 해제하는 스크립트를 작성해줘 [answer] | `_ResourceService:ClearCaches()`는 캐시된 모든 리소스를 캐시에서 해제하는 메서드입니다. 로비 맵으로 이동하기 전에 이 메서드를 호출하여 메모리를 정리할 수 있습니다. 참고로, 맵 이동 시 `_ResourceService:UnloadUnusedResources(0)`는 내부적으로 자동 호출되므로 별도로 호출할 필요가 없습니다. 아래는 로비 맵으로 이동하기 전에 캐시를 비우는 스크립트 예시입니다. ```lua Method: [client only] void BeforeMoveLobbyMap() { -- [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] | code [pass] | ⏳ 미판정 [title] | UserDataSet [question] | 사용자 데이터 테이블의 특정 열 값으로 행을 검색하여 해당 행의 다른 열 데이터를 로그에 출력하는 스크립트를 작성해줘 [answer] | 사용자 데이터 테이블에서 특정 열의 값으로 행을 찾은 후, 해당 행의 다른 열 데이터를 로그에 출력하는 스크립트는 `FindRow` 메서드를 활용하여 작성할 수 있습니다. `FindRow(columnName, value)` 메서드는 지정한 열(`columnName`)의 값이 `value`와 일치하는 행(`UserDataRow`)을 반환하며, 해당 행이 없으면 `nil`을 반환합니다. 반환된 행 객체를 통해 다른 열의 값을 읽기 위해 `GetCell` 메서드(행 인덱스 대신 행 객체와 열 이름/인덱스를 사용하는 형태가 아니라, 문서 [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] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | SetSpriteUploadValidationCallback 함수를 사용하는데, 검증 로직에서 true를 반환해도 스프라이트가 업로드되지 않는 현상이 발생하는데 원인이 무엇일까요? [answer] | 제공된 참고 문서에는 `SetSpriteUploadValidationCallback` 함수의 실제 구현 코드나 동작 원리가 포함되어 있지 않습니다. 문서의 예제 섹션 제목에는 `SetSpriteUploadValidationCallback`이 언급되어 있지만, 해당 함수를 호출하거나 정의하는 실제 mLua 코드 블록은 제공되지 않았습니다. 따라서 제공된 문서 정보만으로는 `SetSpriteUploadValidationCallback`에서 `true`를 반환해도 업로드가 실패하는 원인을 설명하거나 해결 코드를 작성할 수 없습니다. 해 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | ResourceService의 ConnectEvent와 DisconnectEvent 메서드를 사용해 OnBeginPlay에서 이벤트를 연결하고, OnEndPlay에서 연결을 해제하는 생명주기 관리 스크립트를 작성해줘 [answer] | ResourceService의 `ConnectEvent`와 `DisconnectEvent` 메서드를 사용하여 이벤트 연결 상태를 관리하는 스크립트는 다음과 같습니다. `ConnectEvent`의 반환값인 `EventHandlerBase` 타입 변수를 프로퍼티로 선언하여, `OnEndPlay`에서 해당 핸들러를 해제할 때 참조할 수 있도록 해야 합니다. ```lua Property: [None] EventHandlerBase MyEventHandler = nil Method: [server only] void OnBeginPla [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] | ResourceService의 PreloadAsync 함수에서 리소스 ID 목록을 배열로 전달할 때, 특정 리소스가 로드되지 않으면 콜백이 실행되지 않나요? [answer] | 제공된 참고 문서에는 `PreloadAsync` 함수의 성공 처리 방식(로딩 완료 시 콜백 실행)만 설명되어 있으며, **특정 리소스가 로드 실패했을 때의 동작(콜백이 실행되지 않는지, 에러 처리가 되는지)에 대한 정보는 없습니다.** 따라서 문서 근거로 "로드 실패 시 콜백이 실행되지 않는다"고 단정할 수 없습니다. 문서에 명시된 내용은 다음과 같습니다. 1. `PreloadAsync`는 리소스 목록 로드를 시작합니다. 2. **로드가 완료되면** 전달된 콜백이 실행됩니다. 로드 실패 시나리오에 대한 구체적인 API 동작(에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | PreloadAsync의 콜백 함수 안에서 추가로 다른 리소스를 로드하는 작업을 수행해도 되는지, 아니면 반드시 단일 로딩 절차로 마무리해야 하는지 알고 싶습니다. [answer] | 제공된 참고 문서에는 `PreloadAsync` 콜백 함수 내부에서 다른 리소스를 추가로 로드하는 작업(네스티드/연속 호출)에 대한 명시적인 허용 또는 금지 지침이 포함되어 있지 않습니다. 문서에는 단순히 리소스 목록 로드가 완료되었을 때 특정 함수를 호출하는 예제만 제시되어 있으며, 콜백 내부에서 `_ResourceService:PreloadAsync` 를 재귀적으로 또는 연속적으로 호출하는 동작의 유효성이나 권장 사양에 대한 정보는 없습니다. 따라서 문서 기반의 답변으로는 이것이 허용되는지 여부를 단정할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 이벤트 핸들러 함수의 매개 변수로 event 객체를 전달받는데, 이 event 객체에서 어떤 속성이나 메서드에 접근할 수 있는지 구체적인 예시가 있을까요? [answer] | 제공된 참고 문서에는 `ResourceService`의 `ConnectEvent`, `DisconnectEvent`, `SendEvent` 메서드 시그니처만 설명되어 있을 뿐, **구체적인 이벤트 객체(예: `UserEnterEvent`)가 가진 속성(Property)이나 메서드(Method) 목록이 명시되어 있지 않습니다.** 문서 내 실제 mLua 예제 코드 블록에서는 `UserService`를 통해 `UserEnterEvent`, `UserLeaveEvent`, `UserDisconnectEvent` 이벤트 핸들러가 작성된 [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] | ResourceService의 ConnectEvent에서 key 인자로 문자열을 전달할 때, 이벤트 이름이 아닌 클래스 이름이나 다른 문자열을 넣으면 핸들러가 호출되지 않는 원인은 무엇인가요? [answer] | ResourceService의 `ConnectEvent(string key, IScriptFunction eventHandler)` 메서드에서 `key` 인자는 연결하려는 **이벤트의 이름**을 정확히 지정해야 합니다. 문서에서 정의된 동작은 "이 서비스에서 **타입의 이름이 key인** 이벤트가 발생하면" 핸들러가 통지받는 것입니다. 여기서 `key`는 해당 이벤트 클래스의 이름(또는 이벤트 식별자)과 정확히 일치해야 합니다. 만약 이벤트 이름이 아닌 다른 클래스 이름이나 임의의 문자열을 `key`로 전달하면, Resource [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] | 클라이언트에서 생성한 리소스가 업로드되어 ResourceUploadEvent가 발생했을 때, 서버 측 스크립트에서 해당 이벤트를 직접 수신하여 처리할 수 있는지 궁금합니다. [answer] | 네, 가능합니다. `ResourceUploadEvent`는 리소스가 업로드된 월드의 **모든 서버**에서 발생하는 이벤트입니다. 따라서 클라이언트에서 생성된 리소스가 업로드되면, 서버 측 스크립트에서도 해당 이벤트를 수신하여 처리할 수 있습니다. 이벤트 핸들러를 서버 스크립트에 추가하여 처리하는 예제는 다음과 같습니다. ```lua Event Handler: [service: ResourceService] HandleResourceUploadEvent(ResourceUploadEvent event) { -- 이벤트 수신 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 스프레이트 업로드 성공 후 OnScreenshotUploaded 콜백에서 전달되는 ruid 값을 실제 화면에 스프라이트로 표시하기 위해 어떤 컴포넌트의 어떤 프로퍼티에 대입해야 합니까? [answer] | 스프레이트 업로드 성공 후 `OnScreenshotUploaded` 콜백에서 전달되는 `ruid` 값을 화면에 표시하려면 `SpriteRendererComponent`의 `SpriteRUID` 프로퍼티에 대입해야 합니다. ```lua self.Entity.SpriteRendererComponent.SpriteRUID = ruid ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | code [pass] | ⏳ 미판정 [title] | WorldShopProductPages [question] | WorldShopProductPages 컴포넌트의 MoveToNextPageAndWait() Yield 메서드 호출 시 스크립트 실행이 중단되는 것을 고려하여 다음 페이지 이동 후 후속 작업을 수행하는 스크립트를 작성해줘. [answer] | `MoveToNextPageAndWait()`는 `[Yield]` 메서드이므로 호출 시점부터 다음 페이지 조회가 완료될 때까지 스크립트 실행이 일시 중단됩니다. 이 특성을 활용하여 각 페이지의 데이터를 처리한 후, 마지막 페이지가 아니면 다음 페이지로 이동하는 로직을 순차적으로 구성할 수 있습니다. 아래 코드는 `WorldShopService`로 상품 목록을 검색하고, 페이지 단위로 데이터를 조회하며 후속 작업(로그 출력)을 수행하는 예시입니다. ```lua Method: [server only] 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:GetTypeAndWait 를 사용하여 주어진 리소스 ID의 타입을 확인하고 로그에 출력하는 스크립트를 작성해줘 [answer] | `_ResourceService:GetTypeAndWait(resourceId)` 메서드를 사용하면 특정 리소스 ID에 해당하는 타입을 비동기적으로 가져올 수 있습니다. 이 메서드는 리소스가 로드될 때까지 기다렸다가 타입을 반환하므로, `OnBeginPlay()` 같은 초기화 단계에서 호출하여 리소스의 종류(예: sprite, animationclip 등)를 확인하고 로그에 출력하는 데 사용할 수 있습니다. 아래는 주어진 리소스 ID 두 개에 대해 타입을 확인하고 로그에 출력하는 스크립트 예시입니다. ```lua Method: [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] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 리소스 업로드 성공 시 발생하는 ResourceUploadEvent가 '월드 플레이 중 생성된' 리소스에 대해서만 발생하는 건가요? 에디터에서 미리 등록해둔 정적 리소스도 이 이벤트를 통해 감지할 수 있나요? [answer] | 아니요, 에디터에서 미리 등록해둔 정적 리소스는 `ResourceUploadEvent`를 통해 감지할 수 없습니다. `ResourceUploadEvent`는 명시적으로 **"월드 플레이 중 생성된 리소스"**가 업로드에 성공했을 때만 발생하는 이벤트입니다. 따라서 런타임(플레이 중)에 동적으로 생성되고 업로드되는 리소스만 이 이벤트의 대상이 되며, 에디터 단계에서 미리 준비된 정적 리소스는 해당 이벤트가 발생하지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | UserService:GetUserEntityByUserId 메서드 호출 후 반환된 userEntity 값이 유효하지 않을 경우 발생하는 오류는 무엇이며, 이를 방지하기 위해 어떤 로직을 추가해야 하나요? [answer] | 참고 문서에 `UserService:GetUserEntityByUserId` 메서드가 반환한 값이 유효하지 않을 경우 발생하는 구체적인 오류 유형(예외 메시지, 에러 코드 등)에 대한 설명은 포함되어 있지 않습니다. 다만, 문서의 예제 코드에서 유효성 검사를 수행하는 로직은 `_EntityService:IsValid(userEntity)` 함수를 사용하는 것입니다. 이 함수를 통해 유효한 엔티티인지 확인한 후, 유효할 경우에만 후속 로직(예: `self:RecordUploadedResource(RUID, UserId)` 호출)을 [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] | two_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 클라이언트에서 CaptureFullScreenAsPixelDataAndWait 로 스크린샷을 찍은 후 RequestSpriteUploadAsync 로 업로드할 때, 오류 처리와 RUID 를 SpriteRendererComponent 에 적용하는 코드를 작성해 주세요. [answer] | 클라이언트에서 스크린샷을 촬영하고 업로드한 후 오류를 처리하며, 성공 시 RUID를 `SpriteRendererComponent`에 적용하는 코드는 다음과 같습니다. ```lua [client only] void CaptureScreenshotAndUpload() { -- 스크린샷을 찍어 데이터화합니다. local screenshotError, pixelData = _ScreenshotService:CaptureFullScreenAsPixelDataAndWait() -- 스크린샷을 찍는 과정에서 오류가 발생했는지 확인합니 [followup] | ResourceUploadEvent 가 모든 서버에서 발생한다는 점을 고려하여, 특정 서버에서만 중복 기록을 방지하기 위해 UserId 접속 여부를 확인하는 로직을 어떻게 구현해야 하나요? [followup_answer] | 참고 문서에 따르면, `ResourceUploadEvent`는 리소스가 업로드된 월드의 **모든 서버**에서 발생합니다. 따라서 특정 서버에서만 중복 기록을 방지하려면, 이벤트 핸들러 내에서 해당 `UserId`의 유저가 **현재 이 서버에 접속해 있는지**를 확인하는 로직을 포함해야 합니다. 다만, 참고 문서에는 `ResourceUploadEvent`의 구체적인 파라미터 구조(예: `event.UserId`, `event.RUID` 등)나 "유저가 특정 서버에 접속해 있는지 확인하는" 구체적인 API(예: `_UserServic [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | RequestSpriteUploadAsync 호출 시 전달되는 pixelData 변수의 타입은 무엇이며, ScreenshotService에서 어떤 메서드를 호출하여 이 데이터를 얻어올 수 있나요? [answer] | `RequestSpriteUploadAsync` 호출 시 전달되는 `pixelData` 변수의 타입은 문서에 명시된 구체적인 타입 이름(예: `PixelData` 등)이 제공되지 않습니다. 문서에서는 해당 변수를 `pixelData`라고 명명하고 있지만, `ScreenshotService`에서 반환되는 값의 정확한 타입 선언은 찾아볼 수 없습니다. 이 데이터를 얻어올 수 있는 `ScreenshotService`의 메서드는 `CaptureFullScreenAsPixelDataAndWait`입니다. ```lua local scree [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | 상품 지급 함수를 서버에서 등록해야 하는 이유와 권장 작성 위치(Logic)를 3문장 이내로 요약하세요. [answer] | 상품 지급은 서버에서 처리되므로 해당 콜백 등록 역시 반드시 서버에서 수행해야 합니다. 월드 생성 시점에 등록되어 지속적으로 유지되어야 하므로 Logic으로 작성하는 것이 권장됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 구매가 발생했을 때 상품 지급을 실행할 함수와 이 함수를 `WorldShopService`에 등록하는 예제입니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 Logic으로 작성하는 것을 권장합니다. 상품 지급은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPur
[task] | instruction_following [pass] | ⏳ 미판정 [title] | WorldShopService [question] | `ProcessPurchase` 함수에서 로그에 출력하는 `purchaseInfo`의 필드 이름 4가지를 번호 붙인 목록으로 나열하세요. [answer] | `ProcessPurchase` 함수의 로그 출력 코드를 확인하면 `purchaseInfo` 객체에서 접근하는 필드 이름 4가지는 다음과 같습니다. 1. `PurchaseId` 2. `UserId` 3. `ProductId` 4. `OrderNumber` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 구매가 발생했을 때 상품 지급을 실행할 함수와 이 함수를 `WorldShopService`에 등록하는 예제입니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 Logic으로 작성하는 것을 권장합니다. 상품 지급은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPur
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | 상품 지급 함수가 서버에서 실행되어야 하는 이유와, 이에 따라 함수 등록 시 지정해야 하는 실행 공간은 무엇인가요? [answer] | 상품 지급은 서버에서 처리되는 과정이므로, 상품 지급 함수 역시 서버에서 실행되어야 합니다. 따라서 해당 함수를 `WorldShopService`에 등록할 때 지정해야 하는 실행 공간은 `[server only]`입니다. ```lua Method: [server only] void OnBeginPlay() { _WorldShopService:SetProcessPurchaseCallback(self.ProcessPurchase) } [server only] boolean ProcessPurchase(any purchaseI [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 구매가 발생했을 때 상품 지급을 실행할 함수와 이 함수를 `WorldShopService`에 등록하는 예제입니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 Logic으로 작성하는 것을 권장합니다. 상품 지급은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPur
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | ResourceUploadEvent가 트리거되는 시점이 언제이며, 이 이벤트가 발생하는 서버 범위에 대해 주의해야 할 점은 무엇입니까? [answer] | 리소스 업로드가 성공했을 때 `ResourceService`에서 `ResourceUploadEvent`가 트리거됩니다. 이 이벤트가 발생하는 서버 범위에 대해 주의해야 할 점은, **리소스가 업로드된 월드의 모든 서버에서 이벤트가 발생한다**는 것입니다. 특정 서버 한 곳에서만 발생하는 것이 아니라 해당 월드에 연결된 모든 서버에서 이벤트가 발화되므로, 서버별로 중복 처리가 일어나지 않도록 로직을 설계해야 합니다. 예를 들어, 이벤트 핸들러에서 리소스의 RUID와 업로드한 유저의 ID를 기록하는 작업을 수행한다면, `UserId [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | 리소스 업로드 성공 이벤트 처리 시 _EntityService:IsValid 체크가 생략되면 어떤 문제가 발생할 수 있나요? [answer] | 리소스 업로드 성공 이벤트(`HandleResourceUploadEvent`) 처리 시 `_EntityService:IsValid(userEntity)` 체크를 생략하면, 해당 `UserId`에 대한 엔티티가 서버에 존재하지 않거나 유효하지 않은 상태(예: 유저가 이미 탈퇴한 경우, 네트워크 지연으로 엔티티가 생성되지 않은 경우 등)에서 예외가 발생하거나 스크립트가 비정상적으로 동작할 수 있습니다. `_UserService:GetUserEntityByUserId(UserId)`는 유저가 현재 접속 중이지 않거나 엔티티가 초기화되지 [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] | ResourceService [question] | ResourceService의 SendEvent 메서드를 사용해 특정 타입의 이벤트를 발생시키고, ConnectEvent 메서드로 해당 이벤트를 수신하여 상태 값을 변경하는 스크립트를 작성해줘 [answer] | ResourceService를 사용하여 이벤트를 발생시키고 수신하여 상태 값을 변경하는 스크립트는 다음과 같이 작성할 수 있습니다. 1. **이벤트 정의**: `SendEvent`와 `ConnectEvent`에 사용할 이벤트 타입(예: `MyCustomEvent`)이 필요합니다. 참고 문서에는 구체적인 커스텀 이벤트 클래스 정의 방법이 명시되어 있지 않으므로, 실제 개발 환경에서 해당 이벤트 타입이 존재한다고 가정하고 작성합니다. 2. **이벤트 연결**: `ConnectEvent` 메서드는 `string key` 또는 `Type [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] | 구매 처리 함수에서 purchaseInfo를 통해 어떤 항목들을 로그로 출력할 수 있나요? [answer] | `purchaseInfo` 객체를 통해 구매 처리 시 로그로 출력할 수 있는 항목은 다음 4가지입니다. 1. `PurchaseId`: 구매 고유 식별자 2. `UserId`: 구매한 사용자의 ID 3. `ProductId`: 구매한 상품 ID 4. `OrderNumber`: 주문 번호 (문자열 변환이 필요하므로 `tostring()`을 사용하여 출력) 이 항목들을 로그에 출력하는 예제代码如下입니다. ```lua Method: [server only] boolean ProcessPurchase (any purchaseInfo) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 구매가 발생했을 때 상품 지급을 실행할 함수와 이 함수를 `WorldShopService`에 등록하는 예제입니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 Logic으로 작성하는 것을 권장합니다. 상품 지급은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPur
[task] | single_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | SetSpriteUploadValidationCallback 함수를 Logic 스크립트에 등록해야 하는 이유는 무엇이며, 클라이언트에 등록하면 어떤 문제가 발생합니까? [answer] | `SetSpriteUploadValidationCallback` 함수를 Logic 스크립트(서버)에 등록해야 하는 이유는 스프라이트 업로드의 허용 여부를 판단하는 과정이 **서버에서 진행**되기 때문입니다. 클라이언트에 이 함수를 등록하면 다음과 같은 문제가 발생합니다: 1. **업로드 허용 판단 실패:** 업로드 검증 로직이 서버에서 수행되므로, 클라이언트에서 콜백을 등록해도 서버가 이를 인식하지 못하거나 검증 처리가 이루어지지 않을 수 있습니다. 2. **월드 생성 시점의 등록 필요성:** 업로드 허용 결정 함수는 월드가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | _ResourceService 의 ResourceUploadEvent 이벤트 핸들러를 구현하여 리소스 업로드 성공 시 log() 함수로 성공 메시지를 출력하는 [service: ResourceService] 스크립트를 작성해줘 [answer] | `ResourceService`의 `ResourceUploadEvent`는 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 발생하며, 리소스가 업로드된 월드의 모든 서버에서 발생합니다. 해당 이벤트를 수신하기 위해 `[service: ResourceService]` 속성을 붙인 이벤트 핸들러를 정의하고, 이벤트 인수로 전달되는 `ResourceUploadEvent` 객체를 받아 `log()`로 성공 메시지를 출력하면 됩니다. ```lua Event Handler: [service: ResourceService] HandleRe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Events - **ResourceUploadEvent** 월드 플레이 중 생성된 리소스 업로드에 성공했을 때 ResourceService에서 발생하는 이벤트입니다. 이 이벤트는 리소스가 업로드된 월드의 모든 서버에서 발생합니다. # Examples #### PreloadAsync `PreloadAsync()` 함수를 이용하여 리소스 목록을 로드하고, 리소스 로드 중에는 로딩 화면을 보여주는 예제입니다. `ShowLoadingScreen()`,`HideLoadingScreen()` 함수 정의는 생략되었습니다. ```
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | WorldShopService에서 상품 지급 콜백을 등록할 때 반드시 Logic으로 작성해야 하는 구체적인 이유는 무엇인가요? [answer] | 상품 지급 콜백을 Logic으로 작성해야 하는 구체적인 이유는 **월드 생성 시점에 함수가 등록되어 월드가 존재하는 동안 지속적으로 유지되어야 하기 때문**입니다. WorldShopService를 통해 상품 지급이 발생하면 서버에서 해당 콜백 함수가 호출되므로, 이 함수가 언제든 실행될 수 있도록 스크립트 컴포넌트가 월드에 안정적으로 로드되어 있어야 합니다. Logic으로 작성하면 이러한 생명주기 요구사항을 충족할 수 있습니다. 아래는 이를 따르는 mLua 코드 예시입니다. ```lua Method: [server only] [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 구매가 발생했을 때 상품 지급을 실행할 함수와 이 함수를 `WorldShopService`에 등록하는 예제입니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 Logic으로 작성하는 것을 권장합니다. 상품 지급은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPur
[task] | two_turn [pass] | ⏳ 미판정 [title] | ResourceService [question] | `PreloadAsync` 메서드에서 `completeCallback`이 반환하는 `PreloadResultStatus` 리스트의 순서는 어떻게 보장되며, 실패한 리소스가 있을 경우 어떻게 처리해야 하는가? [answer] | `PreloadAsync` 메서드에서 `completeCallback`이 반환하는 `PreloadResultStatus` 리스트의 순서는 **`ruidList`에 지정한 리소스 RUID와 동일한 순서**로 보장됩니다. 실패한 리소스가 있을 경우를 처리하는 방법은 제공된 문서에 명시되어 있지 않습니다. 문서에는 비동기 작업 완료 시 `completeCallback` 함수가 호출되고 로드 결과를 순서대로 반환한다는 사실만 언급되어 있으며, 개별 리소스의 성공/실패 상태를 확인하거나 에러를 처리하는 구체적인 방법(예: `PreloadR [followup] | `ruidList`에 포함된 RUID 중 일부가 로드 실패할 때 `PreloadResultStatus`에서 에러를 식별하는 구체적인 코드 예제를 작성해 주세요. [followup_answer] | 제공된 문서에는 `PreloadResultStatus`의 내부 구조(필드 이름, 에러 코드 상수, 성공/실패 구분 방법 등)에 대한 정보가 포함되어 있지 않습니다. 따라서 `PreloadResultStatus`에서 에러를 식별하는 구체적인 코드 예제를 작성할 수 없습니다. 문서에는 `PreloadAsync`가 완료 시 `completeCallback`을 통해 `table<PreloadResultStatus>`를 반환한다는 사실과, 그 순서가 `ruidList`와 동일하다는 점만 명시되어 있을 뿐, 개별 항목의 성공/실패 상태를 어 [scores] | [judge_reason] | [source_doc] | 리소스와 관련된 기능을 제공하는 서비스입니다. # Methods - **void ClearCaches()** 불러온 모든 리소스를 캐시에서 제거합니다. 리소스를 메모리에서 해제하려면 ClearCaches() 함수로 캐시를 먼저 제거한 후 UnloadUnusedResources() 함수를 사용합니다. - **ResourceType GetTypeAndWait(string RUID) [Yield]** RUID의 리소스 타입을 반환합니다. - **AnimationClip LoadAnimationClipAndWait(string
[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | _WorldShopService:SetProcessPurchaseCallback 메서드에 전달하는 인자의 형태와, 이 함수가 반환해야 하는 값의 타입은 어떻게 되나요? [answer] | `_WorldShopService:SetProcessPurchaseCallback` 메서드에 전달하는 인자는 상품 지급을 처리하는 함수(콜백)입니다. 이 함수는 `purchaseInfo`라는 이름의 `any` 타입 인자를 하나 받습니다. `purchaseInfo`에는 다음과 같은 속성들이 포함되어 있습니다: - `PurchaseId` - `UserId` - `ProductId` - `OrderNumber` 상품 지급 함수는 `boolean` 타입의 값을 반환해야 합니다. 처리가 성공적으로 완료되면 `true`를, 실패하거나 유효 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 구매가 발생했을 때 상품 지급을 실행할 함수와 이 함수를 `WorldShopService`에 등록하는 예제입니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 Logic으로 작성하는 것을 권장합니다. 상품 지급은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPur
[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | ResourceService:RemoveCaches 와 ResourceService:PreloadAsync 를 사용하여 이전 스킬 리소스를 해제하고 새로운 스킬 리소스를 비동기 로딩하는 스크립트를 작성해줘 [answer] | `_ResourceService:RemoveCaches`와 `_ResourceService:PreloadAsync`를 사용하여 이전 스킬 리소스를 해제하고 새 스킬 리소스를 비동기 로딩하는 스크립트입니다. ```lua Property: [None] string currentId = "" [None] table currentRuids = nil Method: [client only] void UpgradeSkill(string id) { -- 이전 스킬에서 사용하던 리소스들을 캐시에서 해제합니다. local oldRuids = [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] | two_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | _WorldShopService에서 SetProcessPurchaseCallback을 사용하여 상품 지급 콜백을 등록하는 기본 구조와 핵심 파라미터는 무엇인가요? [answer] | `_WorldShopService:SetProcessPurchaseCallback`은 구매가 발생했을 때 상품 지급을 처리하는 함수(콜백)를 월드에 등록하는 API입니다. 상품 지급은 서버에서 처리되므로, 해당 콜백 함수와 등록 로직 모두 `[server only]` 실행 공간에서 작성되어야 합니다. 기본 구조와 핵심 파라미터는 다음과 같습니다. 1. **콜백 함수 등록 시점**: 월드가 생성될 때 콜백이 등록되고 유지되어야 하므로, `OnBeginPlay()` 메서드 안에서 `SetProcessPurchaseCallback`을 [followup] | purchaseInfo 객체에 포함된 PurchaseId, UserId, ProductId, OrderNumber 각각의 데이터 타입은 어떻게 확인하며, 실제 지급 로직에서 이 값들을 어떻게 활용해야 하나요? [followup_answer] | 참고 문서에 `purchaseInfo` 객체 내 `PurchaseId`, `UserId`, `ProductId`, `OrderNumber` 필드의 정확한 데이터 타입 선언이 포함되어 있지 않아서, 문서 기준으로 각 필드의 정적 타입을 확정하여 말씀드리기는 어렵습니다. 다만 문서의 예제 코드에서 확인되는 사용 방식과 활용 방법은 다음과 같습니다. 1. **데이터 타입 확인 및 처리 방식** - 문서 예제에서는 `OrderNumber`의 타입이 숫자인지 문자열인지 확실하지 않아서 로그 출력 시 `tostring(purchase [scores] | [judge_reason] | [source_doc] | 구매가 발생했을 때 상품 지급을 실행할 함수와 이 함수를 `WorldShopService`에 등록하는 예제입니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 Logic으로 작성하는 것을 권장합니다. 상품 지급은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. ```lua Method: [server only] void OnBeginPlay () { -- 상품 지급 콜백을 등록합니다. _WorldShopService:SetProcessPurchaseCallback(self.ProcessPur