[task] | code [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | PhysicsColliderComponent의 Friction과 Restitution 값을 각각 0.5와 0.8로 설정하고 UseCustomPhysicalProperties를 true로 활성화하는 스크립트를 작성해줘 [answer] | PhysicsColliderComponent의 `UseCustomPhysicalProperties` 프로퍼티가 `true`일 때 `Friction`과 `Restitution` 값이 물리 강체에 적용됩니다. 따라서 해당 값을 설정하려면 `OnBeginPlay()`에서 프로퍼티를 수정하면 됩니다. ```lua Property: [None] number SetFriction = 0.5 [None] number SetRestitution = 0.8 Method: [server only] void OnBeginPlay () { self [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] | code [pass] | ⏳ 미판정 [title] | BasicParticleComponent [question] | BasicParticleComponent의 OrderInLayerChangedEvent와 SortingLayerChangedEvent 핸들러를 구현하여 해당 값이 변경될 때마다 변경된 내용을 log() 함수로 출력하는 스크립트를 작성해줘 [answer] | `OrderInLayerChangedEvent`와 `SortingLayerChangedEvent`는 `BasicParticleComponent`에 정의된 이벤트입니다. 이 이벤트들을 처리하기 위해서는 컴포넌트 자체에 대한 이벤트 핸들러(`[self]` 또는 컴포넌트 참조를 통한 등록)가 필요합니다. 메이플스토리 월드의 mLua 구조에서 컴포넌트가 부착된 엔티티의 스크립트 내에서 해당 컴포넌트의 이벤트를 처리하려면, 해당 컴포넌트 인스턴스를 참조하여 이벤트를 구독하거나, 문서에서 명시된 이벤트 핸들러 형식을 따릅니다. 주어진 참고 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **OrderInLayerChangedEvent** Component의 OrderInLayer가 변경되었을 때 발생하는 이벤트입니다. - **ParticleEmitEndEvent** 파티클의 방출이 종료되었을 때 BaseParticleComponent에서 발생하는 이벤트입니다. - **ParticleEmitStartEvent** 파티클 입자 방출이 시작될 때 발생하는 이벤트입니다. - **ParticleLoopEvent** Loop 프로퍼티가 활성화 된 경우, 파티클의 방출 주기가 돌아와서 방출을 반복할 때 발생하
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | GravityScale 속성을 0.2로 설정하는 코드를 주석 없이 코드 블록 1개 안에만 출력하세요. [answer] | ```lua Event Handler: [self] HandlePhysicsContactBeginEvent (PhysicsContactBeginEvent event) { local ContactedBodyEntity = event.ContactedBodyEntity ContactedBodyEntity.PhysicsRigidbodyComponent.GravityScale = 0.2 } ``` [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] | two_turn [pass] | ⏳ 미판정 [title] | DistanceJointComponent [question] | DistanceJointComponent를 이용해 두 엔티티의 거리를 일정하게 유지하는 간단한 스크립트 예시를 만들어 주세요 [answer] | DistanceJointComponent는 두 엔티티 간의 거리를 일정하게 유지하는 조인트를 생성하고 관리하는 데 사용됩니다. 아래는 서버에서 실행되는 간단한 스크립트 예시입니다. 이 예제에서는 `OnBeginPlay` 시점에 다른 엔티티(`Ball`)와 거리를 유지하는 조인트를 생성하고, `R` 키를 누르면 조인트를 연결/해제하는 기능을 구현했습니다. ```lua Property: [None] Entity TargetEntity = nil Method: [server only] void OnBeginPlay() { -- [followup] | AddJoint로 생성된 Joint의 index를 저장하지 않고 GetJointsCount를 활용해 동적으로 마지막 추가된 Joint의 Length를 변경하는 로직을 OnUpdate 함수 내에서 구현해 주세요. [followup_answer] | `GetJointsCount()` 메서드를 호출한 후 반환된 값에서 1을 빼면 마지막에 추가된 Joint의 index를 얻을 수 있습니다. 이 index를 `SetLength` 메서드에 전달하여 Length 값을 변경할 수 있습니다. 아래는 `OnUpdate` 함수 내에서 매 프레임(또는 특정 조건)마다 마지막 Joint의 Length를 동적으로 변경하는 예시입니다. ```lua Property: [None] number TargetLength = 5.0 Method: [server only] void OnUpdate(numb [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] | PhysicsColliderComponent [question] | PhysicsColliderComponent의 IsSensor 속성을 true로 설정하면 물리적 충돌은 없는데 이벤트만 발생하게 하는 원리가 무엇인가요? [answer] | `PhysicsColliderComponent`의 `IsSensor` 속성을 `true`로 설정하면, 해당 충돌체는 다른 물리 강체와 물리적으로 상호작용하지 않지만 충돌 감지 이벤트는 정상적으로 발생하게 됩니다. 구체적인 동작 원리와 특징은 다음과 같습니다. **1. 물리적 상호작용 차단** `IsSensor`가 `true`인 충돌체는 다른 강체와 충돌했을 때 서로 밀어내거나, 튕겨 나가는 등 실제 물리적인 힘(Impulse)을 가하지 않습니다. 즉, 두 개체가 겹쳐도 서로의 위치나 운동 상태를 물리적으로 방해하지 않습니다. [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] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | UseDensity 속성이 true일 때 질량(Mass)이 계산되는 로직을 단계별 번호 목록으로 작성하고, 하나의 강체에 여러 Collider가 있는 경우의 계산 방식을 1문장으로 요약하세요. [answer] | UseDensity 속성이 true일 때 질량(Mass) 계산 로직은 다음과 같습니다. 1. PhysicsColliderComponent의 Density 값과 Collider 값을 가져옵니다. 2. 가져온 Density와 Collider 값을 이용해 Mass 값을 계산합니다. 하나의 PhysicsRigidbodyComponent에 여러 개의 PhysicsColliderComponent가 붙어 있는 경우, 각 PhysicsColliderComponent의 Density와 Collider 크기를 곱한 값을 Mass 값으로 사용합 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 물리 엔진에 의해 제어됩니다. 물리 연산에 영향을 주는 값을 설정할 수 있습니다. # Properties - **float AngularDamping [Sync]** 각속도의 변화에 대한 저항 계수를 설정합니다. 값이 클수록 각속도 변화에 더 많은 힘이 필요합니다. 0 이상의 값만 설정할 수 있습니다. - **BodyType BodyType [Sync]** 강체 타입을 설정합니다. - **PhysicsCollisionDetectionMode CollisionDetectionMode [Sync]** 물리 충돌의
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | PhysicsRigidbodyComponent의 마찰 계수(Friction)와 탄성 계수(Restitution)의 물리적 의미를 2문장 이내로 설명하고, 각 값의 허용 범위를 표로 정리하세요. [answer] | Friction은 마찰 계수로 값이 작을수록 잘 미끄러지는 특성을 가지며, Restitution은 충돌 후 튀어 오르는 정도를 결정하여 0에 가까울수록 완전 비탄성 충돌, 1에 가까울수록 완전 탄성 충돌에 가깝습니다. | 프로퍼티 | 허용 범위 | | :--- | :--- | | Friction | 0 이상 | | Restitution | 문서에 명시된 범위 없음 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 물리 엔진에 의해 제어됩니다. 물리 연산에 영향을 주는 값을 설정할 수 있습니다. # Properties - **float AngularDamping [Sync]** 각속도의 변화에 대한 저항 계수를 설정합니다. 값이 클수록 각속도 변화에 더 많은 힘이 필요합니다. 0 이상의 값만 설정할 수 있습니다. - **BodyType BodyType [Sync]** 강체 타입을 설정합니다. - **PhysicsCollisionDetectionMode CollisionDetectionMode [Sync]** 물리 충돌의
[task] | two_turn [pass] | ⏳ 미판정 [title] | DistanceJointComponent [question] | DistanceJointComponent의 주요 기능과 속성, 메서드에 대해 설명해 주세요 [answer] | DistanceJointComponent는 두 강체(Rigidbody) 사이의 거리를 일정하게 유지하도록 연결하는 DistanceJoint를 생성하고 관리하는 컴포넌트입니다. ### 주요 기능 * **거리 유지:** 연결된 두 엔티티 간의 거리를 지정된 길이(length)로 고정하여 유지합니다. * **생성 및 삭제:** `AddJoint`와 `DestroyJoint` 메서드를 통해 조인트를 동적으로 추가하거나 제거할 수 있습니다. * **속성 설정:** 생성 후에도 앵커 위치, 길이, 충돌 여부 등을 변경할 수 있습니 [followup] | AddJoint 메서드에서 localAnchorA와 localAnchorB의 좌표가 로컬 좌표계인지 월드 좌표계인지 명확히 해 주세요, 그리고 실패 시 -1을 반환하는 구체적인 예외 상황(예: 타겟 엔티티에 RigidBody가 없는 경우)에 대한 코드 예시를 보여 주세요. [followup_answer] | ### localAnchorA와 localAnchorB 좌표계 `AddJoint` 메서드의 파라미터 이름이 `localAnchorA`, `localAnchorB`이며, `SetLocalAnchorA`, `SetLocalAnchorB` 메서드에도 동일한 이름이 사용되므로, 이 좌표들은 **로컬 좌표계(Local Coordinate System)**를 의미합니다. 즉, `localAnchorA`는 현재 엔티티(자신)의 로컬 좌표계 기준 앵커 위치, `localAnchorB`는 `targetEntity`(타겟 엔티티)의 로컬 좌표계 [scores] | [judge_reason] | [source_doc] | DistanceJoint를 생성, 삭제할 수 있습니다. 연결된 강체 간 거리를 일정하게 유지합니다. # Properties - **SyncList<DistanceJoint> Joints [Sync] [ReadOnly]** Joint 정보를 설정합니다. ##### inherited from Component: - **boolean Enable [Sync]** 컴포넌트 활성화 여부를 확인합니다. - **boolean EnableInHierarchy [ReadOnly] [HideFromInspector]** 계층 구조상
[task] | code [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent의 Spacing을 Vector2(10, 10)으로 설정하고 Padding을 RectOffset(5, 5, 5, 5)로 지정하여 그리드 레이아웃 간격을 조정하는 스크립트를 작성해줘 [answer] | GridViewComponent는 자식 UI Entity간의 간격을 `Spacing` 속성으로, 그리드뷰의 상하좌우 여유 공간을 `Padding` 속성으로 제어합니다. 요청하신 대로 `Spacing`을 `Vector2(10, 10)`으로, `Padding`을 `RectOffset(5, 5, 5, 5)`으로 설정하는 스크립트는 다음과 같습니다. 참고로 `GridViewComponent`는 자식 UI Entity를 직접 생성하지 않고, `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] | 자식 UI Entity가 생성될 때 OnRefresh 콜백이 호출되지 않는다면, 예제 코드와 비교했을 때 어떤 설정을 누락했을 가능성이 가장 높을까요? [answer] | 참고 문서의 예제를 분석하면, `GridViewComponent`에서 자식 UI Entity가 생성될 때 `OnRefresh` 콜백이 호출되지 않는 가장 큰 원인은 **`ItemEntity` 속성을 설정하지 않은 것**입니다. 문서에 제시된 정상 동작 예제를 보면, `OnBeginPlay` 메서드 내에서 다음과 같은 초기화 순서를 따릅니다. ```lua self.Inventory.ItemEntity = self.InventorySlot self.Inventory.OnRefresh = self.OnRefresh self.Inven [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] | code [pass] | ⏳ 미판정 [title] | LineRendererComponent [question] | LineRendererComponent의 ChangeMaterial 메서드를 호출하여 게임 시작 시 MaterialId를 "default_line"으로 설정하고, 5초 후 "_TimerService"를 이용해 머티리얼을 "highlight_line"으로 교체하는 스크립트를 작성해줘 [answer] | LineRendererComponent의 `MaterialId` 프로퍼티를 초기값으로 설정하고, `ChangeMaterial` 메서드를 호출하여 머티리얼을 교체하는 스크립트입니다. `_TimerService:SetTimerOnce`를 사용하여 5초 후 실행되도록 구성했습니다. ```lua Method: [server only] void OnBeginPlay() { -- 게임 시작 시 MaterialId를 "default_line"으로 설정 self.Entity.LineRendererComponent.MaterialI [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 선을 그리며, 선의 속성을 설정할 수 있는 기능을 제공합니다. # Properties - **float Flexibility [Sync]** 꺾이는 부분의 너비를 조절합니다. IsFlexible이 true일 때 적용됩니다. - **boolean IgnoreMapLayerCheck [Sync]** SortingLayer에 Map Layer 이름을 지정했을 때 자동 치환을 수행하지 않습니다. - **boolean IsFlexible [Sync]** 꺾이는 부분을 이어 그릴지 끊어 그릴지 설정합니다. - **boolean
[task] | code [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | PhysicsRigidbodyComponent의 GravityScale을 0으로 설정하여 중력의 영향을 받지 않도록 하는 스크립트를 작성해줘 [answer] | `PhysicsRigidbodyComponent`의 `GravityScale` 프로퍼티를 `0`으로 설정하면 엔티티가 중력의 영향을 받지 않게 됩니다. ```lua Property: [None] number TargetGravityScale = 0.0 Method: [server only] void OnBeginPlay () { -- 중력의 영향을 받지 않도록 GravityScale을 0으로 설정 self.Entity.PhysicsRigidbodyComponent.GravityScale = self.TargetGr [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 물리 엔진에 의해 제어됩니다. 물리 연산에 영향을 주는 값을 설정할 수 있습니다. # Properties - **float AngularDamping [Sync]** 각속도의 변화에 대한 저항 계수를 설정합니다. 값이 클수록 각속도 변화에 더 많은 힘이 필요합니다. 0 이상의 값만 설정할 수 있습니다. - **BodyType BodyType [Sync]** 강체 타입을 설정합니다. - **PhysicsCollisionDetectionMode CollisionDetectionMode [Sync]** 물리 충돌의
[task] | code [pass] | ⏳ 미판정 [title] | LineRendererComponent [question] | LineRendererComponent의 OrderInLayer와 SortingLayer 속성을 설정하여, 다른 엔티티와 겹칠 때 항상 가장 앞에 보이도록 우선순위를 지정하고 Enable을 활성화하는 스크립트를 작성해줘 [answer] | LineRendererComponent의 `OrderInLayer`와 `SortingLayer`를 설정하고 컴포넌트를 활성화하는 스크립트는 다음과 같습니다. `SortingLayer`는 다른 엔티티와의 겹침 시 우선순위를 결정하는 레이어 이름을 지정합니다. `OrderInLayer`는 같은 레이어 내에서 순서를 결정하며, 값이 클수록 앞으로 표시됩니다. ```lua Property: [Sync] string TargetSortingLayer = "MapLayer" [Sync] int32 TargetOrderInLayer = 10 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 선을 그리며, 선의 속성을 설정할 수 있는 기능을 제공합니다. # Properties - **float Flexibility [Sync]** 꺾이는 부분의 너비를 조절합니다. IsFlexible이 true일 때 적용됩니다. - **boolean IgnoreMapLayerCheck [Sync]** SortingLayer에 Map Layer 이름을 지정했을 때 자동 치환을 수행하지 않습니다. - **boolean IsFlexible [Sync]** 꺾이는 부분을 이어 그릴지 끊어 그릴지 설정합니다. - **boolean
[task] | code [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | PhysicsColliderComponent의 BoxSize를 5.0으로 설정하고 EnableContactEvent를 true로 변경하는 스크립트를 작성해줘 [answer] | PhysicsColliderComponent의 `BoxSize`는 `Vector2` 타입이며, `EnableContactEvent`는 `boolean` 타입입니다. `BoxSize`를 5.0으로 설정한다는 것은 일반적으로 `Vector2(5.0, 5.0)`으로 설정하는 것을 의미합니다. 요청하신 작업을 수행하는 스크립트는 다음과 같습니다. ```lua Property: [None] number TargetBoxSizeValue = 5.0 Method: [server] void OnBeginPlay() { local co [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] | code [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent의 SetScrollNormalizedPosition과 GetScrollNormalizedPosition을 사용하여 UI의 상단과 하단 사이를 오가며 스크롤 위치를 자동 변경하는 스크립트를 작성해줘 [answer] | `GridViewComponent`의 `SetScrollNormalizedPosition`과 `GetScrollNormalizedPosition`을 이용하여 스크롤 위치가 상단(0.0)과 하단(1.0) 사이를 오가도록 자동 변경하는 스크립트입니다. 이 스크립트는 `OnUpdate`에서 매 프레임마다 스크롤 진행도를 계산하여 방향을 반전시켜 스크롤바를 이동시킵니다. ```lua Property: [None] GridViewComponent GridView = nil [None] number ScrollSpeed = 0.5 [Non [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] | code [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | PhysicsRigidbodyComponent의 Friction 값을 0.1로 설정하여 엔티티가 잘 미끄러지도록 마찰 계수를 조정하는 스크립트를 작성해줘 [answer] | PhysicsRigidbodyComponent의 Friction 프로퍼티는 마찰 계수를 설정하며, 값이 작을수록 엔티티가 잘 미끄러집니다. 0.1로 설정하면 마찰이 매우 낮아져 미끄러운 물체의 특성을 가질 수 있습니다. 엔티티가 시작될 때 Friction 값을 0.1로 초기화하는 스크립트는 다음과 같습니다. ```lua Property: [None] number TargetFriction = 0.1 Method: [server only] void OnBeginPlay () { self.Entity.PhysicsRigid [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 물리 엔진에 의해 제어됩니다. 물리 연산에 영향을 주는 값을 설정할 수 있습니다. # Properties - **float AngularDamping [Sync]** 각속도의 변화에 대한 저항 계수를 설정합니다. 값이 클수록 각속도 변화에 더 많은 힘이 필요합니다. 0 이상의 값만 설정할 수 있습니다. - **BodyType BodyType [Sync]** 강체 타입을 설정합니다. - **PhysicsCollisionDetectionMode CollisionDetectionMode [Sync]** 물리 충돌의
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PrismaticJointComponent [question] | PrismaticJointComponent의 AddJoint 메서드에서 성공과 실패 시 각각 반환되는 값을 1줄로 나열하세요. [answer] | 성공 시 index, 실패 시 -1 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | PrismaticJoint를 생성, 삭제할 수 있습니다. 연결된 강체가 특정 축 방향으로만 상대적 이동하도록 제한할 수 있습니다. # Properties - **SyncList<PrismaticJoint> Joints [Sync] [ReadOnly]** Joint의 정보를 설정합니다. ##### inherited from Component: - **boolean Enable [Sync]** 컴포넌트 활성화 여부를 확인합니다. - **boolean EnableInHierarchy [ReadOnly] [HideFromIn
[task] | code [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | PhysicsContactEndEvent 가 발생했을 때 연결된 PhysicsRigidbodyComponent 의 상태를 확인하기 위해 GetAttachedPhysicsRigidbody() 을 호출하여 반환된 값을 로그로 남기는 스크립트를 작성해줘 [answer] | PhysicsColliderComponent의 `OnContactEnd` 이벤트 핸들러를 오버라이드하여 `PhysicsContactEndEvent`가 발생했을 때 동작하는 스크립트입니다. `self.Entity.PhysicsColliderComponent:GetAttachedPhysicsRigidbody()`을 호출해 연결된 강체 컴포넌트를 가져오고, `log` 함수로 반환된 값을 출력합니다. ```lua Event Handler: [self] HandlePhysicsContactEndEvent(PhysicsContactEndE [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] | PhysicsColliderComponent [question] | IsServer() 와 IsClient() 를 이용하여 현재 실행 환경이 서버인지 클라이언트인지에 따라 PhysicsColliderComponent 에 대한 로그 메시지를 다르게 출력하는 스크립트를 작성해줘 [answer] | `IsServer()`와 `IsClient()` 메서드를 사용하여 현재 실행 환경을 판별하고, 그에 따라 다른 로그 메시지를 출력하는 스크립트입니다. ```lua Method: void LogEnvironment() { if self.Entity.PhysicsColliderComponent:IsServer() then log("Current environment is Server") elseif self.Entity.PhysicsColliderComponent:IsClient() then [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **PhysicsRigidbodyComponent GetAttachedPhysicsRigidbody()** 연결된 PhysicsRigidbodyComponent를 반환합니다. - **void OnContactBegin(PhysicsContactBeginEvent beginEvent) [ScriptOverridable]** 두 물리 강체가 충돌을 시작할 때 호출됩니다. - **void OnContactEnd(PhysicsContactEndEvent endEvent) [ScriptOverridable]** 두 물리 강체의
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | AngularDamping과 LinearDamping의 차이점을 코드만 출력하고 설명은 주석으로 작성하여, 두 속성이 각각 어떤 속도 변화에 저항을 주는지를 비교하세요. [answer] | ```lua Property: [Sync] number AngularDamping = 0.5 [Sync] number LinearDamping = 0.5 Method: [server only] void OnBeginPlay () { -- AngularDamping: 각속도(Angular Velocity)의 변화에 대한 저항 계수입니다. -- 값이 클수록 물체가 회전하는 속도를 유지하거나 변화시키는 데 더 많은 힘이 필요합니다. -- 즉, 회전 운동에 대한 감쇠(Damping) 역할을 합니다. -- LinearDampin [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 물리 엔진에 의해 제어됩니다. 물리 연산에 영향을 주는 값을 설정할 수 있습니다. # Properties - **float AngularDamping [Sync]** 각속도의 변화에 대한 저항 계수를 설정합니다. 값이 클수록 각속도 변화에 더 많은 힘이 필요합니다. 0 이상의 값만 설정할 수 있습니다. - **BodyType BodyType [Sync]** 강체 타입을 설정합니다. - **PhysicsCollisionDetectionMode CollisionDetectionMode [Sync]** 물리 충돌의
[task] | code [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | PhysicsColliderComponent의 CollisionGroup을 Player 그룹으로 설정하여 특정 객체와만 충돌하도록 하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `CollisionGroup` 프로퍼티가 존재하고 "충돌 여부를 결정할 수 있는 충돌 그룹을 설정합니다"라고만 기술되어 있습니다. 그러나 **`CollisionGroup`의 구체적인 열거형 값(예: `Player`, `Monster`, `Default` 등)이나 상수 정의가 문서에 포함되어 있지 않습니다.** 또한, 다른 엔티티의 `CollisionGroup`을 읽거나 비교하기 위한 메서드도 문서에 명시되어 있지 않습니다. 따라서 문서에 없는 API나 상수 값을 지어내지 않기 위해, **"Player"라는 [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] | two_turn [pass] | ⏳ 미판정 [title] | GridViewComponent [question] | GridViewComponent에서 화면에 보이는 UI Entity만 생성하고 재사용하는 최적화 방식에서 OnRefresh 콜백은 언제 호출되며 어떤 인자가 전달되나요? [answer] | GridViewComponent는 화면에 보이는 UI Entity만 생성하고 재사용하는 최적화 방식을 사용합니다. 이 과정에서 `OnRefresh` 콜백은 자식 UI Entity가 **재사용될 때** 호출됩니다. 콜백에 전달되는 인자는 다음과 같습니다. 1. `number index`: 재사용되는 자식 UI Entity의 인덱스 2. `Entity entity`: 재사용되는 자식 UI Entity 자체 아래는 `OnRefresh` 콜백을 설정하고 사용하는 mLua 스크립트 예시입니다. ```lua Property: [None [followup] | OnRefresh 콜백 안에서 전달받은 인덱스(index)와 Entity를 사용해 자식 UI의 텍스트나 아이콘을 동적으로 변경하는 mLua 코드 예시를 작성해 주세요. [followup_answer] | `OnRefresh` 콜백에서 전달받은 `index`와 `entity`를 활용하여 자식 UI의 텍스트와 아이콘을 동적으로 변경하는 mLua 코드 예시는 다음과 같습니다. ```lua Property: [None] GridViewComponent Inventory = nil [None] Entity InventorySlot = nil Method: [client only] void OnBeginPlay () { -- ItemEntity에 복제될 원본 슬롯 엔티티를 설정 self.Inventory.ItemEntity = self [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] | PhysicsRigidbodyComponent [question] | Sleep()으로 강체를 수면 상태로 만든 후 Wake()를 호출하지 않으면 물리 시뮬레이션이 완전히 멈추는 건가요? [answer] | 제공된 문서에 `Sleep()`과 `Wake()`의 정확한 동작 원리나 물리 시뮬레이션이 완전히 멈추는지 여부에 대한 기술적 설명은 포함되어 있지 않습니다. 문서에는 아래 두 가지 기능만 정의되어 있습니다: - `void Sleep()`: 강체를 수면 상태로 전환합니다. - `void Wake()`: 강체를 깨어 있는 상태로 전환합니다. 따라서 `Wake()`를 호출하지 않았을 때의 구체적인 물리 엔진 내부 동작(시뮬레이션 정지 여부 등)에 대해서는 확답할 수 없습니다. [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] | PhysicsSimulatorComponent [question] | SetPositionIteration과 SetVelocityIteration 메서드의 최소값, 최대값, 적용 실행 공간을 3문장 이내로 비교 설명하세요. [answer] | `SetPositionIteration`은 위치 연산 반복 횟수를 1부터 300까지 설정할 수 있으며, `SetVelocityIteration`은 속도 연산 반복 횟수를 1부터 30까지 설정할 수 있습니다. 두 메서드 모두 서버에서는 적용되지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 맵에 물리 법칙을 적용합니다. 물리 연산과 관련된 설정을 조절할 수 있습니다. # Properties - **Vector2 Gravity [Sync]** 물리 연산의 중력 값을 설정합니다. - **boolean Paused [Sync]** 물리 연산의 일시정지 여부를 설정합니다. - **Vector2 WorldBounds [Sync] [ReadOnly]** 물리 연산 범위를 설정합니다. 엔티티가 범위를 벗어나면 물리 연산을 하지 않습니다. 예를 들어, 값을 (100, 100)으로 설정하면 원점(0, 0)을 중심으로 가
[task] | code [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | PhysicsRigidbodyComponent의 Restitution 값을 0.8로 초기화하여 충돌 시 일정하게 튀어 오르는 효과를 적용하는 스크립트를 작성해줘 [answer] | `PhysicsRigidbodyComponent`의 `Restitution` 프로퍼티는 충돌 후 튀어 오르는 정도를 결정하며, 0.8은 1(완전 탄성 충돌)에 가깝지만 완전 반발은 아닌 중간 수준의 탄성을 의미합니다. 이 값을 초기화하여 적용하는 스크립트는 엔티티의 시작 시점(`OnBeginPlay`)에 프로퍼티 값을 직접 설정하는 방식으로 작성할 수 있습니다. 아래는 `Restitution`을 0.8로 설정하는 mLua 스크립트 예제입니다. ```lua Method: [server only] void OnBeginPlay () [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 물리 엔진에 의해 제어됩니다. 물리 연산에 영향을 주는 값을 설정할 수 있습니다. # Properties - **float AngularDamping [Sync]** 각속도의 변화에 대한 저항 계수를 설정합니다. 값이 클수록 각속도 변화에 더 많은 힘이 필요합니다. 0 이상의 값만 설정할 수 있습니다. - **BodyType BodyType [Sync]** 강체 타입을 설정합니다. - **PhysicsCollisionDetectionMode CollisionDetectionMode [Sync]** 물리 충돌의
[task] | single_turn [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | ClearPhysicsOwnership과 SetClientAsPhysicsOwner를 사용했을 때 Contact Event 발생 위치가 어떻게 달라지나요? [answer] | `ClearPhysicsOwnership`과 `SetClientAsPhysicsOwner`를 사용할 때 Contact Event(물리 충돌 이벤트)가 발생하는 위치는 다음과 같이 달라집니다. 1. **`ClearPhysicsOwnership()` 사용 시** - 물리 소유권이 자동으로 부여됩니다. - Contact Event는 **Server(서버)**에서만 발생합니다. 2. **`SetClientAsPhysicsOwner(string userId)` 사용 시** - 물리 소유권이 특정 유저(클라이언트)에게 부여 [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] | code [pass] | ⏳ 미판정 [title] | LineRendererComponent [question] | LineRendererComponent의 Loop를 true로 설정하고 Points에 360도 간격의 정점을 추가하여 반지름 10인 원형 경로를 그리는 스크립트를 작성해줘 [answer] | LineRendererComponent의 `Loop` 속성을 `true`로 설정하면 시작점과 끝점이 자동으로 이어져 닫힌 선을 형성합니다. 반지름 10인 원을 그리기 위해 원의 중심을 기준으로 360도를 균등하게 나누는 각도로 정점(`LinePoint`)을 계산하여 `Points` 목록에 추가해야 합니다. 아래 스크립트는 `OnBeginPlay()` 시점에 반지름 10인 원형 경로를 그리는 예제입니다. ```lua Property: [None] number Radius = 10 [None] integer VertexCount = [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 선을 그리며, 선의 속성을 설정할 수 있는 기능을 제공합니다. # Properties - **float Flexibility [Sync]** 꺾이는 부분의 너비를 조절합니다. IsFlexible이 true일 때 적용됩니다. - **boolean IgnoreMapLayerCheck [Sync]** SortingLayer에 Map Layer 이름을 지정했을 때 자동 치환을 수행하지 않습니다. - **boolean IsFlexible [Sync]** 꺾이는 부분을 이어 그릴지 끊어 그릴지 설정합니다. - **boolean
[task] | code [pass] | ⏳ 미판정 [title] | PhysicsColliderComponent [question] | OnBeginPlay 에서 PhysicsRigidbodyComponent 의 Sleep() 을 호출한 후, InputService 의 KeyDownEvent 를 통해 특정 키 입력 시 PhysicsColliderComponent 의 CollisionGroup 을 Monster 로 변경하는 스크립트를 작성해줘 [answer] | 요청하신 기능은 `OnBeginPlay`에서 물리 강체를 잠자는 상태로 만들고, `P` 키 입력 시 `CollisionGroup`을 `Monster`로 변경하는 스크립트입니다. 참고 문서에 따르면, `SleepingMode`를 `NeverSleep`으로 설정해야 `Sleep()` 호출 후에도 물리 시뮬레이션이 완전히 비활성화되지 않고 충돌 그룹 변경 등의 로직이 정상적으로 처리될 수 있습니다. 아래는 mLua 형식으로 작성된 스크립트입니다. ```lua Method: [server only] void OnBeginPlay () [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **PhysicsRigidbodyComponent GetAttachedPhysicsRigidbody()** 연결된 PhysicsRigidbodyComponent를 반환합니다. - **void OnContactBegin(PhysicsContactBeginEvent beginEvent) [ScriptOverridable]** 두 물리 강체가 충돌을 시작할 때 호출됩니다. - **void OnContactEnd(PhysicsContactEndEvent endEvent) [ScriptOverridable]** 두 물리 강체의
[task] | instruction_following [pass] | ⏳ 미판정 [title] | PrismaticJointComponent [question] | SetMotorSpeed, SetUpperTranslation, SetLowerTranslation 메서드의 파라미터 이름을 표로 정리하세요. [answer] | PrismaticJointComponent의 해당 메서드 파라미터 정보는 다음과 같습니다. | 메서드명 | 파라미터 이름 | 타입 | | :--- | :--- | :--- | | `SetMotorSpeed` | `index` | `int32` | | `SetMotorSpeed` | `speed` | `float` | | `SetUpperTranslation` | `index` | `int32` | | `SetUpperTranslation` | `upperTranslation` | `float` | | `SetLowerTransla [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | PrismaticJoint를 생성, 삭제할 수 있습니다. 연결된 강체가 특정 축 방향으로만 상대적 이동하도록 제한할 수 있습니다. # Properties - **SyncList<PrismaticJoint> Joints [Sync] [ReadOnly]** Joint의 정보를 설정합니다. ##### inherited from Component: - **boolean Enable [Sync]** 컴포넌트 활성화 여부를 확인합니다. - **boolean EnableInHierarchy [ReadOnly] [HideFromIn
[task] | single_turn [pass] | ⏳ 미판정 [title] | PhysicsRigidbodyComponent [question] | HandlePhysicsContactBeginEvent 이벤트는 서버와 클라이언트 양쪽에서 동시에 실행되나요? [answer] | 네, `HandlePhysicsContactBeginEvent` 이벤트는 서버와 클라이언트 양쪽에서 동시에 실행됩니다. 이벤트 핸들러의 메타데이터에 실행 공간(Space)이 `Server, Client`로 명시되어 있어, 물리 접촉 시작 시 서버와 클라이언트 모두 해당 이벤트가 트리거됩니다. [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