[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | PhysicsRigidbodyComponent의 함수를 호출하려는데 ClientOnly 설정에 따라 실행 공간이 어떻게 달라지는지 궁금해요. [answer] | `PhysicsRigidbodyComponent`의 함수 호출 가능 실행 공간은 해당 엔티티에 붙어 있는 `PhysicsColliderComponent`의 **ClientOnly** 프로퍼티 값에 따라 결정됩니다. ### 1. ClientOnly가 True인 경우 * **물리 연산 위치**: Client에서만 생성되고, 각 클라이언트에서 물리 연산이 계산됩니다. * **동기화**: 다른 클라이언트와 물리 결과가 동기화되지 않습니다. * **함수 호출/변경 가능 실행 공간**: **Client**에서만 관련 함수를 호출하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PhysicsRigidbodyComponent**의 대부분의 Property와 Function은 **PhysicsColliderComponent**의 ClientOnly 프로퍼티의 값에 따라 사용, 접근 가능한 실행 공간이 나뉘게 됩니다. ClientOnly에 따라 각각의 물리 World에서 연산되며, 이에 따라 서로 충돌하거나 영향을 주지 않습니다. * **ClientOnly가 True일 때**: 해당 Entity의 물리 강체는 Client에서만 생성되고 물리 연산은 각각의 Client에서 계산됩니다. 다른 Client와 결
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | 클릭 좌표를 로그로 출력하는 HandleWebViewClickedEvent 함수의 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Event Handler: [self] HandleWebViewClickedEvent(WebViewClickedEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: WebViewComponent -- Space: Client --------------------------------------------------------- -- Parameters -- local Nor [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 웹 브라우저에서 클릭한 지점의 좌표를 로그로 남겨봅시다. **WebViewClickedEvent**를 활용하면 클릭한 지점의 **normalizedPosition**을 확인할 수 있습니다. **normalizedPosition**이란 웹 뷰를 하나의 평면 좌표계라고 했을 때 왼쪽 상단을 (0,0), 오른쪽 하단을 (1,1)로 표현한 위치를 말합니다. 화면의 정중앙 좌표는 (0.5,0.5) 입니다. 1. **WebViewTest** 스크립트에 **WebViewClickedEvent**를 추가하고 다음과 같이 작성합니다. `
[task] | single_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | Peak Time이 높은 함수를 찾을 때 Shift + 클릭 기능이 어떻게 작동하며, 한 번의 Peak만으로 함수에 문제가 있다고 단정 지을 수 없는 이유는 무엇인가요? [answer] | 루아 프로파일러의 차트 영역에서 **Shift + 클릭**을 수행하면, 클릭한 지점의 주변 10% 범위 내에서 총 실행 시간이 가장 높은 프레임이 선택됩니다. 이렇게 선택된 프레임을 분석함으로써 Peak Time(최대 실행 시간)의 원인이 되는 특정 함수를 파악할 수 있습니다. 그러나 한 번의 Peak가 관찰되었다고 해서 해당 함수에 무조건 문제가 있다고 단정 지을 수는 없습니다. 그 이유는 **프로파일링 노이즈**가 발생했을 가능성이 있기 때문입니다. 따라서 동일한 부분에서 Peak가 반복적으로 발생함을 확인하기 위해 여러 차례 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 샘플 데이터를 보면 Frame의 Total Self Time이 전체의 62% 이상을 차지하는 것을 알 수 있습니다. Frame에서의 Self Time은 스크립트 실행을 제외하고 Native에서 소요된 시간이므로 Native Scope의 세부 분석이 필요한 상황입니다. 루아 프로파일러의 **File - Option**에서 **Native Scope**에 체크한 후 다시 프로파일링해봅시다. 다시 수집한 데이터의 카테고리를 살펴보면 Native Scope 세부 분석이 이루어졌음을 알 수 있습니다. Frame의 Total Self T
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | KeyDownEvent 핸들러 코드만 출력하고 설명은 주석으로만 작성하세요. [answer] | ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: InputService -- Space: Client --------------------------------------------------------- -- Parameters -- local key [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | UI로 웹 브라우저를 배치하면 화면의 특정 위치에 항상 웹 브라우저가 보이도록 할 수 있습니다. 1. **Hierarchy - ui** 아래에서 원하는 UI 그룹의 콘텍스트 메뉴를 엽니다. **Create Entity - Create UIEmpty**를 선택해 **UIEmpty**를 생성합니다. 2. 프로퍼티 에디터에서 **UIEmpty**에 **WebViewComponent**를 추가하고 원하는 Url을 입력합니다. 3. 엔티티의 크기를 적절하게 조절한 후 **[시작]** 버튼을 눌러 테스트해 봅시다. 화면의 특정 위치에
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | PhysicsColliderComponent의 IsSensor 프로퍼티가 true로 설정된 상태에서 PhysicsContactBeginEvent가 발생하면 _TimerService:SetTimerOnce()를 이용해 0.1초 후 PhysicsRigidbodyComponent에 ApplyLinearImpulse() 함수로 상향 충격량을 적용하는 스크립트를 작성해줘 [answer] | `PhysicsColliderComponent`의 `IsSensor`가 `true`로 설정되어 있으면 물리적인 상호작용(반동, 마찰 등)은 일어나지 않지만, 충돌 감지 이벤트는 발생하므로 `PhysicsContactBeginEvent`를 정상적으로 받을 수 있습니다. 요구사항에 맞춰 `PhysicsContactBeginEvent` 핸들러에서 `_TimerService:SetTimerOnce()`로 0.1초 타이머를 설정하고, 타이머가 만료되면 해당 엔티티의 `PhysicsRigidbodyComponent`에 `ApplyLinear [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 힘을 가하는 함수 `ApplyForce()`, `ApplyTorque()` 함수는 지속적인 힘을 가할 수 있습니다. 특정 Key를 눌러 지속적으로 특정 방향으로 힘 가하고 싶을 때가 해당됩니다. 매개 변수 force는 힘을 의미합니다. 해당 Entity에 대응하는 물리 강체의 질량 값에 영향을 받습니다. #### 충격량을 적용하는 함수 `ApplyAngularImpulse()`, `ApplyLinearImpulse()` 함수는 일시적으로 짧은 충격을 가할 수 있습니다. 대포 발파, 방망이 휘두르기 같은 짧은 충격을 주
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | PixelPerUnit 프로퍼티에 대해 100~500 범위 내의 권장 값과 수치 변화에 따른 시각적 영향을 표로 정리해서 설명하세요. [answer] | `PixelPerUnit` 프로퍼티는 월드 내 1 Unit 거리에 해당하는 화면 픽셀 수를 결정하며, 설정 가능한 범위는 **100~500**입니다. 이 값이 크면 더 많은 웹 콘텐츠가 화면에 표시되지만, 웹 요소(텍스트, 버튼 등)가 작게 보이며, 값이 작으면 반대로 콘텐츠 표시 영역은 좁아지지만 웹 요소가 크게 보입니다. 문서에 명시된 구체적인 '권장 값'은 없으므로, 아래 표는 제공된 정보(범위 및 시각적 영향)를 바탕으로 수치 변화에 따른 영향을 정리한 것입니다. | PixelPerUnit 값 | 시각적 영향 | | : [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **WebViewComponent**를 활용하면 웹 브라우저를 월드에 배치하고 탐색할 수 있습니다. 간단한 예제를 통해 월드에서 웹 브라우저를 활용하는 방법을 알아봅시다. ##### 참고 API Reference [WebViewComponent](/apiReference/Components/WebViewComponent) # WebViewComponent 소개 엔티티에 **WebViewComponent**를 추가하면 월드에 웹 브라우저를 배치할 수 있습니다. 먼저 **WebViewComponent**의 프
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | 문서에 제시된 WebViewClickedEvent 활용 단계를 단계별 번호 목록으로 정리하세요. [answer] | 웹 브라우저에서 클릭한 지점의 좌표를 로그로 확인하기 위한 단계는 다음과 같습니다. 1. `WebViewTest` 스크립트에 `WebViewClickedEvent` 핸들러를 추가하고, 이벤트 객체의 `NormalizedPosition` 프로퍼티를 가져와 로그로 출력하는 코드를 작성합니다. ```lua Event Handler: [self] HandleWebViewClickedEvent(WebViewClickedEvent event) { --------------- Native Event Sender Info ------- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 웹 브라우저에서 클릭한 지점의 좌표를 로그로 남겨봅시다. **WebViewClickedEvent**를 활용하면 클릭한 지점의 **normalizedPosition**을 확인할 수 있습니다. **normalizedPosition**이란 웹 뷰를 하나의 평면 좌표계라고 했을 때 왼쪽 상단을 (0,0), 오른쪽 하단을 (1,1)로 표현한 위치를 말합니다. 화면의 정중앙 좌표는 (0.5,0.5) 입니다. 1. **WebViewTest** 스크립트에 **WebViewClickedEvent**를 추가하고 다음과 같이 작성합니다. `
[task] | single_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | TriggerComponent의 OnUpdate 함수가 Native Function으로 분류되는 이유는 무엇이며, 프로파일러에서 이를 확인하기 위해 어떤 옵션을 활성화해야 하나요? [answer] | TriggerComponent의 OnUpdate 함수가 Native Function으로 분류되는 이유는, 이 함수가 스크립트(루아) 코드에서 직접 작성된 로직이 아니라 게임 엔진의 네이티브(Native) 코드에서 실행되기 때문입니다. 루아 프로파일러의 Frame Self Time은 스크립트 실행을 제외한 네이티브 처리에 소요된 시간을 나타내므로, 네이티브 레벨의 세부 내용을 보려면 특별한 옵션이 필요합니다. 프로파일러에서 TriggerComponent의 OnUpdate와 같은 네이티브 함수의 시간 점유율과 호출 횟수를 확인하기 위 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 샘플 데이터를 보면 Frame의 Total Self Time이 전체의 62% 이상을 차지하는 것을 알 수 있습니다. Frame에서의 Self Time은 스크립트 실행을 제외하고 Native에서 소요된 시간이므로 Native Scope의 세부 분석이 필요한 상황입니다. 루아 프로파일러의 **File - Option**에서 **Native Scope**에 체크한 후 다시 프로파일링해봅시다. 다시 수집한 데이터의 카테고리를 살펴보면 Native Scope 세부 분석이 이루어졌음을 알 수 있습니다. Frame의 Total Self T
[task] | code [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | WebViewComponent의 ClickingEnabled, HoveringEnabled, ScrollingEnabled 프로퍼티를 true로 설정하여 상호작용을 활성화하는 스크립트를 작성해줘 [answer] | WebViewComponent의 `ClickingEnabled`, `HoveringEnabled`, `ScrollingEnabled` 프로퍼티를 모두 `true`로 설정하여 웹 뷰에서의 클릭, 호버, 스크롤 상호작용을 활성화하는 스크립트입니다. ```lua Property: [None] WebViewComponent WebView = nil Method: [server only] void OnBeginPlay() { self.WebView.ClickingEnabled = true self.WebView.Hoveri [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **WebViewComponent**를 활용하면 웹 브라우저를 월드에 배치하고 탐색할 수 있습니다. 간단한 예제를 통해 월드에서 웹 브라우저를 활용하는 방법을 알아봅시다. ##### 참고 API Reference [WebViewComponent](/apiReference/Components/WebViewComponent) # WebViewComponent 소개 엔티티에 **WebViewComponent**를 추가하면 월드에 웹 브라우저를 배치할 수 있습니다. 먼저 **WebViewComponent**의 프
[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | ClientOnly 프로퍼티의 값이 물리 연산과 함수 접근 권한에 어떤 영향을 미치는지 설명해 주세요 [answer] | `PhysicsColliderComponent`의 `ClientOnly` 프로퍼티 값은 물리 강체(PhysicsRigidbodyComponent)의 생성 위치, 물리 연산이 수행되는 공간, 그리고 관련 함수 및 프로퍼티에 접근할 수 있는 실행 공간(Server 또는 Client)을 결정합니다. `ClientOnly` 값에 따른 구체적인 영향은 다음과 같습니다. **1. ClientOnly가 True일 때** * **물리 강체 생성 및 연산:** 해당 엔티티의 물리 강체는 **Client에서만** 생성됩니다. 물리 연산 역시 [followup] | ClientOnly가 True일 때와 False일 때, 각각 어떤 실행 공간에서 ApplyLinearImpulse 같은 물리 함수를 호출할 수 있으며 결과는 어떻게 동기화되나요? [followup_answer] | `PhysicsColliderComponent`의 `ClientOnly` 값에 따라 `ApplyLinearImpulse`와 같은 물리 함수를 호출할 수 있는 실행 공간과 결과 동기화 방식은 다음과 같이 달라집니다. **1. ClientOnly가 True일 때** * **호출 가능한 실행 공간:** **Client**에서만 관련 함수를 호출하고 대부분의 프로퍼티를 변경할 수 있습니다. * **동기화 방식:** 물리 강체는 Client에서만 생성되며 물리 연산은 각각의 Client에서 독립적으로 계산됩니다. 따라서 다른 Cli [scores] | [judge_reason] | [source_doc] | **PhysicsRigidbodyComponent**의 대부분의 Property와 Function은 **PhysicsColliderComponent**의 ClientOnly 프로퍼티의 값에 따라 사용, 접근 가능한 실행 공간이 나뉘게 됩니다. ClientOnly에 따라 각각의 물리 World에서 연산되며, 이에 따라 서로 충돌하거나 영향을 주지 않습니다. * **ClientOnly가 True일 때**: 해당 Entity의 물리 강체는 Client에서만 생성되고 물리 연산은 각각의 Client에서 계산됩니다. 다른 Client와 결
[task] | code [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | WebViewComponent를 가진 엔티티에 KeyDownEvent 핸들러를 추가하여 Backspace 키 입력 시 GoBack(), 0 키 입력 시 GoForward(), 5 키 입력 시 Reload(), = 키 입력 시 ZoomIn(), - 키 입력 시 ZoomOut(), Home 키 입력 시 Vector2(0, -100)으로 Scroll(), End 키 입력 시 Vector2(0, 100)으로 Scroll()하도록 제어하는 스크립트를 작성해줘 [answer] | WebViewComponent를 가진 엔티티에 키 입력으로 웹 브라우저를 제어하는 스크립트는 다음과 같이 작성할 수 있습니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: InputService -- Space: Client -------------------------- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | UI로 웹 브라우저를 배치하면 화면의 특정 위치에 항상 웹 브라우저가 보이도록 할 수 있습니다. 1. **Hierarchy - ui** 아래에서 원하는 UI 그룹의 콘텍스트 메뉴를 엽니다. **Create Entity - Create UIEmpty**를 선택해 **UIEmpty**를 생성합니다. 2. 프로퍼티 에디터에서 **UIEmpty**에 **WebViewComponent**를 추가하고 원하는 Url을 입력합니다. 3. 엔티티의 크기를 적절하게 조절한 후 **[시작]** 버튼을 눌러 테스트해 봅시다. 화면의 특정 위치에
[task] | single_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | MonsterController의 OnUpdate 함수처럼 평균 실행 시간은 짧지만 호출 횟수가 많아 총 시간이 길어지는 현상은 어떤 원인으로 발생하며 어떻게 최적화할 수 있나요? [answer] | MonsterController의 OnUpdate 함수처럼 평균 실행 시간은 짧지만 호출 횟수가 많아 총 실행 시간이 길어지는 현상은, 스크립트 내 단순한 프로퍼티 접근이나 가벼운 연산이라도 매 프레임마다 반복적으로 호출될 때 발생합니다. `OnUpdate`는 게임 루프에서 매 프레임마다 실행되므로, 내부 로직이 아무리 간단해도 누적된 호출 횟수가 전체 성능에 큰 영향을 미칩니다. 이러한 문제를 최적화하기 위해서는 프로파일러로 수집된 데이터를 분석하여 시간 점유율이 높은 함수를 식별하고, 해당 함수의 로직을 효율적으로 개선해야 합 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 샘플 데이터를 보면 Frame의 Total Self Time이 전체의 62% 이상을 차지하는 것을 알 수 있습니다. Frame에서의 Self Time은 스크립트 실행을 제외하고 Native에서 소요된 시간이므로 Native Scope의 세부 분석이 필요한 상황입니다. 루아 프로파일러의 **File - Option**에서 **Native Scope**에 체크한 후 다시 프로파일링해봅시다. 다시 수집한 데이터의 카테고리를 살펴보면 Native Scope 세부 분석이 이루어졌음을 알 수 있습니다. Frame의 Total Self T
[task] | two_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 배포된 게임을 플레이하면서 성능 문제를 진단해야 하는 상황인데, 배포된 게임 환경에서 루아 프로파일러를 실행하여 기록을 시작하는 과정이 궁금합니다. [answer] | 배포된 게임에서 루아 프로파일러를 실행하고 기록을 시작하는 과정은 다음과 같습니다. 1. 게임 화면 우측 상단의 **설정** 버튼을 누릅니다. 2. 설정 메뉴에서 **기타** 탭을 선택합니다. 3. **Lua Profiler 사용** 옵션을 켜고, **Lua Profiler 실행** 버튼을 누릅니다. 위 단계를 수행하면 루아 프로파일러가 실행되며 즉시 성능 데이터 기록이 시작됩니다. [followup] | 배포된 게임 우측 상단 설정 버튼에서 '기타' 탭으로 이동하여 'Lua Profiler 사용'을 켜고 'Lua Profiler 실행' 버튼을 누르는 순서와, 이 버튼 클릭 시 기록이 즉시 시작되는지 여부만 확인해 주세요. [followup_answer] | 배포된 게임에서 루아 프로파일러를 실행하는 순서는 다음과 같습니다: 1. 게임 화면 우측 상단의 **설정** 버튼을 누릅니다. 2. **기타** 탭을 선택합니다. 3. **Lua Profiler 사용** 옵션을 켭니다. 4. **Lua Profiler 실행** 버튼을 누릅니다. **Lua Profiler 실행** 버튼을 누르는 시점에 루아 프로파일러가 실행되면서 **즉시 기록이 시작**됩니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 게임을 플레이하다 보면 다양한 상황에서 느려지는 것을 경험할 수 있습니다. 이처럼 게임의 처리 속도에서 부하가 걸리는 병목 지점(Bottleneck)을 찾아 수정하는 것을 최적화라고 합니다. 일부 병목 지점만 해결해도 게임의 전체적인 성능 향상을 기대할 수 있기 때문에 최적화는 상당히 중요한 작업입니다. 루아 프로파일러는 이러한 스크립트 최적화 작업을 더욱 손쉽게 진행할 수 있도록 도와줍니다. 이번 시간에는 **루아 프로파일러**가 무엇인지 알아보고 활용법을 살펴보도록 합시다. **더 알아보기** >
[task] | two_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 루아 프로파일러에서 Context 선택과 그래프 옵션(File - Option) 설정은 어떻게 진행하나요? [answer] | 루아 프로파일러에서 Context 선택과 그래프 옵션 설정은 다음과 같이 진행합니다. ### 1. Context 선택 Context는 Core에서의 실행 흐름을 의미하며, 프로파일링할 대상 환경을 지정합니다. * 선택 가능한 Context는 **Server**, **Client**, **Instance**, **Editor** 입니다. * 원하는 Context를 선택하면 차트 영역과 프로파일링 결과 영역에서 해당 Context의 데이터를 확인할 수 있습니다. ### 2. 그래프 옵션 (File - Option) 설정 프로 [followup] | Server Context에서 Network와 Memory 옵션을 체크한 후, 차트에서 특정 프레임을 선택해 우클릭 메뉴를 통해 데이터를 저장하거나 확대하는 구체적인 방법은 무엇인가요? [followup_answer] | Server Context에서 Network와 Memory 옵션을 체크한 후, 차트에서 특정 프레임을 선택하고 우클릭 메뉴를 활용하는 구체적인 방법은 다음과 같습니다. ### 1. 사전 설정 (Context 및 옵션) 1. **Context 선택**: 프로파일러 상단에서 **Server**를 선택합니다. 2. **옵션 체크**: `File - Option` 메뉴에서 **Network**와 **Memory**를 모두 체크합니다. * 이렇게 하면 프로파일링 기록 시 Network Send/Receive 및 Lua Mem [scores] | [judge_reason] | [source_doc] | * Context는 Core에서의 실행 흐름을 뜻합니다. * Server, Client, Instance, Editor 등의 Context 중에서 선택할 수 있습니다. * Context를 선택하면 ⑤ 차트 영역과 ⑨ 프로파일링 결과 영역에서 데이터를 확인할 수 있습니다. ### ④ 그래프 선택 * **Elapsed Time, Network Send, Network Receive, Lua Memory** 중에서 어떤 그래프를 ⑤의 차트 영역에 표시할 것인지 선택합니다. * **File - Option**에서 **Network**를
[task] | two_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | Frame의 Self Time이 높게 측정될 때 Native Scope 분석을 통해 어떤 원인을 파악할 수 있나요? [answer] | Frame의 Self Time이 높게 측정될 때는 스크립트 실행을 제외한 네이티브(Native) 코드에서 소요된 시간이 원인일 수 있습니다. 루아 프로파일러의 **File - Option**에서 **Native Scope** 옵션을 활성화하고 다시 프로파일링을 수행하면, Frame의 총 Self Time이 감소하는 대신 구체적인 네이티브 함수가 시간 점유율을 차지하는 것으로 나타납니다. 이를 통해 특정 네이티브 함수(예: `TriggerComponent`의 `OnUpdate` 등)가 높은 시간 점유율, 많은 호출 횟수, 또는 높은 [followup] | Native Function인 TriggerComponent의 OnUpdate가 높은 점유율을 차지할 때 최적화를 위해 고려해야 할 지표는 무엇이며, Peak Time의 원인을 정확히 찾기 위해 차트에서 어떤 조작을 해야 하나요? [followup_answer] | Native Function인 TriggerComponent의 OnUpdate가 높은 점유율을 차지할 때 최적화를 위해 고려해야 할 지표는 **호출 횟수**와 **Peak Time**입니다. 샘플 데이터에서 해당 함수는 18% 이상의 시간 점유율과 함께 많은 호출 횟수 및 높은 Peak Time을 보여 최적화가 필요함을 알 수 있었습니다. Peak Time의 원인을 정확히 찾기 위해 차트 영역에서 **Shift + 클릭**을 수행해야 합니다. 이 조작을 하면 주변 10% 범위에서 총 실행 시간이 가장 높은 프레임이 선택되어 Pea [scores] | [judge_reason] | [source_doc] | 샘플 데이터를 보면 Frame의 Total Self Time이 전체의 62% 이상을 차지하는 것을 알 수 있습니다. Frame에서의 Self Time은 스크립트 실행을 제외하고 Native에서 소요된 시간이므로 Native Scope의 세부 분석이 필요한 상황입니다. 루아 프로파일러의 **File - Option**에서 **Native Scope**에 체크한 후 다시 프로파일링해봅시다. 다시 수집한 데이터의 카테고리를 살펴보면 Native Scope 세부 분석이 이루어졌음을 알 수 있습니다. Frame의 Total Self T
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 파티클 활용하기 [question] | `ParticleController` 스크립트에서 트리거 진입 시 파티클을 멈추기 위해 호출하는 메서드 이름과 이벤트 핸들러 이름을 단계별 번호 목록으로 나열하세요. [answer] | `ParticleController` 스크립트에서 트리거 진입 시 파티클을 멈추기 위해 사용하는 이름은 다음과 같습니다. 1. 이벤트 핸들러 이름: `HandleTriggerEnterEvent` 2. 호출하는 메서드 이름: `Stop` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [파티클 사용하기](/docs/?postId=1036) 가이드에서 파티클 컴포넌트의 개념 및 종류에 대해 알아보았습니다. 이번 시간에는 스크립트를 사용해 파티클을 활용하는 예제를 살펴보겠습니다. # 파티클 스크립트 ## 파티클 프로퍼티 제어 캐릭터와의 거리에 따라 파티클의 재생 속도가 바뀌는 예제를 통해 파티클 프로퍼티를 제어하는 방법을 살펴봅시다. 1. 파티클이 잘 보이도록 어두운 배경을 설정하고 지형을 배치한 뒤 원하는 파티클을 배치합니다. 본 예제에서는 Background로 **back-16**을 설
[task] | single_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 긴 스크립트 함수 내부에서 특정 루프의 성능을 분석하기 위해 profiler.beginscope과 profiler.endscope를 어떻게 사용해야 하나요? [answer] | 긴 스크립트 함수 내부의 특정 구간(루프 등)의 성능을 세밀하게 분석하려면 해당 구간의 시작과 끝에 `profiler.beginscope("이름")`과 `profiler.endscope()`를 쌍으로 배치해야 합니다. 이렇게 하면 프로파일러에서 해당 구간의 이름으로 실행 시간 데이터를 따로 분리하여 확인 할 수 있습니다. 사용 방법은 다음과 같습니다. 1. 분석 대상 코드(예: 반복문) 바로 위에 `profiler.beginscope("구분할_이름")`을 작성합니다. 2. 분석 대상 코드 바로 아래에 `profiler.endsc [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 샘플 데이터를 보면 Frame의 Total Self Time이 전체의 62% 이상을 차지하는 것을 알 수 있습니다. Frame에서의 Self Time은 스크립트 실행을 제외하고 Native에서 소요된 시간이므로 Native Scope의 세부 분석이 필요한 상황입니다. 루아 프로파일러의 **File - Option**에서 **Native Scope**에 체크한 후 다시 프로파일링해봅시다. 다시 수집한 데이터의 카테고리를 살펴보면 Native Scope 세부 분석이 이루어졌음을 알 수 있습니다. Frame의 Total Self T
[task] | single_turn [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | WebViewClickedEvent의 normalizedPosition 좌표계에서 (0,0)과 (1,1)은 각각 웹 뷰의 어느 쪽을 의미하나요? [answer] | WebViewClickedEvent의 normalizedPosition 좌표계에서 (0,0)은 웹 뷰의 왼쪽 상단, (1,1)은 오른쪽 하단을 의미합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 웹 브라우저에서 클릭한 지점의 좌표를 로그로 남겨봅시다. **WebViewClickedEvent**를 활용하면 클릭한 지점의 **normalizedPosition**을 확인할 수 있습니다. **normalizedPosition**이란 웹 뷰를 하나의 평면 좌표계라고 했을 때 왼쪽 상단을 (0,0), 오른쪽 하단을 (1,1)로 표현한 위치를 말합니다. 화면의 정중앙 좌표는 (0.5,0.5) 입니다. 1. **WebViewTest** 스크립트에 **WebViewClickedEvent**를 추가하고 다음과 같이 작성합니다. `
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 파티클 활용하기 [question] | `PlayBasicParticle()` 함수 호출 시 `option` 테이블에 반드시 포함해야 하는 키 2가지를 코드에서 추출하여 쉼표로 구분해 출력하세요. [answer] | Color, ParticleCount [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 1. 파티클이 잘 보이도록 어두운 배경을 설정하고 지형을 배치한 뒤 원하는 엔티티를 배치합니다. 본 예제에서는 Preset List에서 Background - **back-51**을 설정하고 Object - **object-174**를 배치했습니다. 2. Workspace - MyDesk에 새 스크립트 컴포넌트 ParticleServiceTest를 생성합니다. 3. 배치한 엔티티(object-174)의 Property에 ParticleServiceTest를 추가합니다. 4. 여기에 TweenCircula
[task] | single_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 루아 프로파일러에서 Frame의 Self Time이 높게 나타나면 왜 Native Scope 체크 후 재프로파일링을 해야 하는지 궁금합니다. [answer] | Frame의 Total Self Time이 전체 시간의 상당 부분(예: 62% 이상)을 차지하고 있다면, 이는 스크립트 코드 자체의 실행 시간이 아니라 **Native(네이티브)에서 소요된 시간**이 크다는 의미입니다. 따라서 Native Scope 체크 후 재프로파일링을 해야 하는 이유는 다음과 같습니다. 1. **Native Scope 세부 분석 필요:** Frame의 Self Time은 스크립트 로직 실행을 제외한 네이티브 레벨에서 발생한 시간을 나타냅니다. 일반 프로파일링 데이터만으로는 이 시간이 구체적으로 어떤 네이티 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 샘플 데이터를 보면 Frame의 Total Self Time이 전체의 62% 이상을 차지하는 것을 알 수 있습니다. Frame에서의 Self Time은 스크립트 실행을 제외하고 Native에서 소요된 시간이므로 Native Scope의 세부 분석이 필요한 상황입니다. 루아 프로파일러의 **File - Option**에서 **Native Scope**에 체크한 후 다시 프로파일링해봅시다. 다시 수집한 데이터의 카테고리를 살펴보면 Native Scope 세부 분석이 이루어졌음을 알 수 있습니다. Frame의 Total Self T
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | LeftEntity, LeftBar 엔티티에 PhysicsRigidbodyComponent, PhysicsColliderComponent를 적용하고 RevoluteJointComponent의 TargetEntityRef를 LeftBar로 설정하며 LocalAnchorB, LowerAngle, UpperAngle, MotorSpeed, UseLimits 값을 문서대로 초기화하는 스크립트를 작성해줘 [answer] | 제시된 문서에는 `RevoluteJointComponent`의 `TargetEntityRef`, `LocalAnchorB`, `LowerAngle`, `UpperAngle`, `MotorSpeed`, `UseLimits` 값에 대한 **구체적인 숫자나 설정 값이 명시되어 있지 않습니다.** 문서 2번 항목에서는 "아래와 같이 지정합니다"라고 언급하지만, 실제 값 목록이 빠져 있습니다. 따라서 문서에 없는 값을 지어내지 않기 위해, 컴포넌트 접근 구조와 문서에 명시된 `Joint` 값(1)만 설정하고, 나머지 미지정 값들은 주석으로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 1. 새로운 **LeftEntity, LeftBar** 오브젝트 엔티티를 만들고, **PhysicsRigidbodyComponent, PhysicsColliderComponent**를 추가합니다. * LeftEntity SpriteRUID: **e75cac80f719471fa482195531ed57cc** * LeftBar SpriteRUID: **0308ac89b10843fcab6384aa43f6ae22** 2. 원형 모양 엔티티에 **RevoluteJointComponent**를 추가하고, **Joint**에 **
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 파티클 활용하기 [question] | `OnBeginPlay()` 함수에 사용된 타이머 서비스 메서드명과 반복 간격(초)을 `메서드명: 간격` 형식으로 한 줄에 출력하세요. [answer] | SetTimerRepeat: 2 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 1. 파티클이 잘 보이도록 어두운 배경을 설정하고 지형을 배치한 뒤 원하는 엔티티를 배치합니다. 본 예제에서는 Preset List에서 Background - **back-51**을 설정하고 Object - **object-174**를 배치했습니다. 2. Workspace - MyDesk에 새 스크립트 컴포넌트 ParticleServiceTest를 생성합니다. 3. 배치한 엔티티(object-174)의 Property에 ParticleServiceTest를 추가합니다. 4. 여기에 TweenCircula
[task] | code [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | WebViewComponent의 DragMode를 DragWithinPage로 설정하고 ScrollSensitivity 값을 조정하는 스크립트를 작성해줘 [answer] | WebViewComponent의 `DragMode`를 `DragWithinPage`로 설정하고 `ScrollSensitivity` 값을 조정하는 스크립트는 다음과 같습니다. ```lua Property: [None] number ScrollSensitivityValue = 1.0 Method: [server only] void OnBeginPlay() { -- WebViewComponent 프로퍼티 접근 및 설정 local webView = self.Entity.WebViewComponent -- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **WebViewComponent**를 활용하면 웹 브라우저를 월드에 배치하고 탐색할 수 있습니다. 간단한 예제를 통해 월드에서 웹 브라우저를 활용하는 방법을 알아봅시다. ##### 참고 API Reference [WebViewComponent](/apiReference/Components/WebViewComponent) # WebViewComponent 소개 엔티티에 **WebViewComponent**를 추가하면 월드에 웹 브라우저를 배치할 수 있습니다. 먼저 **WebViewComponent**의 프
[task] | code [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 원칙에 따라 '주어진 원문에 있는 정보만 사용하고, 없는 사실·API·코드 예제를 지어내지 않는다'는 지시를 준수해야 하므로, 문서에 언급된 프로파일러의 기능(기록 시작, 옵션 변경, 데이터 저장 등)을 실제 mLua 스크립트 코드로 구현하는 과제를 생성할 수 있는 API가 원문에 존재하지 않습니다. 따라서 요청하신 조건(구체적인 mLua 코딩 과제)을 만족시킬 수 없습니다. [answer] | 제시된 참고 문서에는 루아 프로파일러의 **실행 방법**(Window 메뉴 또는 게임 설정에서 실행), **UI 기능 설명**(기록 시작/중지, 옵션 설정, 데이터 저장/불러오기, 보고서 내보내기), 그리고 **프로파일링 대상이 되는 일반 mLua 스크립트 예제**(휠 조인트, 거리 조인트, 트리거 이벤트 등)가 포함되어 있습니다. 그러나 질문에서 요구하신 **"프로파일러의 기능(기록 시작, 옵션 변경, 데이터 저장 등)을 실제 mLua 스크립트 코드로 구현하는 API"**에 대한 정보는 원문에 존재하지 않습니다. 루아 프로파일러 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 게임을 플레이하다 보면 다양한 상황에서 느려지는 것을 경험할 수 있습니다. 이처럼 게임의 처리 속도에서 부하가 걸리는 병목 지점(Bottleneck)을 찾아 수정하는 것을 최적화라고 합니다. 일부 병목 지점만 해결해도 게임의 전체적인 성능 향상을 기대할 수 있기 때문에 최적화는 상당히 중요한 작업입니다. 루아 프로파일러는 이러한 스크립트 최적화 작업을 더욱 손쉽게 진행할 수 있도록 도와줍니다. 이번 시간에는 **루아 프로파일러**가 무엇인지 알아보고 활용법을 살펴보도록 합시다. **더 알아보기** >
[task] | code [pass] | ⏳ 미판정 [title] | 파티클 활용하기 [question] | TriggerEnterEvent 이벤트 핸들러를 통해 특정 엔티티와 충돌할 때 BasicParticleComponent의 Stop 메서드를 호출하여 파티클 재생을 멈추는 스크립트를 작성해줘 [answer] | 특정 엔티티와 충돌할 때 파티클 재생을 멈추는 스크립트는 아래처럼 작성할 수 있습니다. ```lua Event Handler: HandleTriggerEnterEvent(TriggerEnterEvent event) { local TriggerBodyEntity = event.TriggerBodyEntity self.Entity.BasicParticleComponent:Stop() } ``` 이 스크립트를 실행하기 위해서는 다음 조건들이 충족되어야 합니다. 1. 파티클을 제어할 엔티티(예: 플레이어)에 `BasicP [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [파티클 사용하기](/docs/?postId=1036) 가이드에서 파티클 컴포넌트의 개념 및 종류에 대해 알아보았습니다. 이번 시간에는 스크립트를 사용해 파티클을 활용하는 예제를 살펴보겠습니다. # 파티클 스크립트 ## 파티클 프로퍼티 제어 캐릭터와의 거리에 따라 파티클의 재생 속도가 바뀌는 예제를 통해 파티클 프로퍼티를 제어하는 방법을 살펴봅시다. 1. 파티클이 잘 보이도록 어두운 배경을 설정하고 지형을 배치한 뒤 원하는 파티클을 배치합니다. 본 예제에서는 Background로 **back-16**을 설
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | PhysicsColliderComponent 의 CollisionGroup 을 설정하여 지정된 그룹끼리만 충돌하도록 하고, PhysicsRigidbodyComponent 의 Mass 와 Restitution 을 다르게 설정해 충돌 시 튕김 차이를 확인하는 스크립트를 작성해줘 [answer] | 참고 문서에 따르면 `PhysicsColliderComponent`의 `CollisionGroup`은 스크립트 내에서 직접 설정하는 것이 아니라, 에디터에서 "CollisionGroup에 새로운 물리 그룹을 추가하고" 그룹끼리의 충돌 여부를 선택하여 설정하는 것으로 안내되어 있습니다. 따라서 스크립트에서는 `CollisionGroup` 값을 변경하는 코드를 작성할 수 없습니다. 반면, `PhysicsRigidbodyComponent`의 `Mass`와 `Restitution`은 스크립트에서 접근 및 변경이 가능한 프로퍼티로, 문서의 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PhysicsRigidbodyComponent**의 대부분의 Property와 Function은 **PhysicsColliderComponent**의 ClientOnly 프로퍼티의 값에 따라 사용, 접근 가능한 실행 공간이 나뉘게 됩니다. ClientOnly에 따라 각각의 물리 World에서 연산되며, 이에 따라 서로 충돌하거나 영향을 주지 않습니다. * **ClientOnly가 True일 때**: 해당 Entity의 물리 강체는 Client에서만 생성되고 물리 연산은 각각의 Client에서 계산됩니다. 다른 Client와 결
[task] | single_turn [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | 웹 뷰 화면의 정중앙에서 클릭했을 때 로그에 출력되는 normalizedPosition 좌표 값은 어떻게 되나요? [answer] | 웹 뷰 화면의 정중앙에서 클릭했을 때 로그에 출력되는 normalizedPosition 좌표 값은 **(0.5, 0.5)** 입니다. 웹 뷰는 왼쪽 상단을 (0,0), 오른쪽 하단을 (1,1)로 하는 평면 좌표계로 표현되며, 이 범위의 정확히 가운데 위치가 (0.5, 0.5)에 해당합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 웹 브라우저에서 클릭한 지점의 좌표를 로그로 남겨봅시다. **WebViewClickedEvent**를 활용하면 클릭한 지점의 **normalizedPosition**을 확인할 수 있습니다. **normalizedPosition**이란 웹 뷰를 하나의 평면 좌표계라고 했을 때 왼쪽 상단을 (0,0), 오른쪽 하단을 (1,1)로 표현한 위치를 말합니다. 화면의 정중앙 좌표는 (0.5,0.5) 입니다. 1. **WebViewTest** 스크립트에 **WebViewClickedEvent**를 추가하고 다음과 같이 작성합니다. `
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | PhysicsRigidbodyComponent 와 PhysicsColliderComponent 를 가진 엔티티가 PhysicsSimulatorComponent 와 TileMapComponent 의 PhysicsInteractable 와 상호작용하여 중력을 받아 하강하고 바닥에 충돌하는 시나리오를 구성하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `PhysicsRigidbodyComponent`와 `PhysicsColliderComponent`를 가진 엔티티가 `PhysicsSimulatorComponent`와 `TileMapComponent`의 `PhysicsInteractable`와 상호작용하여 중력을 받아 하강하고 바닥에 충돌하는 시나리오를 구성하는 **구체적인 스크립트 코드**가 포함되어 있지 않습니다. 문서에서는 해당 시나리오가 물리 법칙이 적용된 기본 동작임을 설명하고, 활용 예제로 '바닥에 있는 물체 공중으로 던지기'(`ApplyLinea [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **PhysicsRigidbodyComponent**의 대부분의 Property와 Function은 **PhysicsColliderComponent**의 ClientOnly 프로퍼티의 값에 따라 사용, 접근 가능한 실행 공간이 나뉘게 됩니다. ClientOnly에 따라 각각의 물리 World에서 연산되며, 이에 따라 서로 충돌하거나 영향을 주지 않습니다. * **ClientOnly가 True일 때**: 해당 Entity의 물리 강체는 Client에서만 생성되고 물리 연산은 각각의 Client에서 계산됩니다. 다른 Client와 결
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 파티클 활용하기 [question] | 파티클 프로퍼티 제어 예제에서 `OnUpdate()` 함수 내부의 코드만 출력하고, 각 줄의 역할은 주석으로 설명하세요. [answer] | ```lua [client only] void OnUpdate(number delta) { -- 파티클 엔티티의 현재 2D 좌표를 Vector2로 변환 local positionA = Vector2(self.Entity.TransformComponent.Position.x,self.Entity.TransformComponent.Position.y) -- 로컬 플레이어의 현재 2D 좌표를 Vector2로 변환 local positionB = Vector2(_UserService.LocalPlaye [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [파티클 사용하기](/docs/?postId=1036) 가이드에서 파티클 컴포넌트의 개념 및 종류에 대해 알아보았습니다. 이번 시간에는 스크립트를 사용해 파티클을 활용하는 예제를 살펴보겠습니다. # 파티클 스크립트 ## 파티클 프로퍼티 제어 캐릭터와의 거리에 따라 파티클의 재생 속도가 바뀌는 예제를 통해 파티클 프로퍼티를 제어하는 방법을 살펴봅시다. 1. 파티클이 잘 보이도록 어두운 배경을 설정하고 지형을 배치한 뒤 원하는 파티클을 배치합니다. 본 예제에서는 Background로 **back-16**을 설
[task] | code [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | WebViewComponent의 Url 프로퍼티를 변경하여 특정 웹페이지를 로드하는 스크립트를 작성해줘 [answer] | WebViewComponent의 `Url` 프로퍼티에 웹 페이지 주소를 할당하면 해당 주소의 페이지가 로드됩니다. 스크립트에서 엔티티의 `WebViewComponent`에 접근하여 `Url` 값을 변경하는 방식으로 구현할 수 있습니다. 아래는 월드 시작 시(`OnBeginPlay`) 특정 엔티티의 웹 브라우저를 원하는 주소로 변경하는 예제입니다. ```lua Property: [None] string TargetUrl = "https://www.naver.com" Method: [server only] void OnBeginP [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **WebViewComponent**를 활용하면 웹 브라우저를 월드에 배치하고 탐색할 수 있습니다. 간단한 예제를 통해 월드에서 웹 브라우저를 활용하는 방법을 알아봅시다. ##### 참고 API Reference [WebViewComponent](/apiReference/Components/WebViewComponent) # WebViewComponent 소개 엔티티에 **WebViewComponent**를 추가하면 월드에 웹 브라우저를 배치할 수 있습니다. 먼저 **WebViewComponent**의 프