← 목록

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

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

[task] | single_turn [pass] | ⏳ 미판정 [title] | Callback [question] | 함수 명에 Wait이 붙어 있는 경우와 Async가 붙어 있는 경우의 실행 흐름 차이는 무엇인가요? [answer] | 함수 이름의 어미에 따라 실행 방식이 **동기(Synchronous)** 또는 **비동기(Asynchronous)**로 나뉘며, 이는 로직 처리 흐름에 결정적인 차이를 만듭니다. **1. `Wait`가 붙어 있는 경우 (동기 방식)** * **실행 흐름:** 현재 스크립트 실행이 해당 작업이 끝날 때까지 **대기(Hold)**합니다. * **특징:** 이전 작업이 완전히 완료된 후에만 다음 코드 라인으로 진행됩니다. 순차적으로 처리되므로 작업 종료 시점을 명확히 알 수 있습니다. * **예시:** `DataStorage [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다

[task] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 이전 월드에서 전달한 데이터에서 "score" 키를 추출하여 해당 값이 50 이상일 때만 로그에 기록하는 유저 입장 이벤트 처리 스크립트를 작성해줘. (GetWarpRecord, StringToTable, UserEnterEvent) [answer] | 요청하신 조건(이전 월드에서 전달한 데이터의 "score" 값이 50 이상일 때만 로그 기록)을 만족하는 스크립트는 다음과 같습니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: UserService -- Space: Server ------ [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 데이터를 이동할 월드로 전달할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성합니다. 2. 맵에 포탈을 추가한 뒤, 만든 스크립트 컴포넌트를 포탈에 추가합니다. 3. 아래와 같이 `WarpUserToWorldAndWait()`와 `UtilLogic`을 활용해 다른 월드에 데이터를 전달할 수 있게 작성합니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId)

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Callback [question] | `SetAsync` 메서드 호출 시 Callback 인자 순서와 `self` 참조 문법을 정확히 포함하여 3문장 이내로 설명하세요. [answer] | `SetAsync` 메서드의 Callback 함수는 `(errorcode, key)` 순서로 인자를 받습니다. Component의 함수를 Callback으로 사용할 때는 `self:function()`이 아닌 `self.function()` 문법을 사용해야 합니다. 예를 들어 `data:SetAsync("Power", tostring(self.Power), callBack)`와 같이 호출하며, `callBack`은 `function(errorcode, key)` 형태로 정의됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 처리가 완료되었을 때 Callback 함수를 실행하는 예시입니다. ```lua Property: [Sync] number Power = 0 Method: [server only] void OnBeginPlay () { local data = _DataStorageService:GetGlobalDataStorage("data") self.Power = 20 local callBack = function (errorcode, key) log("Power is saved")

[task] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 유저가 워프로 월드에 입장했을 때, `HandleUserEnterEvent`에서 `_TeleportService:GetWarpRecord()`로 기록을 조회하여 nil이 아닌 경우에만 로그에 "워프로 입장한 유저"라고 출력하는 서버 전용 스크립트를 작성해줘. [answer] | 요청하신 조건에 맞는 서버 전용 스크립트 컴포넌트입니다. `HandleUserEnterEvent` 이벤트 핸들러에서 `_TeleportService:GetWarpRecord(UserId)`를 호출하여 반환값이 `nil`이 아닐 때만 로그를 출력하도록 작성되었습니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { -- Parameters local UserId = event.Use [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이동한 월드에서 입장한 유저가 워프로 입장한 것인지 `GetWarpRecord()`를 활용해 확인할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성하고, Common에 추가합니다. 2. 월드에 입장한 유저가 워프로 입장했는지 확인할 수 있도록 아래와 같이 작성합니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { -------------

[task] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | `HandleUserEnterEvent` 이벤트 핸들러에서 `warpRecord.PreviousWorldId` 값을 추출하여, 해당 유저가 이전 월드 ID와 함께 워프해 온 것을 로그에 기록하는 서버 전용 스크립트를 작성해줘. [answer] | `_TeleportService:GetWarpRecord(UserId)`를 호출하여 워프 기록을 확인하고, 기록이 존재할 때 `PreviousWorldId`를 추출해 로그에 출력하는 서버 전용 스크립트 컴포넌트입니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { local UserId = event.UserId local warpRecord = _TeleportServ [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이동한 월드에서 입장한 유저가 워프로 입장한 것인지 `GetWarpRecord()`를 활용해 확인할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성하고, Common에 추가합니다. 2. 월드에 입장한 유저가 워프로 입장했는지 확인할 수 있도록 아래와 같이 작성합니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { -------------

[task] | two_turn [pass] | ⏳ 미판정 [title] | Callback [question] | 함수 이름의 어미(Wait, Async)를 통해 동기/비동기 여부를 구분하는 기준에 대해 자세히 설명해 주세요. [answer] | 함수 이름의 어미는 해당 함수가 동기 방식인지 비동기 방식인지를 구분하는 명확한 기준입니다. * **동기(Synchronous) 방식**: 함수 이름의 어미에 **`Wait`**가 붙어 있습니다. * 이전 작업이 끝날 때까지 대기하며 순차적으로 로직을 처리합니다. * 작업 완료 시점을 명확히 알 수 있습니다. * **비동기(Asynchronous) 방식**: 함수 이름의 어미에 **`Async`**가 붙어 있습니다. * 작업을 순차적으로 처리하지 않고 병행하여 처리합니다. * 작업 [followup] | TimerService의 SetTimerRepeat 함수를 사용할 때, 주기적으로 실행될 '특정 작업'을 Callback으로 지정하는 mLua 코드 예시를 보여주세요. [followup_answer] | `_TimerService:SetTimerRepeat` 함수를 사용하여 주기적으로 실행될 작업을 Callback로 지정하는 mLua 코드 예시는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { local callBack = function() log("CallBack! :"..tostring(os.date())) end log("SetTimer! :"..tostring(os.date())) local timerId = [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다

[task] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 포탈을 사용할 때 현재 월드의 WorldId 와 함께 숫자 100을 테이블로 구성하여 다음 월드로 전달하는 Warp 메서드를 포함하는 스크립트를 작성해줘. (WarpUserToWorldAndWait, TableToString, PortalUseEvent) [answer] | 포탈 사용 시 현재 월드의 `WorldId`와 숫자 `100`을 테이블로 구성하여 다음 월드로 전달하는 스크립트는 다음과 같습니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId) { -- 현재 월드의 WorldId와 숫자 100을 테이블로 구성 local warpDataTable = {} warpDataTable.currentWorldId = self.WorldId warpDataTable.va [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 데이터를 이동할 월드로 전달할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성합니다. 2. 맵에 포탈을 추가한 뒤, 만든 스크립트 컴포넌트를 포탈에 추가합니다. 3. 아래와 같이 `WarpUserToWorldAndWait()`와 `UtilLogic`을 활용해 다른 월드에 데이터를 전달할 수 있게 작성합니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId)

[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | TweenLogic의 Ease 함수가 Tweener 객체 생성 없이 동작하는 이유와 직접 호출해야 하는 시점을 3문장 이내로 설명하세요. [answer] | Ease 함수는 Tweener 객체를 생성하지 않고 프레임마다 자동 업데이트되지 않는 순수 계산 함수이기 때문에, 움직임이 필요한 경우 크리에이터가 직접 매 프레임 호출해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [TweenLogic](/apiReference?postId=700)을 사용해 엔티티를 확대, 축소, 회전, 이동시킬 수 있습니다. [Tweener](/apiReference?postId=714)를 함께 확인해보세요. # TweenLogic 개념 **TweenLogic**은 엔티티에 애니메이션 효과를 줄 수 있는 다양한 함수를 제공합니다. 여러 프레임에 걸쳐 Entity의 위치나 크기를 변화시키거나 회전시킬 수 있습니다. 다양한 함수를 사용해 엔티티를 Tween 시켜 애니메이션을 한 번의 함수 호출로 간단

[task] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 유저가 워프로 입장한 경우에만 `HandleUserEnterEvent`에서 `warpRecord.PreviousWorldId`를 확인하고, 이 값이 특정 월드 ID(예: 1001)와 일치하면 "특정 월드에서 온 유저"라고 로그에 출력하는 서버 전용 스크립트를 작성해줘. [answer] | 요청하신 조건에 맞춰, 유저가 워프로 입장한 경우에만 이전 월드 ID를 확인하고 특정 월드 ID(1001)와 일치할 때 로그를 출력하는 서버 전용 스크립트입니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { local UserId = event.UserId local warpRecord = _TeleportService:GetWarpRecord(UserId) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이동한 월드에서 입장한 유저가 워프로 입장한 것인지 `GetWarpRecord()`를 활용해 확인할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성하고, Common에 추가합니다. 2. 월드에 입장한 유저가 워프로 입장했는지 확인할 수 있도록 아래와 같이 작성합니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { -------------

[task] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | `HandleUserEnterEvent`에서 `warpRecord`가 존재할 경우 `warpRecord.CurrentWorldId`와 `warpRecord.PreviousWorldId`를 비교하여 두 값이 서로 다르면 "다른 월드로부터 이동함"이라고 로그에 출력하는 서버 전용 스크립트를 작성해줘. [answer] | `HandleUserEnterEvent` 이벤트 핸들러 내에서 `_TeleportService:GetWarpRecord(UserId)`를 호출하여 워프 기록을 가져옵니다. `warpRecord`가 `nil`이 아닌 경우, `warpRecord.CurrentWorldId`와 `warpRecord.PreviousWorldId`를 비교하여 값이 서로 다르면 요청하신 메시지로 로그를 출력하는 서버 전용 스크립트는 다음과 같습니다. ```lua Event Handler: [server only] [service: UserService] H [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이동한 월드에서 입장한 유저가 워프로 입장한 것인지 `GetWarpRecord()`를 활용해 확인할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성하고, Common에 추가합니다. 2. 월드에 입장한 유저가 워프로 입장했는지 확인할 수 있도록 아래와 같이 작성합니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { -------------

[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | ButtonComponent 의 ButtonClickEvent 를 수신하여 TextComponent 의 Text 프로퍼티에 현재 시각을 문자열로 표시하는 스크립트를 작성해줘 [answer] | ButtonComponent에서 발생하는 `ButtonClickEvent`를 수신하고, 해당 이벤트가 발생했을 때 현재 시각을 문자열로 변환하여 `TextComponent`의 `Text` 프로퍼티에 설정하는 스크립트입니다. 참고 문서에 제공된 API 및 이벤트 정보(`ButtonClickEvent`, `TextComponent.Text`)를 기반으로 작성하였으며, 현재 시각을 가져오는 함수나 `os.date`와 같은 표준 라이브러리 사용은 문서에 명시되지 않아 제외하고, **이벤트 수신 및 Text 설정 구조**만 정확히 구현했습 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |

[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 출발 월드의 스크립트에서 `self.WorldId`를 `[Sync]` 속성으로 설정했는데, 이 값이 클라이언트에서 수정되면 서버의 텔레포트 동작에 어떤 영향을 미칠 수 있나요? [answer] | `[Sync]` 속성은 서버와 클라이언트 간에 값을 동기화하지만, **서버 로직의 최종 권한(권위)은 서버에 있습니다.** 따라서 클라이언트가 `self.WorldId` 값을 임의로 수정하더라도, **서버에서 실행되는 `Warp` 메서드 내의 `self.WorldId` 값은 클라이언트의 수정값을 그대로 따르지 않습니다.** 구체적인 동작은 다음과 같습니다: 1. **서버-클라이언트 동기화 방식:** * `[Sync]` 속성은 기본적으로 서버에서 클라이언트로 값을 전달하는 방향이 주된 동기화 경로입니다. * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 유저의 데이터를 이동할 월드로 전달할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성합니다. 2. 맵에 포탈을 추가한 뒤, 만든 스크립트 컴포넌트를 포탈에 추가합니다. 3. 아래와 같이 `WarpUserToWorldAndWait()`와 `UtilLogic`을 활용해 다른 월드에 데이터를 전달할 수 있게 작성합니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId)

[task] | code [pass] | ⏳ 미판정 [title] | Callback [question] | 함수명 어미가 Async인 비동기 함수를 호출하고, 그 함수의 Callback 파라미터로 특정 작업 함수를 전달하는 스크립트를 작성해줘 [answer] | 참고 문서에 명시된 비동기 함수(`Async` 어미)와 해당 함수에 Callback을 전달하는 구체적인 API 이름, 파라미터 구조, 또는 사용 예제가 포함되어 있지 않습니다. 문서에서 비동기 함수가 `Async`로 끝나며, Callback이 완료 시점 알림이나 연계 작업 정의에 사용된다는 개념적 설명과 `TimerService`의 `SetTimerRepeat`/`SetTimerOnce`를 통한 Callback 사용 예제만 제공되고 있을 뿐, 일반적인 데이터 저장소(DataStorage)나 다른 서비스의 `Async` 함수에 Ca [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Callback [question] | `_DataStorageService`의 `GetGlobalDataStorage`와 `SetAsync` 사용 예시를 단계별 번호 목록으로 정리하되, 각 단계에 변수 이름이 명시되어야 합니다. [answer] | `_DataStorageService`의 `GetGlobalDataStorage`와 `SetAsync` 사용 예시는 다음과 같이 단계별로 정리할 수 있습니다. 1. **글로벌 데이터 저장소 객체 획득**: `_DataStorageService:GetGlobalDataStorage("data")`를 호출하여 반환된 객체를 `data` 변수에 할당합니다. 2. **저장할 값 설정**: 컴포넌트의 프로퍼티(예: `self.Power`)에 저장하려는 값(예: `20`)을 대입합니다. 3. **콜백 함수 정의**: 저장 완료 후 실행 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 처리가 완료되었을 때 Callback 함수를 실행하는 예시입니다. ```lua Property: [Sync] number Power = 0 Method: [server only] void OnBeginPlay () { local data = _DataStorageService:GetGlobalDataStorage("data") self.Power = 20 local callBack = function (errorcode, key) log("Power is saved")

[task] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | HandlePortalUseEvent(PortalUseEvent event) 이벤트 핸들러를 통해 포탈 사용자를 식별하고, self:Warp() 메서드를 호출하여 _TeleportService:WarpUserToWorldAsync()로 비동기 워프를 수행하는 컴포넌트 스크립트를 작성해줘. [answer] | 요청하신 기능을 구현한 mLua 스크립트 컴포넌트입니다. 참고 문서의 예제에서 포탈 이벤트 핸들러(`HandlePortalUseEvent`)가 클라이언트 공간(Space: Client)에서 발생한다고 명시되어 있습니다. 하지만 `_TeleportService:WarpUserToWorldAsync()`는 서버에서 실행되어야 하는 함수이므로, 클라이언트에서 포탈 이벤트를 감지한 후 해당 정보를 서버로 전달하여 워프를 처리하는 구조로 작성해야 합니다. 아래 스크립트는 클라이언트에서 포탈 사용자를 식별하고, 이를 서버 메서드로 전달하여 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 TeleportService의 함수를 활용해 월드에서 다른 월드로 이동할 수 있습니다. # 다른 월드로 이동하기 TeleportService는 월드의 유저를 특정 장소로 이동시킬 때 사용할 수 있을 뿐 아니라, 접속 중인 월드에서 다른 월드로 이동시킬 수 있습니다. 접속 중인 월드와 이동할 월드가 공개 출시된 상태여야 이동이 가능합니다. 이 특성으로 인해 제작 중에는 워프를 테스트할 수 없습니다. | 현재 월드 | 이동할 월드 | 워프 여부 | | --- | --- | --- | | 공개 | 공개 | *

[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | MoveTo() 메서드 호출 시 전달해야 하는 매개변수 3가지를 3문장 이내로 나열하세요. [answer] | 엔티티가 이동할 목적지, 이동에 걸리는 시간, EaseType을 전달해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하

[task] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent의 ContentType 옵션 중 Password와 Pin의 차이점은 무엇이며, Custom 유형은 어떤 항목을 설정할 수 있나요? [answer] | **Password와 Pin의 차이점** * **Password**: 모든 문자(영문, 숫자, 특수문자 등)의 입력을 허용합니다. 입력된 내용은 별표(asterisk, `*`)로 가려져 표시됩니다. * **Pin**: 숫자 타입의 입력만 허용합니다. 입력된 내용 역시 별표(asterisk, `*`)로 가려져 표시됩니다. 즉, 두 옵션 모두 입력값을 별표로 표시한다는 점은 같지만, **Password는 모든 문자를 허용하는 반면 Pin은 숫자만 허용**한다는 점이 핵심 차이입니다. **Custom 유형 설정 항목** * [followup] | Custom 유형에서 Line Type, Input Type, Keyboard Type, 문자열 검증을 구체적으로 어떻게 조합하여 비밀번호 입력 필드를 만들 수 있는지 코드 예시를 보여주세요. [followup_answer] | 제시된 참고 문서에는 `Custom` 유형에서 `Line Type`, `Input Type`, `Keyboard Type`, 문자열 검증을 구체적으로 조합하는 방법이나 해당 프로퍼티를 설정하는 mLua 코드 예시가 포함되어 있지 않습니다. 문서에는 `Custom` 유형을 선택할 경우 사용자가 직접 `Line Type`, `Input Type`, `Keyboard Type`, 문자열 검증을 설정할 수 있다는 사실만 언급되어 있으며, 이를 통해 비밀번호 입력 필드를 만드는 구체적인 구현 코드나 설정 값 목록은 확인할 수 없습니다. [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>

[task] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | SpriteGUIRendererComponent에서 이미지를 표시할 때 선택 가능한 Type 종류와 각각의 특징을 설명해 주세요. [answer] | SpriteGUIRendererComponent에서 이미지를 표시할 때 선택 가능한 `Type` 종류는 **Simple**, **Sliced**, **Tiled**, **Filled** 네 가지입니다. 각 타입의 특징은 다음과 같습니다. 1. **Simple**: 이미지를 기본 형태로 표시하는 방식입니다. 2. **Sliced**: 이미지를 슬라이스하여 표시하는 방식입니다. 3. **Tiled**: 동일한 이미지를 타일처럼 반복하여 출력하는 방식입니다. * **주의사항**: UI 크기 대비 설정된 ImageRUI [followup] | Simple, Sliced, Tiled, Filled 중에서 특정 상황에서 선택해야 하는 기준이 있다면 mLua 스크립트 예시를 통해 설정 방법을 보여주세요. [followup_answer] | 제공된 문서에는 Simple, Sliced, Tiled, Filled 타입을 특정 상황에서 선택해야 하는 구체적인 기준이나 로직이 명시되어 있지 않습니다. 문서에는 각 타입의 이름과 Tiled 타입 사용 시 성능 최적화 사항, 그리고 Filled 타입을 사용할 때 `FillMethod`와 `FillAmount`를 함께 설정하는 예제 코드만 포함되어 있습니다. 따라서 문서에 근거하여 Filled 타입을 사용할 때의 mLua 설정 예제만 보여드릴 수 있으며, 다른 타입(Simple, Sliced, Tiled)의 선택 기준에 대한 스크 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 컴포넌트를 조합해 다양한 형태의 UI 엔티티를 구성할 수 있습니다. 이번 과정에서는 UI에서 자주 사용하는 기본 컴포넌트에 대해 알아봅니다. ##### 참고 가이드 * [UI 에디터](/docs?postId=120) * [UI 제작하기](/docs?postId=64) * [UI 엔티티 제어하기](/docs?postId=1154) # UITransformComponent [UITransformComponent](/apiReference/Components/UITransformComponent)는 UI 엔티티에

[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | TweenComponent 계열과 TweenLogic의 멀티플레이 환경에서의 성능 및 스크립트 필요성 차이를 2열 3행 표로 정리해서 출력하세요. [answer] | 요청하신 정보에 따라 TweenComponent 계열과 TweenLogic의 차이를 2열 3행 표로 정리했습니다. | 구분 | TweenComponent 계열 (Line, Circular, Floating) | TweenLogic | | :--- | :--- | :--- | | **멀티플레이 환경 성능** | 네트워크 최적화가 되어 있어 다수의 엔티티를 Tween 시킬 때 성능 향상을 기대할 수 있습니다. | 네트워크 최적화 여부가 명시되어 있지 않으며, 동적 트윈에 초점을 맞춘 기능입니다. | | **스크립트 필요성** | 스크 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [TweenLogic](/apiReference?postId=700)을 사용해 엔티티를 확대, 축소, 회전, 이동시킬 수 있습니다. [Tweener](/apiReference?postId=714)를 함께 확인해보세요. # TweenLogic 개념 **TweenLogic**은 엔티티에 애니메이션 효과를 줄 수 있는 다양한 함수를 제공합니다. 여러 프레임에 걸쳐 Entity의 위치나 크기를 변화시키거나 회전시킬 수 있습니다. 다양한 함수를 사용해 엔티티를 Tween 시켜 애니메이션을 한 번의 함수 호출로 간단

[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | Tweener 객체의 자동 파괴를 비활성화할 때 권장되는 수동 파괴 시점과 해당 시점에 호출해야 하는 함수 이름을 표로 정리해서 제시하세요. [answer] | Tweener 객체의 자동 파괴(`AutoDestroy`)를 비활성화할 때 권장되는 수동 파괴 시점과 호출 함수는 다음과 같습니다. | 권장 수동 파괴 시점 | 호출 함수 | | :--- | :--- | | 컴포넌트 종료 시 (`OnEndPlay`) | `Destroy()` | | Tween 대상 엔티티가 파괴되는 시점 | `Destroy()` | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하

[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | RotateTo() 메서드 호출 시 인자 순서와 LoopCount 설정 값을 정확히 포함하여 코드 블록으로만 출력하세요. [answer] | ```lua Method: void OnBeginPlay() { self._T.tween = _TweenLogic:RotateTo(self.Entity, 360, 5, EaseType.Linear) self._T.tween.LoopCount = -1 } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `RotateTo()`를 활용해 엔티티를 회전시킬 수 있고, `TweenLogic:RotateAroundOffset()`를 활용해 특정 엔티티의 offset을 기준으로 따라다니게 회전시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. **angle**을 360도로 설정해 엔티티가 한 바퀴 돌 수 있게 작성합니다. ```lua Method: void OnBeginPlay() { self._T.tween = _TweenLogic:RotateTo(self.E

[task] | code [pass] | ⏳ 미판정 [title] | Callback [question] | _TimerService_의 SetTimerRepeat 메서드를 사용해 주기적으로 Callback 함수를 실행하여 특정 작업을 반복 수행하는 스크립트를 작성해줘 [answer] | `_TimerService:SetTimerRepeat` 메서드를 사용하여 주기적으로 Callback 함수를 실행하는 스크립트입니다. 이 예제에서는 `OnBeginPlay` 시점에 타이머를 설정하여 1초마다 `repeatFunc`이라는 Callback 함수를 실행하도록 합니다. 이 Callback 함수 내에서 실제 반복 수행할 작업(예: 로깅, 위치 변경 등)을 정의할 수 있습니다. `OnEndPlay` 시점에는 타이머를 정리하여 메모리 누수를 방지합니다. ```lua Property: [None] integer TimerId = [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다

[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | MoveTo 함수의 시그니처와 EaseType이 이동 궤적에 미치는 영향을 보여주는 mLua 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Property: [None] number MoveDuration = 3 Method: [server only] void OnBeginPlay () { -- MoveTo 함수의 시그니처: MoveTo(Entity entity, Vector2 destination, number duration, EaseType type) -- EaseType이 이동 궤적에 미치는 영향: -- EaseType은 Easing 함수를 결정하여 시간(x축)에 따른 위치 변화율(y축)을 제어합니다. -- 같은 시간과 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [TweenLogic](/apiReference?postId=700)을 사용해 엔티티를 확대, 축소, 회전, 이동시킬 수 있습니다. [Tweener](/apiReference?postId=714)를 함께 확인해보세요. # TweenLogic 개념 **TweenLogic**은 엔티티에 애니메이션 효과를 줄 수 있는 다양한 함수를 제공합니다. 여러 프레임에 걸쳐 Entity의 위치나 크기를 변화시키거나 회전시킬 수 있습니다. 다양한 함수를 사용해 엔티티를 Tween 시켜 애니메이션을 한 번의 함수 호출로 간단

[task] | two_turn [pass] | ⏳ 미판정 [title] | Callback [question] | 메이플스토리 월드에서 동기(Synchronous)와 비동기(Asynchronous) 방식의 차이는 무엇이며, 각각 어떤 상황에 적합한가요? [answer] | 메이플스토리 월드(mLua)에서 동기(Synchronous)와 비동기(Asynchronous) 방식의 차이와 적합한 상황은 다음과 같습니다. ### 1. 동기(Synchronous) 방식 * **정의**: 로직을 순서대로 처리하는 방식입니다. 이전 작업이 완전히 끝날 때까지 대기하고, 그 다음 작업을 시작합니다. * **특징**: * 작업 완료 시점을 명확하게 알 수 있습니다. * 함수명 뒤에 **`Wait`**가 붙어 있는 함수들이 동기 방식으로 실행됩니다. * **적합한 상황**: * [followup] | DataStorage API를 사용하는 비동기 작업에서 완료 시점을 알리는 Callback 함수를 어떻게 정의하고 등록해야 하나요? [followup_answer] | 제공된 참고 문서에는 `DataStorage` API의 비동기 함수(Async)에 Callback을 직접 전달하여 등록하는 구체적인 코드 예제나 메서드 시그니처가 포함되어 있지 않습니다. 문서에는 다음과 같은 정보만 확인됩니다: 1. `DataStorage` API는 외부 데이터 주고받기 등 IO 처리에 사용되며, 비동기 방식으로 처리하면 불필요한 시간을 줄일 수 있습니다. 2. 비동기 작업은 순차적 흐름이 아니므로 완료 시점을 알기 위해 Callback이 필요합니다. 3. Callback은 "비동기 작업이 끝난 뒤에 실행할 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다

[task] | code [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | 서버 스크립트에서 OnBeginPlay() 시 _TimerService:SetTimerOnce 를 활용하여 1초 간격으로 반복 실행되는 타이머를 설정하고, 실행될 때마다 PixelRendererComponent:GetPixels 를 호출하여 픽셀 데이터를 수집한 후 _UtilLogic:RandomDouble() 로 생성된 값으로 PixelRendererComponent:SetAlpha 를 적용하는 스크립트를 작성해줘 [answer] | 요청하신 스크립트 작성 과정에서 참고 문서와 mLua 규칙을 검토한 결과, 몇 가지 중요한 불일치가 있습니다. 1. **타이머 API 불일치**: 질문에서는 "1초 간격으로 반복 실행"되도록 `SetTimerOnce`를 사용하라고 했으나, `SetTimerOnce`는 **단일 실행** 전용 API입니다. 반복 실행을 위해선 `SetTimerRepeat`가 필요합니다. 하지만 질문의 명시적 지시(`SetTimerOnce`)와 문맥상 "반복"이라는 모순이 있습니다. * *판단*: 질문의 핵심 의도인 "1초 간격 반복"을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetAlpha` 함수를 활용하면 스프라이트 전체의 알파 값을 변경할 수 있습니다. 예시 코드는 아래와 같습니다. 버튼을 만들고, 함수를 추가한 다음 버튼에 **ButtonClickEvent**를 연결하는 것은 위의 예제와 동일합니다. ```lua [client only] void SetAlphaTest() { local a = _UtilLogic:RandomDouble() -- SetAlpha를 사용하여 스프라이트 전체의 알파 값을 변경합니다. self.Entity.PixelRendererComponent

[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | 위 예제 코드에서 `tween.LoopCount`와 `tween.LoopType`이 각각 어떤 값을 가지는지 2문장 이내로 설명하세요. [answer] | `LoopCount`는 -1을 가짐으로써 무한 반복을 의미하며, `LoopType`은 `TweenLoopType.PingPong`을 설정하여Tween이 왕복 방식으로 반복되도록 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MakeTween()`에서 **Alpha** 값을 조절해 특정 엔티티가 점점 옅어지게 만들 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. `MakeTween()`의 startvalue를 SpriteRenderer의 a로 지정하고, endvalue를 0으로 지정해 엔티티가 투명해질 수 있도록 아래와 같이 작성합니다. ```lua Method: [server only] void OnBeginPlay() { local spriteRenderer

[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | ScaleTo()를 사용하여 PingPong 방식으로 반복되는 크기를 변경하는 코드를 주석 설명 없이 코드만 출력하세요. [answer] | ```lua Method: [server only] void OnBeginPlay() { local tween = _TweenLogic:ScaleTo(self.Entity, Vector2(2.5, 2.5), 4, EaseType.QuadEaseInOut) tween.LoopCount = -1 tween.LoopType = TweenLoopType.PingPong } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `RotateTo()`를 활용해 엔티티를 회전시킬 수 있고, `TweenLogic:RotateAroundOffset()`를 활용해 특정 엔티티의 offset을 기준으로 따라다니게 회전시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. **angle**을 360도로 설정해 엔티티가 한 바퀴 돌 수 있게 작성합니다. ```lua Method: void OnBeginPlay() { self._T.tween = _TweenLogic:RotateTo(self.E

[task] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | GetWarpRecord()로 이전 월드에서 전달된 직렬화 데이터를 복호화하여 유저의 고유 데이터를 복구하는 로직을 포함하는 TeleportService 기반 워프 처리 스크립트를 작성해줘. [answer] | 제시된 참고 문서에는 `WarpUserToWorldAndWait()`를 호출할 때 데이터를 전달하는 방법과, 이동한 월드에서 `GetWarpRecord()`로 데이터에 접근할 수 있다는 사실만 명시되어 있습니다. 그러나 `GetWarpRecord()` 함수의 정확한 시그니처(매개변수, 반환 타입)나 `TableToString`으로 직렬화된 문자열을 다시 테이블로 복호화하는 구체적인 API(예: `StringToTable`)가 문서에 포함되어 있지 않습니다. 따라서 문서에 기반하여 **데이터를 전달하는 로직**과 **`GetWarp [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 TeleportService의 함수를 활용해 월드에서 다른 월드로 이동할 수 있습니다. # 다른 월드로 이동하기 TeleportService는 월드의 유저를 특정 장소로 이동시킬 때 사용할 수 있을 뿐 아니라, 접속 중인 월드에서 다른 월드로 이동시킬 수 있습니다. 접속 중인 월드와 이동할 월드가 공개 출시된 상태여야 이동이 가능합니다. 이 특성으로 인해 제작 중에는 워프를 테스트할 수 없습니다. | 현재 월드 | 이동할 월드 | 워프 여부 | | --- | --- | --- | | 공개 | 공개 | *

[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent의 AutoClear 속성을 True로 설정하고 ContentType을 IntegerNumber로 지정하여 TextInputEndEditEvent 시 입력된 숫자가 0보다 크면 log로 해당 숫자를 출력하는 스크립트를 작성해줘 [answer] | TextInputComponent의 `AutoClear` 프로퍼티를 `True`로, `ContentType`을 `IntegerNumber`로 설정하고, `TextInputEndEditEvent` 이벤트에서 입력된 텍스트를 숫자로 변환한 값이 0보다 크면 해당 숫자를 로그로 출력하는 스크립트입니다. ```lua Property: [None] TextInputComponent NumberInput = EntityPath Method: [client only] void OnBeginPlay () { self.NumberInpu [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>

[task] | two_turn [pass] | ⏳ 미판정 [title] | Callback [question] | 컴포넌트 메서드를 Callback으로 전달할 때 콜론(`:`)과 점(`.`) 중 어떤 것을 사용해야 하나? [answer] | 컴포넌트 메서드를 Callback으로 전달할 때는 **점(`.`)** 을 사용해야 합니다. 콜론(`:`)을 사용하면 `self`가 자동으로 첫 번째 인자로 전달되므로, Callback 함수의 인자 시그니처(예: `errorcode, key`)와 맞지 않아 오류가 발생할 수 있습니다. 따라서 Callback으로 사용할 때는 `self:function()` 형태가 아닌 `self.function()` 형태로 호출해야 합니다. [followup] | `self:function()`과 `self.function()`의 차이로 인해 발생할 수 있는 오류 상황과, 올바른 형태로 Component Function을 Callback으로 사용하는 실제 코드 예시를 작성해 주세요. [followup_answer] | `self:function()`과 `self.function()`의 차이는 함수 호출 시 `self`가 어떻게 전달되는지에 있습니다. 1. **`self:function()` (콜론 문법)** * 함수를 호출할 때 `self`가 **자동으로 첫 번째 인자**로 전달됩니다. * 즉, `self:MyFunc(arg1)`은 내부적으로 `self.MyFunc(self, arg1)`와 동일하게 실행됩니다. * **오류 상황**: Callback은 외부 서비스(예: `_DataStorageService`)에 [scores] | [judge_reason] | [source_doc] | 처리가 완료되었을 때 Callback 함수를 실행하는 예시입니다. ```lua Property: [Sync] number Power = 0 Method: [server only] void OnBeginPlay () { local data = _DataStorageService:GetGlobalDataStorage("data") self.Power = 20 local callBack = function (errorcode, key) log("Power is saved")

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