[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 이름표 붙이기 [question] | 엔티티가 생성될 때 OnBeginPlay 에서 NameTagComponent.Name 이 Null 이면 "이름 없는 고양이"로, 아니면 현재 이름을 유지하도록 초기화하는 스크립트를 작성해줘 [answer] | 요청하신 로직을 구현한 스크립트입니다. `OnBeginPlay` 생명주기 메서드에서 `NameTagComponent.Name`의 값이 `nil` (문서상 Null)인 경우에만 기본값을 설정하고, 이미 값이 있는 경우 변경하지 않도록 작성했습니다. ```lua Method: [server only] void OnBeginPlay() { local nametag = self.Entity.NameTagComponent if nametag.Name == nil then nametag.Name = "이름 없는 고양이" end [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 사물을 구분하는 효과적인 방법은 이름을 붙이는 것입니다. 이름표를 이용해 오브젝트와 NPC를 구분하거나, 유저를 구분할 수 있습니다. NameTagComponent 사용 방법과 활용 예시를 소개합니다. # 이름표 붙이기 엔티티를 선택하고 **NameTagComponent**를 추가합니다. 프로퍼티 값을 변경해 원하는 이름표를 만듭니다. NameTagComponent 프로퍼티 구성은 다음과 같습니다. | 이름 | 설명 | | --- | --- | | FontColor | 글씨 색상을 변경합니다. 색상 변
[task] | code [pass] | ⏳ 미판정 [title] | MaterialService [question] | _UIService 로 화면 좌표를 계산하고, _MaterialService:ChangeMaterialProperty 를 통해 카메라 중심이 아닌 지정된 UI 좌표로 머티리얼 효과를 이동시키는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `_UIService`에 대한 정보가 없습니다. 문서에 언급된 UI 관련 기능은 `_UILogic` (예: `WorldToScreenPosition`, `ScreenWidth`, `ScreenHeight`) 와 `UITransfromComponent` (예: `anchoredPosition`) 입니다. 따라서 요청하신 `_UIService`를 사용하여 좌표를 계산하는 코드를 작성할 수 없습니다. 대신, 문서에 존재하는 `_UILogic`과 `UITransfromComponent`를 활용하여, **UI 컴포넌트 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 머티리얼 프로퍼티를 제어하는 기능을 제공합니다. # Methods - **void ChangeMaterialProperty(string entryId, Dictionary<string, any> changeProperty) [ClientOnly]** entryId에 해당하는 머티리얼의 프로퍼티를 변경합니다. changeProperty의 key는 프로퍼티 이름, value는 프로퍼티 값입니다. ##### inherited from Service: - **EventHandlerBase ConnectEvent(string ke
[task] | single_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | SetTimerRepeat에서 startDelaySeconds와 intervalSeconds 값이 같을 경우 최초 실행 시점은 언제인가요? [answer] | `SetTimerRepeat()`에서 `startDelaySeconds`와 `intervalSeconds`의 값이 같다면, **액션이 최초 실행되는 시점은 예약 호출 후 `startDelaySeconds` 값만큼의 시간이 지난 직후**입니다. 구체적인 동작 방식은 다음과 같습니다. 1. **최초 실행:** `SetTimerRepeat()`가 호출된 후 `startDelaySeconds`가 지정된 시간(예: 3초)이 지난 시점에 액션이 **최초로 한 번** 실행됩니다. 2. **반복 실행:** 최초 실행 이후에는 `interv [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetTimerOnce()`는 `SetTimer()`의 isRepeat를 false로 설정한 것과 동일하게 작동합니다. 예약 성공 시 integer 타입의 타이머의 id를 반환하고, 예약 실패 시 0을 반환합니다. 매개 변수는 다음과 같습니다. | 타입 | 매개 변수 | 설명 | | --- | ------ | --- | | func | callback | 몇 초 뒤 수행할 액션을 CallBack 형태로 넘겨줍니다. | | float | delaySeconds | 액션을 예약한 뒤 몇 초 후에 액션을 실행할 것인지를 설정합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | `ClearTimer()` 호출 시점을 권장하는 이유와 자동 취소 메커니즘을 3문장 이내로 요약하세요. [answer] | 예약된 액션이 과도하게 누적되면 월드 성능이 하락할 수 있으므로 컴포넌트나 로직의 `OnEndPlay` 시점에 `ClearTimer()`를 호출하는 것이 권장됩니다. 크리에이터가 명시적으로 취소하지 않더라도 예약된 액션의 소유자가 파괴되면 월드 최적화를 위해 시스템이 내부적으로 `ClearTimer()`를 자동으로 시도합니다. 따라서 수동 취소는 성능 저하를 방지하고, 자동 취소는 누락된 타이머가 메모리에 잔존하는 것을 막는 안전장치 역할을 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetTimerOnce()`와 `SetTimerRepeat()`는 예약한 액션을 취소할 수 있습니다. 예약한 액션을 취소할 때는 `ClearTimer()` 함수를 활용합니다. 아래의 예제처럼 10초 뒤 액션 실행을 취소할 수 있습니다. ```lua Method: [server only] void OnBeginPlay() { local callBack = function() log("CallBack! :"..tostring(os.date())) end log("SetTimer! :"
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | Remove Component를 클릭하는 단계별 과정을 3단계 번호 목록으로 작성하세요. [answer] | 1. **Workspace - BaseEnvironment - NativeModel - Player**를 선택합니다. 2. 모델 프로퍼티 창에서 삭제하고 싶은 컴포넌트를 선택합니다. 3. 콘텍스트 메뉴를 열어 **Remove Component**를 클릭합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 모델 프로퍼티 비활성화하기 크리에이터의 의도에 따라 필요 없는 모델 프로퍼티를 비활성화 할 수 있습니다. 예를 들어, **NameTag**을 사용하고 싶지 않다면, 프로퍼티 에디터에서 **NameTagComponent**의 **Enable** 체크를 해제합니다. # DefaultPlayer의 기본 컴포넌트 삭제하기 기본 컴포넌트를 확장한 컴포넌트를 제작해 사용한다면, **DefaultPlayer**의 기본 컴포넌트를 삭제해야 합니다. 근본이 같은 컴포넌트가 여러 개 있으면 오동작 가능성이 커지기 때문에 기본적으로 하나의 컴
[task] | single_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | SetTimerOnce와 SetTimerRepeat의 매개변수 개수와 역할이 어떻게 다른지 비교해 줄 수 있나요? [answer] | `SetTimerOnce`와 `SetTimerRepeat`는 모두 `_TimerService`에서 제공하는 타이머 예약 메서드이지만, 실행 방식에 따라 매개변수의 개수와 역할이 다릅니다. ### 1. 매개변수 비교 | 메서드 | 매개변수 개수 | 매개변수 목록 | | :--- | :---: | :--- | | **SetTimerOnce** | 2개 | `callback`, `delaySeconds` | | **SetTimerRepeat** | 3개 | `callback`, `intervalSeconds`, `startDelayS [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetTimerOnce()`는 `SetTimer()`의 isRepeat를 false로 설정한 것과 동일하게 작동합니다. 예약 성공 시 integer 타입의 타이머의 id를 반환하고, 예약 실패 시 0을 반환합니다. 매개 변수는 다음과 같습니다. | 타입 | 매개 변수 | 설명 | | --- | ------ | --- | | func | callback | 몇 초 뒤 수행할 액션을 CallBack 형태로 넘겨줍니다. | | float | delaySeconds | 액션을 예약한 뒤 몇 초 후에 액션을 실행할 것인지를 설정합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | 문서 예제에서 `timerId`가 0인 경우와 아닌 경우의 처리 흐름을 단계별 번호 목록으로 정리하세요. [answer] | `SetTimerRepeat()` 함수가 반환하는 `timerId` 값에 따라 처리 흐름은 다음과 같습니다. 1. **`timerId`가 0인 경우 (예약 실패)** * 예약이 실패했으므로 즉시 함수를 종료합니다(`return`). * 이후 `cancelCallBack` 정의 및 `SetTimerOnce()` 호출 로직은 실행되지 않습니다. 2. **`timerId`가 0이 아닌 경우 (예약 성공)** * 예약이 성공했으므로 처리를 계속 진행합니다. * `timerId` 변수를 인자 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetTimerOnce()`와 `SetTimerRepeat()`는 예약한 액션을 취소할 수 있습니다. 예약한 액션을 취소할 때는 `ClearTimer()` 함수를 활용합니다. 아래의 예제처럼 10초 뒤 액션 실행을 취소할 수 있습니다. ```lua Method: [server only] void OnBeginPlay() { local callBack = function() log("CallBack! :"..tostring(os.date())) end log("SetTimer! :"
[task] | two_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | _TimerService:SetTimer()와 SetTimerOnce()의 차이점과 어떤 상황에서 각각을 사용하는 것이 적합한지 알려주세요. [answer] | `_TimerService:SetTimer()`와 `_TimerService:SetTimerOnce()`의 차이점과 적합한 사용 상황은 다음과 같습니다. ### 1. 차이점 **`_TimerService:SetTimer()`** * **기능:** 액션을 1회 또는 반복으로 예약할 수 있는 **기본(모두 포함) 기능**을 제공합니다. * **매개변수:** 전달할 매개변수가 많아 비교적 복잡합니다. * `self`: 스크립트 인스턴스 * `callBack`: 실행할 함수 * `delay`: 대 [followup] | SetTimer()로 예약한 반복 타이머를 특정 조건에서 취소하고 싶을 때 ClearTimer()를 호출하는 구체적인 코드 예시를 작성해 주세요. [followup_answer] | `_TimerService:SetTimer()`로 예약한 반복 타이머를 특정 조건에서 취소하려면, 먼저 `SetTimer()` 호출 시 반환되는 `timerId`를 저장하고, 취소하고 싶은 시점에 `_TimerService:ClearTimer(timerId)`를 호출하면 됩니다. 아래는 스위치를 Off했을 때 3초 후 문이 열리는 예약을 취소하는 구체적인 코드 예시입니다. ```lua Property: [None] integer DoorTimerId = 0 Method: [server only] void OnBeginPlay( [scores] | [judge_reason] | [source_doc] | `SetTimer()`를 통해 특정 액션을 수행하도록 예약을 만들었지만, 특정 조건에 의해 해당 예약을 취소해야 하는 경우가 빈번히 발생합니다. 게임 내에서 스위치를 On 했을 때 3초 후 문이 열리는 장치를 만들었다고 가정해 봅시다. 유저가 스위치를 On 상태로 만들었을 때 3초 뒤에 문이 열리게 됩니다. 문이 열리는 액션을 `SetTimer()`를 이용해 예약했기 때문입니다. 그러나 유저가 문이 열리기 전에 스위치를 Off 상태로 만든다면 `SetTimer()`의 예약을 취소해 Off일 때 문이 열리지 않게 만들어야 합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | DefaultPlayer의 기본 컴포넌트를 삭제해야 하는 이유와 권장 사항을 표로 정리해서 출력하세요. [answer] | DefaultPlayer의 기본 컴포넌트를 삭제해야 하는 이유와 권장 사항은 다음과 같습니다. | 구분 | 내용 | | :--- | :--- | | **삭제 이유** | 기본 컴포넌트를 확장한 컴포넌트를 제작해 사용할 때, 근본이 같은 컴포넌트가 여러 개 존재하면 오동작 가능성이 커지기 때문입니다. | | **권장 사항** | 하나의 컴포넌트만 사용하는 것을 권장합니다. | | **비활성화 주의** | 단순히 비활성화만 하는 것은 권장하지 않습니다. 컴포넌트 동작 방식이 각각 달라 스크립트 작성 중 컴포넌트 명이 헷갈리거나, 작성 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 모델 프로퍼티 비활성화하기 크리에이터의 의도에 따라 필요 없는 모델 프로퍼티를 비활성화 할 수 있습니다. 예를 들어, **NameTag**을 사용하고 싶지 않다면, 프로퍼티 에디터에서 **NameTagComponent**의 **Enable** 체크를 해제합니다. # DefaultPlayer의 기본 컴포넌트 삭제하기 기본 컴포넌트를 확장한 컴포넌트를 제작해 사용한다면, **DefaultPlayer**의 기본 컴포넌트를 삭제해야 합니다. 근본이 같은 컴포넌트가 여러 개 있으면 오동작 가능성이 커지기 때문에 기본적으로 하나의 컴
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | Player 모델의 프로퍼티 값을 수정한 후 변경 사항을 바로 확인하려면 어떤 버튼을 눌러야 하나요? [answer] | **[시작]** 버튼을 눌러야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 동시에 출발해 목표 지점까지 오르는 게임을 시작할 때 누군가는 한 번에 4칸을 오르고, 다른 누구는 2칸을 오른다면 함께 게임을 즐길 수 없을 것입니다. 게임을 처음 시작할 때 만큼은 동일한 환경에서 시작하는 게 중요합니다. 모델 프로퍼티를 이용해 속성을 편집하는 방법을 알아봅니다. # 플레이어 기본 속성 변경 **Player** 모델에서 기본 속성을 변경할 수 있습니다. 1. **Workspace - BaseEnvironment - NativeModel - Player**를 선택합니다. 2. **Play
[task] | single_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | 예시 코드에서 self를 첫 번째 인자로 전달하는 이유는 무엇이며, 이 값을 생략하거나 다른 엔티티로 전달했을 때 발생할 수 있는 오류나 동작 이상에 대해 설명해 주세요. [answer] | 제시된 참고 문서에는 `_TimerService:SetTimer()` 메서드의 첫 번째 인자로 `self`를 전달하는 **기술적인 이유**나, 해당 값을 생략하거나 다른 엔티티로 전달했을 때 발생하는 **구체적인 오류 메시지나 동작 이상**에 대한 설명이 포함되어 있지 않습니다. 문서에는 오직 `_TimerService:SetTimer(self, callBack, ...)` 형태로 `self`를 전달하는 예제 코드만 제시되어 있을 뿐, 파라미터의 역할에 대한 명시적인 정의는 없습니다. 따라서 문서 근거만으로 이 질문에 대한 정확한 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | isRepeat을 true로 변경해 반복 실행하게 만듭니다. `SetTimer()`가 호출될 때 "SetTimer!"라는 문자열과 함께 해당 코드가 실행된 시간을 출력합니다. 예시 코드는 다음과 같습니다. 3초마다 `SetTimer()`로 넘긴 CallBack 함수가 호출될 때 "CallBack!"이라는 문자열과 함께 코드가 실행된 시간을 출력합니다. ```lua Method: [server only] void OnBeginPlay() { local callBack = function() log("Ca
[task] | single_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | SetTimer를 [client only] 스크립트에서 호출했을 때와 [server only]에서 호출했을 때의 차이점과, 멀티플레이 환경에서 동기화 문제를 피하기 위해 어떤 실행 공간을 권장하는지 알려 주세요. [answer] | 제공된 참고 문서에는 `_TimerService`의 `SetTimer()`, `SetTimerOnce()`, `SetTimerRepeat()`, `ClearTimer()` 메서드의 사용법과 매개 변수 의미(intervalSeconds, startDelaySeconds, isRepeat)가 설명되어 있습니다. 그러나 **`[client only]` 스크립트와 `[server only]` 스크립트에서 호출했을 때의 동작 차이**나 **멀티플레이 환경에서의 동기화 문제 및 권장 실행 공간**에 대한 정보는 참고 문서에 포함되어 있지 않 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | isRepeat을 true로 변경해 반복 실행하게 만듭니다. `SetTimer()`가 호출될 때 "SetTimer!"라는 문자열과 함께 해당 코드가 실행된 시간을 출력합니다. 예시 코드는 다음과 같습니다. 3초마다 `SetTimer()`로 넘긴 CallBack 함수가 호출될 때 "CallBack!"이라는 문자열과 함께 코드가 실행된 시간을 출력합니다. ```lua Method: [server only] void OnBeginPlay() { local callBack = function() log("Ca
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | Workspace에서 Player 모델을 정확히 찾으려면 어떤 경로로 진입해야 하나요? [answer] | Workspace에서 Player 모델을 찾으려면 **BaseEnvironment - NativeModel - Player** 경로로 진입해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 동시에 출발해 목표 지점까지 오르는 게임을 시작할 때 누군가는 한 번에 4칸을 오르고, 다른 누구는 2칸을 오른다면 함께 게임을 즐길 수 없을 것입니다. 게임을 처음 시작할 때 만큼은 동일한 환경에서 시작하는 게 중요합니다. 모델 프로퍼티를 이용해 속성을 편집하는 방법을 알아봅니다. # 플레이어 기본 속성 변경 **Player** 모델에서 기본 속성을 변경할 수 있습니다. 1. **Workspace - BaseEnvironment - NativeModel - Player**를 선택합니다. 2. **Play
[task] | code [pass] | ⏳ 미판정 [title] | MaplePreferencesLogic [question] | _MaplePreferencesLogic 의 JumpSound 와 DeathSound 속성을 OnBeginPlay 시 설정하고, ConnectEvent 로 이벤트 키를 연결하여 이벤트가 발생할 때마다 SendEvent 를 호출하여 이벤트를 재전송하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `_MaplePreferencesLogic` 의 `JumpSound`, `DeathSound` 속성과 `Logic` 에서 상속되는 `ConnectEvent`, `SendEvent` 메서드의 존재만 확인됩니다. 하지만 **구체적으로 연결할 이벤트 키(string)의 이름**이나, 해당 이벤트가 발생했을 때 `SendEvent` 에 전달할 `EventType` 객체를 생성하는 구체적인 API (예: `CreateEvent` 등)는 문서에 명시되어 있지 않습니다. 따라서 질문하신 내용을 정확히 구현하기 위해 **연 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ##### inherited from Logic: - **EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다. - **EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)** 이벤트를 연결합니다. 이 서비스에서 타입이
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | `SetTimerRepeat()`로 예약한 반복 액션을 10초 후 취소하는 로직을 `OnBeginPlay`와 `OnEndPlay`를 포함해 코드 블록 하나로만 작성하세요. [answer] | `SetTimerRepeat()`로 예약한 반복 액션을 10초 후 자동으로 취소하고, 컴포넌트가 종료될 때에도 안전하게 타이머를 정리하는 로직을 하나의 코드 블록으로 작성했습니다. ```lua Property: [None] integer TimerId = 0 integer CancelTimerId = 0 Method: [server only] void OnBeginPlay() { local repeatCallBack = function() log("Repeat Action! :"..tostring(os.da [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetTimerOnce()`와 `SetTimerRepeat()`는 예약한 액션을 취소할 수 있습니다. 예약한 액션을 취소할 때는 `ClearTimer()` 함수를 활용합니다. 아래의 예제처럼 10초 뒤 액션 실행을 취소할 수 있습니다. ```lua Method: [server only] void OnBeginPlay() { local callBack = function() log("CallBack! :"..tostring(os.date())) end log("SetTimer! :"
[task] | single_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | SetTimerOnce와 SetTimerRepeat을 별도로 제공한 이유는 무엇이며, SetTimer를 직접 사용하는 것과의 차이점이 있나요? [answer] | `SetTimerOnce`와 `SetTimerRepeat`를 별도로 제공한 주된 이유는 **사용 목적에 따른 명확한 구분**과 **코드 작성의 간편함**입니다. 1. **사용 목적에 따른 분리:** * `SetTimerOnce()`: 액션을 **1회만** 실행할 필요가 있을 때 사용합니다. * `SetTimerRepeat()`: 액션을 **반복적으로** 실행할 필요가 있을 때 사용합니다. * 이러한 기능적 분리를 통해 개발자가 의도를 명확히 표현할 수 있으며, 버그 발생 가능성을 줄여줍니다. 2 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetTimer()`를 통해 특정 액션을 수행하도록 예약을 만들었지만, 특정 조건에 의해 해당 예약을 취소해야 하는 경우가 빈번히 발생합니다. 게임 내에서 스위치를 On 했을 때 3초 후 문이 열리는 장치를 만들었다고 가정해 봅시다. 유저가 스위치를 On 상태로 만들었을 때 3초 뒤에 문이 열리게 됩니다. 문이 열리는 액션을 `SetTimer()`를 이용해 예약했기 때문입니다. 그러나 유저가 문이 열리기 전에 스위치를 Off 상태로 만든다면 `SetTimer()`의 예약을 취소해 Off일 때 문이 열리지 않게 만들어야 합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | Player 모델의 프로퍼티 명칭이 변경되는 경우가 있는데, 이 때를 구분하기 위해 어떤 주의를 기울여야 하나요? [answer] | 여러 프로퍼티를 참조할 경우 정확한 구분을 위해 모델 프로퍼티 명칭이 변경된 경우가 있습니다. 따라서 Player 모델의 프로퍼티를 사용하거나 수정할 때, 현재 최신 명칭과 구형 명칭이 혼재되어 있을 수 있으므로 정확한 프로퍼티 이름을 확인하는 주의를 기울여야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 동시에 출발해 목표 지점까지 오르는 게임을 시작할 때 누군가는 한 번에 4칸을 오르고, 다른 누구는 2칸을 오른다면 함께 게임을 즐길 수 없을 것입니다. 게임을 처음 시작할 때 만큼은 동일한 환경에서 시작하는 게 중요합니다. 모델 프로퍼티를 이용해 속성을 편집하는 방법을 알아봅니다. # 플레이어 기본 속성 변경 **Player** 모델에서 기본 속성을 변경할 수 있습니다. 1. **Workspace - BaseEnvironment - NativeModel - Player**를 선택합니다. 2. **Play
[task] | code [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | 5초마다 반복되는 적 소환 예약을 시작하고, 30초 후 해당 예약을 영구적으로 취소하는 스크립트를 _TimerService:SetTimer와 _TimerService:ClearTimer를 이용해 작성해줘 [answer] | 요청하신 조건(5초마다 반복, 30초 후 영구 취소, `SetTimer`와 `ClearTimer` 사용)에 맞춰 작성한 스크립트입니다. ```lua Property: [None] integer SpawnTimerId = 0 Method: [server only] void OnBeginPlay() { -- 5초마다 반복되는 적 소환 콜백 함수 local spawnCallBack = function() -- 여기서 적을 소환하는 로직을 구현합니다. log("Enemy spawned!") [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetTimer()`를 통해 특정 액션을 수행하도록 예약을 만들었지만, 특정 조건에 의해 해당 예약을 취소해야 하는 경우가 빈번히 발생합니다. 게임 내에서 스위치를 On 했을 때 3초 후 문이 열리는 장치를 만들었다고 가정해 봅시다. 유저가 스위치를 On 상태로 만들었을 때 3초 뒤에 문이 열리게 됩니다. 문이 열리는 액션을 `SetTimer()`를 이용해 예약했기 때문입니다. 그러나 유저가 문이 열리기 전에 스위치를 Off 상태로 만든다면 `SetTimer()`의 예약을 취소해 Off일 때 문이 열리지 않게 만들어야 합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 맵 레이어 [question] | 맵 레이어의 우선순위 적용 규칙을 단계별 번호 목록으로 설명하세요. [answer] | 맵 레이어의 우선순위 적용 규칙은 메이커에서 엔티티 순서를 결정할 때 다음 단계에 따라 적용됩니다. 1. **Map Layer** (SpriteRendererComponent의 SortingLayer) 2. **SpriteRendererComponent의 OrderInLayer 프로퍼티** 3. **TransformComponent의 Position Z값** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 맵 레이어를 사용해 더욱 입체적으로 게임 화면을 디자인할 수 있습니다. 맵 레이어 창 구성을 살펴보고 활용하는 방법을 알아봅니다. 레이어 순서를 이해하고 레이어를 크리에이터의 게임에 맞게 활용할 수 있습니다. # 맵 레이어 위치 맵 레이어 창은 기본 패널 설정 기준, 중앙 하단에 위치합니다. 작업 편의를 위해 탭을 닫은 후 다시 불러올 때는 **Panels - Map Layer**을 선택해 불러올 수 있습니다. | 메이커 화면 기본 위치 | Panels - Map Layer | | ------------
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | MovementComponent와 RigidBodyComponent에 속하는 프로퍼티의 기본값을 3문장 이내로 설명하세요. [answer] | MovementComponent의 speed와 jumpForce 기본값은 각각 1.2와 1입니다. RigidBodyComponent의 walkAcceleration과 gravity 기본값은 모두 1입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | 모델 프로퍼티 명 | 원 컴포넌트 원 프로퍼티 명 | 설명 | | --------- | ---------------- | --- | | speed | MovementComponent <ul><li>InputSpeed</li></ul> | 플레이어의 기본 이동 속도 값을 정합니다. 값이 클수록 빠르게 움직입니다. 기본값은 1.2입니다. | | jumpForce | MovementComponent<ul><li>JumpForce</li></ul> | 플레이어의 기본 점프 높이를 설정합니다. 값이 클수록 높이 점프합니다. 기본값은
[task] | single_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | 스위치를 Off했을 때 3초 후 문이 열리는 예약을 취소하기 위해 ClearTimer를 사용할 때, timerId가 0인 경우를 어떻게 처리해야 하나요? [answer] | `SetTimer()` 또는 `SetTimerRepeat()` 호출 시 반환되는 `timerId`가 0이면 타이머 예약에 실패했음을 의미하므로, `ClearTimer()`를 호출하기 전에 반드시 0인지 확인해야 합니다. `timerId`가 0인 상태에서 `ClearTimer()`를 호출하면 의도하지 않은 동작이나 오류가 발생할 수 있으므로, 0인 경우 타이머 취소 로직을 건너뛰거나 즉시 반환하는 방식으로 처리해야 합니다. 참고 문서의 예제처럼 `timerId`가 0인 경우를 체크하는 코드는 다음과 같습니다. ```lua Meth [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `SetTimer()`를 통해 특정 액션을 수행하도록 예약을 만들었지만, 특정 조건에 의해 해당 예약을 취소해야 하는 경우가 빈번히 발생합니다. 게임 내에서 스위치를 On 했을 때 3초 후 문이 열리는 장치를 만들었다고 가정해 봅시다. 유저가 스위치를 On 상태로 만들었을 때 3초 뒤에 문이 열리게 됩니다. 문이 열리는 액션을 `SetTimer()`를 이용해 예약했기 때문입니다. 그러나 유저가 문이 열리기 전에 스위치를 Off 상태로 만든다면 `SetTimer()`의 예약을 취소해 Off일 때 문이 열리지 않게 만들어야 합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 맵 레이어 [question] | 플레이어 아바타의 레이어 소속이 바뀌는 원리를 3문장 이내로 요약하세요. [answer] | 다른 엔티티는 처음 배치된 맵 레이어에만 고정적으로 속하지만, 플레이어 아바타는 현재 밟고 있는 엔티티(타일, 발판 등)의 레이어로 소속이 계속 변경됩니다. 이는 플레이어 아바타가 특정 레이어에 귀속되지 않는 특성을 가지고 있기 때문입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 맵 레이어를 사용해 더욱 입체적으로 게임 화면을 디자인할 수 있습니다. 맵 레이어 창 구성을 살펴보고 활용하는 방법을 알아봅니다. 레이어 순서를 이해하고 레이어를 크리에이터의 게임에 맞게 활용할 수 있습니다. # 맵 레이어 위치 맵 레이어 창은 기본 패널 설정 기준, 중앙 하단에 위치합니다. 작업 편의를 위해 탭을 닫은 후 다시 불러올 때는 **Panels - Map Layer**을 선택해 불러올 수 있습니다. | 메이커 화면 기본 위치 | Panels - Map Layer | | ------------
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | 메이플스토리 월드에서 플레이어의 기본 속성을 편집하기 위해 어떤 특정 모델 객체를 선택해야 하나요? [answer] | 메이플스토리 월드에서 플레이어의 기본 속성을 편집하려면 **Player** 모델 객체를 선택해야 합니다. 구체적인 경로는 다음과 같습니다. 1. **Workspace - BaseEnvironment - NativeModel - Player** 경로로 이동합니다. 2. 해당 **Player** 모델을 선택합니다. 3. 선택된 Player 모델의 프로퍼티 값을 변경합니다. 4. **[시작]** 버튼을 눌러 변경 사항을 확인합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 동시에 출발해 목표 지점까지 오르는 게임을 시작할 때 누군가는 한 번에 4칸을 오르고, 다른 누구는 2칸을 오른다면 함께 게임을 즐길 수 없을 것입니다. 게임을 처음 시작할 때 만큼은 동일한 환경에서 시작하는 게 중요합니다. 모델 프로퍼티를 이용해 속성을 편집하는 방법을 알아봅니다. # 플레이어 기본 속성 변경 **Player** 모델에서 기본 속성을 변경할 수 있습니다. 1. **Workspace - BaseEnvironment - NativeModel - Player**를 선택합니다. 2. **Play
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | 왜 게임 시작 시점에 모든 플레이어가 동일한 환경에서 출발하도록 속성을 통일하는 것이 중요하다고 하나요? [answer] | 게임 시작 시점에 모든 플레이어가 동일한 환경에서 출발하도록 속성을 통일하는 것은 공정한 경쟁과 원활한 게임 플레이를 위해 필수적입니다. 만약 동시에 출발하는 게임에서 어떤 플레이어는 한 번에 4칸을 오르고 다른 플레이어는 2칸만 오른다면, 출발점부터 불공평한 차이가 생겨 함께 게임을 즐길 수 없게 됩니다. 따라서 게임의 초창기만큼은 모든 참여자가 동일한 조건에서 시작할 수 있도록 **Player** 모델의 기본 속성을 편집하여 환경을 일관되게 유지하는 것이 중요합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 동시에 출발해 목표 지점까지 오르는 게임을 시작할 때 누군가는 한 번에 4칸을 오르고, 다른 누구는 2칸을 오른다면 함께 게임을 즐길 수 없을 것입니다. 게임을 처음 시작할 때 만큼은 동일한 환경에서 시작하는 게 중요합니다. 모델 프로퍼티를 이용해 속성을 편집하는 방법을 알아봅니다. # 플레이어 기본 속성 변경 **Player** 모델에서 기본 속성을 변경할 수 있습니다. 1. **Workspace - BaseEnvironment - NativeModel - Player**를 선택합니다. 2. **Play
[task] | two_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | 스위치를 On 했을 때 3초 후 문이 열리도록 예약했지만, 문이 열리기 전에 Off 하면 예약을 취소하는 로직을 구현하려면 어떤 구조가 필요할까요? [answer] | 스위치를 On 했을 때 3초 후 문이 열리도록 예약하고, 그 전에 Off 하면 예약을 취소하는 로직을 구현하기 위해서는 `TimerService`의 `SetTimerOnce`와 `ClearTimer`를 함께 사용하는 구조가 필요합니다. 핵심은 다음과 같습니다: 1. **예약 ID 저장**: `SetTimerOnce`를 호출하면 예약이 성공적으로 등록되면 고유한 `timerId`(integer)가 반환됩니다. 이 ID를 프로퍼티에 저장해야 합니다. 2. **예약 취소**: 스위치가 Off 상태로 변경될 때, 저장된 `timerI [followup] | 이 시나리오에서 SetTimerOnce()와 SetTimerRepeat() 중 어떤 메서드를 사용하는 것이 효율적인지, 그리고 취소 로직을 위한 timerId 관리 방법을 설명해 주세요. [followup_answer] | 제시된 시나리오(스위치를 On 했을 때 3초 후 문이 열리고, 그 전에 Off 하면 취소)는 **단일 액션**이 특정 시간 후에 **한 번만** 실행되어야 하는 경우입니다. 따라서 효율적인 선택은 **`SetTimerOnce()`**입니다. ### 1. 왜 `SetTimerOnce()`가 효율적인가? * **목적 일치**: `SetTimerOnce()`는 1회성 액션 예약을 위해 설계되었습니다. 문이 열리는 동작은 반복이 아닌, 조건(3초 경과)이 충족되면 한 번만 수행되면 됩니다. * **코드 간결성**: `SetTi [scores] | [judge_reason] | [source_doc] | `SetTimer()`를 통해 특정 액션을 수행하도록 예약을 만들었지만, 특정 조건에 의해 해당 예약을 취소해야 하는 경우가 빈번히 발생합니다. 게임 내에서 스위치를 On 했을 때 3초 후 문이 열리는 장치를 만들었다고 가정해 봅시다. 유저가 스위치를 On 상태로 만들었을 때 3초 뒤에 문이 열리게 됩니다. 문이 열리는 액션을 `SetTimer()`를 이용해 예약했기 때문입니다. 그러나 유저가 문이 열리기 전에 스위치를 Off 상태로 만든다면 `SetTimer()`의 예약을 취소해 Off일 때 문이 열리지 않게 만들어야 합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | TriggerComponent의 프로퍼티를 mLua 스크립트의 Property 블록 형식으로 변환해 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Property: [None] Vector2 BoxSize = Vector2(1, 1) [None] Vector2 Offset = Vector2(0, 0) ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | 모델 프로퍼티 명 | 원 컴포넌트 원 프로퍼티 명 | 설명 | | --------- | ---------------- | --- | | speed | MovementComponent <ul><li>InputSpeed</li></ul> | 플레이어의 기본 이동 속도 값을 정합니다. 값이 클수록 빠르게 움직입니다. 기본값은 1.2입니다. | | jumpForce | MovementComponent<ul><li>JumpForce</li></ul> | 플레이어의 기본 점프 높이를 설정합니다. 값이 클수록 높이 점프합니다. 기본값은
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 이름표 붙이기 [question] | NameTagComponent.FontSize 를 1로 유지하면서 OffsetY 값을 0에서 10까지 0.5 간격으로 증감시켜 이름표 위치를 애니메이션처럼 변경하는 스크립트를 작성해줘 [answer] | 요청하신 조건(FontSize 1 유지, OffsetY를 0에서 10까지 0.5 간격으로 증감)을 만족하는 mLua 스크립트입니다. `OnUpdate`에서 델타 타임(`delta`)을 이용해 매 프레임마다 `OffsetY` 값을 변경하며, 0에서 10까지 올라가면 다시 0으로 내려가는 왕복 애니메이션을 구현했습니다. ```lua Property: [None] number currentOffsetY = 0 number direction = 1 number speed = 1 Method: [server only] void OnBe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 사물을 구분하는 효과적인 방법은 이름을 붙이는 것입니다. 이름표를 이용해 오브젝트와 NPC를 구분하거나, 유저를 구분할 수 있습니다. NameTagComponent 사용 방법과 활용 예시를 소개합니다. # 이름표 붙이기 엔티티를 선택하고 **NameTagComponent**를 추가합니다. 프로퍼티 값을 변경해 원하는 이름표를 만듭니다. NameTagComponent 프로퍼티 구성은 다음과 같습니다. | 이름 | 설명 | | --- | --- | | FontColor | 글씨 색상을 변경합니다. 색상 변
[task] | single_turn [pass] | ⏳ 미판정 [title] | 액션을 예약하고 실행하는 TimerService [question] | TimerService에서 예약된 타이머를 중간에 취소하려면 어떤 메서드를 사용해야 하며, 해당 메서드의 파라미터로 전달해야 하는 값은 무엇인가요? [answer] | TimerService에서 예약된 타이머를 중간에 취소하려면 `ClearTimer` 메서드를 사용합니다. 이 메서드의 파라미터로 전달해야 하는 값은 `SetTimer` 또는 `SetTimerRepeat` 호출 시 반환되는 `timerId`(타이머 식별자)입니다. `SetTimer` 계열 메서드가 실행되면 타이머가 정상적으로 생성되면 고유한 ID를 반환하며, 이 ID를 `ClearTimer`에 넘겨 해당 타이머의 실행을 취소합니다. (참고: `timerId`가 0이면 타이머 생성에 실패한 것이므로 취소 대상이 아닙니다.) ```l [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | isRepeat을 true로 변경해 반복 실행하게 만듭니다. `SetTimer()`가 호출될 때 "SetTimer!"라는 문자열과 함께 해당 코드가 실행된 시간을 출력합니다. 예시 코드는 다음과 같습니다. 3초마다 `SetTimer()`로 넘긴 CallBack 함수가 호출될 때 "CallBack!"이라는 문자열과 함께 코드가 실행된 시간을 출력합니다. ```lua Method: [server only] void OnBeginPlay() { local callBack = function() log("Ca
[task] | two_turn [pass] | ⏳ 미판정 [title] | 캐릭터 초기 속성 편집 [question] | NameTagComponent의 Enable 체크를 해제하여 모델 프로퍼티를 비활성화하는 구체적인 절차와 예시를 알려주세요. [answer] | NameTagComponent의 Enable 체크를 해제하여 모델 프로퍼티를 비활성화하는 절차는 다음과 같습니다. 1. **Workspace**에서 대상 모델(예: Player)을 선택합니다. 2. **모델 프로퍼티 창**(Model Properties)에서 비활성화할 컴포넌트인 **NameTagComponent**를 찾습니다. 3. 해당 컴포넌트의 **Enable** 체크박스를 해제합니다. 이렇게 하면 NameTagComponent가 비활성화되어 이름 태그가 표시되지 않습니다. 이는 스크립트를 통해 동적으로 제어하는 것이 [followup] | DefaultPlayer의 기본 컴포넌트를 삭제해야 하는 경우, Workspace에서 Player를 선택 후 Remove Component를 클릭하는 3단계 과정과 확장 컴포넌트 사용 시의 주의사항을 자세히 설명해 주세요. [followup_answer] | DefaultPlayer의 기본 컴포넌트를 삭제해야 하는 경우와 확장 컴포넌트 사용 시의 주의사항은 다음과 같습니다. ### 기본 컴포넌트 삭제 3단계 과정 기본 컴포넌트를 확장한 컴포넌트로 대체하여 사용할 때, 오동작을 방지하기 위해 기존 기본 컴포넌트를 삭제해야 합니다. 삭제 절차는 다음과 같습니다. 1. **Workspace - BaseEnvironment - NativeModel - Player**를 선택합니다. 2. 모델 프로퍼티 창에서 삭제하고 싶은 컴포넌트를 선택합니다. 3. 콘텍스트 메뉴를 열어 **Remo [scores] | [judge_reason] | [source_doc] | # 모델 프로퍼티 비활성화하기 크리에이터의 의도에 따라 필요 없는 모델 프로퍼티를 비활성화 할 수 있습니다. 예를 들어, **NameTag**을 사용하고 싶지 않다면, 프로퍼티 에디터에서 **NameTagComponent**의 **Enable** 체크를 해제합니다. # DefaultPlayer의 기본 컴포넌트 삭제하기 기본 컴포넌트를 확장한 컴포넌트를 제작해 사용한다면, **DefaultPlayer**의 기본 컴포넌트를 삭제해야 합니다. 근본이 같은 컴포넌트가 여러 개 있으면 오동작 가능성이 커지기 때문에 기본적으로 하나의 컴
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 맵 레이어 [question] | 모델 유형별 OrderInLayer 기본값을 표로 정리해서 출력하세요. [answer] | 모델 유형별 OrderInLayer 기본값은 다음과 같습니다. | OrderInLayer 값 | 모델 유형 | | :--- | :--- | | 0 | 오브젝트 | | 1 | 타일 | | 2 | 몬스터, NPC, 발판, 사다리, 로프, 포탈, 트랩, 아이템 | | 3 | 타 이용자의 아바타 | | 4 | 나의 아바타 | 배치 순서를 임의로 변경할 수 있으나, 아바타가 가려지는 문제를 방지하기 위해 "3 이상의 값"을 입력하는 것은 지양하는 것이 좋습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 맵 레이어를 사용해 더욱 입체적으로 게임 화면을 디자인할 수 있습니다. 맵 레이어 창 구성을 살펴보고 활용하는 방법을 알아봅니다. 레이어 순서를 이해하고 레이어를 크리에이터의 게임에 맞게 활용할 수 있습니다. # 맵 레이어 위치 맵 레이어 창은 기본 패널 설정 기준, 중앙 하단에 위치합니다. 작업 편의를 위해 탭을 닫은 후 다시 불러올 때는 **Panels - Map Layer**을 선택해 불러올 수 있습니다. | 메이커 화면 기본 위치 | Panels - Map Layer | | ------------