← 목록

mLua · Nemotron SDG 질문-응답 (SFT)

총 21,567개 · 페이지 234/719
🔀 랜덤
불러오는 중…

[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | _LogStorageService:LogPurchaseInfo를 통해 구매 기록을 남기는 것이 필수적인가요? 기록을 남기지 않고 true만 반환할 경우에도 구매 처리가 정상적으로 완료되나요? [answer] | 제공된 참고 문서에 `_LogStorageService:LogPurchaseInfo`의 사용 여부가 구매 처리 완료의 필수 조건인지 여부에 대한 명시적인 설명은 포함되어 있지 않습니다. 문서에는 상품 지급이 정상적으로 진행되어 구매를 완료시키려면 `true`를 리턴해야 한다고만 설명하고 있으며, 예제 코드에서 `true`를 반환하기 직전에 `_LogStorageService:LogPurchaseInfo(purchaseInfo, "Success")`를 호출하는 모습을 보여줄 뿐, 이 로그 기록이 구매 완료 판정에 필수적인지 여부는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 상품 지급 함수는 `WorldShopPurchaseInfo`를 매개 변수로 받고 boolean을 반환해야 합니다. `WorldShopPurchaseInfo`에는 구매한 유저, 구매한 상품과 같은 처리할 구매의 정보가 들어있습니다. 이를 이용해 상품을 지급하거나 지급하지 않을지 여부를 결정합니다. 상품 지급이 정상적으로 진행되어 구매를 완료시키려면 true를 리턴합니다. 만약 상품을 지급할 수 없다고 판단되어 정상적인 구매 과정을 수행할 수 없다면 false를 리턴합니다. false를 리턴한 구매의 경우, 구매를 수행한 유저가 다음에

[task] | two_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | WorldShopService를 사용해 유저가 상품을 구매하도록 유도하는 기본적인 흐름은 어떻게 구성하나요? [answer] | WorldShopService를 사용하여 유저가 상품을 구매하도록 유도하는 기본적인 흐름은 클라이언트와 서버가 각각 다른 역할을 담당하는 방식으로 구성됩니다. **1. 서버: 구매 처리 콜백 등록 (OnBeginPlay)** 서버 스크립트에서는 월드가 시작될 때(`OnBeginPlay`) 상품 구매가 발생했을 때 상품을 실제로 지급하는 로직을 처리하는 콜백을 등록해야 합니다. `_WorldShopService:SetProcessPurchaseCallback`을 사용하여 이 콜백을 설정합니다. 이 콜백은 `WorldShopPurch [followup] | SetProcessPurchaseCallback에서 true를 반환하지 않으면 재입장 시 다시 실행되는 동작이 실제 코드에서 어떻게 구현되는지 예시를 보여주세요. [followup_answer] | `SetProcessPurchaseCallback`에서 `true`를 반환하지 않으면(즉, `false`를 반환하거나 아무것도 반환하지 않으면) 해당 구매 건은 "처리 완료"로 간주되지 않습니다. 이 경우, 구매한 유저가 월드를 나갔다 다시 입장할 때 서버가 이전에 처리되지 않은 구매 기록을 감지하여 동일한 `WorldShopPurchaseInfo` 인자를 전달받아 콜백을 **다시 실행**합니다. 개발자가 직접 재입장 시 재실행되는 로직을 별도로 구현할 필요는 없습니다. 이는 `WorldShopService`가 내부적으로 처리하는 [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] | DefaultUserEnterLeaveLogic [question] | 이 문서에 등장하는 모든 메서드 시그니처를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void OnBeginPlay() { -- (참고: 본 메서드는 문서의 'Methods' 섹션에 명시된 DefaultUserEnterLeaveLogic 자체의 메서드가 아닙니다. -- 문서에 명시된 메서드는 모두 'inherited from Logic' 이며, 아래 주석에 시그니처만 나열합니다.) } -- inherited from Logic: -- EventHandlerBase ConnectEvent(string key, IScriptFunction eventHa [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 입장과 퇴장에 관련된 기능을 제공합니다. # Properties - **string PlayerUri** 플레이어 엔티티를 생성할 때 사용할 Model의 Id입니다. 모델 콘텍스트 메뉴의 Copy Model ID를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. - **string StartPoint** 시작 맵의 이름입니다. 맵 콘텍스트 메뉴의 Copy Entry Path를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. # Methods ##### inherited f

[task] | instruction_following [pass] | ⏳ 미판정 [title] | ComponentRef [question] | ComponentRef가 Component 타입과 같은 사용법을 가진다는 점을 3문장 이내로 요약해 주세요. [answer] | ComponentRef는 컴포넌트의 Id를 저장해 두고 실제 접근 시점에 해당 컴포넌트를 찾도록 설계된 참조 타입입니다. 이 때문에 사용법은 Component 타입과 완전히 동일하게 적용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 컴포넌트를 참조합니다. 컴포넌트의 Id를 갖고 있다가 실제로 접근이 필요할 때 컴포넌트를 찾습니다. 사용법은 Component 타입과 똑같습니다. # Properties - **string EntityId [ReadOnly]** 참조하고 있는 Component를 가진 Entity의 Id입니다. - **string TypeName [ReadOnly]** 참조하고 있는 Component의 타입명입니다. # Constructors - **ComponentRef(Component component)** 지정한 compon

[task] | instruction_following [pass] | ⏳ 미판정 [title] | ComponentRef [question] | ComponentRef의 EntityId와 TypeName 프로퍼티의 용도를 단계별 번호 목록으로 나열해 주세요. [answer] | ComponentRef의 `EntityId`와 `TypeName` 프로퍼티의 용도는 다음과 같습니다. 1. **EntityId**: 참조하고 있는 Component를 가진 Entity의 Id를 보관합니다. 2. **TypeName**: 참조하고 있는 Component의 타입명을 보관합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 컴포넌트를 참조합니다. 컴포넌트의 Id를 갖고 있다가 실제로 접근이 필요할 때 컴포넌트를 찾습니다. 사용법은 Component 타입과 똑같습니다. # Properties - **string EntityId [ReadOnly]** 참조하고 있는 Component를 가진 Entity의 Id입니다. - **string TypeName [ReadOnly]** 참조하고 있는 Component의 타입명입니다. # Constructors - **ComponentRef(Component component)** 지정한 compon

[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | GiveCoin1000과 WalletComponent의 AddCoin 메서드를 직접 호출하는 방식의 차이점은 무엇인가요? [answer] | 제공된 참고 문서에는 `GiveCoin1000` 함수의 구현 코드만 포함되어 있으며, `WalletComponent`의 `AddCoin` 메서드 자체의 정의, 동작 방식, 또는 `GiveCoin1000`과의 공식적인 차이점에 대한 설명이 없습니다. 문서에 명시된 `GiveCoin1000` 함수의 코드를 분석하면, 이 함수는 단순히 `userEntity.WalletComponent`를 가져와 `AddCoin(1000)`을 호출하고, 컴포넌트가 존재하지 않으면 `false`, 존재하면 `true`를 반환하는 **유틸리티 함수(Wrap [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [server only] boolean GiveCoin1000 (EntityRef userEntity) { local walletComponent = userEntity.WalletComponent if walletComponent == nil then return false end -- 유저에게 1000 코인 지급 walletComponent:AddCoin(1000) -- 상품 지급 성공 return true } ```

[task] | instruction_following [pass] | ⏳ 미판정 [title] | MODTweenLogic [question] | MODTweenLogic이 비추천되는 이유와 공식적으로 권장하는 4가지 대안 컴포넌트/로직 이름을 정확히 3문장 이내로 요약하세요. [answer] | MODTweenLogic은 더 이상 사용되지 않는 비추천 로직입니다. 대신 용도에 맞게 TweenLogic, TweenLineComponent, TweenFloatingComponent, TweenCircularComponent를 사용해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 더는 사용하지 않는 Logic입니다. 용도에 맞게 TweenLogic, TweenLineComponent, TweenFloatingComponent, TweenCircularComponent를 사용하세요. # Methods - **float Ease(EaseType type, float from, float totalDelta, float time, float duration) [Deprecated] [Static]** 더는 사용하지 않는 함수입니다. TweenLogic의 Ease(float, float, float, Eas

[task] | code [pass] | ⏳ 미판정 [title] | WorldShopService [question] | _WorldShopService의 SetProcessPurchaseCallback 메서드를 사용하여 상품 구매 시 서버에서 상품 지급 로직을 실행하는 스크립트를 작성해줘 [answer] | `_WorldShopService:SetProcessPurchaseCallback` 메서드를 사용하여 상품 구매 시 서버에서 상품 지급 로직을 실행하는 스크립트는 다음과 같습니다. 상품 지급 함수는 월드가 생성될 때 등록되고 계속 유지되어야 하므로 `OnBeginPlay`에서 등록하며, 상품 지급 처리는 서버에서 진행되므로 `[server only]` 속성을 적용합니다. ```lua Method: [server only] void OnBeginPlay() { -- 상품 지급 콜백을 등록합니다. _WorldShopS [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] | WorldShopService에서 GetProductsAndWait를 호출할 때 두 번째 인자로 WorldShopProductStatus.Ing를 지정했는데, 이 상태가 정확히 어떤 의미인지 궁금합니다. [answer] | `WorldShopProductStatus.Ing`는 **판매 중** 상태를 의미합니다. 참고 문서의 예제 주석에서 "판매 상태가 판매 중인 상품을 검색합니다"라고 명시되어 있으며, `WorldShopProductStatus.Ing` 인자를 사용하여 해당 상태의 상품만 필터링하는 용도로 사용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetProductsAndWait `GetProductsAndWait()` 함수를 이용해 조건에 해당하는 상품들을 검색할 수 있습니다. 이 함수가 리턴하는 `WorldShopProductPages` 타입의 객체는 검색된 결과가 많을 경우 결과를 페이지 단위로 나눠 구할 수 있게 해줍니다. ```lua Method: void SearchOnSaleItems () { -- 상품 종류가 아이템이고, 판매 상태가 판매 중인 상품을 검색합니다. local pages = _WorldShopService:GetProductsAn

[task] | single_turn [pass] | ⏳ 미판정 [title] | FaceActionStateChangeEvent [question] | 이벤트가 발생했는데 ActionState 값이 원하는 값과 달라서 디버깅이 안 되는 이유는 무엇일까요? [answer] | `FaceActionStateChangeEvent`에서 `ActionState` 값이 기대와 달라 보이는 가장 흔한 이유는, **이벤트가 "변경된 상태"를 전달하는 것이지, "변경하려는 상태"를 전달하는 것이 아니기 때문**입니다. 이벤트는 실제 상태가 전환된 시점에 발생하며, `ActionState` 프로퍼티에는 **변경 완료된 새로운 상태**가 담깁니다. 따라서 다음 같은 상황에서 디버깅이 어려워질 수 있습니다. 1. **동시성 문제**: 다른 스크립트나 시스템이 동시에 페이스 액션을 변경하고 있을 때, 이벤트가 발생하는 순 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Face Action의 상태가 변경되었을 때 발생하는 이벤트입니다. # Properties - **MapleAvatarFaceActionState ActionState** 변경된 상태입니다. # Constructors - **FaceActionStateChangeEvent()** 기본값으로 FaceActionStateChangeEvent를 초기화합니다.

[task] | code [pass] | ⏳ 미판정 [title] | WorldShopService [question] | _WorldShopService의 SetProcessPurchaseCallback 메서드를 통해 등록되는 상품 지급 콜백 함수가 월드 생성 시점에 한 번만 등록되어 유지되도록 OnBeginPlay 메서드와 [server only] 속성을 함께 사용하는 스크립트를 작성해줘 [answer] | `_WorldShopService:SetProcessPurchaseCallback` 메서드는 월드가 생성될 때 상품 지급 콜백을 등록하고, 이 등록이 유지되도록 하기 위해 `OnBeginPlay` 생명주기 메서드와 `[server only]` 속성을 함께 사용합니다. 상품 지급 처리는 서버에서 수행되므로, 콜백 등록 및 실제 지급 로직 모두 `[server only]` 영역에 작성해야 합니다. 아래는 해당 요구사항을 충족하는 mLua 스크립트 예시입니다. ```lua Method: [server only] void OnBegin [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] | MODTweenLogic [question] | MODTweenLogic의 StartRot 메서드 시그니처와 대체 가능한 TweenLogic 함수 시그니처를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua -- MODTweenLogic.StartRot 시그니처 (Deprecated) -- [Static] [Deprecated] -- Component StartRot(Entity entity, float radius, float speed, boolean lookAtCenter = false, boolean needSync = true) -- 대체 가능한 TweenLogic 함수 시그니처 -- [Static] -- Component RotateTo(Entity entity, float angle, float time, E [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 더는 사용하지 않는 Logic입니다. 용도에 맞게 TweenLogic, TweenLineComponent, TweenFloatingComponent, TweenCircularComponent를 사용하세요. # Methods - **float Ease(EaseType type, float from, float totalDelta, float time, float duration) [Deprecated] [Static]** 더는 사용하지 않는 함수입니다. TweenLogic의 Ease(float, float, float, Eas

[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | 검색된 상품 데이터에서 product.Id, product.Name, product.Price 외에도 활용할 수 있는 필드들이 있는지, 또는 WorldShopProductPages 객체의 구조를 더 자세히 알려줄 수 있나요? [answer] | 제공된 참고 문서에는 `product.Id`, `product.Name`, `product.Price` 필드만 명시되어 있습니다. 문서에는 이 외에 상품 데이터(`product`)에 포함된 다른 필드나 `WorldShopProductPages` 객체의 추가적인 구조적 세부 사항(예: 전체 페이지 수, 현재 페이지 인덱스 등)에 대한 정보가 없습니다. 문서에서 확인할 수 있는 `WorldShopProductPages` 객체의 기능은 다음과 같습니다: 1. `GetCurrentPageDatas()`: 현재 페이지의 상품 데이터 목록을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetProductsAndWait `GetProductsAndWait()` 함수를 이용해 조건에 해당하는 상품들을 검색할 수 있습니다. 이 함수가 리턴하는 `WorldShopProductPages` 타입의 객체는 검색된 결과가 많을 경우 결과를 페이지 단위로 나눠 구할 수 있게 해줍니다. ```lua Method: void SearchOnSaleItems () { -- 상품 종류가 아이템이고, 판매 상태가 판매 중인 상품을 검색합니다. local pages = _WorldShopService:GetProductsAn

[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | 클라이언트에서 스크린샷 캡처 오류(`ScreenshotError.Success`가 아닌 경우)와 업로드 오류(`ResourceUploadError.Success`가 아닌 경우)를 각각 `log_error`로 출력하고 함수를 종료하는 에러 처리 로직이 포함된 스크린샷 업로드 스크립트를 작성해줘. [answer] | 요청하신 에러 처리 로직이 포함된 스크린샷 캡처 및 업로드 스크립트입니다. 1. **클라이언트 (`[client only]`)**: `_ScreenshotService`로 캡처하여 오류가 없음을 확인한 뒤, `_ResourceService`로 업로드 요청을 보냅니다. 2. **업로드 콜백 (`[client only]`)**: 업로드가 완료되면 `_ResourceService`의 콜백으로 전달받은 `ruid`를 `SpriteRendererComponent`에 적용합니다. 3. **서버 (`[server only]`)**: 스프 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(

[task] | single_turn [pass] | ⏳ 미판정 [title] | DefaultUserEnterLeaveLogic [question] | PlayerUri와 StartPoint 값을 변경했는데 게임 내에서는 적용이 안 되는 이유는 무엇인가요? [answer] | `PlayerUri`와 `StartPoint` 프로퍼티는 Server 공간에서만 변경 사항을 적용하도록 설계되어 있습니다. 따라서 클라이언트(C#) 공간에서 값을 수정했거나, Server 공간에서 변경 후 저장하지 않은 경우 게임 내에서 변경된 값이 반영되지 않을 수 있습니다. 이 두 프로퍼티의 값을 수정할 때는 반드시 **Server** 실행 공간(예: `[server only]` 메서드)에서 변경 작업을 수행해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 입장과 퇴장에 관련된 기능을 제공합니다. # Properties - **string PlayerUri** 플레이어 엔티티를 생성할 때 사용할 Model의 Id입니다. 모델 콘텍스트 메뉴의 Copy Model ID를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. - **string StartPoint** 시작 맵의 이름입니다. 맵 콘텍스트 메뉴의 Copy Entry Path를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. # Methods ##### inherited f

[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | 상품 검색 시 아이템 종류(Item)와 다른 상품 종류를 구분하기 위해 WorldShopProductType에서 어떤 값들을 사용할 수 있는지 알고 싶습니다. [answer] | 제공된 문서에는 `WorldShopProductType.Item` 값의 사용 예시만 포함되어 있습니다. 문서에는 `WorldShopProductType` 안에 `Item` 외에 어떤 다른 값들이 존재하는지에 대한 정보가 없습니다. 따라서 해당 열거형(Enum)의 전체 값 목록을 확인하는 것은 불가능합니다. 참고로, 문서에서 보여준 `Item` 값의 사용 방법은 다음과 같습니다. ```lua Method: void SearchOnSaleItems () { -- 상품 종류가 아이템이고, 판매 상태가 판매 중인 상품을 검색합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetProductsAndWait `GetProductsAndWait()` 함수를 이용해 조건에 해당하는 상품들을 검색할 수 있습니다. 이 함수가 리턴하는 `WorldShopProductPages` 타입의 객체는 검색된 결과가 많을 경우 결과를 페이지 단위로 나눠 구할 수 있게 해줍니다. ```lua Method: void SearchOnSaleItems () { -- 상품 종류가 아이템이고, 판매 상태가 판매 중인 상품을 검색합니다. local pages = _WorldShopService:GetProductsAn

[task] | two_turn [pass] | ⏳ 미판정 [title] | MODTweenLogic [question] | MODTweenLogic의 이벤트 연결과 해제 메서드(ConnectEvent, DisconnectEvent)의 차이점을 알고 싶다 [answer] | `MODTweenLogic`의 이벤트 연결(`ConnectEvent`)과 해제(`DisconnectEvent`) 메서드는 다음과 같은 차이점이 있습니다. ### 1. 메서드 역할 차이 * **ConnectEvent**: 특정 이벤트가 발생했을 때 실행될 핸들러 함수(`IScriptFunction`)를 연결합니다. 연결된 이벤트가 발생하면 해당 핸들러가 `event` 매개변수를 전달받아 호출됩니다. * **DisconnectEvent**: 이전에 연결했던 이벤트와 핸들러 간의 연결을 끊습니다. 이 후 해당 이벤트가 발생해도 [followup] | string key와 Type eventType으로 이벤트를 연결할 때 각각 어떤 상황이 유리한지, 그리고 연결된 이벤트를 해제할 때 boolean 반환값을 어떻게 활용해야 하는지 구체적으로 알려줘 [followup_answer] | `MODTweenLogic`의 `ConnectEvent`와 `DisconnectEvent`를 사용할 때 `string key`와 `Type eventType`의 사용 시나리오 및 `boolean` 반환값 활용 방법은 다음과 같습니다. ### 1. string key와 Type eventType의 유리한 상황 참고 문서에 따르면 두 방식 모두 "이벤트가 발생하면 핸들러로 통지받는다"는 동일한 동작을 수행하지만, 이벤트를 식별하는 기준이 다릅니다. * **string key (이름 기반 연결)** * **유리한 상황 [scores] | [judge_reason] | [source_doc] | - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지

[task] | instruction_following [pass] | ⏳ 미판정 [title] | ComponentRef [question] | ComponentRef의 생성자 두 가지 방식의 차이를 표로 정리해서 설명해 주세요. [answer] | ComponentRef는 컴포넌트를 즉시 접근하는 것이 아니라, 참조 정보를 저장해 두고 필요할 때 실제 컴포넌트를 찾도록 하는 역할을 합니다. 생성자는 두 가지 방식으로 제공되며, 각각 다른 입력 값을 요구합니다. | 구분 | 생성자 시그니처 | 입력 값 | 특징 및 사용 예시 | | :--- | :--- | :--- | :--- | | **기존 컴포넌트 인스턴스 기반** | `ComponentRef(Component component)` | `Component` 타입 객체 | 이미 메모리에 로드되어 접근 가능한 **실제 컴포넌 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 컴포넌트를 참조합니다. 컴포넌트의 Id를 갖고 있다가 실제로 접근이 필요할 때 컴포넌트를 찾습니다. 사용법은 Component 타입과 똑같습니다. # Properties - **string EntityId [ReadOnly]** 참조하고 있는 Component를 가진 Entity의 Id입니다. - **string TypeName [ReadOnly]** 참조하고 있는 Component의 타입명입니다. # Constructors - **ComponentRef(Component component)** 지정한 compon

[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | _WorldShopService:SetProcessPurchaseCallback 메서드를 호출할 때, 콜백 함수의 매개변수 타입이 any로 되어 있는데 실제 전달되는 WorldShopPurchaseInfo 객체에 어떤 필드들이 포함되는지 궁금합니다. [answer] | 참고 문서에 근거하여 `_WorldShopService:SetProcessPurchaseCallback` 메서드에 등록한 콜백 함수(`ProcessPurchase`)가 실제로 전달받는 `purchaseInfo` 객체에 포함된 필드를 확인해 드리겠습니다. 문서 내 예제 코드에서 `purchaseInfo` 객체를 통해 직접 접근하고 사용된 필드는 다음과 같습니다. 1. **`UserId`**: 구매한 유저의 ID. * 예: `purchaseInfo.UserId` 2. **`ProductId`**: 구매한 상품의 ID. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 상품 지급 함수는 `WorldShopPurchaseInfo`를 매개 변수로 받고 boolean을 반환해야 합니다. `WorldShopPurchaseInfo`에는 구매한 유저, 구매한 상품과 같은 처리할 구매의 정보가 들어있습니다. 이를 이용해 상품을 지급하거나 지급하지 않을지 여부를 결정합니다. 상품 지급이 정상적으로 진행되어 구매를 완료시키려면 true를 리턴합니다. 만약 상품을 지급할 수 없다고 판단되어 정상적인 구매 과정을 수행할 수 없다면 false를 리턴합니다. false를 리턴한 구매의 경우, 구매를 수행한 유저가 다음에

[task] | single_turn [pass] | ⏳ 미판정 [title] | DefaultUserEnterLeaveLogic [question] | DisconnectEvent 메서드 호출 시 false가 반환되는 경우는 어떤 상황에서 발생하며, 이는 어떤 오류를 의미하나요? [answer] | 제공된 참고 문서에는 `DisconnectEvent` 메서드가 `boolean` 타입을 반환한다는 사실과, "이벤트와 핸들러와의 연결을 끊습니다"라는 기능 설명만 있을 뿐, **`false`가 반환되는 구체적인 조건이나 그 의미를 정의하는 내용이 없습니다.** 따라서 문서에 근거하여 `false` 반환 상황과 오류 의미를 설명할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 입장과 퇴장에 관련된 기능을 제공합니다. # Properties - **string PlayerUri** 플레이어 엔티티를 생성할 때 사용할 Model의 Id입니다. 모델 콘텍스트 메뉴의 Copy Model ID를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. - **string StartPoint** 시작 맵의 이름입니다. 맵 콘텍스트 메뉴의 Copy Entry Path를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. # Methods ##### inherited f

[task] | code [pass] | ⏳ 미판정 [title] | ResourceService [question] | 서버에서 `ResourceUploadEvent` 핸들러를 구현하여 이벤트의 `UserId`가 현재 서버에 접속해 있는지 확인한 뒤, 해당 유저의 `ruid`를 서버 로직의 테이블에 기록하여 중복 저장 방지하는 스크립트를 작성해줘. [answer] | 참고 문서에 `ResourceUploadEvent` 핸들러의 구체적인 이벤트 핸들러 문법(`[service: ...] HandleXxxEvent`)이 명시되어 있지 않습니다. 문서에는 "리소스 업로드에 성공했을 때 `ResourceService`에서 `ResourceUploadEvent`가 발생한다"는 사실과 "이벤트의 `UserId`에 해당하는 유저가 이 서버에 접속해 있는지 확인해 여러 서버에서 중복으로 기록되지 않도록 해야 한다"는 안내만 있을 뿐, `ResourceUploadEvent` 핸들러를 등록하거나 처리하는 정확한 m [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ResourceService`를 이용해 스크린샷을 스프라이트 리소스로 만들어 업로드하는 예제입니다. 유저가 스크린샷을 업로드 했을 때 업로드를 허용하는 함수를 먼저 만들어야 합니다. 업로드 허용 결정 함수는 월드가 생성될 때 등록되고 계속해서 유지되어야 하므로 Logic의 함수로 작성하는 것을 권장합니다. 한 업로드 허용 판단은 서버에서 진행되므로 함수 등록도 서버에서 수행되어야 합니다. 이 예제는 업로드 허가를 받은 유저인지 확인하고 허용 여부를 결정합니다. ```lua [server only] void OnBeginPlay(

[task] | code [pass] | ⏳ 미판정 [title] | AnimationClip [question] | AnimationClip.Frames 리스트의 길이와 AnimationClip.PlayRate 값을 log 함수로 출력하는 스크립트를 작성해줘 [answer] | AnimationClip의 `Frames`는 `ReadOnlyList<Frame>` 타입이므로, 리스트의 길이를 구하기 위해 `.Count` 속성을 사용하고 `PlayRate` 속성 값을 직접 참조하여 `log` 함수로 출력합니다. 참고 문서에 `AnimationClip` 리소스를 직접 로드하거나 생성하는 서비스 API(예: `_ResourceService:Load` 등)가 명시되어 있지 않으므로, 이미 `AnimationClip` 객체를 가지고 있다고 가정하고 해당 객체의 프로퍼티를 출력하는 코드를 작성합니다. 실제 사용 시에는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | MSW의 애니메이션 출력을 위한 메타 정보와 Sprite를 포함하고 있는 클래스입니다. # Properties - **ReadOnlyList<Frame> Frames [ReadOnly]** 각 프레임을 담고 있는 리스트입니다. - **float PlayRate [ReadOnly]** 재생 속도입니다. 1일 경우 1배속입니다. ##### inherited from ResourceObject: - **boolean IsLoadComplete [ReadOnly]** 리소스가 정상적으로 로드가 완료됐는지를 확인하는 플래그

[task] | single_turn [pass] | ⏳ 미판정 [title] | DefaultUserEnterLeaveLogic [question] | ConnectEvent 메서드의 key 매개변수에 문자열을 직접 입력할 때, 어떤 형태의 이름으로 지정해야 정상적으로 이벤트를 수신할 수 있나요? [answer] | `ConnectEvent` 메서드의 `key` 매개변수에 문자열을 직접 입력할 경우, **발생시킬 이벤트 타입의 이름(String)**을 그대로 지정해야 합니다. 문서에 따르면, `key`는 "이벤트 타입의 이름"을 의미하며, 해당 이름이 매칭되는 이벤트가 발생하면 연결된 핸들러가 호출됩니다. 예를 들어, `UserEnterEvent` 타입의 이벤트를 수신하고 싶다면 `key`에 `"UserEnterEvent"`를 지정해야 합니다. 참고로, 이벤트 타입 이름을 문자열로 직접 입력하지 않고 `Type` 타입을 전달하는 방식도 지 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 입장과 퇴장에 관련된 기능을 제공합니다. # Properties - **string PlayerUri** 플레이어 엔티티를 생성할 때 사용할 Model의 Id입니다. 모델 콘텍스트 메뉴의 Copy Model ID를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. - **string StartPoint** 시작 맵의 이름입니다. 맵 콘텍스트 메뉴의 Copy Entry Path를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. # Methods ##### inherited f

[task] | instruction_following [pass] | ⏳ 미판정 [title] | MODTweenLogic [question] | MODTweenLogic의 각 Deprecated 메서드와 대체할 수 있는 TweenLogic 함수 또는 Component를 매칭하여 5열 이상의 표로 정리하세요. [answer] | `MODTweenLogic`은 더 이상 사용되지 않는 로직이며, 각 비추천(Deprecated) 메서드와 이를 대체할 수 있는 `TweenLogic` 함수 또는 컴포넌트는 다음과 같습니다. | MODTweenLogic Deprecated 메서드 | 대체 TweenLogic 함수 | 대체 Component | 비고 | | :--- | :--- | :--- | :--- | | `Ease(EaseType type, float from, float totalDelta, float time, float duration)` | `Ease(f [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 더는 사용하지 않는 Logic입니다. 용도에 맞게 TweenLogic, TweenLineComponent, TweenFloatingComponent, TweenCircularComponent를 사용하세요. # Methods - **float Ease(EaseType type, float from, float totalDelta, float time, float duration) [Deprecated] [Static]** 더는 사용하지 않는 함수입니다. TweenLogic의 Ease(float, float, float, Eas

[task] | code [pass] | ⏳ 미판정 [title] | WorldShopService [question] | 상품 지급 함수 실행 결과에 따라 `LogStorageService`에 성공 내역을 기록하고, 성공 시 `true`를 반환하는 `WorldShopService` 스크립트를 작성해줘. [answer] | 요청하신 `WorldShopService` 상품 지급 스크립트는 아래처럼 작성할 수 있습니다. `ProcessPurchase` 함수는 `purchaseInfo`를 받아 상품 지급 로직을 수행한 후, 성공 여부를 `boolean`으로 반환합니다. 지급에 성공한 경우 `LogStorageService`의 `LogPurchaseInfo` 메서드를 호출하여 성공 내역을 기록하고 `true`를 반환하며, 실패하거나 오류가 발생한 경우 `false`를 반환합니다. ```lua Method: [server only] void OnBeginPl [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 상품 지급 함수는 `WorldShopPurchaseInfo`를 매개 변수로 받고 boolean을 반환해야 합니다. `WorldShopPurchaseInfo`에는 구매한 유저, 구매한 상품과 같은 처리할 구매의 정보가 들어있습니다. 이를 이용해 상품을 지급하거나 지급하지 않을지 여부를 결정합니다. 상품 지급이 정상적으로 진행되어 구매를 완료시키려면 true를 리턴합니다. 만약 상품을 지급할 수 없다고 판단되어 정상적인 구매 과정을 수행할 수 없다면 false를 리턴합니다. false를 리턴한 구매의 경우, 구매를 수행한 유저가 다음에

[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | ProcessPurchase 함수에서 false를 반환하면 유저가 다음 접속 시 상품 지급이 재시도되는지, 그리고 이 재시도 과정에서 주의해야 할 점은 무엇인가요? [answer] | `ProcessPurchase` 함수에서 `false`를 반환하면, 해당 구매 건은 즉시 완료되지 않고 **유저가 다음에 월드에 접속했을 때 상품 지급이 자동으로 재시도**됩니다. 이 재시도 과정에서 주의해야 할 점은 다음과 같습니다: 1. **유저 엔티티 존재 확인 필수**: 재시도 시에도 `ProcessPurchase` 함수가 다시 호출됩니다. 이때 `_UserService:GetUserEntityByUserId(purchaseInfo.UserId)`를 통해 유저 엔티티를 가져온 뒤, 반드시 `_EntityService:I [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 상품 지급 함수는 `WorldShopPurchaseInfo`를 매개 변수로 받고 boolean을 반환해야 합니다. `WorldShopPurchaseInfo`에는 구매한 유저, 구매한 상품과 같은 처리할 구매의 정보가 들어있습니다. 이를 이용해 상품을 지급하거나 지급하지 않을지 여부를 결정합니다. 상품 지급이 정상적으로 진행되어 구매를 완료시키려면 true를 리턴합니다. 만약 상품을 지급할 수 없다고 판단되어 정상적인 구매 과정을 수행할 수 없다면 false를 리턴합니다. false를 리턴한 구매의 경우, 구매를 수행한 유저가 다음에

[task] | code [pass] | ⏳ 미판정 [title] | DefaultUserEnterLeaveLogic [question] | DefaultUserEnterLeaveLogic의 ConnectEvent 메서드를 사용하여 "UserEnterEvent" 키로 이벤트를 연결하고 핸들러에서 log로 유저 입장을 기록하는 스크립트를 작성해줘. [answer] | `DefaultUserEnterLeaveLogic`은 `Logic`을 상속받기 때문에 `ConnectEvent` 메서드를 사용할 수 있습니다. `OnBeginPlay` 생명주기 메서드 안에서 `"UserEnterEvent"` 문자열을 키로 사용하여 이벤트 연결을 설정하고, 해당 핸들러 함수에서 `log`로 유저 입장을 기록하는 스크립트는 다음과 같습니다. ```lua Property: [None] string PlayerUri = "" string StartPoint = "" Method: [server only] void On [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 입장과 퇴장에 관련된 기능을 제공합니다. # Properties - **string PlayerUri** 플레이어 엔티티를 생성할 때 사용할 Model의 Id입니다. 모델 콘텍스트 메뉴의 Copy Model ID를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. - **string StartPoint** 시작 맵의 이름입니다. 맵 콘텍스트 메뉴의 Copy Entry Path를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. # Methods ##### inherited f

[task] | single_turn [pass] | ⏳ 미판정 [title] | DefaultUserEnterLeaveLogic [question] | DefaultUserEnterLeaveLogic 컴포넌트에서 제공되는 기본 API만으로 유저가 특정 맵에 도착했다는 사실 자체를 감지하는 것이 가능한가요? [answer] | 제공된 `DefaultUserEnterLeaveLogic` 문서에는 유저가 특정 맵에 도착했다는 사실을 감지하기 위한 전용 API나 이벤트 핸들러가 존재하지 않습니다. 문서에 명시된 API는 다음과 같습니다: 1. **Properties**: `PlayerUri` (플레이어 모델 ID), `StartPoint` (시작 맵 이름) 2. **Inherited Methods (Logic)**: `ConnectEvent`, `DisconnectEvent`, `IsClient`, `IsServer`, `SendEvent` 이 중 `S [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 입장과 퇴장에 관련된 기능을 제공합니다. # Properties - **string PlayerUri** 플레이어 엔티티를 생성할 때 사용할 Model의 Id입니다. 모델 콘텍스트 메뉴의 Copy Model ID를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. - **string StartPoint** 시작 맵의 이름입니다. 맵 콘텍스트 메뉴의 Copy Entry Path를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. # Methods ##### inherited f

[task] | code [pass] | ⏳ 미판정 [title] | DefaultUserEnterLeaveLogic [question] | DefaultUserEnterLeaveLogic의 IsServer 메서드를 확인하여 서버 환경에서만 StartPoint 프로퍼티 값을 변경하는 스크립트를 작성해줘. [answer] | `DefaultUserEnterLeaveLogic`의 `IsServer()` 메서드를 사용하면 현재 실행 환경이 서버인지 확인할 수 있습니다. `StartPoint` 프로퍼티는 시작 맵의 이름을 저장하며, 문서에 명시된 바와 같이 **Server 공간에서만 변경해야 변경 사항이 적용**됩니다. 따라서 `IsServer()`가 `true`를 반환할 때만 `StartPoint` 값을 수정하는 로직을 `OnBeginPlay()` 생명주기 메서드 내에 구현하면 됩니다. ```lua Property: [None] string Player [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 입장과 퇴장에 관련된 기능을 제공합니다. # Properties - **string PlayerUri** 플레이어 엔티티를 생성할 때 사용할 Model의 Id입니다. 모델 콘텍스트 메뉴의 Copy Model ID를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. - **string StartPoint** 시작 맵의 이름입니다. 맵 콘텍스트 메뉴의 Copy Entry Path를 활용하세요. Server 공간에서 변경해야 변경 사항이 적용됩니다. # Methods ##### inherited f

[task] | single_turn [pass] | ⏳ 미판정 [title] | WorldShopService [question] | GetProductsAndWait 함수가 반환하는 WorldShopProductPages 객체에서 페이지를 넘기며 전체 상품 목록을 조회하는 로직이 어떻게 구성되어 있는지 설명해 주세요. [answer] | `WorldShopService`의 `GetProductsAndWait` 함수는 검색 조건에 맞는 상품들을 `WorldShopProductPages` 타입의 객체로 반환합니다. 이 객체는 검색 결과가 많을 경우 결과를 페이지 단위로 나누어 처리할 수 있도록 설계되어 있습니다. 전체 상품 목록을 조회하기 위해서는 반환된 객체를 이용해 현재 페이지의 데이터를 가져오고, 마지막 페이지가 아니면 다음 페이지로 이동하는 순환 구조를 사용해야 합니다. 구체적인 로직 구성은 다음과 같습니다. 1. **상품 검색**: `WorldShopPr [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### GetProductsAndWait `GetProductsAndWait()` 함수를 이용해 조건에 해당하는 상품들을 검색할 수 있습니다. 이 함수가 리턴하는 `WorldShopProductPages` 타입의 객체는 검색된 결과가 많을 경우 결과를 페이지 단위로 나눠 구할 수 있게 해줍니다. ```lua Method: void SearchOnSaleItems () { -- 상품 종류가 아이템이고, 판매 상태가 판매 중인 상품을 검색합니다. local pages = _WorldShopService:GetProductsAn

← → 방향키로 페이지 이동 · 숫자 입력 후 Enter로 점프