← 목록

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

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

[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | `_UtilLogic:TableToString()`으로 변환한 문자열을 `warpData`로 전달했는데, 도착지에서 `StringToTable()`로 복원할 때 원본 테이블의 구조가 깨지는 원인은 무엇일까요? [answer] | 제시된 참고 문서에는 `_UtilLogic:TableToString()`과 `_UtilLogic:StringToTable()` 함수의 내부 동작 방식이나, 데이터 직렬화/역직렬화 시 구조가 깨지는 구체적인 원인에 대한 기술적 설명이 포함되어 있지 않습니다. 문서에는 단순히 다음과 같은 사용 예제만 제시되어 있습니다. 1. **전달 시**: `local warpData= _UtilLogic:TableToString(warpDataTable)` 2. **수신 시**: `local warpDataTable = _UtilLogic:Str [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] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | ContentType을 EmailAddress로 지정했을 때 사용자가 마침표를 연달아 입력하면 어떻게 처리되나요? [answer] | ContentType을 EmailAddress로 지정하면, 이메일 형식에 맞춰 하나의 @ 기호를 포함하는 영문과 숫자 문자열만 입력할 수 있습니다. 이 과정에서 마침표(.)는 연달아 입력할 수 없습니다. 즉, 사용자가 마침표를 연속으로 입력하려는 시도가 발생하면 컴포넌트가 이를 허용하지 않아 막아집니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>

[task] | code [pass] | ⏳ 미판정 [title] | 로그 [question] | `OnUpdate`에서 `delta` 값이 0.1초 이상 누적되면 `log()` 함수를 통해 "High latency detected" 오류 로그를 출력하고, `_TimerService:SetTimerOnce`를 사용하여 5초 후 로그 출력을 재개하도록 타이머를 설정하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `log()` 함수가 존재하고, `_TimerService:SetTimerOnce`를 사용하여 특정 시간 후에 함수를 실행할 수 있으며, `OnUpdate(number delta)`에서 `delta` 값을 전달받아 누적할 수 있는 예제가 명시되어 있습니다. 다만, 요청하신 내용 중 **`log()` 함수를 통해 "오류 로그"를 출력하는 특정 API(예: `error()`, `logError()` 등)는 문서에 존재하지 않습니다.** 문서에는 단순히 `log("HelloMSW")` 형태로 정보 로그를 출력하는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 콘솔에는 플레이 테스트 도중에 발생한 정보, 경고, 오류 로그가 출력됩니다. | 번호 | 설명 | | :---: | --- | | | 콘솔 창에 남아있는 로그를 삭제합니다. Clear 오른쪽에 확장 버튼을 눌러 Clear on Play를 활성화하고, 시작 버튼을 누르면 콘솔 창에 남아있던 로그를 자동으로 삭제하고 시작합니다. | | | 버튼을 누르면 중복 로그를 하나로 합쳐줍니다. 영역에 합쳐진 총 개수가 나옵니다. | | | 실행 공간(Client / Server) 별로 로그를 모아볼 수 있습니다. | | |

[task] | code [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | PixelRendererComponent의 SetPixel 메서드를 사용해 TransformComponent의 Scale이 10x10인 엔티티에서 버튼을 누르면 랜덤한 색상의 픽셀이 그려지는 스크립트를 작성해줘. [answer] | PixelRendererComponent의 `SetPixel` 메서드를 사용하여 버튼을 누를 때 랜덤한 위치와 색상의 픽셀을 표시하는 스크립트입니다. 이 기능을 구현하기 위해서는 두 개의 스크립트 컴포넌트가 필요합니다. 1. **PixelRendererTest**: 실제 픽셀을 변경하는 로직을 포함합니다. 2. **ButtonClick_SetPixel**: 버튼 클릭 이벤트를 감지하여 위 로직을 호출합니다. ### 1. PixelRendererTest 스크립트 이 스크립트는 `SetPixelTest` 엔티티에 부착되며, 랜 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetPixel` 함수를 활용해 스프라이트에서 원하는 위치의 픽셀 색상을 변경할 수 있습니다. 버튼을 누르면 스프라이트의 랜덤한 위치에 랜덤한 색상의 픽셀이 표시되도록 해봅시다. 1. **Hierarchy - map01 - Create Entity - Create Empty**를 눌러 새로운 **SetPixelTest**를 생성합니다. 2. **SetPixelTest** 엔티티에 **TransformComponent**를 추가하고 **Scale** 프로퍼티에 **X = 10, Y = 10**을 입력합니다. 그리

[task] | two_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | TeleportService를 사용해 유저를 다른 월드로 이동시키는 기본 절차와 필요 조건은 무엇인가요? [answer] | TeleportService를 사용하여 유저를 다른 월드로 이동시키는 절차와 필요 조건은 다음과 같습니다. ### 1. 필요 조건 * **월드 공개 상태:** 현재 접속 중인 월드와 이동하려는 대상 월드 모두 **공개 출시** 상태여야 합니다. * 공개 월드 -> 공개 월드: 이동 가능 * 비공개 월드 -> 공개 월드: 이동 가능 * 공개 월드 -> 비공개 월드: 이동 불가 * 비공개 월드 -> 비공개 월드: 이동 불가 * **테스트 제한:** 위 조건(공개 출시 상태) 때문에 제 [followup] | `WarpUserToWorldAndWait()`와 `WarpUserToWorldAsync()`의 차이점과, 제작 중 워프 테스트가 불가능한 이유에 대해 자세히 설명해 주세요. [followup_answer] | `WarpUserToWorldAndWait()`와 `WarpUserToWorldAsync()`의 차이점 및 제작 중 테스트가 불가능한 이유는 다음과 같습니다. ### 1. 두 함수의 차이점 두 함수 모두 유저를 다른 월드로 이동시킬 때 사용하며, **이동시킬 유저 ID**와 **이동할 월드 ID** 두 가지 인자가 필요합니다. 주요 차이점은 데이터 전달 기능과 실행 방식에 있습니다. * **WarpUserToWorldAndWait()** * **데이터 전달 가능:** 현재 머물던 월드에서 유저가 쌓은 데이터를 이 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 TeleportService의 함수를 활용해 월드에서 다른 월드로 이동할 수 있습니다. # 다른 월드로 이동하기 TeleportService는 월드의 유저를 특정 장소로 이동시킬 때 사용할 수 있을 뿐 아니라, 접속 중인 월드에서 다른 월드로 이동시킬 수 있습니다. 접속 중인 월드와 이동할 월드가 공개 출시된 상태여야 이동이 가능합니다. 이 특성으로 인해 제작 중에는 워프를 테스트할 수 없습니다. | 현재 월드 | 이동할 월드 | 워프 여부 | | --- | --- | --- | | 공개 | 공개 | *

[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | UITransformComponent의 UIMode 프로퍼티가 World일 때만 OverrideSorting을 활성화하도록 제어하는 스크립트를 작성해줘 [answer] | 참고 문서에 따르면 `SpriteGUIRendererComponent`의 `OverrideSorting`은 "SpriteGUIRendererComponent가 World - maps 하위의 엔티티에 추가된 경우에만 활성화됩니다."라고 설명되어 있습니다. 하지만 `UITransformComponent`의 `UIMode` 프로퍼티 값을 직접 읽어 `OverrideSorting`을 프로그램적으로 켜고 끌 수 있는 API나 조건 분기 로직에 대한 구체적인 방법은 문서에 제시되어 있지 않습니다. 따라서 문서에 근거하여 `UIMode` 값에 [followup] | [followup_answer] | [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] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 포탈 사용 시 지정된 WorldId 프로퍼티로 유저를 이동시키고, _UtilLogic:TableToString()으로 직렬화된 데이터를 _TeleportService:WarpUserToWorldAndWait()를 통해 전달하는 Warp 컴포넌트 스크립트를 작성해줘. [answer] | ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId) { local warpDataTable = {} warpDataTable.userId = userId local serializedData = _UtilLogic:TableToString(warpDataTable) _TeleportService:WarpUserToWorldAndWait(userId, s [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 TeleportService의 함수를 활용해 월드에서 다른 월드로 이동할 수 있습니다. # 다른 월드로 이동하기 TeleportService는 월드의 유저를 특정 장소로 이동시킬 때 사용할 수 있을 뿐 아니라, 접속 중인 월드에서 다른 월드로 이동시킬 수 있습니다. 접속 중인 월드와 이동할 월드가 공개 출시된 상태여야 이동이 가능합니다. 이 특성으로 인해 제작 중에는 워프를 테스트할 수 없습니다. | 현재 월드 | 이동할 월드 | 워프 여부 | | --- | --- | --- | | 공개 | 공개 | *

[task] | code [pass] | ⏳ 미판정 [title] | 로그 [question] | `OnUpdate`에서 1초 간격으로 실행 공간(Server)에 "Heartbeat" 정보 로그를 출력하되, `_TimerService`를 사용하여 타이머를 설정하고 `log()` 함수를 이용해 콘솔에 기록하는 스크립트를 작성해줘 [answer] | 요청하신 `_TimerService:SetTimerOnce`를 사용하여 `OnUpdate`에서 1초 간격으로 "Heartbeat" 로그를 출력하는 스크립트는 다음과 같습니다. 참고로 `_TimerService:SetTimerOnce`는 타이머가 만료되면 함수를 **1회만** 실행하므로, 반복 실행을 위해 타이머 콜백 내에서 다시 타이머를 설정하는 재귀 방식을 사용해야 합니다. 또한, 타이머 설정은 `OnBeginPlay`에서 한 번만 초기화하는 것이 일반적이며, `OnUpdate`에서 매 프레임마다 타이머를 설정하면 오류가 발생할 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 콘솔에는 플레이 테스트 도중에 발생한 정보, 경고, 오류 로그가 출력됩니다. | 번호 | 설명 | | :---: | --- | | | 콘솔 창에 남아있는 로그를 삭제합니다. Clear 오른쪽에 확장 버튼을 눌러 Clear on Play를 활성화하고, 시작 버튼을 누르면 콘솔 창에 남아있던 로그를 자동으로 삭제하고 시작합니다. | | | 버튼을 누르면 중복 로그를 하나로 합쳐줍니다. 영역에 합쳐진 총 개수가 나옵니다. | | | 실행 공간(Client / Server) 별로 로그를 모아볼 수 있습니다. | | |

[task] | code [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | 멀티캐스트 스크립트에서 OnUpdate(number delta) 에서 delta 를 누적하여 0.5초마다 PixelRendererComponent:GetPixels 를 호출하여 픽셀 정보의 변화 여부를 확인하고, 변화가 감지되면 PixelRendererComponent:SetAlpha(0.8) 으로 설정하며 변화가 없으면 SetAlpha(1.0) 으로 유지하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `PixelRendererComponent`의 `SetAlpha` 함수와 `ResetWithColors` 함수, 그리고 `GetPixel`, `GetPixels` 함수의 존재에 대한 언급은 있습니다. 그러나 **`GetPixels` 함수의 정확한 매개변수(인자)와 반환 값 형식(픽셀 데이터 배열 구조, 색상 객체 구조 등)에 대한 구체적인 정의가 문서에 포함되어 있지 않습니다.** mLua API 문서에 없는 API의 시그니처나 반환 값을 임의로 추측하여 코드를 작성하는 것은 오류를 유발할 수 있으므로, 현재 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetAlpha` 함수를 활용하면 스프라이트 전체의 알파 값을 변경할 수 있습니다. 예시 코드는 아래와 같습니다. 버튼을 만들고, 함수를 추가한 다음 버튼에 **ButtonClickEvent**를 연결하는 것은 위의 예제와 동일합니다. ```lua [client only] void SetAlphaTest() { local a = _UtilLogic:RandomDouble() -- SetAlpha를 사용하여 스프라이트 전체의 알파 값을 변경합니다. self.Entity.PixelRendererComponent

[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent의 ContentType이 Custom으로 설정되었을 때 LineType과 Input Type은 어떻게 지정하게 되나요? [answer] | ContentType이 `Custom`으로 설정되면, LineType과 Input Type은 사용자가 직접 설정할 수 있습니다. 참고 문서에 따르면 ContentType이 `Custom`일 때 "사용자가 직접 유형(Line Type, Input Type, Keyboard Type, 문자열 검증)을 설정할 수 있습니다"라고 명시되어 있습니다. 구체적인 설정 방법은 다음과 같습니다. 1. **LineType**: `TextInputComponent`의 `LineType` 프로퍼티를 통해 지정합니다. * `SingleL [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>

[task] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | ButtonComponent에는 출력 기능이 없다고 하는데, 실제로 버튼이 눌렸다는 것을 유저에게 시각적으로 알려주기 위해 어떤 컴포넌트를 조합해야 하나요? [answer] | ButtonComponent는 입력 정보만 전달하고 시각적 피드백을 직접 생성하지 않기 때문에, 버튼의 상태 변화에 따라 외관을 바꾸는 컴포넌트를 함께 사용해야 합니다. 문서에 따르면 **SpriteGUIRendererComponent**나 **TextComponent**와 함께 조합하여 유저에게 버튼이 눌렸음을 인지시킬 수 있습니다. 구체적으로 ButtonComponent의 `Transition` 프로퍼티를 설정하여 버튼 상태(Normal, Hover, Pressed, Released, Clicked)에 따른 시각적 전환 방식을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |

[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 포탈을 통해 다른 월드로 이동할 때 데이터를 함께 보내려면 어떤 서비스와 함수를 조합해서 사용해야 하나요? [answer] | 포탈을 통해 다른 월드로 이동하면서 데이터를 함께 보내려면 `_UtilLogic`과 `_TeleportService`를 조합해서 사용해야 합니다. 데이터를 전달하는 과정은 다음과 같습니다. 1. **데이터 직렬화**: 보낼 데이터를 테이블로 구성한 후, `_UtilLogic:TableToString()` 함수를 사용하여 문자열로 변환합니다. 2. **월프 및 데이터 전달**: `_TeleportService:WarpUserToWorldAndWait()` 함수를 호출하여 유저를 지정된 월드 ID로 이동시키고, 변환된 데이터 문 [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] | single_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputEndEditEvent와 TextInputValueChangeEvent는 각각 어떤 상황의 입력 처리에 적합하며, 두 이벤트의 발생 시점 차이는 무엇인가요? [answer] | TextInputEndEditEvent와 TextInputValueChangeEvent는 입력 처리 시점과 목적에 따라 명확하게 구분됩니다. **TextInputEndEditEvent** * **적합한 상황**: 사용자가 입력을 완전히 종료했을 때(예: Enter 키 입력, 입력 영역에서 포커스 해제) 전체 텍스트를 한 번에 처리해야 할 때 적합합니다. * **발생 시점**: 입력이 완료된 시점에 발생합니다. * **용도**: 완전한 문장이나 단어를 받아서 처리하는 로직에 사용합니다. **TextInputValueCh [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>

[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | `WarpUserToWorldAndWait()`로 보낸 데이터를 도착한 월드에서 가져오기 위해 `HandleUserEnterEvent`에서 어떤 순서로 처리해야 하나요? [answer] | `WarpUserToWorldAndWait()`로 보낸 데이터를 도착한 월드에서 가져오려면 `HandleUserEnterEvent` 이벤트 핸들러 내에서 다음 순서로 처리해야 합니다. 1. **이벤트 파라미터에서 `UserId` 추출**: 이벤트 객체(`event`)에서 `UserId` 값을 가져옵니다. 2. **워프 레코드 조회**: `_TeleportService:GetWarpRecord(UserId)` 함수를 호출하여 해당 유저의 이전 워프 기록을 조회합니다. 3. **널 체크 및 반환**: 조회된 레코드(`warpRecor [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] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | UI 엔티티를 구성할 때 필수로 포함해야 하는 컴포넌트와 TransformComponent와의 차이점이 무엇인가요? [answer] | UI 엔티티를 구성할 때 반드시 포함해야 하는 기본 컴포넌트는 **UITransformComponent**입니다. 이 컴포넌트는 **TransformComponent**와 동작 방식이 상당히 유사하지만, 좌표 시스템에서 차이가 있습니다. TransformComponent가 월드 좌표를 사용하는 반면, UITransformComponent는 **스크린 좌표**에서 동작합니다. [followup] | UI 좌표 설정 시 Anchor Presets가 어떻게 Property에 영향을 주는지, 그리고 World - maps 하위에서 OverrideSorting가 활성화되는 조건을 구체적으로 알려주세요. [followup_answer] | ### 1. Anchor Presets와 UI 좌표 Property UITransformComponent의 UI 좌표는 UI의 위치를 설정하는 역할을 하며, 이 때 사용되는 구체적인 Property는 UI 에디터 왼쪽의 **Anchor Presets** 설정에 따라 달라집니다. 참고 문서에는 Anchor Presets의 구체적인 값(예: TopLeft, Center 등)이 어떤 Property(예: anchoredPosition, offsetMin 등)로 매핑되는지 상세한 매핑 표는 제공되지 않습니다. 다만, Anchor Pre [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] | code [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 공개 출시된 상태의 다른 월드 ID로 유저를 이동시키기 위해 _TeleportService:WarpUserToWorldAndWait() 함수를 사용하되, 이동 대상 월드 ID를 프로퍼티 에디터에서 설정할 수 있도록 [Sync] 속성을 가진 WorldId 프로퍼티를 정의하는 스크립트를 작성해줘. [answer] | 사용자가 포탈을 통해 다른 월드로 이동할 수 있도록 `Warp` 컴포넌트 스크립트를 작성했습니다. 요청하신 대로 `[Sync]` 속성이 있는 `WorldId` 프로퍼티를 정의하여 프로퍼티 에디터에서 월드 ID를 설정할 수 있게 구성했으며, 포탈 사용 이벤트 발생 시 `_TeleportService:WarpUserToWorldAndWait()`를 호출하도록 구현했습니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId) { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 TeleportService의 함수를 활용해 월드에서 다른 월드로 이동할 수 있습니다. # 다른 월드로 이동하기 TeleportService는 월드의 유저를 특정 장소로 이동시킬 때 사용할 수 있을 뿐 아니라, 접속 중인 월드에서 다른 월드로 이동시킬 수 있습니다. 접속 중인 월드와 이동할 월드가 공개 출시된 상태여야 이동이 가능합니다. 이 특성으로 인해 제작 중에는 워프를 테스트할 수 없습니다. | 현재 월드 | 이동할 월드 | 워프 여부 | | --- | --- | --- | | 공개 | 공개 | *

[task] | single_turn [pass] | ⏳ 미판정 [title] | Callback [question] | 동기 방식으로 코드를 작성하면 전체 로직 처리 시간이 길어지는 이유가 무엇인가요? [answer] | 동기 방식은 이전 작업이 완전히 종료될 때까지 대기한 후에야 다음 작업을 시작하는 순차적 처리 방식을 따르기 때문에, 전체 로직 처리 시간이 길어집니다. 특정 작업의 실제 계산 시간보다 외부 데이터 주고받기나 I/O 처리 등 외부 요인으로 인해 시간이 더 오래 소요되는 경우가 있습니다. 이러한 지연 시간이 있는 작업을 동기 방식으로 처리하면, 지연 시간이 발생한 작업이 끝날 때까지 다른 모든 로직이 멈춰 있게 됩니다. 따라서 작업들의 지연 시간이 모두 합산되어 전체 처리 시간이 비동기 방식보다 길어지게 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다

[task] | single_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | `GetWarpRecord(UserId)` 호출 후 `nil`을 반환받아 함수가 종료되는 경우, 주로 어떤 상황이나 오류에서 발생하는 것일까요? [answer] | `_TeleportService:GetWarpRecord(UserId)` 호출 후 `nil`을 반환받아 함수가 종료되는 경우는, 해당 유저가 **이전 월드에서 데이터를 전달하며 워프해 온 기록이 존재하지 않을 때** 발생합니다. 구체적으로 다음과 같은 상황에서 `nil`이 반환됩니다. 1. **데이터 없이 워프한 경우:** * 이전 월드에서 `_TeleportService:WarpUserToWorldAndWait()`를 호출할 때, 전달할 데이터(`warpData`)를 생성하거나 전달하지 않았거나, 빈 데이터를 전달 [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] | 기본 UI 컴포넌트 [question] | ButtonComponent 의 ButtonStateChangeEvent 를 처리하여 버튼의 상태가 Pressed 일 때 TextComponent 의 FontColor 를 빨간색으로, Normal 일 때 흰색으로 변경하는 스크립트를 작성해줘 [answer] | 사용자가 요청한 `ButtonStateChangeEvent` 처리와 `TextComponent`의 `FontColor` 변경을 위한 스크립트입니다. 참고 문서에 따르면, `ButtonComponent`는 `ButtonStateChangeEvent` 이벤트를 발생시키며, `ButtonState` 열거형(enum)으로 `Normal`, `Pressed` 등의 상태를 확인할 수 있습니다. 또한 `TextComponent`의 `FontColor` 프로퍼티를 통해 색상(투명도 포함)을 설정할 수 있습니다. 아래 스크립트는 UI 엔티티에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |

[task] | single_turn [pass] | ⏳ 미판정 [title] | Callback [question] | DataStorage API를 사용할 때 동기 방식과 비동기 방식을 어떻게 구별해서 선택해야 하는지 궁금합니다. [answer] | DataStorage API를 사용할 때 동기 방식과 비동기 방식을 구별하여 선택하는 기준은 함수명의 어미를 확인하는 것입니다. * **동기 방식(Synchronous)**: 함수명에 **`Wait`** 가 붙어 있습니다. * 이전 작업이 끝날 때까지 대기하고, 작업이 완료된 후 다음 로직을 순차적으로 진행합니다. * 작업 완료 시점을 정확히 알고, 그 직후의 데이터를 바로 사용해야 할 때 적합합니다. * **비동기 방식(Asynchronous)**: 함수명에 **`Async`** 가 붙어 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다

[task] | code [pass] | ⏳ 미판정 [title] | 스프라이트 색상을 픽셀 단위로 설정하기 [question] | 클라이언트 스크립트에서 TouchEvent 를 수신하여 터치된 좌표의 픽셀 색상을 PixelRendererComponent:GetPixel 로 조회하고, 해당 색상의 알파 값이 0.5 이상이면 스프라이트 전체를 PixelRendererComponent:SetAlpha(1.0) 으로 설정하고 0.5 미만이면 SetAlpha(0.3) 으로 변경하는 스크립트를 작성해줘 [answer] | 사용자가 요청한 로직은 `TouchEvent`를 수신하여 터치 좌표의 픽셀 색상을 조회하고, 해당 색상의 알파 값에 따라 스프라이트 전체의 알파를 변경하는 것입니다. 참고 문서를 분석하면 다음과 같은 사실들을 확인할 수 있습니다. 1. `SetAlpha` 함수를 사용하여 스프라이트 전체의 알파 값을 변경할 수 있으며, `self.Entity.PixelRendererComponent:SetAlpha(value)` 형태로 호출합니다. 2. `GetPixel` 함수를 사용하여 픽셀의 위치와 색상을 받아올 수 있다고 명시되어 있습니다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetAlpha` 함수를 활용하면 스프라이트 전체의 알파 값을 변경할 수 있습니다. 예시 코드는 아래와 같습니다. 버튼을 만들고, 함수를 추가한 다음 버튼에 **ButtonClickEvent**를 연결하는 것은 위의 예제와 동일합니다. ```lua [client only] void SetAlphaTest() { local a = _UtilLogic:RandomDouble() -- SetAlpha를 사용하여 스프라이트 전체의 알파 값을 변경합니다. self.Entity.PixelRendererComponent

[task] | two_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 포탈을 통해 다른 월드로 유저를 이동시키면서 데이터를 함께 전달하려면 어떻게 작성해야 하는가? [answer] | 포탈을 통해 다른 월드로 유저를 이동시키면서 데이터를 함께 전달하려면, 포탈에 스크립트 컴포넌트를 추가하여 `PortalUseEvent`를 처리하고 `_TeleportService:WarpUserToWorldAndWait()` 함수를 사용해야 합니다. 전달할 데이터는 `_UtilLogic:TableToString()`으로 문자열로 변환하여 전송하고, 도착한 월드에서는 `UserEnterEvent`를 통해 `_TeleportService:GetWarpRecord()`로 데이터를 받아 `_UtilLogic:StringToTable()` [followup] | `WarpUserToWorldAndWait()` 호출 시 전달할 데이터를 `UtilLogic`으로 변환하는 구체적인 코드 예시를 보여주세요. [followup_answer] | `WarpUserToWorldAndWait()` 호출 시 전달할 데이터를 변환하는 구체적인 코드는 출발 월드에 있는 포탈 스크립트 컴포넌트의 `Warp` 메서드 내에 포함되어 있습니다. 다음은 테이블 형태의 데이터를 문자열로 변환하여 `_TeleportService:WarpUserToWorldAndWait()`에 전달하는 코드 예시입니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId) { -- 1. 전달할 데이터를 [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] | 기본 UI 컴포넌트 [question] | ButtonComponent 의 ButtonPressedEvent 가 발생할 때마다 TextComponent 의 FontSize 를 10 증가시키고 100 을 초과하면 10 으로 초기화하는 스크립트를 작성해줘 [answer] | ButtonComponent의 `ButtonPressedEvent`를 감지하여 TextComponent의 `FontSize`를 조절하는 로직을 구현하기 위한 스크립트입니다. 참고 문서에 따르면 `ButtonComponent`는 `ButtonPressedEvent`를 지원하며, `TextComponent`에는 `FontSize` 프로퍼티가 존재합니다. ```lua Property: [None] TextComponent TargetText = nil Method: [client only] void OnBeginPlay() { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |

[task] | two_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 전 세계로 이동한 후, 이전 월드에서 전달한 데이터를 어떻게 받아와서 활용할 수 있는가? [answer] | 전 세계로 이동한 후, 이전 월드에서 전달한 데이터를 받아와서 활용하려면 **도착한 월드**에 스크립트를 작성하여 `UserService`의 `UserEnterEvent`를 처리해야 합니다. 구체적인 절차는 다음과 같습니다. 1. **스크립트 컴포넌트 생성 및 배치**: * 새로운 스크립트 컴포넌트를 생성합니다. * 해당 컴포넌트를 **Common**에 추가해야 합니다. (Common에 추가해야 해당 월드에 입장하는 모든 유저에 대해 이벤트가 처리됩니다.) 2. **데이터 수신 로직 구현**: [followup] | `HandleUserEnterEvent`에서 `GetWarpRecord`로 받은 데이터를 테이블로 변환하여 특정 값을 출력하는 코드 블록을 작성해 주세요. [followup_answer] | ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: UserService -- Space: Server --------------------------------------------------------- -- Parameters [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] | 월드 워프하기 [question] | 다른 월드에서 전달받은 warpRecord 데이터를 파싱하여 특정 키 값이 "secret"일 때만 로그에 출력하는 유저 입장 처리 스크립트를 작성해줘. (GetWarpRecord, StringToTable, UserEnterEvent) [answer] | 요청하신 조건에 따라, 다른 월드에서 전달받은 `warpRecord` 데이터를 파싱하여 특정 키 값이 "secret"일 때만 로그를 출력하는 스크립트는 다음과 같습니다. ```lua Event Handler: [server only] [service: UserService] HandleUserEnterEvent(UserEnterEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: UserService -- Spac [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] | 월드 워프하기 [question] | 포탈을 사용했을 때 "welcome"이라는 문자열을 데이터로 담아 지정된 WorldId 로 유저를 이동시키는 스크립트를 작성해줘. (WarpUserToWorldAndWait, UtilLogic, PortalUseEvent) [answer] | 포탈 사용 시 "welcome" 문자열을 데이터로 변환하여 지정된 WorldId로 유저를 이동시키는 스크립트입니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId) { local warpDataTable = {} warpDataTable.message = "welcome" local warpData = _UtilLogic:TableToString(warpDataTable) _Te [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] | two_turn [pass] | ⏳ 미판정 [title] | 월드 워프하기 [question] | 포탈 사용 이벤트에서 유저를 워프할 때 `self.WorldId` 프로퍼티와 `event.PortalUser` 정보를 어떻게 조합하여 서버 측 메서드를 호출하는가? [answer] | 포탈 사용 이벤트(`HandlePortalUseEvent`)는 클라이언트 공간에서 발생하지만, 유저를 다른 월드로 이동시키는 워프 로직은 서버에서 처리해야 합니다. 따라서 포탈 이벤트 핸들러는 서버에서 실행되는 메서드를 호출하는 역할만 담당하고, 실제 워프 처리는 서버 메서드 내에서 `self.WorldId`와 `event.PortalUser` 정보를 조합하여 수행합니다. 구체적인 조합 방식은 다음과 같습니다. 1. **이벤트 핸들러 (`HandlePortalUseEvent`)**: * `event.PortalUse [followup] | 클라이언트 공간의 `HandlePortalUseEvent`에서 서버 메서드 `Warp()`를 호출하는 정확한 이벤트 핸들러 코드 구조를 알려주세요. [followup_answer] | 클라이언트 공간에서 발생하는 `HandlePortalUseEvent`에서 서버 메서드 `Warp()`를 호출하는 정확한 이벤트 핸들러 코드 구조는 다음과 같습니다. ```lua Event Handler: [self] HandlePortalUseEvent(PortalUseEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: PortalComponent -- Space: Client --------------- [scores] | [judge_reason] | [source_doc] | 유저의 데이터를 이동할 월드로 전달할 수 있습니다. 1. 새로운 스크립트 컴포넌트를 생성합니다. 2. 맵에 포탈을 추가한 뒤, 만든 스크립트 컴포넌트를 포탈에 추가합니다. 3. 아래와 같이 `WarpUserToWorldAndWait()`와 `UtilLogic`을 활용해 다른 월드에 데이터를 전달할 수 있게 작성합니다. ```lua Property: [Sync] string WorldId = "" Method: [server] void Warp(string userId)

[task] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | SpriteGUIRendererComponent의 Type을 Tiled로 설정했을 때 발생할 수 있는 성능 부하 원인과 이를 해결하기 위한 ImageRUID 리소스 설정 조건은 무엇인가요? [answer] | SpriteGUIRendererComponent의 `Type`을 **Tiled**로 설정하면 동일한 이미지를 타일처럼 반복 출력하게 됩니다. 이때 UI의 크기 대비 `ImageRUID`로 설정한 리소스의 크기가 너무 작으면 타일 개수가 과도하게 증가하여 성능 부하가 발생합니다. 이러한 성능 부하를 줄이기 위해 `ImageRUID` 리소스를 다음과 같이 설정해야 합니다. 1. **랩 모드(Lap Mode) 설정**: 리소스의 랩 모드를 **Repeat**로 설정합니다. Repeat로 설정된 이미지는 크기에 영향을 받지 않고 Ti [followup] | 리소스의 Border 값이 필요하거나 아틀라스에 포함되어야 하는 경우 Tiled 성능을 최적화하기 위한 대안 코드를 작성해 주세요. [followup_answer] | 참고 문서에 따르면, 리소스의 Border 값이 필요하거나 아틀라스에 포함되어야 하는 경우 Repeat 모드의 부하 절감 효과가 적용되지 않으므로, **이미지를 더 큰 크기로 교체**하여 실제 출력되는 타일 개수를 줄이는 것이 권장되는 최적화 방법입니다. mLua는 에디터에서 리소스(ImageRUID)를 선택하고 설정하는 것이 주된 방식이며, 스크립트 코드만으로 "이미지 리소스 자체의 픽셀 크기를 변경"하거나 "아틀라스 포함 여부를 변경"하는 API는 제공되지 않습니다. 따라서 성능 최적화를 위한 실제 작업은 에디터에서 수행되어야 [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] | Callback [question] | Callback 함수 내부에서 `log`를 호출하는 코드 블록만 출력하고, `self` 참조 오류를 방지하기 위한 팁은 주석으로만 작성하세요. [answer] | ```lua local callBack = function (errorcode, key) -- Tip: Component의 Function을 Callback으로 사용할 때는 self:function()이 아닌 self.function()을 사용해야 합니다. log("Power is saved") end ``` [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] | single_turn [pass] | ⏳ 미판정 [title] | Callback [question] | SetTimerRepeat에서 Callback로 지정된 함수가 실행되는 주기와 타이밍은 어떻게 결정되나요? [answer] | `_TimerService:SetTimerRepeat`에서 Callback로 지정된 함수가 실행되는 주기와 타이밍은 함수 호출 시 전달하는 인자로 결정됩니다. 참고 문서의 예제를 보면 다음과 같이 사용됩니다: ```lua local timerId = _TimerService:SetTimerRepeat(callBack, 3, 2) ``` 또는: ```lua self.TimerId = _TimerService:SetTimerRepeat(callBack, 3) ``` 여기서 `SetTimerRepeat` 함수의 시그니처는 명시되 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다

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