[task] | code [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | RectTileMapMode를 RectTile로 변경하고 PhysicsSimulatorComponent를 활성화한 환경에서 Static 타입 물리 엔티티를 배치하는 준비 과정 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `RectTileMapMode` 변경, `PhysicsSimulatorComponent` 활성화, `PhysicsInteractable` 활성화, 그리고 Static 타입 물리 엔티티 배치가 **에디터(Hierarchy, Component Inspector)에서의 설정 단계**로만 설명되어 있습니다. mLua 스크립트로 이러한 환경 설정(타일맵 모드 변경, 시뮬레이터 컴포넌트 추가/활성화, 스태틱 오브젝트 배치)을 동적으로 수행하는 API(예: `_TileMapService`, `_PhysicsService` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WheelJoint는 연결된 엔티티가 바퀴처럼 동작하도록 제한을 설정합니다. Motor를 사용한 TargetEntityRef는 MotorSpeed 값을 목표 속도로 사용합니다. | 주요 프로퍼티 | 설명 | | --- | --- | | **MaxMotorTorque** | 목표 모터 속도에 도달하기 위한 Joint의 모터에 적용할 수 있는 최대 힘을 설정합니다. | | **MotorEnable** | Motor를 사용할지 여부를 설정합니다. True일 경우 연결된 Entity가 LocalAxis 방향의 힘을 받습니다. | | *
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `SideviewbodyComponent`와 `CustomPlayerController`를 활용하여, 캐릭터가 밟고 있는 타일이 "Ice"일 때에만 `Drag` 값을 `2`로 변경하고 그 외의 경우 항상 `0`으로 초기화하는 `IceTileChecker` 스크립트의 `OnUpdate` 함수만 작성해줘. [answer] | 요청하신 `IceTileChecker` 스크립트의 `OnUpdate` 함수는 `SideviewbodyComponent`의 `GetUnderfootTile` 메서드로 현재 밟고 있는 타일을 확인한 뒤, 타일 이름이 "Ice"인 경우에만 `CustomPlayerController.Drag` 값을 2로 설정하고, 그 외의 모든 경우(타일이 없는 경우 포함)에는 0으로 초기화하는 로직으로 작성됩니다. ```lua [client only] void OnUpdate(number delta) { local customController [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `IceTileChecker` 컴포넌트에 `[None]` 속성을 가진 `number` 타입의 `IceDrag`와 `DefaultDrag` 프로퍼티를 정의하고, `OnBeginPlay`에서 현재 `Drag`를 백업한 뒤 `OnUpdate`에서 `GetUnderfootTile`의 결과에 따라 `Drag`를 동적으로 전환하는 전체 스크립트 구조를 작성해줘. [answer] | 요청하신 `IceTileChecker` 컴포넌트 스크립트 전체 구조는 다음과 같습니다. ```lua Property: [None] number IceDrag = 2 [None] number DefaultDrag = 0 Method: [client only] void OnBeginPlay() { self.DefaultDrag = self.Entity.CustomPlayerController.Drag } [client only] void OnUpdate(number delta) { local customControl [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | OnUpdate() 생명주기 메서드에서 매 프레임마다 PhysicsRigidbodyComponent의 ApplyForce() 함수를 호출하여 엔티티가 지속적으로 오른쪽 방향으로 움직이도록 만드는 스크립트를 작성해줘 [answer] | `OnUpdate()`에서 매 프레임 `ApplyForce()`를 호출하면, 해당 물리 강체의 질량에 따라 힘이 누적되어 엔티티가 지속적으로 오른쪽 방향으로 가속됩니다. ```lua Method: [server only] void OnUpdate(number delta) { self.Entity.PhysicsRigidbodyComponent:ApplyForce(Vector2(1, 0)) } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 힘을 가하는 함수 `ApplyForce()`, `ApplyTorque()` 함수는 지속적인 힘을 가할 수 있습니다. 특정 Key를 눌러 지속적으로 특정 방향으로 힘 가하고 싶을 때가 해당됩니다. 매개 변수 force는 힘을 의미합니다. 해당 Entity에 대응하는 물리 강체의 질량 값에 영향을 받습니다. #### 충격량을 적용하는 함수 `ApplyAngularImpulse()`, `ApplyLinearImpulse()` 함수는 일시적으로 짧은 충격을 가할 수 있습니다. 대포 발파, 방망이 휘두르기 같은 짧은 충격을 주
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `DefaultPlayer`에 추가되는 `IceTileChecker` 스크립트에서 `OnBeginPlay` 시점에 `self.Entity.CustomPlayerController.Drag` 값을 `DefaultDrag` 프로퍼티에 저장하고, `OnUpdate`에서 `GetUnderfootTile`이 `nil`을 반환하면 즉시 반환하는 방어적 코딩을 포함하여 얼음 타일 감지 로직을 작성해줘. [answer] | `DefaultPlayer`에 추가할 `IceTileChecker` 스크립트 컴포넌트입니다. `OnBeginPlay`에서 현재 `Drag` 값을 저장하고, `OnUpdate`에서 `GetUnderfootTile` 결과가 `nil`인 경우 즉시 반환하는 방어적 코딩을 포함하여 얼음 타일 감지 로직을 구현했습니다. ```lua Property: [None] number IceDrag = 2 [None] number DefaultDrag = 0 Method: [client only] void OnBeginPlay() { sel [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | 엔티티가 물리 법칙을 따르고 다른 엔티티와 충돌하려면 어떤 컴포넌트를 함께 사용해야 하며, BodyType의 Static, Dynamic, Kinematic은 어떤 차이가 있나요? [answer] | 엔티티가 물리 법칙을 따르고 다른 엔티티와 충돌하려면 `PhysicsRigidbodyComponent`와 `PhysicsColliderComponent`를 함께 사용해야 합니다. `PhysicsRigidbodyComponent`의 `BodyType`은 엔티티의 물리 행동 방식을 결정하며, 세 가지 타입의 차이는 다음과 같습니다. 1. **Static**: 질량이 무한히 큰 엔티티로 취급됩니다. `Dynamic` 타입의 엔티티와 충돌할 수 있습니다. 2. **Dynamic**: 엔티티가 물리 법칙에 따라 동작합니다. 물리 충돌 [followup] | PhysicsRigidbodyComponent와 PhysicsColliderComponent를 모두 가진 Dynamic 엔티티와 Static 엔티티가 충돌할 때, Static 엔티티의 Mass나 Friction 설정이 충돌 결과에 영향을 미치나요? [followup_answer] | 제공된 문서에는 Static 타입 엔티티의 `Mass`나 `Friction` 설정이 충돌 결과에 직접적인 영향을 미치는지에 대한 명시적인 설명이 없습니다. 문서에서 확인할 수 있는 정보는 다음과 같습니다. 1. **Static의 정의**: Static은 "질량이 무한히 큰 엔티티로 취급"되며, Dynamic 타입과 충돌할 수 있다고 설명되어 있습니다. 2. **Mass의 역할**: `Mass` 프로퍼티는 "질량 값을 설정"하며, Collider의 넓이와 함께 밀도 값을 계산하는 데 사용된다고 설명되어 있습니다. 또한 `Appl [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리 법칙을 엔티티에 적용하고 물리 엔티티끼리 충돌할 수 있게 만들어 봅시다. 월드에 물리를 만드는 방법은 [물리 사용하기](/docs?postId=757%7B%22target%22:%22_self%22%7D)를 참고하세요. # PhysicsRigidbodyComponent Entity에 PhysicsRigidbodyComponent를 추가하면 Entity가 물리 엔진에 의해 제어됩니다. 또한 엔티티의 저항 계수, 마찰 계수, 질량 등 물리 연산에 영향을 주는 값을 설정할 수 있습니다. Entity가 Phy
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | DefaultPlayer에 추가되는 Swing 스크립트 컴포넌트에서 InputService의 HandleKeyDownEvent, HandleKeyReleaseEvent를 통해 N, M 키 입력 시 Left, Right 엔티티의 RevoluteJointComponent:SetMotorEnable 메서드를 호출하여 모터를 제어하는 로직을 구현하는 스크립트를 작성해줘 [answer] | 요청하신 Swing 스크립트 컴포넌트 코드는 다음과 같습니다. ```lua Property: [Sync] Entity Left = /maps/map01/LeftEntity [Sync] Entity Right = /maps/map01/RightEntity Method: [server] void MoveLeft(boolean enable) { self.Left.RevoluteJointComponent:SetMotorEnable(1, enable) } [server] void MoveRight(boolean enable) { [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] | Frame의 Self Time이 62% 이상을 차지하는 상황에서의 해결 단계를 3단계 번호 목록으로 나열하세요. [answer] | Frame의 Total Self Time이 전체의 62% 이상을 차지하는 상황은 스크립트 실행을 제외한 Native에서 소요된 시간이 높다는 의미이므로, Native Scope의 세부 분석이 필요합니다. 이를 해결하기 위한 단계는 다음과 같습니다. 1. 루아 프로파일러의 **File - Option** 메뉴에서 **Native Scope** 항목에 체크한 후 프로파일링을 다시 수행합니다. 2. 다시 수집된 데이터를 확인하여 Native Function 중 시간 점유율(예: 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] | instruction_following [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 프로파일러 표본 추출을 위해 스크립트 함수에 삽입해야 하는 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua -- 프로파일러 표본 추출을 위해 분석 대상 함수 내부에 삽입하는 코드 -- profiler.beginscope("이름")과 profiler.endscope()으로 측정 구간을 지정합니다. void Function1(string arg1) { -- "FirstLoop" 구간의 프로파일링 시작 profiler.beginscope("FirstLoop") for i = 1, 10000 do local en = self.Entity end -- "FirstLoop" 구간의 프로파일링 [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] | 주의: 제공된 원문은 '루아 프로파일러'라는 개발자 도구의 사용법(실행, UI, 옵션 설정)에 관한 정보만을 담고 있으며, 실제 게임 로직을 구현하는 mLua 스크립트 API(컴포넌트, 메서드, 이벤트 핸들러 등)에 대한 기술적 정의가 포함되어 있지 않습니다. [answer] | 제공된 참고 문서에는 '루아 프로파일러'라는 개발자 도구의 실행 방법, UI 구성, 옵션 설정 등에 관한 정보만 포함되어 있으며, 실제 게임 로직을 구현하는 mLua 스크립트 API(컴포넌트, 메서드, 이벤트 핸들러 등)에 대한 기술적 정의는 포함되어 있지 않습니다. 따라서 질문하신 내용이 mLua 스크립트 API 또는 구체적인 게임 로직 구현에 관한 것이라면, 제공된 문서만으로는 답변할 수 없습니다. 문서에 없는 API나 이벤트, 프로퍼티는 지어낼 수 없으므로, 해당 주제에 대한 정확한 답변은 불가능합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 게임을 플레이하다 보면 다양한 상황에서 느려지는 것을 경험할 수 있습니다. 이처럼 게임의 처리 속도에서 부하가 걸리는 병목 지점(Bottleneck)을 찾아 수정하는 것을 최적화라고 합니다. 일부 병목 지점만 해결해도 게임의 전체적인 성능 향상을 기대할 수 있기 때문에 최적화는 상당히 중요한 작업입니다. 루아 프로파일러는 이러한 스크립트 최적화 작업을 더욱 손쉽게 진행할 수 있도록 도와줍니다. 이번 시간에는 **루아 프로파일러**가 무엇인지 알아보고 활용법을 살펴보도록 합시다. **더 알아보기** >
[task] | two_turn [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | RevoluteJoint와 PrismaticJoint를 활용하여 엔티티의 회전 각도 및 선형 이동 범위를 제한하는 방법은 무엇인가요? [answer] | RevoluteJoint와 PrismaticJoint는 각각 엔티티의 회전과 선형 이동에 물리적 제한을 걸어주는 컴포넌트입니다. 두 컴포넌트 모두 제한을 적용하려면 `UseLimits` 프로퍼티를 `true`로 설정해야 합니다. ### 1. RevoluteJoint (회전 각도 제한) 엔티티가 회전할 때 `LocalAnchorA`와 `LocalAnchorB`가 만나는 지점을 공통 회전 축(Anchor)으로 사용합니다. 회전 각도 제한은 Entity의 로컬 좌표계에서 `Vector2(1, 0)` 방향을 기준으로 설정됩니다. * [followup] | RevoluteJoint의 LowerAngle과 UpperAngle이 Entity의 Local Vector2(1, 0)을 기준으로 설정되는 점을 고려하여, 특정 각도 범위 내에서만 회전하도록 제한하는 스크립트 예시를 작성해 주세요. [followup_answer] | RevoluteJoint의 `LowerAngle`과 `UpperAngle`은 Entity의 로컬 좌표계에서 `Vector2(1, 0)` 방향(보통 엔티티의 앞쪽 또는 우측 방향)을 0도로 기준점으로 삼아 설정됩니다. 따라서 원하는 회전 범위를 이 기준점에 대한 상대 각도(도 단위)로 지정하면 됩니다. 아래 예시는 `OnBeginPlay` 시점에 RevoluteJoint의 제한을 활성화하고, Entity가 기준 방향에서 시계 방향으로 최대 45도, 반시계 방향으로 최대 -45도까지만 회전할 수 있도록 제한하는 스크립트입니다. `` [scores] | [judge_reason] | [source_doc] | RevoluteJoint는 엔티티의 회전과 관련된 제한을 설정합니다. UseLimits를 활성화한 후, LowerAngle, UpperAngle를 활용해 회전 각도를 제한할 수 있습니다. 엔티티가 회전할 때는 LocalAnchorA와 B가 만나는 지점을 공통의 Anchor로 사용합니다. 또한 Motor를 사용하면 Anchor를 기준으로 회전하는 힘을 받을 수 있습니다. | 주요 프로퍼티 | 설명 | | --- | --- | |**UseLimits** | 상대적 각도에 제한을 설정할지 여부를 결정합니다. | |**LowerAn
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | LeftEntity와 RightEntity 엔티티에 필요한 컴포넌트와 SpriteRUID 값을 표로 정리해서 나열하세요. [answer] | 제공된 문서에 따르면, `LeftEntity`와 `RightEntity` 엔티티에 필요한 컴포넌트와 SpriteRUID 값은 다음과 같습니다. | 엔티티 이름 | 필요한 컴포넌트 | SpriteRUID | | :--- | :--- | :--- | | LeftEntity | `PhysicsRigidbodyComponent`, `PhysicsColliderComponent` | `e75cac80f719471fa482195531ed57cc` | | RightEntity | `PhysicsRigidbodyComponent`, `Physi [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] | UIEmpty 생성부터 WebViewComponent 추가까지의 절차를 3단계 번호 목록으로 정리하세요. [answer] | 1. **Hierarchy - ui** 아래에서 원하는 UI 그룹의 콘텍스트 메뉴를 열고 **Create Entity - Create UIEmpty**를 선택하여 **UIEmpty**를 생성합니다. 2. 프로퍼티 에디터에서 생성한 **UIEmpty**에 **WebViewComponent**를 추가하고 원하는 Url을 입력합니다. 3. 엔티티의 크기를 적절하게 조절합니다. [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] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `SideViewRectTileMap` 환경에서 `IceTileChecker` 스크립트 컴포넌트를 작성하여 `OnUpdate`에서 `SideviewbodyComponent`의 `GetUnderfootTile`을 호출하고, 반환된 타일의 `Name`이 "Ice"일 경우 `CustomPlayerController`의 `Drag`를 `IceDrag` 프로퍼티 값으로, 아닐 경우 `DefaultDrag` 프로퍼티 값으로 설정하는 로직을 구현해줘. [answer] | `SideViewRectTileMap` 환경에서 얼음 타일(`Name`이 "Ice"인 타일)을 밟을 때 마찰력(`Drag`)을 변경하는 `IceTileChecker` 스크립트 컴포넌트입니다. 1. **`OnBeginPlay`**: 게임 시작 시 캐릭터의 기본 `Drag` 값을 `DefaultDrag` 프로퍼티에 저장합니다. 2. **`OnUpdate`**: 매 프레임마다 캐릭터가 밟고 있는 타일(`GetUnderfootTile`)을 확인합니다. * 타일이 존재하지 않거나 `Name`이 "Ice"가 아니면 `Defau [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | code [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 주어진 문서에는 mLua 스크립트 작성에 필요한 API, 컴포넌트, 서비스 정보가 포함되어 있지 않으며, 루아 프로파일러 사용법과 데이터 분석 지표만 설명하고 있습니다. 따라서 문서의 정보만으로 해결할 수 있는 mLua 코딩 과제를 만들 수 없습니다. [answer] | 제공된 참고 문서는 mLua 스크립트 작성에 필요한 구체적인 API, 컴포넌트, 또는 서비스 명세서를 포함하지 않습니다. 해당 문서는 **루아 프로파일러(Lua Profiler)의 사용법** 및 **성능 데이터 분석 지표**에 초점을 맞추고 있습니다. 따라서 문서에 포함된 정보만으로 mLua 스크립트 코딩 과제를 만들거나, 문서에 없는 API/기능에 대해 코드를 작성하는 것은 불가능합니다. 문서에서 확인할 수 있는 루아 프로파일러 관련 주요 정보만 요약해 드립니다. ### 1. 루아 프로파일러 기본 조작 * **Contex [followup] | [followup_answer] | [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] | CollisionDetectionMode의 Discrete와 Continuous는 각각 어떤 상황에서 사용해야 하며, 빠른 속도로 움직이는 작은 크기의 물체에서 Discrete 모드로 설정하면 어떤 문제가 발생하나요? [answer] | `CollisionDetectionMode`는 물리 충돌을 감지하는 방식을 결정하는 설정입니다. 두 모드의 특징과 사용 상황은 다음과 같습니다. **1. Discrete (비연속적 감지)** * **동작 방식:** 충돌을 비연속적으로 확인합니다. * **적합 상황:** 속도가 느리고, 크기가 큰 물체에서 일반적으로 사용됩니다. 연산 자원이 적게 들어가는 장점이 있습니다. **2. Continuous (연속적 감지)** * **동작 방식:** 충돌을 연속적으로 확인합니다. * **적합 상황:** 물체가 충돌 대상과 [followup] | Discrete 모드에서 빠른 속도의 작은 물체가 충돌을 감지하지 못하고 통과하는 현상을 방지하기 위해 Continuous 모드로 변경할 때, 코드에서 PhysicsRigidbodyComponent의 CollisionDetectionMode 프로퍼티를 어떻게 설정해야 하나요? [followup_answer] | `PhysicsRigidbodyComponent`의 `CollisionDetectionMode` 프로퍼티를 `Continuous` 값으로 설정하면, 물체가 빠르게 움직이거나 크기가 작아도 충돌을 감지하지 못하고 통과하는 현상을 방지할 수 있습니다. 참고 문서의 예제 형식을 따라 `OnBeginPlay` 시점에 해당 프로퍼티를 설정하는 mLua 스크립트 예시는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { self.Entity.PhysicsRigidbodyComp [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리 법칙을 엔티티에 적용하고 물리 엔티티끼리 충돌할 수 있게 만들어 봅시다. 월드에 물리를 만드는 방법은 [물리 사용하기](/docs?postId=757%7B%22target%22:%22_self%22%7D)를 참고하세요. # PhysicsRigidbodyComponent Entity에 PhysicsRigidbodyComponent를 추가하면 Entity가 물리 엔진에 의해 제어됩니다. 또한 엔티티의 저항 계수, 마찰 계수, 질량 등 물리 연산에 영향을 주는 값을 설정할 수 있습니다. Entity가 Phy
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | J 키 입력 시 PhysicsRigidbodyComponent 가 적용된 엔티티에 ApplyLinearImpulse(0, 10) 을 호출하여 공중으로 던지는 스크립트를 작성해줘 [answer] | J 키를 눌렀을 때 `PhysicsRigidbodyComponent`에 `ApplyLinearImpulse`를 호출하여 엔티티를 공중으로 던지는 스크립트는 다음과 같습니다. ```lua Method: void Jump() { self.Entity.PhysicsRigidbodyComponent:ApplyLinearImpulse(Vector2(0, 10)) } Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------- [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] | WebViewComponent의 DragMode 옵션 중 DragToScroll과 DragWithinPage의 동작 차이를 2문장 이내로 설명하세요. [answer] | `DragToScroll`은 페이지에서 드래그를 시작하듯 동작하여 스크롤바를 직접 조종하지 않고 스크롤로만 동작하는 반면, `DragWithinPage`는 일반 웹페이지에서 마우스로 드래그하듯이 페이지 내에서 드래그 동작을 수행합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **WebViewComponent**를 활용하면 웹 브라우저를 월드에 배치하고 탐색할 수 있습니다. 간단한 예제를 통해 월드에서 웹 브라우저를 활용하는 방법을 알아봅시다. ##### 참고 API Reference [WebViewComponent](/apiReference/Components/WebViewComponent) # WebViewComponent 소개 엔티티에 **WebViewComponent**를 추가하면 월드에 웹 브라우저를 배치할 수 있습니다. 먼저 **WebViewComponent**의 프
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | Native Scope 체크 후 TriggerComponent OnUpdate의 최적화 필요성을 판단하는 기준을 '호출 횟수', 'Peak Time', '점유율' 항목으로 표로 정리하세요. [answer] | 참고 문서에 근거하여 Native Scope 체크 후 TriggerComponent OnUpdate의 최적화 필요성 판단 기준을 요청하신 항목으로 정리하면 다음과 같습니다. | 항목 | 판단 기준 및 설명 | | :--- | :--- | | **점유율** | 프로파일링 데이터에서 해당 함수가 차지하는 시간 점유율이 높은지 확인합니다. 문서의 샘플에서는 TriggerComponent의 OnUpdate가 18% 이상의 상당한 점유율을 차지하고 있어 최적화를 고민해야 함을 시사합니다. | | **호출 횟수** | 함수가 얼마나 자주 호 [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] | 충돌 이벤트가 발생할 때 PhysicsRigidbodyComponent의 SetLinearVelocity() 함수를 호출하여 엔티티의 속도를 즉시 0으로 설정하는 스크립트를 작성해줘 [answer] | 충돌 이벤트가 발생했을 때 해당 엔티티의 선형 속도를 즉시 0으로 설정하려면 `PhysicsColliderComponent`에 `EnableContactEvent`가 `true`로 설정되어 있어야 하며, `PhysicsContactBeginEvent` 핸들러에서 `SetLinearVelocity(Vector2.zero)`를 호출하면 됩니다. 아래는 요청한 기능을 구현한 mLua 스크립트입니다. ```lua Event Handler: [self] HandlePhysicsContactBeginEvent (PhysicsContactB [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 힘을 가하는 함수 `ApplyForce()`, `ApplyTorque()` 함수는 지속적인 힘을 가할 수 있습니다. 특정 Key를 눌러 지속적으로 특정 방향으로 힘 가하고 싶을 때가 해당됩니다. 매개 변수 force는 힘을 의미합니다. 해당 Entity에 대응하는 물리 강체의 질량 값에 영향을 받습니다. #### 충격량을 적용하는 함수 `ApplyAngularImpulse()`, `ApplyLinearImpulse()` 함수는 일시적으로 짧은 충격을 가할 수 있습니다. 대포 발파, 방망이 휘두르기 같은 짧은 충격을 주
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | 키 입력에 따라 실행되는 WebViewComponent 메서드와 대응하는 키를 표로 정리해서 출력하세요. [answer] | 키 입력에 따라 실행되는 `WebViewComponent` 메서드와 대응하는 키는 다음과 같습니다. | 키 입력 | WebViewComponent 메서드 | 설명 | | :--- | :--- | :--- | | `KeyboardKey.Backspace` | `GoBack()` | 뒤로 가기 | | `KeyboardKey.Alpha0` | `GoForward()` | 앞으로 가기 | | `KeyboardKey.Alpha5` | `Reload()` | 페이지 새로 고침 | | `KeyboardKey.Equals` | `ZoomIn() [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] | 다양한 물리 joint 활용하기 [question] | RevoluteJointComponent의 Joint 값을 1로 고정하고, 키 입력에 따라 모터 활성화 상태만 토글하도록 설계된 Left, Right 엔티티의 물리 동작 제어용 Swing 스크립트를 작성해줘 [answer] | 제시된 문서의 지침에 따라, `LeftEntity`와 `RightEntity`의 `RevoluteJointComponent`를 제어하는 `Swing` 스크립트 컴포넌트를 작성했습니다. 주요 구성 요소: 1. **Property**: `Left`와 `Right` 엔티티를 `[Sync]` 속성으로 선언하여 서버와 클라이언트 간 참조를 동기화합니다. 2. **Method**: `MoveLeft`와 `MoveRight` 메서드를 `[server]` 실행 공간으로 설정하여 서버에서 물리 연산을 제어합니다. `SetMotorEnable( [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] | WebViewClickedEvent에서 제공하는 normalizedPosition 좌표의 의미와 정중앙 좌표 값을 3문장 이내로 설명하세요. [answer] | normalizedPosition은 웹 뷰를 하나의 평면 좌표계로 보고 왼쪽 상단을 (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] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | IsSensor 프로퍼티를 true로 설정했을 때 충돌 이벤트는 발생하되 물리적 상호작용이 일어나지 않는다는 구체적인 예시를 들어 설명해 주세요. [answer] | `IsSensor` 프로퍼티를 `true`로 설정하면, 해당 엔티티는 다른 물리 강체와 물리적으로 밀리거나 튕기거나 하는 **물리적 상호작용(Force, Impulse, Velocity 변경 등)을 일으키지 않습니다.** 하지만, 두 엔티티가 겹치는 영역에 들어왔을 때 **충돌 감지 이벤트(`PhysicsContactBeginEvent`, `PhysicsContactEndEvent`)는 정상적으로 발생**합니다. 이것은 "감지기(Sensor)" 역할을 하는 경우, 즉 물리적으로 방해는 하지 않지만 위치만 감지해서 로직을 실행할 때 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 힘을 가하는 함수 `ApplyForce()`, `ApplyTorque()` 함수는 지속적인 힘을 가할 수 있습니다. 특정 Key를 눌러 지속적으로 특정 방향으로 힘 가하고 싶을 때가 해당됩니다. 매개 변수 force는 힘을 의미합니다. 해당 Entity에 대응하는 물리 강체의 질량 값에 영향을 받습니다. #### 충격량을 적용하는 함수 `ApplyAngularImpulse()`, `ApplyLinearImpulse()` 함수는 일시적으로 짧은 충격을 가할 수 있습니다. 대포 발파, 방망이 휘두르기 같은 짧은 충격을 주
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | PhysicsColliderComponent의 ClientOnly 프로퍼티가 false일 때만 Server 공간에서 PhysicsRigidbodyComponent의 SetAngularVelocity() 함수를 사용하여 엔티티의 각속도를 고정값으로 설정하는 스크립트를 작성해줘 [answer] | `PhysicsColliderComponent`의 `ClientOnly` 프로퍼티가 `false`일 때만 Server 공간에서 물리 연산이 수행되며, 이때 `PhysicsRigidbodyComponent`의 함수를 사용할 수 있습니다. 질문하신 조건을 만족하는 스크립트는 다음과 같습니다. ```lua Property: [None] number FixedAngularVelocity = 0 Method: [server only] void OnBeginPlay() { -- PhysicsColliderComponent의 ClientO [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 힘을 가하는 함수 `ApplyForce()`, `ApplyTorque()` 함수는 지속적인 힘을 가할 수 있습니다. 특정 Key를 눌러 지속적으로 특정 방향으로 힘 가하고 싶을 때가 해당됩니다. 매개 변수 force는 힘을 의미합니다. 해당 Entity에 대응하는 물리 강체의 질량 값에 영향을 받습니다. #### 충격량을 적용하는 함수 `ApplyAngularImpulse()`, `ApplyLinearImpulse()` 함수는 일시적으로 짧은 충격을 가할 수 있습니다. 대포 발파, 방망이 휘두르기 같은 짧은 충격을 주
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티에 물리 적용하기 [question] | SetLinearVelocity() 함수를 사용할 때 다른 힘 관련 함수들과 달리 질량 값의 영향을 받지 않는다는 점이 실제 게임 로직 구현에 어떤 영향을 주나요? [answer] | `SetLinearVelocity()` 함수는 엔티티의 물리 강체 질량 값과 관계없이 속도를 직접 설정하는 함수입니다. 이 특성은 다른 힘 관련 함수들과 비교했을 때 다음과 같은 실제 게임 로직 구현상의 영향을 줍니다. ### 1. 일관된 이동 속도 보장 `ApplyForce()`나 `ApplyLinearImpulse()`는 힘 또는 충격량을 적용할 때 엔티티의 질량에 영향을 받습니다. 따라서 질량이 다른 두 엔티티에 동일한 힘/충격량을 적용하면, 질량이 작은 엔티티가 더 빠르게 가속되거나 이동하게 됩니다. 반면 `SetLine [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 힘을 가하는 함수 `ApplyForce()`, `ApplyTorque()` 함수는 지속적인 힘을 가할 수 있습니다. 특정 Key를 눌러 지속적으로 특정 방향으로 힘 가하고 싶을 때가 해당됩니다. 매개 변수 force는 힘을 의미합니다. 해당 Entity에 대응하는 물리 강체의 질량 값에 영향을 받습니다. #### 충격량을 적용하는 함수 `ApplyAngularImpulse()`, `ApplyLinearImpulse()` 함수는 일시적으로 짧은 충격을 가할 수 있습니다. 대포 발파, 방망이 휘두르기 같은 짧은 충격을 주
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 웹 브라우저 활용하기 [question] | 월드에서 웹 브라우저를 배치하는 과정을 단계별 번호 목록으로 작성하되 각 단계의 UI 조작 요소(탭, 버튼, 컴포넌트명)를 정확히 포함해야 합니다. [answer] | 월드에서 웹 브라우저를 배치하는 과정은 다음과 같습니다. 1. **Hierarchy** 탭에서 원하는 맵을 선택한 뒤 콘텍스트 메뉴를 엽니다. **Create Entity - Create Empty**를 선택해 **EmptyEntity**를 생성합니다. 2. 프로퍼티 에디터에서 **EmptyEntity**에 **TransformComponent**를 추가합니다. 3. 프로퍼티 에디터에서 **EmptyEntity**에 **WebViewComponent**를 추가하고 원하는 **Url**을 입력합니다. 4. **WebViewCompo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **WebViewComponent**를 활용하면 웹 브라우저를 월드에 배치하고 탐색할 수 있습니다. 간단한 예제를 통해 월드에서 웹 브라우저를 활용하는 방법을 알아봅시다. ##### 참고 API Reference [WebViewComponent](/apiReference/Components/WebViewComponent) # WebViewComponent 소개 엔티티에 **WebViewComponent**를 추가하면 월드에 웹 브라우저를 배치할 수 있습니다. 먼저 **WebViewComponent**의 프
[task] | two_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 차트 영역에서 FrameChart와 TimelineChart의 차이점과, 우클릭 메뉴의 'Zoom to Fit Data' 기능을 언제 활용하면 효과적인지 설명해 주세요. [answer] | 루아 프로파일러의 차트 영역에서 **FrameChart**와 **TimelineChart**는 모두 ④에서 선택한 그래프(Elapsed Time, Network Send, Network Receive, Lua Memory) 데이터를 표시하는 시각화 도구입니다. 일반적인 사용 흐름에서는 **FrameChart**를 많이 활용합니다. 차트 영역에서 **Zoom to Fit Data** 기능은 다음과 같은 상황에서 효과적으로 활용할 수 있습니다. * 차트를 확대해서 특정 구간을 자세히 보다가, 다시 전체 차트를 한눈에 보고 싶을 [followup] | 프로파일링 결과 테이블에서 'Total Self Time'과 'Peak Time'이 높은 함수를 식별하여 최적화 우선순위를 정하는 분석 프로세스를 구체적으로 알려주세요. [followup_answer] | 프로파일링 결과를 분석하여 최적화 우선순위를 정하는 과정은 다음과 같은 단계로 진행할 수 있습니다. ### 1. 분석 전 준비 * **Context 선택:** 분석 대상 실행 흐름에 따라 `Server`, `Client`, `Instance`, `Editor` 중 하나를 선택합니다. * **Frame Data 설정:** `All`을 선택하여 전체 프레임을 합산한 데이터를 기준으로 분석하는 것이 일반적입니다. 특정 프레임의 이상 현상을 조사할 경우 개별 프레임을 선택할 수도 있습니다. ### 2. 핵심 지표 식별 프로파일링 [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] | 웹 뷰에서 클릭 좌표를 로그로 출력하는 방법을 알려주세요 [answer] | 웹 뷰에서 클릭한 위치의 좌표를 로그로 출력하려면 `WebViewClickedEvent`를 처리하는 이벤트 핸들러를 작성하면 됩니다. `WebViewClickedEvent`는 클릭한 지점의 **normalizedPosition**을 제공합니다. `normalizedPosition`은 웹 뷰를 하나의 평면 좌표계로 봤을 때, 왼쪽 상단을 (0,0), 오른쪽 하단을 (1,1)로 표현한 값입니다. 따라서 화면 정중앙의 좌표는 (0.5, 0.5)가 됩니다. 다음은 웹 뷰에서 클릭 시 해당 좌표를 로그로 출력하는 mLua 스크립트 예시입 [followup] | NormalizedPosition의 좌표 범위와 좌상단 기준점이 무엇이며, 화면 정중앙 좌표는 어떻게 표현되나요? [followup_answer] | `NormalizedPosition`의 좌표 범위와 기준점은 다음과 같습니다. * **좌표 범위:** 0부터 1까지입니다. * **기준점:** 웹 뷰의 **왼쪽 상단**이 **(0, 0)** 입니다. * **오른쪽 하단:** **(1, 1)** 로 표현됩니다. * **화면 정중앙:** **(0.5, 0.5)** 로 표현됩니다. [scores] | [judge_reason] | [source_doc] | 웹 브라우저에서 클릭한 지점의 좌표를 로그로 남겨봅시다. **WebViewClickedEvent**를 활용하면 클릭한 지점의 **normalizedPosition**을 확인할 수 있습니다. **normalizedPosition**이란 웹 뷰를 하나의 평면 좌표계라고 했을 때 왼쪽 상단을 (0,0), 오른쪽 하단을 (1,1)로 표현한 위치를 말합니다. 화면의 정중앙 좌표는 (0.5,0.5) 입니다. 1. **WebViewTest** 스크립트에 **WebViewClickedEvent**를 추가하고 다음과 같이 작성합니다. `
[task] | two_turn [pass] | ⏳ 미판정 [title] | 루아 프로파일러를 활용하여 최적화하기 [question] | 프로파일링 결과에서 Category가 Lua와 Native로 나뉘는 기준과, Getter/Setter가 함수로 취급되는 이유에 대해 설명해 주세요. [answer] | 루아 프로파일러의 프로파일링 결과에서 **Category**는 크게 **Lua**와 **Native**로 나뉩니다. 이는 실행 대상이 루아 코드 자체인지, 아니면 엔진의 네이티브(원시) 코드인지에 따른 구분입니다. **Getter/Setter가 함수로 취급되는 이유**는 프로파일러가 프로퍼티(Property)의 접근 동작을 추적할 때, 값을 가져오는(Get) 동작과 값을 설정하는(Set) 동작을 모두 **함수 호출**로 간주하기 때문입니다. 따라서 프로파일링 결과의 **Name** 항목에서는 프로퍼티의 이름이 아니라, 해당 프로퍼 [followup] | 'Network Usage'와 'Lua Memory (Self)' 항목을 통해 특정 함수의 네트워크 부하와 메모리 할당 문제를 진단하고 개선하는 실제 코드 예시나 체크리스트를 요청합니다. [followup_answer] | 참고 문서에 'Network Usage'와 'Lua Memory (Self)' 항목의 정의와 의미는 포함되어 있지만, 이를 통해 문제를 진단하고 개선하는 **구체적인 실제 코드 예시**나 **최적화 체크리스트**는 제공되지 않습니다. 문서에 명시된 해당 항목의 정의와 특징은 다음과 같습니다. **1. Network Usage** * **정의**: 함수 실행 시간 동안 발생한 Network Send Size입니다. * **특징**: 일반적으로 실행 제어 함수가 대부분을 차지합니다. **2. Lua Memory (Self) [scores] | [judge_reason] | [source_doc] | * Context는 Core에서의 실행 흐름을 뜻합니다. * Server, Client, Instance, Editor 등의 Context 중에서 선택할 수 있습니다. * Context를 선택하면 ⑤ 차트 영역과 ⑨ 프로파일링 결과 영역에서 데이터를 확인할 수 있습니다. ### ④ 그래프 선택 * **Elapsed Time, Network Send, Network Receive, Lua Memory** 중에서 어떤 그래프를 ⑤의 차트 영역에 표시할 것인지 선택합니다. * **File - Option**에서 **Network**를