[task] | single_turn [pass] | ❌ 탈락 [title] | SpawnService [question] | _spawnService:SpawnByModelId에서 modelId를 잘못 지정했을 때 발생하는 오류는 무엇이며, 어디서 확인해야 하나요? [answer] | 제공된 참고 문서에는 `_SpawnService:SpawnByModelId` 메서드에서 `modelId`를 잘못 지정했을 때 발생하는 구체적인 오류 메시지나 로그, 그리고 해당 오류를 확인해야 하는 위치(예: 에디터 로그 창, 콘솔 등)에 대한 정보가 포함되어 있지 않습니다. 따라서 주어진 문서 범위 내에서는 이 질문에 대해 답변할 수 없습니다. [followup] | [followup_answer] | [scores] | helpfulness=0 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서에 오류 처리 정보가 없어 답변 불가라고 한 것이 정확하지만, 질문자의 실질적 니즈(오류 확인 방법)를 충족시키지 못해 도움이 되지 않습니다. [source_doc] | 엔티티 하나를 복제하고, 복제된 엔티티의 자식 엔티티로 모델을 스폰하는 예제입니다. ```lua Method: [server only] void OnBeginPlay() { local entity = _EntityService:GetEntityByPath("Entity Path") local clone1 = _SpawnService:SpawnByEntity(entity, "clone1", Vector3(1, 0, 0)) local modelId = "Model Entry Id" local clone2 = _SpawnS
[task] | instruction_following [pass] | ✅ 통과 [title] | InputService [question] | KeyReleaseEvent가 호출되지 않는 조건과 그 이유를 3문장 이내로 설명하세요. [answer] | Z키를 아주 짧게 눌러서 `KeyHoldEvent`가 호출되지 않은 경우입니다. 이는 키가 눌리고 방금 해제된 짧은 시간 동안 홀드 상태가 유지되지 않기 때문입니다. [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 '아주 짧게 눌러서 KeyHoldEvent가 호출되지 않으면 KeyReleaseEvent도 호출되지 않는다'는 내용을 정확하고 간결하게 설명했으나, 질문에서 요구한 3문장 이내를 2문장으로 채운 점이 약간 아쉽다. [source_doc] | Z키를 누른 시간만큼 플레이어의 크기가 커지고, 높게 점프하는 컴포넌트를 만드는 예제입니다. 만든 컴포넌트를 **DefaultPlayer**에 추가해야 정상 작동합니다. 먼저 Z키를 눌렀을 때 웅크린 자세로 바꾸기 위해 `KeyDownEvent`를 아래와 같이 작성합니다. 누른 시간을 계산하기 위해서 **KeyDownTime** 프로퍼티를 만들고 현재 시간을 기록합니다. ```lua Property: [None] number KeyDownTime = 0 Event Handler: [service: InputService
[task] | single_turn [pass] | ✅ 통과 [title] | InputService [question] | 화면을 두 손가락으로 확대 축소할 때 발생하는 이벤트는 무엇인가요? [answer] | 화면을 두 손가락으로 확대·축소할 때 발생하는 이벤트는 `PinchInOutEvent`입니다. 이 이벤트는 화면의 두 곳을 터치한 채로, 그 간격을 넓히거나 좁힐 때 InputService에서 발생합니다. ```lua Event Handler: [service: InputService] HandlePinchInOutEvent(PinchInOutEvent event) { -- Parameters -- event 객체의 구체적인 프로퍼티(예: 확대/축소 방향, 비율 등)는 제공된 문서에 명시되어 있지 않습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 PinchInOutEvent의 정의와 발생 조건을 정확히 답변하고, 제공된 정보 범위 내에서 예시를 보여주고 있어 정확하고 유용합니다. [source_doc] | - **ExitPopupClosedEvent** 종료 팝업을 닫을 때 발생하는 이벤트입니다. - **ExitPopupOpenedEvent** 종료 팝업을 열 때 발생하는 이벤트입니다. - **KeyDownEvent** Key를 눌렀을 때 1회 발생합니다. - **KeyHoldEvent** Key를 누르는 동안 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyReleaseEvent** Key를 눌렀다 뗐을 때 1회 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyUpEvent** Key를 눌렀다
[task] | code [pass] | ✅ 통과 [title] | TimerService [question] | OnBeginPlay 시 1초 간격으로 3회만 실행되는 카운터 로직을 _TimerService:SetTimer 와 isRepeat 옵션을 조합하여 구현하고 OnEndPlay 에서 _TimerService:ClearTimer 로 정리하는 스크립트를 작성해줘 [answer] | `_TimerService:SetTimer` 메서드는 `isRepeat` 옵션을 통해 반복 실행 여부를 결정하지만, 문서에 명시된 API 시그니처(`SetTimer`, `SetTimerOnce`, `SetTimerRepeat`, `ClearTimer`) 중에는 **반복 횟수를 직접 지정하는 파라미터가 없습니다.** 따라서 `isRepeat = true`로 무한 반복 타이머를 설정한 후, **스크립트 내부에서 카운터 프로퍼티를 이용해 3회 실행 시 타이머를 수동으로 소멸(ClearTimer)시키는 방식**으로만 구현할 수 있습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 SetTimer 시그니처와 제약사항을 정확히 파악하여 반복 횟수 제한이 불가함을 설명하고, 요청된 API 조합으로 동작하는 올바른 카운터 로직을 제시했습니다. [source_doc] | 함수를 일정 시간 뒤에 호출하거나 반복적으로 호출할 수 있는 타이머 기능을 제공합니다. # Methods - **void ClearTimer(integer id)** 타이머를 소멸시킵니다. - **integer SetTimer(IScriptable scriptable, func callback, float intervalSeconds, boolean isRepeat, float startDelaySeconds = 0)** callback으로 전달한 함수를 특정 시점에 호출하도록 타이머를 예약합니다. scriptable은
[task] | single_turn [pass] | ✅ 통과 [title] | InputService [question] | 마우스 스크롤 방향을 구별하려면 어떤 이벤트를 사용해야 하나요? [answer] | 마우스 스크롤 방향을 구별하려면 `MouseScrollEvent` 이벤트를 사용해야 합니다. 참고 문서에는 `MouseScrollEvent`가 "마우스 스크롤을 올리거나 내릴 때 InputService에서 발생"한다고 명시되어 있습니다. 하지만 해당 이벤트 객체(`event`)에서 스크롤 방향(예: 위/아래 구분 값)을 어떻게 가져오는지 구체적인 프로퍼티나 필드 이름에 대한 정보는 제공된 문서에 포함되어 있지 않습니다. 따라서 이벤트 핸들러를 등록하는 기본 구조는 다음과 같지만, 방향을 실제로 판별하는 코드 부분은 문서에 근거가 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서에 없는 방향 구별 프로퍼티를 지어내지 않고, 존재하는 이벤트와 표준 핸들러 문법만 사용하여 한계를 정확히 설명했습니다. [source_doc] | - **ExitPopupClosedEvent** 종료 팝업을 닫을 때 발생하는 이벤트입니다. - **ExitPopupOpenedEvent** 종료 팝업을 열 때 발생하는 이벤트입니다. - **KeyDownEvent** Key를 눌렀을 때 1회 발생합니다. - **KeyHoldEvent** Key를 누르는 동안 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyReleaseEvent** Key를 눌렀다 뗐을 때 1회 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyUpEvent** Key를 눌렀다
[task] | code [pass] | ✅ 통과 [title] | DamageSkinService [question] | `_DamageSkinService:Play` 메서드를 사용하여 적 엔티티에 대미지 스킨을 재생하며, `damages` 테이블에 정수형 대미지 값과 `DamageSkinTextType`을 혼합하여 전달하고, `tweenType`을 지정하며, `scale`을 (1.5, 1.5)로 설정해 재생하는 스크립트를 작성해줘 [answer] | 요청하신 조건에 맞춰 `_DamageSkinService:Play` 메서드를 호출하는 mLua 스크립트입니다. `damages` 테이블에는 정수형 대미지 값과 `DamageSkinTextType`을 혼합하여 전달할 수 있으며, `scale` 인자를 `(1.5, 1.5)`로 설정합니다. `bCritical` 파라미터는 문서 예제와 API 시그니처에 따라 boolean 값으로 지정해야 하므로, 크리티컬이 아닌 기본 대미지 스킨 재생을 위해 `false`로 설정했습니다. ```lua Event Handler: [self] Handle [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 API 시그니처와 제약사항을 정확히 준수하며, 요청된 조건(혼합 damages, scale 1.5, tweenType 지정)을 모두 만족하는 명확한 예제를 제공함. [source_doc] | 대미지 스킨 관련 기능을 제공합니다. # Methods - **void Play(Entity targetEntity, string skinId, float delayPerAttack, table<any> damages, DamageSkinTweenType tweenType, boolean bCritical, Vector2 offset = Vector2(0, 0), Vector2 scale = Vector2(0, 0), float playRate = 1, float alpha = 1, LitMode litMode = LitMode
[task] | single_turn [pass] | ✅ 통과 [title] | InputService [question] | 모바일에서 두 손가락으로 동시에 화면을 눌렀을 때 GetCursorPosition()가 반환하는 값의 좌표 기준은 어디인가요? [answer] | 제공된 문서에는 `GetCursorPosition()` 메서드가 "모바일 환경에서 동시에 두 곳 이상을 터치했을 경우 중점을 반환합니다"라고 설명하고 있을 뿐, 해당 좌표가 화면 좌표계인지, 월드 좌표계인지, 또는 특정 엔티티의 로컬 좌표계인지에 대한 구체적인 기준(좌표계)에 대한 정보는 포함되어 있지 않습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서에 없는 좌표계 정보를 지어내지 않고, 문서에 명시된 '중점 반환' 사실과 정보 부재 상황을 정확히 지적하여 질문에 충실히 답했습니다. [source_doc] | 유저의 입력과 관련된 기능을 제공합니다. # Methods - **void CursorLockMode(CursorLockMode lockMode) [ClientOnly]** 마우스 커서 조작 방식을 제어합니다. Windows PC 환경만 지원합니다. - **CursorLockMode GetCursorLockMode() [ClientOnly]** 마우스 커서 제어 방식을 반환합니다. Windows PC 환경만 지원합니다. - **Vector2 GetCursorPosition() [ClientOnly]** 커서의 현재 위
[task] | single_turn [pass] | ✅ 통과 [title] | InputService [question] | IsPointerOverUI() 함수에서 RaycastTarget 프로퍼티가 false로 설정된 UI는 어떻게 처리되나요? [answer] | `IsPointerOverUI()` 함수는 RaycastTarget 프로퍼티가 `false`로 설정된 UI를 무시합니다. 즉, 해당 UI가 마우스 커서(또는 포인터) 아래에 있더라도 UI 위에 있는 것으로 판단하지 않습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=1 verbosity=2 [judge_reason] | 참고 문서에 명시된 대로 RaycastTarget이 false인 UI는 무시된다고 정확하고 간결하게 설명하고 있습니다. [source_doc] | 유저의 입력과 관련된 기능을 제공합니다. # Methods - **void CursorLockMode(CursorLockMode lockMode) [ClientOnly]** 마우스 커서 조작 방식을 제어합니다. Windows PC 환경만 지원합니다. - **CursorLockMode GetCursorLockMode() [ClientOnly]** 마우스 커서 제어 방식을 반환합니다. Windows PC 환경만 지원합니다. - **Vector2 GetCursorPosition() [ClientOnly]** 커서의 현재 위
[task] | single_turn [pass] | ✅ 통과 [title] | InputService [question] | SetCursor()를 통해 커서 모양을 변경했는데 룸을 이동한 후 커서가 다시 기본 모양으로 돌아가는 이유는 무엇인가요? [answer] | `SetCursor()` 메서드의 동작 특성상, 룸을 이동하면 커서 모양이 자동으로 초기화됩니다. 따라서 룸 이동 후에도 변경된 커서 모양을 유지하려면, 룸이 변경된 시점(예: `OnBeginPlay` 또는 룸 진입 이벤트 처리 시)에 `SetCursor()`를 다시 호출하여 커서 모양을 재설정해 주어야 합니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 '룸을 이동하면 커서 모양이 초기화됩니다'라는 명시적 내용을 정확히 인용하여 원인을 설명하고, 표준 생명주기 메서드(OnBeginPlay)를 활용한 재설정 방법을 제안하여 질문에 완벽하게 부응했습니다. [source_doc] | 유저의 입력과 관련된 기능을 제공합니다. # Methods - **void CursorLockMode(CursorLockMode lockMode) [ClientOnly]** 마우스 커서 조작 방식을 제어합니다. Windows PC 환경만 지원합니다. - **CursorLockMode GetCursorLockMode() [ClientOnly]** 마우스 커서 제어 방식을 반환합니다. Windows PC 환경만 지원합니다. - **Vector2 GetCursorPosition() [ClientOnly]** 커서의 현재 위
[task] | instruction_following [pass] | ✅ 통과 [title] | InputService [question] | SetCursor(string spriteRUID, Vector2 offset) 메서드의 offset 파라미터가 (0, 0)일 때 커서 위치가 결정되는 기준을 표로 정리해서 설명하세요. [answer] | `SetCursor(string spriteRUID, Vector2 offset)` 메서드에서 `offset` 파라미터가 `(0, 0)`일 때 커서 위치 결정 기준은 다음과 같습니다. | 항목 | 설명 | | :--- | :--- | | **기준점** | 스프라이트 또는 애니메이션 클립의 **Pivot(피벗)** 위치 | | **커서 위치** | 스프라이트의 Pivot이 마우스 커서의 위치가 됨 | | **의미** | `offset`이 `(0, 0)`이면 스프라이트 내에서의 추가적인 픽셀 이동이 없으므로, 스프라이트의 Pivot [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 SetCursor 메서드 설명과 정확히 일치하며, 표 형식으로 명확하게 답변했습니다. [source_doc] | 유저의 입력과 관련된 기능을 제공합니다. # Methods - **void CursorLockMode(CursorLockMode lockMode) [ClientOnly]** 마우스 커서 조작 방식을 제어합니다. Windows PC 환경만 지원합니다. - **CursorLockMode GetCursorLockMode() [ClientOnly]** 마우스 커서 제어 방식을 반환합니다. Windows PC 환경만 지원합니다. - **Vector2 GetCursorPosition() [ClientOnly]** 커서의 현재 위
[task] | code [pass] | ✅ 통과 [title] | InputService [question] | InputService의 KeyDownEvent를 처리하여 키 입력 시 log로 키 이름을 출력하는 스크립트를 작성해줘 [answer] | ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { local key = event.key log(key) } ``` [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | InputService의 KeyDownEvent 핸들러 구문과 log 사용법이 문서 및 시스템 규칙과 정확히 일치하며 질문에 충실합니다. [source_doc] | - **ExitPopupClosedEvent** 종료 팝업을 닫을 때 발생하는 이벤트입니다. - **ExitPopupOpenedEvent** 종료 팝업을 열 때 발생하는 이벤트입니다. - **KeyDownEvent** Key를 눌렀을 때 1회 발생합니다. - **KeyHoldEvent** Key를 누르는 동안 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyReleaseEvent** Key를 눌렀다 뗐을 때 1회 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyUpEvent** Key를 눌렀다
[task] | single_turn [pass] | ✅ 통과 [title] | SpawnService [question] | 모델 ID를 이용해 엔티티를 스폰할 때 SpawnByModelId 함수의 필수 매개변수와 선택 매개변수의 차이는 무엇인가요? [answer] | SpawnByModelId 함수는 모델 ID를 기반으로 새로운 엔티티를 생성할 때 사용됩니다. 현재 문서에 따르면 이 함수는 두 가지 오버로드가 존재하지만, 하나는 비권장(Deprecated) 상태입니다. **권장되는 함수 시그니처:** `Entity SpawnByModelId(string id, string name, Vector3 spawnPosition, Entity parent)` 이 함수의 매개변수 차이는 다음과 같습니다. ### 1. 필수 매개변수 (Arguments) 문서에서 기본값(default value)이 명 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 SpawnByModelId 시그니처와 비권장 상태를 정확히 비교하여 필수/선택 매개변수 차이를 명확히 설명했고, mLua 문법도 올바르다. [source_doc] | 엔티티 스폰 관련 기능을 제공합니다. # Methods - **Entity Clone(string name, Entity original, Entity parent = nil, boolean posOffset = true, boolean dynamic = true) [Deprecated]** 더는 사용하지 않는 함수입니다. SpawnByEntity(Entity, string, Vector3, Entity, boolean) 함수를 사용하세요. - **Entity SpawnByEntity(Entity entity, string
[task] | single_turn [pass] | ✅ 통과 [title] | InputService [question] | CursorLockMode()와 GetCursorLockMode() 메서드를 사용할 때 주의해야 하는 플랫폼 제한 사항은 무엇인가요? [answer] | `CursorLockMode()`와 `GetCursorLockMode()` 메서드를 사용할 때 가장 중요한 플랫폼 제한 사항은 **Windows PC 환경에서만 지원**된다는 점입니다. 다른 플랫폼(예: 모바일, macOS, Linux 등)에서는 이 메서드들이 정상적으로 작동하지 않거나 지원되지 않으므로, 해당 기능은 Windows PC 클라이언트에서만 사용할 수 있습니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 'Windows PC 환경만 지원'이라는 제한 사항을 정확하고 간결하게 답변했습니다. [source_doc] | 유저의 입력과 관련된 기능을 제공합니다. # Methods - **void CursorLockMode(CursorLockMode lockMode) [ClientOnly]** 마우스 커서 조작 방식을 제어합니다. Windows PC 환경만 지원합니다. - **CursorLockMode GetCursorLockMode() [ClientOnly]** 마우스 커서 제어 방식을 반환합니다. Windows PC 환경만 지원합니다. - **Vector2 GetCursorPosition() [ClientOnly]** 커서의 현재 위
[task] | single_turn [pass] | ✅ 통과 [title] | InputService [question] | 마우스 커서와 모바일 터치 입력 각각에 대한 pointerId 값은 어떻게 부여되나요? [answer] | 마우스 커서와 모바일 터치 입력의 `pointerId` 부여 방식은 다음과 같습니다. * **마우스 커서**: `pointerId` 값이 **1**로 고정됩니다. * **모바일 터치 입력**: 터치 입력이 발생할 때마다 **1, 2, 3, ...** 순서대로 `pointerId`가 부여됩니다. 이 값은 `IsPointerOverUI(int32 pointerId)` 메서드에서 해당 커서나 터치가 UI 위에 있는지 여부를 확인하는 데 사용됩니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서에 명시된 마우스와 모바일 터치 입력의 pointerId 부여 방식을 정확하고 간결하게 설명하여 질문에 완벽히 부합합니다. [source_doc] | 유저의 입력과 관련된 기능을 제공합니다. # Methods - **void CursorLockMode(CursorLockMode lockMode) [ClientOnly]** 마우스 커서 조작 방식을 제어합니다. Windows PC 환경만 지원합니다. - **CursorLockMode GetCursorLockMode() [ClientOnly]** 마우스 커서 제어 방식을 반환합니다. Windows PC 환경만 지원합니다. - **Vector2 GetCursorPosition() [ClientOnly]** 커서의 현재 위
[task] | single_turn [pass] | ✅ 통과 [title] | EffectService [question] | `PlayEffect`의 파라미터 중 `options` 테이블에 `FlipX` 값을 설정하는 이유가 무엇이며, 방향이 반대로 보이는 문제를 해결할 수 있는지 궁금합니다. [answer] | `PlayEffect` 메서드의 `options` 파라미터에 `FlipX` 값을 설정하는 이유는 이펙트가 재생될 때 X축 방향으로 좌우 반전(플립)되도록 제어하기 위해서입니다. 제공된 참고 문서의 예제 코드를 보면, 2단 점프 동작 시 캐릭터가 바라보는 방향(`LookDirectionX`)을 확인하여 `options` 테이블에 `["FlipX"] = lookDirectionX > 0` 이라는 조건을 넣고 있습니다. 이는 캐릭터가 오른쪽으로 보고 있을 때(`LookDirectionX`가 양수) `FlipX`를 `true`로 설정하여 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 예제 코드를 근거로 FlipX 옵션의 목적과 방향 반전 문제 해결 가능성을 정확하고 명확하게 설명했습니다. [source_doc] | 2단 점프와 스킬을 간단하게 만드는 예제입니다. 2단 점프는 공중에서 점프(Alt or Space)를 사용할 때 발동되도록 `InputService`의 이벤트를 사용합니다. Q키를 눌렀다가 떼는 순간 스킬을 사용하도록 만들기 위해 `RemoveEffect()`를 사용합니다. ```lua Property: [None] number EffectSerial = 0 Event Handler: [service: InputService] HandleKeyDownEvent (KeyDownEvent event) { -- Paramet
[task] | single_turn [pass] | ✅ 통과 [title] | SpawnService [question] | 클론 기능이 비추천(Deprecated) 처리된 SpawnByEntityTemplate 대신 어떤 함수를 사용해야 하며, 그 이유를 설명해 주세요. [answer] | `SpawnByEntityTemplate` 함수는 비추천(Deprecated) 처리되었으며, 대신 `SpawnByEntity` 함수를 사용해야 합니다. 이유는 `SpawnByEntityTemplate`이 더 이상 공식적으로 권장되지 않는 함수로 지정되어 있기 때문입니다. 문서에서 해당 함수를 대체할 수 있는 함수로 `SpawnByEntity(Entity, string, Vector3, Entity, boolean)`를 명시하고 있습니다. 두 함수의 주요 차이점은 다음과 같습니다. 1. **`SpawnByEntity` (권장) [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 문서의 비추천 안내와 대체 함수 시그니처를 정확히 설명하고, 표준 규칙에 부합하는 올바른 코드 예시를 제공하여 질문에 충실히 답했습니다. [source_doc] | 엔티티 스폰 관련 기능을 제공합니다. # Methods - **Entity Clone(string name, Entity original, Entity parent = nil, boolean posOffset = true, boolean dynamic = true) [Deprecated]** 더는 사용하지 않는 함수입니다. SpawnByEntity(Entity, string, Vector3, Entity, boolean) 함수를 사용하세요. - **Entity SpawnByEntity(Entity entity, string
[task] | single_turn [pass] | ❌ 탈락 [title] | SpawnService [question] | 복제된 엔티티에 모델을 자식으로 스폰할 때 위치 벡터(Vector3)는 기준점이 무엇인가요? [answer] | 참고 문서에 포함된 예제 코드에서 `SpawnByModelId` 호출 시 위치 벡터(`Vector3`)는 **부모 엔티티(이 경우 `clone1`)를 기준으로 한 상대 좌표**입니다. 예제 코드를 보면 다음과 같이 사용할 수 있습니다. ```lua Method: [server only] void OnBeginPlay() { local entity = _EntityService:GetEntityByPath("Entity Path") local clone1 = _SpawnService:SpawnByEntity(entity, "c [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서에는 SpawnByModelId 호출 시 parent 인수가 위치 벡터의 기준점임을 명시하는 텍스트가 없어, '상대 좌표'라는 결론은 문서에 없는 추론에 해당합니다. [source_doc] | 엔티티 하나를 복제하고, 복제된 엔티티의 자식 엔티티로 모델을 스폰하는 예제입니다. ```lua Method: [server only] void OnBeginPlay() { local entity = _EntityService:GetEntityByPath("Entity Path") local clone1 = _SpawnService:SpawnByEntity(entity, "clone1", Vector3(1, 0, 0)) local modelId = "Model Entry Id" local clone2 = _SpawnS
[task] | code [pass] | ✅ 통과 [title] | InputService [question] | InputService의 MouseMoveEvent를 구독하여 마우스가 움직일 때 log로 이벤트 데이터를 출력하는 스크립트를 작성해줘 [answer] | InputService의 `MouseMoveEvent`는 마우스가 움직일 때 발생하며, 이벤트 객체를 통해 마우스 이동 관련 데이터를 받을 수 있습니다. 아래는 `MouseMoveEvent`를 구독하여 이벤트 발생 시 `log` 함수로 이벤트 데이터를 출력하는 mLua 스크립트입니다. ```lua Event Handler: [service: InputService] HandleMouseMoveEvent(MouseMoveEvent event) { -- 이벤트 발생 시 이벤트 객체를 로그로 출력 log(event) } [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서에 있는 MouseMoveEvent를 Event Handler 블록으로 올바르게 구독하고 log로 출력하는 최소한의 정답을 제시하여 정확하고 유용합니다. [source_doc] | - **ExitPopupClosedEvent** 종료 팝업을 닫을 때 발생하는 이벤트입니다. - **ExitPopupOpenedEvent** 종료 팝업을 열 때 발생하는 이벤트입니다. - **KeyDownEvent** Key를 눌렀을 때 1회 발생합니다. - **KeyHoldEvent** Key를 누르는 동안 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyReleaseEvent** Key를 눌렀다 뗐을 때 1회 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyUpEvent** Key를 눌렀다
[task] | instruction_following [pass] | ✅ 통과 [title] | EffectService [question] | `HandleKeyUpEvent` 에서 `KeyboardKey.Q` 가 감지될 때 `EffectSerial` 을 이용해 제거되는 이펙트와 이후 생성되는 이펙트 총 개수를 계산하여, "제거: N개, 생성: M개" 형식으로 한 줄에 출력하세요. [answer] | `HandleKeyUpEvent`에서 `KeyboardKey.Q`가 감지될 때 `EffectSerial`에 저장된 시리얼 번호를 이용해 `_EffectService:RemoveEffect()`를 한 번 호출하므로 제거되는 이펙트는 1개입니다. 이후 `_EffectService:PlayEffect()`가 X축 방향 5개와 원본 위치 1개, 총 6번 호출되므로 생성되는 이펙트는 6개입니다. ```lua Property: [None] number EffectSerial = 0 Event Handler: [service: InputSe [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 코드와 정확히 일치하며, 질문에서 요구한 형식으로 로그를 출력하는 적절한 응답입니다. [source_doc] | 2단 점프와 스킬을 간단하게 만드는 예제입니다. 2단 점프는 공중에서 점프(Alt or Space)를 사용할 때 발동되도록 `InputService`의 이벤트를 사용합니다. Q키를 눌렀다가 떼는 순간 스킬을 사용하도록 만들기 위해 `RemoveEffect()`를 사용합니다. ```lua Property: [None] number EffectSerial = 0 Event Handler: [service: InputService] HandleKeyDownEvent (KeyDownEvent event) { -- Paramet
[task] | single_turn [pass] | ✅ 통과 [title] | EffectService [question] | PlayEffect와 PlayEffectAttached 메서드의 차이점이 무엇이며, 각각 어떤 상황에 사용해야 하나요? [answer] | `EffectService`의 `PlayEffect`와 `PlayEffectAttached` 메서드는 이펙트의 위치 지정 방식과 부모 엔티티와의 관계에서 명확한 차이가 있습니다. ### 1. 핵심 차이점 | 구분 | PlayEffect | PlayEffectAttached | | :--- | :--- | :--- | | **위치 기준** | **세계 좌표 (World Position)** | **로컬 좌표 (Local Position)** | | **부모 엔티티** | 없음 (맵의 고정된 위치에 생성) | 있음 (`parentE [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 API 시그니처와 설명을 정확히 반영하여 두 메서드의 차이와 사용 시나리오를 명확히 설명했으며, 코드 예제도 mLua 문법에 맞게 작성되었습니다. [source_doc] | 이펙트 제어 기능을 제공합니다. # Methods - **integer PlayEffect(string animationClipRUID, Entity instigator, Vector3 position, float zRotation, Vector3 scale, boolean isLoop = false, Dictionary<string, any> options = nil)** 현재 맵의 고정된 위치에 이펙트를 재생하고 이펙트를 제거하기 위한 일련 번호를 반환합니다. 이펙트 생성에 실패할 경우 0을 반환합니다. 사용 가능한 옵션
[task] | code [pass] | ✅ 통과 [title] | InputService [question] | InputService의 ExitPopupOpenedEvent와 ExitPopupClosedEvent를 처리하여 팝업 열림과 닫힘 상태를 log로 기록하는 스크립트를 작성해줘 [answer] | InputService의 `ExitPopupOpenedEvent`와 `ExitPopupClosedEvent`를 처리하기 위한 스크립트입니다. ```lua Event Handler: [service: InputService] HandleExitPopupOpenedEvent(ExitPopupOpenedEvent event) { log("Exit popup opened.") } [service: InputService] HandleExitPopupClosedEvent(ExitPopupClosedEvent event) { [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서의 이벤트 이름과 system 규칙의 Event Handler 구문을 정확히 적용하여 요구사항을 간결하게 충족했습니다. [source_doc] | - **ExitPopupClosedEvent** 종료 팝업을 닫을 때 발생하는 이벤트입니다. - **ExitPopupOpenedEvent** 종료 팝업을 열 때 발생하는 이벤트입니다. - **KeyDownEvent** Key를 눌렀을 때 1회 발생합니다. - **KeyHoldEvent** Key를 누르는 동안 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyReleaseEvent** Key를 눌렀다 뗐을 때 1회 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyUpEvent** Key를 눌렀다
[task] | instruction_following [pass] | ✅ 통과 [title] | InputService [question] | Z키 입력 시 크기가 커지고 점프하는 컴포넌트에서 사용하는 프로퍼티와 메서드 호출만 코드 블록으로 출력하세요. [answer] | ```lua Property: [None] number KeyDownTime = 0 Event Handler: [service: InputService] HandleKeyDownEvent (KeyDownEvent event) { local key = event.key if key == KeyboardKey.Z then self.Entity.StateComponent:ChangeState("CROUCH") self.KeyDownTime = _UtilLogic.ElapsedSeconds end } Event Handle [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 질문에서 요구한 프로퍼티와 메서드 호출(이벤트 핸들러)만 정확하고 간결하게 코드 블록으로 제시하여 참고 문서와 완전히 일치합니다. [source_doc] | Z키를 누른 시간만큼 플레이어의 크기가 커지고, 높게 점프하는 컴포넌트를 만드는 예제입니다. 만든 컴포넌트를 **DefaultPlayer**에 추가해야 정상 작동합니다. 먼저 Z키를 눌렀을 때 웅크린 자세로 바꾸기 위해 `KeyDownEvent`를 아래와 같이 작성합니다. 누른 시간을 계산하기 위해서 **KeyDownTime** 프로퍼티를 만들고 현재 시간을 기록합니다. ```lua Property: [None] number KeyDownTime = 0 Event Handler: [service: InputService
[task] | two_turn [pass] | ✅ 통과 [title] | InputService [question] | InputService의 HandleKeyReleaseEvent 핸들러가 어떤 키 입력 이벤트를 처리하는지 알려주세요. [answer] | InputService의 `HandleKeyReleaseEvent` 핸들러는 사용자가 키보드의 키를 **놓았을 때(Release)** 발생하는 이벤트를 처리합니다. 이벤트 객체(`KeyReleaseEvent`)의 `key` 프로퍼티를 통해 어떤 키가 눌렸는지 확인할 수 있으며, 예제에서는 `KeyboardKey.Z` 키가 눌렸을 때 엔티티의 스케일을 `Vector3.one`으로 초기화하는 동작을 수행합니다. ```lua Event Handler: [service: InputService] HandleKeyReleaseEvent [followup] | KeyboardKey.Z 키를 누르면 Scale이 Vector3.one으로 리셋되는 예시 코드 외에, 다른 키(예: A, B)에 특정 동작을 부여하려면 if 조건문이나 if-else 문법을 어떻게 수정해야 하나요? [followup_answer] | 참고 문서에 제시된 예제 코드는 `KeyboardKey.Z` 키에 대한 처리만 포함하고 있으며, 다른 키(예: `KeyboardKey.A`, `KeyboardKey.B`)에 대한 구체적인 처리 로직이나 추가 키 상수 사용 예시는 문서에 포함되어 있지 않습니다. 따라서 문서에 근거하여 `KeyboardKey.Z` 키를 제외한 다른 키에 동작을 부여하는 구체적인 코드 예제는 제공하기 어렵습니다. 다만, 문서에 보이는 문법 구조를 바탕으로 `if` 조건문에서 `event.key` 값을 비교하는 방식은 동일하게 적용될 것으로 예상됩니다. [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 참고 문서와 시스템 규칙에 근거하여 HandleKeyReleaseEvent가 키 해제 이벤트를 처리함을 정확히 설명하고 예제를 제시하여 질문에 충실하게 답변했습니다. [source_doc] | ```lua Event Handler: [service: InputService] HandleKeyReleaseEvent (KeyReleaseEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: InputService -- Space: Client --------------------------------------------------------- -- Parameters local key = event.key ---
[task] | single_turn [pass] | ❌ 탈락 [title] | SpawnService [question] | SpawnService에서 특정 이벤트 발생 시 핸들러로 통지받기 위해 ConnectEvent 함수를 호출할 때 key와 eventType 매개변수 중 어떤 것을 사용하는 것이 적절한가요? [answer] | `SpawnService`에서 `ConnectEvent` 함수를 사용하여 이벤트 발생 시 핸들러로 통지받기 위해 `key`와 `eventType` 매개변수 중 **`eventType` (Type)**를 사용하는 것이 더 명확하고 안정적인 방법입니다. 이유는 다음과 같습니다. 1. **타입 안정성**: `eventType` 매개변수는 이벤트의 `Type` 객체를 직접 전달하므로, 문자열 오타로 인한 오류가 발생할 가능성이 없습니다. 2. **명확성**: `key`는 문자열 형태이므로, 이벤트 이름이 변경되거나 정적 분석이 어려 [followup] | [followup_answer] | [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=3 [judge_reason] | eventType 권장 논리는 타당하나, 문서에 없는 'EntitySpawnedEvent'와 'EntitySpawned' 키를 예시로 제시하여 존재하지 않는 API를 지어낸 것으로 판단됩니다. [source_doc] | 엔티티 스폰 관련 기능을 제공합니다. # Methods - **Entity Clone(string name, Entity original, Entity parent = nil, boolean posOffset = true, boolean dynamic = true) [Deprecated]** 더는 사용하지 않는 함수입니다. SpawnByEntity(Entity, string, Vector3, Entity, boolean) 함수를 사용하세요. - **Entity SpawnByEntity(Entity entity, string
[task] | single_turn [pass] | ✅ 통과 [title] | InputService [question] | 종료 팝업과 메뉴 팝업의 열림/닫힘 이벤트를 각각 어떻게 처리하나요? [answer] | 종료 팝업과 메뉴 팝업의 열림/닫힘 이벤트는 `InputService`에서 제공하는 각각의 이벤트 핸들러를 통해 처리합니다. 각 팝업 상태 변화에 따라 4개의 다른 이벤트를 사용해야 합니다. 1. **종료 팝업 (Exit Popup)** - 열림: `ExitPopupOpenedEvent` - 닫힘: `ExitPopupClosedEvent` 2. **메뉴 팝업 (Menu Popup)** - 열림: `MenuPopupOpenedEvent` - 닫힘: `MenuPopupClosedEvent` 아래는 이 4가지 이 [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서에 명시된 4가지 팝업 이벤트와 mLua 스크립트 규칙에 따른 Event Handler 문법이 정확하고 명확하게 설명되어 있습니다. [source_doc] | - **ExitPopupClosedEvent** 종료 팝업을 닫을 때 발생하는 이벤트입니다. - **ExitPopupOpenedEvent** 종료 팝업을 열 때 발생하는 이벤트입니다. - **KeyDownEvent** Key를 눌렀을 때 1회 발생합니다. - **KeyHoldEvent** Key를 누르는 동안 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyReleaseEvent** Key를 눌렀다 뗐을 때 1회 발생합니다. 짧게 누르면 발생하지 않습니다. - **KeyUpEvent** Key를 눌렀다
[task] | single_turn [pass] | ✅ 통과 [title] | EffectService [question] | `RemoveEffect`를 호출할 때 `EffectSerial`을 어떻게 관리해야 하며, 이 값을 잘못 저장하면 어떤 문제가 발생하는지 알고 싶습니다. [answer] | `EffectService`의 `PlayEffectAttached` 메서드를 사용하여 엔티티에 부착된 이펙트를 생성할 때, 반환되는 `EffectSerial` 값을 반드시 저장해야 합니다. 이 값은 해당 이펙트를 식별하는 고유 식별자 역할을 하며, 이후 `RemoveEffect` 메서드를 호출하여 특정 이펙트를 제거할 때 사용됩니다. **EffectSerial 관리 방법** 1. **Property 선언**: 스크립트 상단에 `number` 타입의 프로퍼티(예: `EffectSerial`)를 선언하여 이 값을 보관합니다. 2. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 예제와 API 동작을 정확히 바탕으로 EffectSerial 관리 방법과 오류 시나리오를 명확히 설명하여 질문에 충실하게 답변함 [source_doc] | 2단 점프와 스킬을 간단하게 만드는 예제입니다. 2단 점프는 공중에서 점프(Alt or Space)를 사용할 때 발동되도록 `InputService`의 이벤트를 사용합니다. Q키를 눌렀다가 떼는 순간 스킬을 사용하도록 만들기 위해 `RemoveEffect()`를 사용합니다. ```lua Property: [None] number EffectSerial = 0 Event Handler: [service: InputService] HandleKeyDownEvent (KeyDownEvent event) { -- Paramet
[task] | code [pass] | ✅ 통과 [title] | EffectService [question] | 공중에서 점프키를 눌렀을 때 RigidbodyComponent 의 IsOnGround() 를 확인하여 공중이면 TransformComponent.Position 을 기준으로 EffectService 의 PlayEffect() 를 호출해 이펙트를 재생하는 2단 점프 스크립트를 작성해줘 [answer] | 제공된 문서에 포함된 예제를 기반으로, 공중에서 점프키를 눌렀을 때 `RigidbodyComponent:IsOnGround()` 로 공중 여부를 확인하고, 공중이면 `TransformComponent.Position` 을 기준으로 `_EffectService:PlayEffect()` 를 호출하여 이펙트를 재생하는 2단 점프 스크립트입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent (KeyDownEvent event) { -- Parameters loca [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 질문에서 요구한 조건(공중 확인, 포지션 기반 이펙트 재생)을 참고 문서의 API와 문법을 정확히 준수하여 간결하게 작성했음. [source_doc] | 2단 점프와 스킬을 간단하게 만드는 예제입니다. 2단 점프는 공중에서 점프(Alt or Space)를 사용할 때 발동되도록 `InputService`의 이벤트를 사용합니다. Q키를 눌렀다가 떼는 순간 스킬을 사용하도록 만들기 위해 `RemoveEffect()`를 사용합니다. ```lua Property: [None] number EffectSerial = 0 Event Handler: [service: InputService] HandleKeyDownEvent (KeyDownEvent event) { -- Paramet
[task] | two_turn [pass] | ❌ 탈락 [title] | InstanceMapService [question] | Service에서 상속받은 ConnectEvent와 SendEvent를 이용해 InstanceMapService의 이벤트를 처리하려면 어떤 코드가 필요한가? [answer] | `InstanceMapService`는 `Service`에서 상속받은 `ConnectEvent`와 `SendEvent` 메서드를 제공합니다. 1. **이벤트 연결 (ConnectEvent)**: 특정 이벤트가 발생했을 때 실행될 함수(핸들러)를 등록합니다. * `string key`: 연결할 이벤트의 이름(키) * `IScriptFunction eventHandler`: 이벤트 발생 시 호출될 함수 2. **이벤트 발생 (SendEvent)**: 직접 이벤트를 발생시켜 연결된 핸들러들을 실 [followup] | ConnectEvent의 string key와 Type eventType 오버로드를 각각 사용하여 이벤트 핸들러를 등록하고, 특정 조건에서 SendEvent를 호출하는 mLua 코드 예제를 작성해줘. [followup_answer] | `InstanceMapService`는 `Service`에서 상속받은 `ConnectEvent`의 두 가지 오버로드(문자열 키 방식과 타입 방식)를 제공합니다. **중요 참고:** 제공된 문서에는 `InstanceMapService`에서 실제로 정의된 구체적인 이벤트 이름(예: `"MapSpawned"`)이나 이벤트 타입(예: `MapSpawnedEvent`)이 명시되어 있지 않습니다. 따라서 아래 코드 예시에서는 가상의 이벤트 키 `"InstanceMapEvent"`와 가상의 이벤트 타입 `InstanceMapEvent`를 사용 [scores] | helpfulness=3 correctness=2 coherence=4 complexity=3 verbosity=3 [judge_reason] | 문서에 없는 'MapChanged' 이벤트 키와 '{}' 테이블을 이벤트 객체로 사용하는 예시를 '가상'이라고 명시했으나, mLua의 실제 이벤트 처리 방식(Event Handler 블록)을 무시하고 C#풍 메서드 호출로만 작성해 실제 적용 가능한 코드가 아님. [source_doc] | g, string, string) 함수를 사용하세요. - **boolean MoveUserToParentMap(string userId, string mapName = nil) [Deprecated] [ServerOnly] [Yield]** 더는 사용하지 않는 함수입니다. RoomService의 MoveUserToStaticRoom(string, string) 함수를 사용하세요. - **boolean MoveUserToStaticRoom(string userId, string mapName = nil) [Deprecated] [
[task] | single_turn [pass] | ✅ 통과 [title] | SpawnService [question] | _spawnService:SpawnByEntity로 복제한 엔티티는 원본과 어떤 관계에 있으며, 자식 엔티티로 추가한 모델은 어디에 속하나요? [answer] | `_SpawnService:SpawnByEntity`를 사용하여 엔티티를 복제하면, 원본 엔티티와 구조적으로 동일한 **독립된 복제본(Clone)**이 생성됩니다. 복제된 엔티티는 원본과 별도의 개체로 존재하며, 원본의 상태를 실시간으로 공유하지 않습니다. 자식 엔티티로 추가한 모델은 **복제된 엔티티**를 부모(Parent)로 가집니다. 즉, `_SpawnService:SpawnByModelId` 호출 시 네 번째 인자로 복제된 엔티티를 전달하면, 해당 모델은 원본 엔티티가 아닌 복제된 엔티티의 자식으로 생성되어 관리됩니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=3 verbosity=2 [judge_reason] | 참고 문서의 예제와 설명을 정확히 인용하여 복제본의 독립성과 자식 엔티티의 소속 관계를 명확하고 일관되게 설명했습니다. [source_doc] | 엔티티 하나를 복제하고, 복제된 엔티티의 자식 엔티티로 모델을 스폰하는 예제입니다. ```lua Method: [server only] void OnBeginPlay() { local entity = _EntityService:GetEntityByPath("Entity Path") local clone1 = _SpawnService:SpawnByEntity(entity, "clone1", Vector3(1, 0, 0)) local modelId = "Model Entry Id" local clone2 = _SpawnS
[task] | instruction_following [pass] | ✅ 통과 [title] | InputService [question] | 문서 예제에서 `HandleScreenTouchEvent` 이벤트 핸들러가 `TouchId`가 1 미만일 때 수행하는 동작을 1문장으로 설명하세요. [answer] | `TouchId`가 1 미만일 경우 즉시 함수를 종료(return)합니다. [followup] | [followup_answer] | [scores] | helpfulness=4 correctness=4 coherence=4 complexity=2 verbosity=2 [judge_reason] | 문서 예제에서 `TouchId < 1`일 때 `return`으로 함수를 종료하는 동작을 정확하고 간결하게 설명했습니다. [source_doc] | #### 터치 입력 터치한 위치에 파티클을 보여주는 예제입니다. ```lua Method: [server only] void OnBeginPlay () { local root = _EntityService:GetEntityByPath(EntityPath) for i = 1, #root.Children do root.Children[i].Enable = false end } Event Handler: [service: InputService] HandleScreenTouchEvent (ScreenTouchEvent ev