[task] | code [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent의 FixedType을 열 고정으로 설정하고 FixedCount를 5로 지정하여 가로 스크롤이 가능하도록 UseScroll을 활성화하는 스크립트를 작성해줘 [answer] | GridViewComponent는 `FixedType` 프로퍼티를 통해 행 고정 또는 열 고정 중 하나를 선택할 수 있으며, `FixedCount`는 고정된 행 또는 열의 개수를 지정합니다. 사용자가 요청한 대로 열을 고정하고 그 개수를 5로 설정하려면 `GridViewFixedType` enum 값 중 열 고정 옵션을 사용해야 합니다. 또한 `UseScroll`을 `true`로 설정하여 스크롤 기능을 활성화합니다. 참고 문서에는 `GridViewFixedType`의 구체적인 enum 이름(예: `FixedColumn`)이 명시적 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 규격화된 UI Entity들을 Grid 형태로 표현합니다. 화면에 보이는 UI Entity만 생성하고 재사용합니다. 대량의 Grid를 표현하기에 최적화된 형태입니다. # Properties - **Vector2 CellSize** 자식 UI Entity의 고정 크기입니다. - **int32 FixedCount** 고정된 행 혹은 열의 개수를 설정합니다. - **GridViewFixedType FixedType** 행을 고정할지 열을 고정할지 설정합니다. - **HorizontalScrollBarDirection Hor
[task] | code [pass] | ⏳ 미판정 [title] | DistanceJointComponent [question] | OnUpdate에서 self.DistanceJointComponent:GetJointsCount()가 0보다 크면 log로 joint 수를 출력하고, 0이면 _TimerService:SetTimerOnce으로 1초 후 AddJoint를 실행하는 스크립트를 작성해줘 [answer] | 사용자가 요청한 로직을 구현하기 위해 `OnUpdate` 생명주기 메서드를 사용합니다. `self.Entity.DistanceJointComponent`를 통해 컴포넌트에 접근하며, `GetJointsCount()` 반환 값에 따라 분기 처리합니다. 1. **Joint 수가 0보다 큰 경우**: `log()` 함수를 사용하여 현재 Joint 수를 출력합니다. 2. **Joint 수가 0인 경우**: `_TimerService:SetTimerOnce()`를 사용하여 1초 후 실행될 함수를 등록합니다. 이 함수 내부에서 `AddJoi [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DistanceJoint를 생성, 삭제할 수 있습니다. 연결된 강체 간 거리를 일정하게 유지합니다. # Properties - **SyncList<DistanceJoint> Joints [Sync] [ReadOnly]** Joint 정보를 설정합니다. ##### inherited from Component: - **boolean Enable [Sync]** 컴포넌트 활성화 여부를 확인합니다. - **boolean EnableInHierarchy [ReadOnly] [HideFromInspector]** 계층 구조상
[task] | single_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | OnRefresh 콜백에서 인덱스와 UI Entity를 받아 자식 항목의 내용을 갱신할 때, 특정 항목만 조건부로 표시하려면 어떤 로직을 짜야 하나요? [answer] | `OnRefresh` 콜백은 GridView가 화면에 표시할 자식 UI Entity를 생성하거나 재사용할 때 호출되며, `index`(0부터 시작하는 인덱스)와 해당 `Entity`를 인자로 전달받습니다. 특정 항목만 조건부로 표시하려면 `OnRefresh` 함수 내부에서 전달받은 `index` 값을 기준으로 로직을 분기하면 됩니다. 표시하지 않을 항목의 경우, 해당 Entity의 가시성을 숨기거나(예: `Enable` 속성 변경) 내용을 비우는 방식으로 처리할 수 있습니다. 참고 문서의 예제에서는 `entity:GetChildB [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 규격화된 UI Entity들을 Grid 형태로 표현합니다. 화면에 보이는 UI Entity만 생성하고 재사용합니다. 대량의 Grid를 표현하기에 최적화된 형태입니다. # Properties - **Vector2 CellSize** 자식 UI Entity의 고정 크기입니다. - **int32 FixedCount** 고정된 행 혹은 열의 개수를 설정합니다. - **GridViewFixedType FixedType** 행을 고정할지 열을 고정할지 설정합니다. - **HorizontalScrollBarDirection Hor
[task] | single_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | ScrollPositionChangedEvent가 발생하려면 GridViewComponent만 있으면 충분한지, ScrollLayoutGroupComponent와 함께 사용해야 하는지 확인하고 싶습니다. [answer] | `ScrollPositionChangedEvent`가 발생하려면 `GridViewComponent`만 있으면 충분합니다. `ScrollLayoutGroupComponent`를 함께 사용할 필요는 없습니다. 이벤트 발생 조건은 UI Entity에 **`ScrollLayoutGroupComponent` 또는 `GridViewComponent` 중 하나**가 있으면 충족됩니다. 즉, 두 컴포넌트 중 하나만 존재해도 이벤트가 정상적으로 발생합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **Vector2 GetScrollNormalizedPosition()** 스크롤바의 정규화된 위치를 반환합니다. - **float GetScrollNormalizedPosition(UITransformAxis axis)** 지정한 방향 스크롤바의 정규화된 위치를 반환합니다. - **void Refresh(boolean resetPos = true, boolean force = false)** GridView의 자식 UI Entity를 전체 갱신합니다. resetPos가 true라면 갱신 후 스크롤 위치를 초기화합니다
[task] | single_turn [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | Friction과 Restitution 값을 커스텀으로 적용하려면 어떤 전제 조건이 필요한가요? [answer] | Friction과 Restitution 값을 커스텀으로 적용하려면 해당 Collider 컴포넌트의 `UseCustomPhysicalProperties` 프로퍼티가 `true`여야 합니다. `UseCustomPhysicalProperties`가 `false`인 경우, 설정한 Friction과 Restitution 값은 무시되고 연결된 PhysicsRigidbodyComponent의 값이 사용됩니다. `true`로 설정해야만 Collider에 설정된 Friction(마찰 계수)과 Restitution(충돌 후 튀어 오르는 정도) 값이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 물리 강체의 모양을 설정하고 다른 강체와 충돌 시 이벤트를 발생시킵니다. 자동으로 부모 또는 자신의 PhysicsRigidbodyComponent에 연결됩니다. 연결된 PhysicsRigidbodyComponent가 없으면 Static 강체로 취급됩니다. # Properties - **Vector2 BoxSize [Sync]** Box Collider 크기를 설정합니다. - **float CircleRadius [Sync]** Circle Collider의 반지름 길이를 설정합니다. - **boolean ClientOnl
[task] | single_turn [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | PhysicsRigidbodyComponent가 연결되지 않은 상태의 PhysicsColliderComponent는 어떻게 동작하나요? [answer] | PhysicsRigidbodyComponent가 연결되지 않은 PhysicsColliderComponent는 Static(정적) 강체로 취급됩니다. 즉, 해당 콜리더는 다른 물리 강체와 충돌은 발생시키지만, 자체적으로 이동하거나 물리 연산(중력, 속도 변화 등)에 의해 움직이지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 물리 강체의 모양을 설정하고 다른 강체와 충돌 시 이벤트를 발생시킵니다. 자동으로 부모 또는 자신의 PhysicsRigidbodyComponent에 연결됩니다. 연결된 PhysicsRigidbodyComponent가 없으면 Static 강체로 취급됩니다. # Properties - **Vector2 BoxSize [Sync]** Box Collider 크기를 설정합니다. - **float CircleRadius [Sync]** Circle Collider의 반지름 길이를 설정합니다. - **boolean ClientOnl
[task] | single_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GetScrollNormalizedPosition 메서드에 UITransformAxis 인자를 전달하지 않고 호출하면 가로와 세로 방향의 스크롤 위치 중 어느 쪽이 반환되나요? [answer] | `GetScrollNormalizedPosition` 메서드에 `UITransformAxis` 인자를 전달하지 않고 호출하면, **가로와 세로 방향 중 어느 쪽이 반환되는지에 대한 정보가 제공된 문서에 없습니다.** 문서에는 두 가지 오버로드가 나열되어 있습니다. 1. `Vector2 GetScrollNormalizedPosition()` 2. `float GetScrollNormalizedPosition(UITransformAxis axis)` 첫 번째 메서드가 `Vector2` 타입을 반환하므로 가로(X)와 세로(Y) 값을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **Vector2 GetScrollNormalizedPosition()** 스크롤바의 정규화된 위치를 반환합니다. - **float GetScrollNormalizedPosition(UITransformAxis axis)** 지정한 방향 스크롤바의 정규화된 위치를 반환합니다. - **void Refresh(boolean resetPos = true, boolean force = false)** GridView의 자식 UI Entity를 전체 갱신합니다. resetPos가 true라면 갱신 후 스크롤 위치를 초기화합니다
[task] | single_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | TotalCount를 변경했을 때 기존에 생성된 자식 UI Entity들이 어떻게 재사용되며, OnClear와 OnRefresh가 호출되는 순서는 어떻게 되나요? [answer] | 제공된 참고 문서에 `TotalCount` 값을 변경했을 때 기존 자식 UI Entity의 구체적인 재사용 로직(예: 어떤 인덱스의 엔티티가 먼저 소거되는지, 메모리 풀링 방식의 내부 구현 등)이나 `OnClear`와 `OnRefresh` 콜백이 호출되는 **정확한 순서(Sequence)** 에 대한 명시적인 설명은 포함되어 있지 않습니다. 문서에서 확인 가능한 사실은 다음과 같습니다. 1. **GridViewComponent의 동작 원리**: "화면에 보이는 UI Entity만 생성하고 재사용합니다."라고 설명되어 있어, 화 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 규격화된 UI Entity들을 Grid 형태로 표현합니다. 화면에 보이는 UI Entity만 생성하고 재사용합니다. 대량의 Grid를 표현하기에 최적화된 형태입니다. # Properties - **Vector2 CellSize** 자식 UI Entity의 고정 크기입니다. - **int32 FixedCount** 고정된 행 혹은 열의 개수를 설정합니다. - **GridViewFixedType FixedType** 행을 고정할지 열을 고정할지 설정합니다. - **HorizontalScrollBarDirection Hor
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | PhysicsColliderComponent의 충돌 시작 및 종료 시점에 호출되는 두 메서드의 정확한 시그니처를 2줄의 코드 블록으로만 출력하세요. [answer] | ```lua void OnContactBegin(PhysicsContactBeginEvent beginEvent) void OnContactEnd(PhysicsContactEndEvent endEvent) ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **PhysicsRigidbodyComponent GetAttachedPhysicsRigidbody()** 연결된 PhysicsRigidbodyComponent를 반환합니다. - **void OnContactBegin(PhysicsContactBeginEvent beginEvent) [ScriptOverridable]** 두 물리 강체가 충돌을 시작할 때 호출됩니다. - **void OnContactEnd(PhysicsContactEndEvent endEvent) [ScriptOverridable]** 두 물리 강체의
[task] | code [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent의 SetScrollPositionByItemIndex 메서드를 활용하여 목록에서 특정 아이템 인덱스를 선택하면 해당 위치로 스크롤이 이동하도록 하는 스크립트를 작성해줘 [answer] | `GridViewComponent`의 `SetScrollPositionByItemIndex` 메서드를 사용하여 특정 인덱스에 위치한 아이템이 보이도록 스크롤을 이동하는 로직은 다음과 같이 구현할 수 있습니다. 이 예제에서는 `GridViewComponent`가 장착된 엔티티에 대한 참조를 갖고, 선택된 인덱스를 전달받아 스크롤 위치를 조정하는 메서드를 제공합니다. ```lua Property: [None] GridViewComponent GridViewComp = nil Method: [client only] void OnBe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **Vector2 GetScrollNormalizedPosition()** 스크롤바의 정규화된 위치를 반환합니다. - **float GetScrollNormalizedPosition(UITransformAxis axis)** 지정한 방향 스크롤바의 정규화된 위치를 반환합니다. - **void Refresh(boolean resetPos = true, boolean force = false)** GridView의 자식 UI Entity를 전체 갱신합니다. resetPos가 true라면 갱신 후 스크롤 위치를 초기화합니다
[task] | single_turn [pass] | ⏳ 미판정 [title] | DistanceJointComponent [question] | DistanceJointComponent를 사용 중인데 강체 간 거리가 설정한 length만큼 유지되지 않고 늘거나 줄어드는 현상이 발생하는데, 이는 어떤 원인으로 인해 발생하는 것일까요? [answer] | DistanceJointComponent는 두 강체(엔티티) 간의 거리를 `length` 값으로 유지하도록 설계되어 있지만, 물리 시뮬레이션 특성상 실제 거리가 설정된 `length`와 완벽하게 일치하지 않고 미세하게 늘어나거나 줄어드는 현상이 발생할 수 있습니다. 이는 주로 다음과 같은 원인으로 인해 발생합니다. 1. **물리 엔진의 수치적 오차 및 반복 횟수 제한**: 물리 엔진은 한 프레임 내 유한한 횟수만큼 충돌 및 조인트 제약 조건을 해결합니다. 매우 큰 힘이나 빠른 속도가 가해지면 한 프레임 내에 제약을 완전히 충족시키 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | DistanceJoint를 생성, 삭제할 수 있습니다. 연결된 강체 간 거리를 일정하게 유지합니다. # Properties - **SyncList<DistanceJoint> Joints [Sync] [ReadOnly]** Joint 정보를 설정합니다. ##### inherited from Component: - **boolean Enable [Sync]** 컴포넌트 활성화 여부를 확인합니다. - **boolean EnableInHierarchy [ReadOnly] [HideFromInspector]** 계층 구조상
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | OnBeginPlay에서 Sleep()을 호출하고 Change에서 CollisionGroup을 변경하는 예제 코드 내의 실행 공간(Attribute) 두 가지를 단계별 번호 목록으로 제시하세요. [answer] | 제시된 예제 코드에서 `OnBeginPlay`와 `Change` 메서드에 지정된 실행 공간(Attribute)은 다음과 같습니다. 1. `OnBeginPlay` 메서드: `[server only]` 2. `Change` 메서드: `[server]` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **PhysicsRigidbodyComponent GetAttachedPhysicsRigidbody()** 연결된 PhysicsRigidbodyComponent를 반환합니다. - **void OnContactBegin(PhysicsContactBeginEvent beginEvent) [ScriptOverridable]** 두 물리 강체가 충돌을 시작할 때 호출됩니다. - **void OnContactEnd(PhysicsContactEndEvent endEvent) [ScriptOverridable]** 두 물리 강체의
[task] | single_turn [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | ColliderOffset이 Entity의 SpriteRendererComponent에 영향을 미치는 Legacy 시스템과 현재 시스템의 차이점은 무엇인가요? [answer] | `PhysicsColliderComponent`의 `IsLegacy` 프로퍼티 값을 기준으로 두 시스템의 차이가 나뉩니다. **1. Legacy 시스템 (`IsLegacy`가 true일 때)** * **영향:** `ColliderOffset` 값이 Entity의 `SpriteRendererComponent`에 영향을 미칩니다. 즉, 충돌체(Collider)의 위치를 오프셋하면 스프라이트 렌더링 위치도 함께 이동하는 특성이 있습니다. * **지원 상태:** 현재 더 이상 지원하지 않는 시스템이며, 추후 삭제될 예정입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 물리 강체의 모양을 설정하고 다른 강체와 충돌 시 이벤트를 발생시킵니다. 자동으로 부모 또는 자신의 PhysicsRigidbodyComponent에 연결됩니다. 연결된 PhysicsRigidbodyComponent가 없으면 Static 강체로 취급됩니다. # Properties - **Vector2 BoxSize [Sync]** Box Collider 크기를 설정합니다. - **float CircleRadius [Sync]** Circle Collider의 반지름 길이를 설정합니다. - **boolean ClientOnl
[task] | single_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent에서 ItemEntity로 설정된 엔티티가 자동으로 비활성화되는 이유와 이 설정을 안 하면 어떤 문제가 생기는지 궁금합니다. [answer] | GridViewComponent에서 `ItemEntity`로 설정된 엔티티가 자동으로 비활성화되는 이유는 이 엔티티가 **자식 UI Entity를 생성할 때 복제되는 원본(Template)** 용도로만 사용되기 때문입니다. ### 1. 자동으로 비활성화되는 이유 * **원본 보호 및 혼란 방지:** `ItemEntity`는 실제 화면에 표시되는 항목이 아니라, 복사본을 만들 때 참조하는 '틀' 역할을 합니다. 만약 이 원본 엔티티가 활성화된 채로 화면에 남아있다면, 실제 그리드 항목들과 겹쳐 보이거나 위치가 어긋나는 등 시각적 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 규격화된 UI Entity들을 Grid 형태로 표현합니다. 화면에 보이는 UI Entity만 생성하고 재사용합니다. 대량의 Grid를 표현하기에 최적화된 형태입니다. # Properties - **Vector2 CellSize** 자식 UI Entity의 고정 크기입니다. - **int32 FixedCount** 고정된 행 혹은 열의 개수를 설정합니다. - **GridViewFixedType FixedType** 행을 고정할지 열을 고정할지 설정합니다. - **HorizontalScrollBarDirection Hor
[task] | single_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | Refresh 메서드를 호출할 때 resetPos와 force 파라미터를 각각 true와 false로 설정하면 화면에 어떤 차이가 발생하나요? [answer] | `Refresh` 메서드를 `resetPos`가 `true`, `force`가 `false`로 설정하여 호출하면 다음과 같은 결과가 발생합니다. 1. **스크롤 위치 초기화 (resetPos = true)**: GridView의 자식 UI Entity가 갱신된 후, 스크롤 위치가 자동으로 초기화됩니다. 즉, 스크롤바가 가장 위쪽(또는 시작 위치)으로 이동하게 됩니다. 2. **강제 갱신 여부 (force = false)**: `force`가 `false`이므로, GridView는 내부 상태에 따라 실제 변경이 필요한 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **Vector2 GetScrollNormalizedPosition()** 스크롤바의 정규화된 위치를 반환합니다. - **float GetScrollNormalizedPosition(UITransformAxis axis)** 지정한 방향 스크롤바의 정규화된 위치를 반환합니다. - **void Refresh(boolean resetPos = true, boolean force = false)** GridView의 자식 UI Entity를 전체 갱신합니다. resetPos가 true라면 갱신 후 스크롤 위치를 초기화합니다
[task] | single_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | 스크롤바가 보이지 않는데 UseScroll은 true로 되어 있고 ScrollBarVisible도 true인데, 스크롤바가 안 나타나는 원인은 무엇일까요? [answer] | `UseScroll`과 `ScrollBarVisible`이 모두 `true`로 설정되어 있음에도 스크롤바가 보이지 않는 가장 일반적인 원인은 **스크롤이 실제로 필요한 상황(오버플로우)이 아닌 경우**입니다. `GridViewComponent`의 스크롤바는 그리드 내부에 배치된 자식 UI Entity(`ItemEntity`로 복제된 요소들)의 총 크기가 뷰포트(시야) 범위를 넘어설 때만 기능을 수행하도록 설계되어 있습니다. `TotalCount`가 설정된 값보다 적거나, `CellSize`와 `Spacing`이 작아서 전체 그리드 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 규격화된 UI Entity들을 Grid 형태로 표현합니다. 화면에 보이는 UI Entity만 생성하고 재사용합니다. 대량의 Grid를 표현하기에 최적화된 형태입니다. # Properties - **Vector2 CellSize** 자식 UI Entity의 고정 크기입니다. - **int32 FixedCount** 고정된 행 혹은 열의 개수를 설정합니다. - **GridViewFixedType FixedType** 행을 고정할지 열을 고정할지 설정합니다. - **HorizontalScrollBarDirection Hor
[task] | code [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent의 TotalCount를 100으로 설정하고 OnRefresh 콜백에서 인덱스 값에 따라 자식 UI Entity의 텍스트를 변경하는 스크립트를 작성해줘 [answer] | `GridViewComponent`의 `TotalCount`를 100으로 설정하고, `OnRefresh` 콜백에서 인덱스 값에 따라 자식 UI Entity의 텍스트를 변경하는 스크립트는 다음과 같습니다. 1. `ItemEntity`에 복제할 원본 UI Entity를 지정합니다. 2. `OnRefresh`와 `OnClear` 콜백을 등록합니다. 3. `TotalCount`를 100으로 설정하고 `Refresh()`를 호출하여 그리드를 초기화합니다. 4. `OnRefresh` 함수에서 전달받은 `index` 값을 사용하여 해당 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 규격화된 UI Entity들을 Grid 형태로 표현합니다. 화면에 보이는 UI Entity만 생성하고 재사용합니다. 대량의 Grid를 표현하기에 최적화된 형태입니다. # Properties - **Vector2 CellSize** 자식 UI Entity의 고정 크기입니다. - **int32 FixedCount** 고정된 행 혹은 열의 개수를 설정합니다. - **GridViewFixedType FixedType** 행을 고정할지 열을 고정할지 설정합니다. - **HorizontalScrollBarDirection Hor
[task] | single_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridView에서 특정 아이템이 보이는 위치로 스크롤을 이동할 때 SetScrollNormalizedPosition과 SetScrollPositionByItemIndex 중 어떤 메서드를 사용해야 하는지 차이점을 알고 싶습니다. [answer] | GridView에서 특정 아이템이 보이는 위치로 스크롤을 이동할 때는 **`SetScrollPositionByItemIndex`** 메서드를 사용해야 합니다. 두 메서드의 차이점은 다음과 같습니다: 1. **`SetScrollPositionByItemIndex(int32 index)`** * **목적:** 특정 index를 가진 자식 UI Entity가 화면에 **보이는 위치**로 스크롤바를 이동시킵니다. * **사용 시나리오:** "10번째 아이템이 보이도록 스크롤해 줘"라는 식의 요구사항에 적합합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **Vector2 GetScrollNormalizedPosition()** 스크롤바의 정규화된 위치를 반환합니다. - **float GetScrollNormalizedPosition(UITransformAxis axis)** 지정한 방향 스크롤바의 정규화된 위치를 반환합니다. - **void Refresh(boolean resetPos = true, boolean force = false)** GridView의 자식 UI Entity를 전체 갱신합니다. resetPos가 true라면 갱신 후 스크롤 위치를 초기화합니다
[task] | two_turn [pass] | ⏳ 미판정 [title] | DistanceJointComponent [question] | DistanceJointComponent의 Joints 속성이 SyncList 타입인 이유와 네트워크 동기화 시 주의할 점을 알려주세요 [answer] | DistanceJointComponent의 `Joints` 속성이 `SyncList<DistanceJoint>` 타입으로 설계된 이유는 서버와 클라이언트 간에 강체 간 연결 상태(Joint) 정보를 일관되게 동기화하기 위해서입니다. `DistanceJoint`는 물리 시뮬레이션에서 두 엔티티의 거리를 일정하게 유지하는 역할을 수행하며, 이 정보는 서버에서 물리 엔진을 통해 계산되고 변경됩니다. `SyncList` 타입을 사용하면 서버에서 Joint가 추가되거나 삭제될 때 해당 변경 사항이 자동으로 클라이언트에 전달되어, 모든 클라 [followup] | SetLength 메서드를 서버에서 호출했을 때 클라이언트에도 즉시 반영되는지, 아니면 매 프레임 동기화되는지에 따라 발생하는 시각적 지연 현상을 방지하기 위한 최적화 코드를 작성해 주세요. [followup_answer] | 참고 문서에 따르면, `DistanceJointComponent`의 `Joints` 속성은 `SyncList<DistanceJoint>` 타입이며 `[Sync]` 태그가 붙어 있습니다. 이는 서버에서 Joint 정보(Length 포함)가 변경되면 네트워크를 통해 클라이언트로 동기화됨을 의미합니다. 하지만 **`SyncList`의 정확한 동기화 주기(매 프레임 즉시 반영인지, 특정 간격의 배치(batch) 처리인지)에 대한 세부 기술은 제공된 문서에 명시되어 있지 않습니다.** 따라서 "매 프레임 동기화되는지" 또는 "즉시 반영되는 [scores] | [judge_reason] | [source_doc] | DistanceJoint를 생성, 삭제할 수 있습니다. 연결된 강체 간 거리를 일정하게 유지합니다. # Properties - **SyncList<DistanceJoint> Joints [Sync] [ReadOnly]** Joint 정보를 설정합니다. ##### inherited from Component: - **boolean Enable [Sync]** 컴포넌트 활성화 여부를 확인합니다. - **boolean EnableInHierarchy [ReadOnly] [HideFromInspector]** 계층 구조상
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | ApplyLinearImpulse와 ApplyForce의 차이점을 3문장 이내로 설명하세요. [answer] | `ApplyLinearImpulse`는 강체의 무게 중심이나 특정 위치에 순간적인 선형 충격량을 가하여 속도를 즉시 변경하는 반면, `ApplyForce`는 무게 중심이나 특정 위치에 힘을 가하여 시간의 흐름에 따라 점진적으로 속도가 변하도록 합니다. 즉, 충격량(Impulse)은 즉각적인 속도 변화를, 힘(Force)은 지속되는 가속 효과를 의미합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **void ApplyAngularImpulse(float impulse)** 강체에 반시계 방향으로(CCW) 각 충격량을 적용합니다. - **void ApplyForce(Vector2 force)** 강체의 무게 중심에 특정 방향으로 힘을 가합니다. - **void ApplyForce(Vector2 force, Vector2 worldPoint)** 강체에 월드 상 특정 위치에서 특정 방향으로 힘을 가합니다. - **void ApplyLinearImpulse(Vector2 impulse)** 강체의 무게 중심에
[task] | two_turn [pass] | ⏳ 미판정 [title] | DistanceJointComponent [question] | DistanceJointComponent 로 떨어지는 엔티티를 잡는 원리를 설명해 주세요 [answer] | DistanceJointComponent로 떨어지는 엔티티를 잡는 원리는 물리 시뮬레이션에서 두 지점 사이의 거리를 고정하는 "줄" 또는 "로드"의 개념을 활용하는 것입니다. ### 원리 설명 1. **Joint 생성 (`AddJoint`)**: * `DistanceJointComponent`의 `AddJoint` 메서드를 호출하여 현재 엔티티(self.Entity)와 대상 엔티티(예: 떨어지는 공) 사이에 물리적 연결을 만듭니다. * 이 메서드는 대상 엔티티, 대상 엔티티 내에서의 연결 지점(Anchor [followup] | Vector2.Distance 를 이용해 초기 길이를 계산하는 코드와 AddJoint 메서드의 파라미터 순서를 구체적으로 알려주세요. [followup_answer] | 참고 문서에 제시된 예제 코드를 기준으로 `Vector2.Distance`를 이용해 초기 길이를 계산하는 코드와 `AddJoint` 메서드의 파라미터 순서는 다음과 같습니다. ### 1. 초기 길이 계산 코드 두 엔티티(`ball`과 `self.Entity`)의 월드 위치(`WorldPosition`)를 2D 벡터(`Vector2`)로 변환한 후, `Vector2.Distance` 함수를 사용하여 두 지점 사이의 거리를 계산합니다. ```lua Vector2.Distance( ball.TransformComponent. [scores] | [judge_reason] | [source_doc] | R을 눌러 Joint를 추가해 떨어지는 공을 잡는 예제입니다. ```lua Function: [server] void Connect () { local ball = _EntityService:GetEntityByPath("/maps/map01/Ball") self.Entity.DistanceJointComponent:AddJoint( ball, Vector2.zero, Vector2.zero, Vector2.Distance(ball.TransformComponent.WorldPosition:ToVector2
[task] | code [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent의 RefreshIndex 메서드를 사용하여 특정 인덱스의 UI 엔티티만 선택적으로 갱신하는 스크립트를 작성해줘 [answer] | `GridViewComponent`의 `RefreshIndex(index)` 메서드는 전체 그리드를 다시 그리지 않고, 지정한 `index`에 해당하는 자식 UI Entity만 갱신합니다. 이 메서드가 호출되면 해당 인덱스의 자식 UI Entity에 대해 `OnRefresh` 콜백이 실행됩니다. 아래 예제는 `GridViewComponent`를 초기화한 후, 특정 인덱스(예: 3번째 항목)만 선택적으로 갱신하는 방법을 보여줍니다. ```lua Property: [None] GridViewComponent GridView = ni [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **Vector2 GetScrollNormalizedPosition()** 스크롤바의 정규화된 위치를 반환합니다. - **float GetScrollNormalizedPosition(UITransformAxis axis)** 지정한 방향 스크롤바의 정규화된 위치를 반환합니다. - **void Refresh(boolean resetPos = true, boolean force = false)** GridView의 자식 UI Entity를 전체 갱신합니다. resetPos가 true라면 갱신 후 스크롤 위치를 초기화합니다
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | HandlePhysicsContactBeginEvent에서 이벤트 파라미터로 접근 가능한 필드 이름 하나만 추출하여 출력하세요. [answer] | ContactedBodyEntity [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Event Handler: [self] HandlePhysicsContactBeginEvent (PhysicsContactBeginEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: PhysicsColliderComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | 물리 소유권 관련 메서드 3종을 표로 정리해서, 각 메서드의 실행 공간과 Contact Event 발생 주체를 명시하세요. [answer] | 물리 소유권 관련 메서드 3종은 다음과 같습니다. | 메서드 | 실행 공간 | Contact Event 발생 주체 | | :--- | :--- | :--- | | `ClearPhysicsOwnership()` | Server | Server | | `SetClientAsPhysicsOwner(string userId)` | ServerOnly | 해당 Client, Server | | `SetServerAsPhysicsOwner()` | Server | Server | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **void ApplyAngularImpulse(float impulse)** 강체에 반시계 방향으로(CCW) 각 충격량을 적용합니다. - **void ApplyForce(Vector2 force)** 강체의 무게 중심에 특정 방향으로 힘을 가합니다. - **void ApplyForce(Vector2 force, Vector2 worldPoint)** 강체에 월드 상 특정 위치에서 특정 방향으로 힘을 가합니다. - **void ApplyLinearImpulse(Vector2 impulse)** 강체의 무게 중심에
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | 강체의 위치와 회전각을 동시에 설정하는 코드를 출력하되, 설명은 주석으로만 작성하세요. [answer] | ```lua Method: void SetTransform(Vector2 position, float angle) { -- 강체의 월드 좌표 위치를 설정합니다. self.Entity.PhysicsRigidbodyComponent:SetPosition(position) -- 강체의 회전각을 설정합니다. self.Entity.PhysicsRigidbodyComponent:SetRotation(angle) } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **void ApplyAngularImpulse(float impulse)** 강체에 반시계 방향으로(CCW) 각 충격량을 적용합니다. - **void ApplyForce(Vector2 force)** 강체의 무게 중심에 특정 방향으로 힘을 가합니다. - **void ApplyForce(Vector2 force, Vector2 worldPoint)** 강체에 월드 상 특정 위치에서 특정 방향으로 힘을 가합니다. - **void ApplyLinearImpulse(Vector2 impulse)** 강체의 무게 중심에
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | PhysicsRigidbodyComponent의 ApplyLinearImpulse 메서드 호출 시 전달하는 Vector2 인자값을 코드 블록 1개 안에만 출력하세요. [answer] | ```lua Vector2(0, 5) ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Event Handler: [self] HandlePhysicsContactBeginEvent (PhysicsContactBeginEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: PhysicsColliderComponent -- Space: Server, Client --------------------------------------------------------- -- Parameters local
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | 문서 예제에서 P 키 입력 시 CollisionGroup을 변경하기 위해 필요한 InputService 이벤트 핸들러의 파라미터 타입과 조건문 구조를 표로 정리해서 작성하세요. [answer] | 제시된 문서의 예제를 기준으로 `P` 키 입력 시 `CollisionGroup`을 변경하기 위한 `InputService` 이벤트 핸들러의 파라미터 타입과 조건문 구조를 표로 정리하면 다음과 같습니다. | 구분 | 내용 | | :--- | :--- | | **이벤트 핸들러** | `HandleKeyDownEvent` | | **연결 서비스** | `[service: InputService]` | | **파라미터 타입** | `KeyDownEvent` | | **파라미터 변수명** | `event` | | **접근할 키 값** | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **PhysicsRigidbodyComponent GetAttachedPhysicsRigidbody()** 연결된 PhysicsRigidbodyComponent를 반환합니다. - **void OnContactBegin(PhysicsContactBeginEvent beginEvent) [ScriptOverridable]** 두 물리 강체가 충돌을 시작할 때 호출됩니다. - **void OnContactEnd(PhysicsContactEndEvent endEvent) [ScriptOverridable]** 두 물리 강체의
[task] | code [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent의 OnClear 콜백에서 비활성화된 자식 UI Entity의 Enable 속성을 false로 설정하여 메모리 관리를 돕는 스크립트를 작성해줘 [answer] | `GridViewComponent`의 `OnClear` 콜백은 자식 UI Entity가 화면에서 사라져 더 이상 사용되지 않을 때 호출됩니다. 이 시점에 해당 Entity의 `Enable` 속성을 `false`로 설정하면 비활성화되어 메모리 관리를 돕는 효과를 볼 수 있습니다. 아래 스크립트는 `GridViewComponent`에 `OnClear` 콜백을 연결하고, 콜백 내에서 전달받은 Entity의 `Enable`을 `false`로 설정하는 예시입니다. ```lua Property: [None] GridViewComponent [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 규격화된 UI Entity들을 Grid 형태로 표현합니다. 화면에 보이는 UI Entity만 생성하고 재사용합니다. 대량의 Grid를 표현하기에 최적화된 형태입니다. # Properties - **Vector2 CellSize** 자식 UI Entity의 고정 크기입니다. - **int32 FixedCount** 고정된 행 혹은 열의 개수를 설정합니다. - **GridViewFixedType FixedType** 행을 고정할지 열을 고정할지 설정합니다. - **HorizontalScrollBarDirection Hor
[task] | code [pass] | ⏳ 미판정 [title] | UserDataStorage [question] | _UserDataStorage 서비스의 TransactSetByInfoAsync 메서드를 사용하여 유저의 기본 정보(닉네임, 레벨, 직업)를 Dictionary<DataStorageKeyInfo, string> 형태로 묶어 비동기로 저장하고, 콜백에서 성공 시 log로 저장 결과를 출력하는 스크립트를 작성해줘 [answer] | 사용자 데이터 스토리지(`UserDataStorage`)에 접근하기 위해서는 `_UserDataStorageService`를 사용해야 합니다. 제공된 참고 문서에는 `_DataStorageService`의 `GetGlobalDataStorage` 예제가 있으며, 이는 전역 데이터 스토리지에 대한 것입니다. 하지만 질문에서는 **유저의** 기본 정보를 저장하라고 했으므로, 일반적으로 유저 데이터는 `_UserDataStorageService`를 통해 특정 유저 ID에 해당하는 스토리지 객체를 얻어와야 합니다. 참고 문서에 `_Use [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ing> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictionary<DataStorageKeyInfo, string> keyValue
[task] | single_turn [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | ClientOnly 속성이 true일 때와 false일 때 물리 연산 결과의 동기화 방식이 어떻게 달라지나요? [answer] | `ClientOnly` 속성은 물리 연산이 수행되는 공간과 그 결과가 다른 클라이언트와 동기화되는 방식을 결정합니다. **1. `ClientOnly`가 `true`인 경우** * **물리 연산 공간:** Client(클라이언트)에서 물리 연산이 수행됩니다. * **함수 및 Property 접근:** Client 공간에서만 함수를 사용하거나 Property를 변경할 수 있습니다. * **동기화 방식:** 물리 연산의 결과가 다른 Clients(클라이언트)와 **동기화되지 않습니다.** 즉, 해당 클라이언트에서만 물리 상태 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 물리 강체의 모양을 설정하고 다른 강체와 충돌 시 이벤트를 발생시킵니다. 자동으로 부모 또는 자신의 PhysicsRigidbodyComponent에 연결됩니다. 연결된 PhysicsRigidbodyComponent가 없으면 Static 강체로 취급됩니다. # Properties - **Vector2 BoxSize [Sync]** Box Collider 크기를 설정합니다. - **float CircleRadius [Sync]** Circle Collider의 반지름 길이를 설정합니다. - **boolean ClientOnl