[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `IsJumpKeyPressed`가 `KeyboardKey.LeftAlt` 또는 `KeyboardKey.Space`를 눌렀을 때 `false`로 초기화되는 로직은 왜 필요한가요? [answer] | `IsJumpKeyPressed`가 `KeyboardKey.LeftAlt` 또는 `KeyboardKey.Space` 키를 눌렀을 때 `false`로 초기화되는 로직은 **점프 입력의 중복 처리 방지 및 상태 정합성 유지**를 위해 필요합니다. 구체적인 이유는 다음과 같습니다: 1. **입력 상태의 명확한 초기화**: `IsJumpKeyPressed`는 현재 점프 동작이 실행되었는지, 혹은 점프 입력을 기다리고 있는지를 나타내는 플래그로 사용됩니다. 점프 키(Space 또는 LeftAlt)가 눌리는 순간(`HandleKeyDow [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | OnUpdate 함수에서 PlayerControllerComponent의 MoveVelocity를 매 프레임마다 0.95배로 감소시켜 마찰력을 구현하는 스크립트를 작성해줘 [answer] | 사용자가 요청한 마찰력(0.95배 감소) 구현을 위해 `OnUpdate`에서 `PlayerControllerComponent`의 `MoveVelocity`를 수정하는 스크립트를 작성합니다. 참고 문서에서 `OnBeginPlay`에서 `PlayerControllerComponent`를 비활성화하는 예시가 있었으나, `MoveVelocity`를 직접 조작하여 이동 제어를 하려면 컴포넌트가 활성화된 상태여야 합니다(또는 `MoveVelocity` 속성이 비활성화 상태에서도 적용될 수 있는 경우). 일반적인 mLua 패턴에서는 `Move [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideviewbodyComponent의 MoveVelocity를 조작하여 착지 시 Y축 속도가 0보다 큰 상태가 유지되도록 하여 캐릭터가 미끄러지지 않도록 방지하는 스크립트를 작성해줘 [answer] | SideViewRectTileMap에서 캐릭터의 이동 속도는 `SideviewbodyComponent`의 `MoveVelocity` 프로퍼티를 통해 제어할 수 있습니다. 착지 후에도 Y축 속도가 0보다 큰 값(양수)으로 유지되면 캐릭터가 바닥에 닿았음에도 불구하고 공중에 떠 있는 것처럼 인식되어 미끄러짐(또는 비정상적인 점프) 현상이 발생할 수 있습니다. 이를 방지하기 위해 캐릭터가 착지(`IsOnGround()`가 true)하는 시점에 `MoveVelocity`의 Y축 값을 0으로 초기화하는 로직을 적용해야 합니다. 아래는 `D [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 캐릭터의 이동은 `MoveVelocity`를 통해 제어합니다. `MoveVelocity`를 통해 간단한 2단 점프 기능을 만들어봅시다. 1. MyDesk 아래에 새 스크립트 컴포넌트 DoubleJump를 만든 뒤, DefaultPlayer에 추가합니다. 2. 아래와 같이 DoubleJump에 `IsDoubleJumping` 프로퍼티와 `TryDoubleJump` 함수를 추가합니다. ```lua Property: [None] boolean IsDoubleJumping = false
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | IsCrouchKeyPressed와 IsJumpKeyPressed가 동시에 true인 상태에서 지면에 있을 때, UpdateAction 함수는 어떤 순서로 액션을 처리하며 ActionDownJump가 실행되나요? [answer] | `UpdateAction` 함수의 코드를 분석하면, 지면에 있을 때(`body:IsOnGround()`가 true) `IsCrouchKeyPressed`와 `IsJumpKeyPressed`가 동시에 true인 경우 처리 순서는 다음과 같습니다. 1. **엎드리기(Crouch) 처리:** * 먼저 `if self.IsCrouchKeyPressed and body:IsOnGround() then` 조건을 검사합니다. * 두 조건 모두 만족하므로 `controller:ActionCrouch()`가 실행됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 유저의 키 입력이 없을 때는 감속하고 키 입력이 있을 때는 가속하도록 설정해봅시다. 아래와 같이 `UpdateVelocity` 함수와 `SignOf` 함수를 추가합니다. ```lua number SignOf(number value) { if value >= 0 then return 1 else return -1 end } void UpdateVelocity(number delta)
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | RevoluteJoint의 회전 제한 관련 프로퍼티 4개를 표로 정리하고, 각 프로퍼티의 역할과 기준을 한 줄로 설명하세요. [answer] | RevoluteJoint의 회전 제한에 사용되는 4가지 프로퍼티는 다음과 같습니다. | 프로퍼티 | 역할과 기준 설명 | | :--- | :--- | | **UseLimits** | Entity의 Local Vector2(1, 0)을 기준으로 한 상대적 각도 제한을 적용할지 여부를 결정합니다. | | **LowerAngle** | Entity의 Local Vector2(1, 0)을 기준으로 한 최소 상대 각도를 설정합니다. | | **UpperAngle** | Entity의 Local Vector2(1, 0)을 기준으로 한 최대 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | RevoluteJoint는 엔티티의 회전과 관련된 제한을 설정합니다. UseLimits를 활성화한 후, LowerAngle, UpperAngle를 활용해 회전 각도를 제한할 수 있습니다. 엔티티가 회전할 때는 LocalAnchorA와 B가 만나는 지점을 공통의 Anchor로 사용합니다. 또한 Motor를 사용하면 Anchor를 기준으로 회전하는 힘을 받을 수 있습니다. | 주요 프로퍼티 | 설명 | | --- | --- | |**UseLimits** | 상대적 각도에 제한을 설정할지 여부를 결정합니다. | |**LowerAn
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | WheelJoint의 주요 프로퍼티 3가지를 표로 정리하여 설명하시오. [answer] | WheelJoint의 주요 프로퍼티 3가지는 다음과 같습니다. | 프로퍼티 | 설명 | | :--- | :--- | | **MaxMotorTorque** | 목표 모터 속도에 도달하기 위한 Joint의 모터에 적용할 수 있는 최대 힘을 설정합니다. | | **MotorEnable** | Motor를 사용할지 여부를 설정합니다. True일 경우 연결된 Entity가 LocalAxis 방향의 힘을 받습니다. | | **MotorSpeed** | Joint의 목표 모터 속도를 설정합니다. MotorEnable이 True여야 동작합니다. [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의 MoveVelocity.y가 0보다 클 때(상승 중)와 0보다 작을 때(하강 중) 각각 다른 값으로 MoveVelocity.y를 수정하여 점프의 상승/하강 속도를 조절하는 스크립트를 작성해줘 [answer] | SideViewRectTileMap에서 캐릭터의 점프 속도를 조절하기 위해서는 `SideviewbodyComponent`의 `MoveVelocity`를 `OnUpdate` 주기적으로 확인하고 수정해야 합니다. `MoveVelocity.y` 값이 0보다 크면 상승 중, 0보다 작으면 하강 중으로 판단하여 각각 다른 속도를 적용하는 로직을 구현합니다. 아래는 상승 속도와 하강 속도를 각각 조절할 수 있는 `JumpControl` 스크립트입니다. ```lua Property: [None] number AscendSpeed = 10.0 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 캐릭터의 이동은 `MoveVelocity`를 통해 제어합니다. `MoveVelocity`를 통해 간단한 2단 점프 기능을 만들어봅시다. 1. MyDesk 아래에 새 스크립트 컴포넌트 DoubleJump를 만든 뒤, DefaultPlayer에 추가합니다. 2. 아래와 같이 DoubleJump에 `IsDoubleJumping` 프로퍼티와 `TryDoubleJump` 함수를 추가합니다. ```lua Property: [None] boolean IsDoubleJumping = false
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | InputService의 KeyDownEvent를 통해 Space 키 입력 시 SideviewbodyComponent의 JumpSpeed를 기반으로 MoveVelocity.y를 설정하고, 착지 후 0.5초 이내에 다시 점프할 수 없도록 TimerService:SetTimerOnce를 사용하여 입력을 무시하는 스크립트를 작성해줘 [answer] | 요청하신 기능을 구현하기 위한 스크립트 컴포넌트입니다. 1. **Property**: * `IsJumping`: 현재 점프 상태(공중)를 관리합니다. * `CanJump`: 착지 후 0.5초 쿨다운이 끝났을 때 `true`가 되어 다시 점프를 허용합니다. 2. **Method**: * `TryJump`: `CanJump`가 `true`이고, 캐릭터가 공중에 있을 때(`IsOnGround()`가 `false`) `SideviewbodyComponent`의 `MoveVelocity.y`를 `Jump [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 캐릭터의 이동은 `MoveVelocity`를 통해 제어합니다. `MoveVelocity`를 통해 간단한 2단 점프 기능을 만들어봅시다. 1. MyDesk 아래에 새 스크립트 컴포넌트 DoubleJump를 만든 뒤, DefaultPlayer에 추가합니다. 2. 아래와 같이 DoubleJump에 `IsDoubleJumping` 프로퍼티와 `TryDoubleJump` 함수를 추가합니다. ```lua Property: [None] boolean IsDoubleJumping = false
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | JointComponent를 엔티티에 추가하는 과정을 단계별 번호 목록으로 작성하시오. [answer] | JointComponent를 엔티티에 추가하는 과정은 다음과 같습니다. 1. `PhysicsRigidbodyComponent`와 `PhysicsColliderComponent`를 추가한 엔티티를 두 개 생성하고 배치합니다. 2. 사용할 `JointComponent`를 추가합니다. 3. 추가한 `JointComponent`의 **Size** 프로퍼티에 생성할 Joint의 개수를 입력합니다. 4. **TargetEntityRef**로 사용할 엔티티를 선택합니다. 5. `LocalAnchor A`와 `LocalAnchor B`의 위치를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WheelJoint는 연결된 엔티티가 바퀴처럼 동작하도록 제한을 설정합니다. Motor를 사용한 TargetEntityRef는 MotorSpeed 값을 목표 속도로 사용합니다. | 주요 프로퍼티 | 설명 | | --- | --- | | **MaxMotorTorque** | 목표 모터 속도에 도달하기 위한 Joint의 모터에 적용할 수 있는 최대 힘을 설정합니다. | | **MotorEnable** | Motor를 사용할지 여부를 설정합니다. True일 경우 연결된 Entity가 LocalAxis 방향의 힘을 받습니다. | | *
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | DistanceJointComponent에서 Length 값을 변경하면 두 엔티티 사이의 거리가 즉시 어떻게 반응하는지 궁금합니다. [answer] | 제공된 참고 문서에는 `DistanceJointComponent`의 `Length` 프로퍼티가 "Joint로 연결된 두 Entity가 유지할 거리를 설정한다"고만 설명되어 있습니다. 문서에는 `Length` 값을 변경했을 때 두 엔티티 사이의 거리가 **즉시** 어떻게 반응하는지(예: 순간이동, 점프, 부드러운 보간 등)에 대한 구체적인 동작 방식이나 반응 속도 관련 설명이 없습니다. 따라서 제공된 문서 정보만으로는 이 질문에 대한 정확한 답변이 불가능합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리를 사용하는 맵에서 특정 엔티티끼리의 운동 방식을 설정하는 방법을 알아봅시다. 다양한 JointComponent를 활용해 다양한 운동을 하는 엔티티를 만들어 월드 제작에 활용할 수 있습니다. # Joint Joint란 물리 법칙을 적용한 맵에서 특정 엔티티끼리만 연결해 서로 영향을 주고받을 수 있게 만드는 특정 연결부를 의미합니다. 아래의 그림과 같이 Entity A와 Entity B가 서로 영향을 주고받을 수 있도록 하는 연결부가 바로 Joint입니다. 기준 엔티티인 Entity A에 Joint 연결
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideviewbodyComponent:GetUnderfootTile()에서 가져온 타일의 Name이 대소문자 구분 없이 "ice"로 입력된 경우에도 얼음 효과가 적용되나요? [answer] | 네, 적용됩니다. 문서에 제시된 `OnUpdate` 함수의 코드를 보면, `underfootTile.Name == "Ice"`라는 조건을 사용하고 있습니다. mLua는 Lua 5.3 기반이며, Lua의 문자열 비교 연산자(`==`)는 기본적으로 대소문자를 구분합니다. 즉, `"Ice"`와 `"ice"`는 다른 문자열로 취급됩니다. 따라서, 타일의 `Name` 속성이 정확히 `"Ice"`인 경우에만 `if underfootTile.Name == "Ice" then` 조건이 참이 되어 얼음 효과(`customController.Dr [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] | 엔티티에 PhysicsRigidbodyComponent와 PhysicsColliderComponent를 추가하여 물리 타입을 Static, Dynamic, Kinematic 중 하나로 설정하고 싶을 때, 각 타입별 특성(질량, 속도 지정 가능 여부, 충돌 대상)에 따라 어떤 상황에 적합한지 코드 없이 개념적으로 비교해 주세요. [answer] | 메이플스토리 월드에서 엔티티에 `PhysicsRigidbodyComponent`와 `PhysicsColliderComponent`를 추가하여 설정할 수 있는 세 가지 물리 타입(Static, Dynamic, Kinematic)은 질량, 속도 제어 방식, 충돌 대상에 따라 명확한 차이가 있습니다. 각 타입의 특성과 적합한 사용 상황을 비교하면 다음과 같습니다. ### 1. Static (정적) * **질량:** 무한히 큰 것으로 취급됩니다. * **속도 지정:** 직접적인 속도 지정을 통한 이동이 불가능합니다. * **충 [followup] | Dynamic 타입 엔티티가 Kinematic 타입 엔티티와 충돌할 때 물리 법칙에 따라 어떤 동작을 보이는지 구체적인 시나리오를 통해 설명해 주세요. [followup_answer] | 제시된 참고 문서에는 Dynamic 타입과 Kinematic 타입 엔티티가 충돌했을 때 발생하는 **구체적인 물리 반응(예: Dynamic 엔티티가 튕겨 나가는지, Kinematic 엔티티가 멈추는지 등)에 대한 명시적인 설명이 없습니다.** 문서에서 확인할 수 있는 사실은 다음과 같습니다. 1. **Dynamic 타입:** "엔티티가 물리 법칙에 따라 동작"하며, "물리 충돌이 가능한 다른 Entity와 충돌할 수 있다"고만 정의되어 있습니다. 2. **Kinematic 타입:** "질량이 무한히 큰 엔티티로 취급"되며, [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | UpdateVelocity 함수에서 감속 로직 처리 시, vel.x의 부호가 바뀌는 순간을 확인하는 SignOf(vel.x) ~= sign 조건문의 정확한 역할은 무엇인가요? [answer] | `UpdateVelocity` 함수의 감속 로직에서 `self:SignOf(vel.x) ~= sign` 조건문의 역할은 **속도가 0을 넘어서 반대 방향으로 바뀌는 것(과충격)을 방지하고, 정확히 0에서 멈추도록 하는 것**입니다. 구체적인 동작 원리는 다음과 같습니다. 1. **초기 부호 저장 (`local sign = self:SignOf(vel.x)`)**: * 감속 시작 시점의 `vel.x` 부호를 `sign` 변수에 저장합니다. * 예: 오른쪽으로 이동 중 감속 시작 시 `vel.x`가 양수이므로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 유저의 키 입력이 없을 때는 감속하고 키 입력이 있을 때는 가속하도록 설정해봅시다. 아래와 같이 `UpdateVelocity` 함수와 `SignOf` 함수를 추가합니다. ```lua number SignOf(number value) { if value >= 0 then return 1 else return -1 end } void UpdateVelocity(number delta)
[task] | two_turn [pass] | ⏳ 미판정 [title] | SideViewRectTile모드로 맵 만들기 [question] | SideViewRectTile 모드로 맵을 만들 때, 기존 RectTileMap과 어떤 점이 다르고 어떤 컴포넌트를 활용해야 하는지 알려주세요. [answer] | SideViewRectTile 모드는 기존 RectTileMap 모드와 비교할 때, 횡스크롤 게임 제작에 특화된 기능들을 제공합니다. RectTileMapComponent와 KinematicbodyComponent는 탑다운뷰 게임에는 적합하지만, 횡스크롤 방식의 이동, 점프, 타일과의 충돌 처리에는 적합하지 않습니다. 반면, SideViewRectTile 모드는 이러한 횡스크롤 특화 기능을 직접 지원하므로, 별도의 복잡한 충돌 로직 구현 없이도 손쉽게 횡스크롤 게임을 제작할 수 있습니다. **RectTileMap과 SideView [followup] | 타일 모드를 SideViewRectTile로 전환하는 두 가지 방법(Hierarchy 우클릭, 상단 메뉴 길게 누르기)과 전환 후 Scene 화면의 변화가 어떻게 보이는지 구체적으로 설명해주세요. [followup_answer] | 타일 모드를 SideViewRectTile로 전환하는 방법은 두 가지가 있습니다. 첫 번째 방법은 Hierarchy 뷰에서 현재 편집 중인 맵 엔티티를 선택한 뒤, 우클릭 메뉴에서 **Switch To SideViewRectTileMap**을 선택하는 것입니다. 두 번째 방법은 상단 메뉴의 타일 에디터 버튼을 길게 눌러 타일 모드 선택 메뉴를 연 뒤, **SideViewRectTile**을 선택하는 것입니다. SideViewRectTile 모드를 선택하면 Scene 화면이 횡스크롤 게임 제작에 적합한 형태로 변경됩니다. 구체적 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 RectTileMapComponent와 KinematicbodyComponent는 탑다운뷰 게임 제작에는 적합하지만 횡스크롤 게임 제작에는 적합하지 않습니다. SideViewRectTile 모드는 RectTileMap을 활용해 손쉽게 횡스크롤 게임을 제작할 수 있도록 횡스크롤 방식의 이동, 점프, 타일과의 충돌 등을 지원합니다. 이번 시간에는 SideViewRectTile 모드에 대해 알아보고 맵을 제작해봅시다. > **더 알아보기** > SideViewRectTile 모드는 RectTile 모드를 기반으로
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | UpdateLookDirection에서 PlayerControllerComponent의 LookDirectionX 값을 -1과 1로만 설정하는 이유는 무엇이며, 다른 값은 사용할 수 없나요? [answer] | 제시된 문서의 `UpdateLookDirection` 함수 코드와 주석에 따르면, `LookDirectionX` 값이 `-1`과 `1`로만 설정되는 이유는 **2D 사이드뷰(좌우 이동) 환경에서 캐릭터의 시선(바라보는 방향)은 오직 왼쪽과 오른쪽 두 가지 상태만 존재하기 때문**입니다. * **`-1`**: 캐릭터가 **왼쪽**을 바라보는 경우 * **`1`**: 캐릭터가 **오른쪽**을 바라보는 경우 코드의 주석(`-- 왼쪽을 바라봅니다.`, `-- 오른쪽을 바라봅니다.`)에서도 이를 명확히 확인할 수 있습니다. ** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 11. 캐릭터의 애니메이션을 제어하는 `UpdateAnimationState` 함수도 추가합니다. ```lua void UpdateAnimationState() { local body = self.Entity.SideviewbodyComponent local state = self.Entity.StateComponent if body:IsOnGround() then if self.InputDirection.x ~= 0 then
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | JointComponent를 추가했을 때 TargetEntityRef가 지정되지 않으면 어떤 오류가 발생하거나 동작하지 않는 원인이 무엇인가요? [answer] | 제공된 참고 문서에는 `TargetEntityRef`가 지정되지 않았을 때 발생하는 구체적인 오류 메시지나 기술적인 실패 원인이 설명되어 있지 않습니다. 문서에는 `TargetEntityRef`가 "Joint를 연결할 Entity"이며, `Entity A`의 `JointComponent`에서 `Entity B`를 지정하는 프로퍼티로 정의되어 있을 뿐, 값이 비어 있을 경우의 동작이나 에러 처리 방식에 대한 정보는 포함되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리를 사용하는 맵에서 특정 엔티티끼리의 운동 방식을 설정하는 방법을 알아봅시다. 다양한 JointComponent를 활용해 다양한 운동을 하는 엔티티를 만들어 월드 제작에 활용할 수 있습니다. # Joint Joint란 물리 법칙을 적용한 맵에서 특정 엔티티끼리만 연결해 서로 영향을 주고받을 수 있게 만드는 특정 연결부를 의미합니다. 아래의 그림과 같이 Entity A와 Entity B가 서로 영향을 주고받을 수 있도록 하는 연결부가 바로 Joint입니다. 기준 엔티티인 Entity A에 Joint 연결
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideviewbodyComponent의 IsOnGround() 상태를 확인하여 공중 상태일 때만 MoveVelocity의 X축 값에 가속도를 누적하고, 착지 시에는 X축 속도를 즉시 0으로 초기화하여 정지할 수 있게 하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `SideviewbodyComponent`의 `IsOnGround()` 메서드, `MoveVelocity` 프로퍼티, 그리고 `JumpSpeed` 프로퍼티에 대한 사용 예시만 포함되어 있습니다. 문서에 따르면, `MoveVelocity`를 직접 수정하여 캐릭터의 이동 상태를 제어할 수 있으며, `IsOnGround()`를 통해 착지 여부를 확인할 수 있습니다. 하지만 요청하신 "X축 가속도 누적" 로직에 필요한 **가속도(Acceleration) 값**, **마찰력(Friction) 값**, 또는 **최대 속 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 캐릭터의 이동은 `MoveVelocity`를 통해 제어합니다. `MoveVelocity`를 통해 간단한 2단 점프 기능을 만들어봅시다. 1. MyDesk 아래에 새 스크립트 컴포넌트 DoubleJump를 만든 뒤, DefaultPlayer에 추가합니다. 2. 아래와 같이 DoubleJump에 `IsDoubleJumping` 프로퍼티와 `TryDoubleJump` 함수를 추가합니다. ```lua Property: [None] boolean IsDoubleJumping = false
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `SideviewbodyComponent`의 `IsOnGround()` 메서드를 사용해 지면 상태를 확인하지 않고 항상 동일한 가속도를 적용하면 어떤 조작상의 문제가 발생하나요? [answer] | `SideviewbodyComponent`의 `IsOnGround()` 메서드를 사용해 지면과 공중 상태를 구분하지 않고 항상 동일한 가속도를 적용하면, 캐릭터의 이동 조작감에 다음과 같은 문제가 발생합니다. **1. 공중 조작의 반응성 저하 (또는 과도한 반응)** 일반적으로 캐릭터는 지면에 있을 때보다 공중에 있을 때 더 낮은 가속도(`AirAccel`)를 적용받습니다. 이는 캐릭터가 공중에 떠 있는 동안 방향 전환이나 속도 변경이 즉각적으로 이루어지지 않도록 하여, 물리적 관성감과 자연스러운 아크(궤적)를 만들어 주기 위함입 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | LocalAnchor A와 B의 값이 동일해도 엔티티의 ColliderOffset이 다르면 Joint 연결 위치가 왜 달라지는지 설명해 주세요. [answer] | Joint의 연결 위치(LocalAnchor)는 절대 좌표가 아니라, 각 엔티티 자체를 기준으로 한 **상대적 오프셋**으로 설정됩니다. 문서에 따르면 Anchor의 위치는 해당 엔티티의 `PhysicsColliderComponent`에 있는 `ColliderOffset`을 원점(0,0)으로 삼아 계산됩니다. 즉, `LocalAnchorA`는 Entity A의 `ColliderOffset`을 기준으로 한 위치이고, `LocalAnchorB`는 Entity B의 `ColliderOffset`을 기준으로 한 위치입니다. 따라서 두 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리를 사용하는 맵에서 특정 엔티티끼리의 운동 방식을 설정하는 방법을 알아봅시다. 다양한 JointComponent를 활용해 다양한 운동을 하는 엔티티를 만들어 월드 제작에 활용할 수 있습니다. # Joint Joint란 물리 법칙을 적용한 맵에서 특정 엔티티끼리만 연결해 서로 영향을 주고받을 수 있게 만드는 특정 연결부를 의미합니다. 아래의 그림과 같이 Entity A와 Entity B가 서로 영향을 주고받을 수 있도록 하는 연결부가 바로 Joint입니다. 기준 엔티티인 Entity A에 Joint 연결
[task] | two_turn [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | RevoluteJointComponent의 Joint, TargetEntityRef, LocalAnchorB, LowerAngle, UpperAngle, MotorSpeed, UseLimits 속성은 각각 어떤 물리 동작을 제어하나요? [answer] | 제공된 문서에는 `RevoluteJointComponent`의 각 속성이 구체적으로 어떤 물리 동작을 제어하는지에 대한 설명이 포함되어 있지 않습니다. 문서에는 `Joint`에 1을 입력하고, `TargetEntityRef`에 LeftBar를 지정하며, `LocalAnchorB`, `LowerAngle`, `UpperAngle`, `MotorSpeed`, `UseLimits` 값을 특정 값으로 설정하라는 **설정 지침**만 나와 있을 뿐, 각 속성의 정의나 물리적 의미를 설명하는 내용은 없습니다. 따라서 주어진 참고 문서의 범위 [followup] | LocalAnchorB와 Joint 값이 1로 설정된 상황에서 TargetEntityRef 지정 시 발생할 수 있는 회전축 오정렬 예외 상황과 해결 코드는 무엇인가요? [followup_answer] | 제공된 참고 문서에는 `LocalAnchorB`, `Joint` 값이 1로 설정된 상황에서 `TargetEntityRef` 지정 시 발생할 수 있는 "회전축 오정렬 예외 상황"이나 그 해결을 위한 코드에 대한 정보가 포함되어 있지 않습니다. 문서에는 해당 속성들의 값을 특정 값으로 설정하라는 지침과, 입력 키에 따라 `SetMotorEnable` 메서드를 호출하여 모터를 제어하는 스크립트 예제만 제시되어 있을 뿐, 오류 처리나 예외 상황 관련 내용은 없습니다. 따라서 주어진 문서 범위 내에서 이 질문에 답할 수 없습니다. [scores] | [judge_reason] | [source_doc] | 1. 새로운 **LeftEntity, LeftBar** 오브젝트 엔티티를 만들고, **PhysicsRigidbodyComponent, PhysicsColliderComponent**를 추가합니다. * LeftEntity SpriteRUID: **e75cac80f719471fa482195531ed57cc** * LeftBar SpriteRUID: **0308ac89b10843fcab6384aa43f6ae22** 2. 원형 모양 엔티티에 **RevoluteJointComponent**를 추가하고, **Joint**에 **
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideViewRectTileMap에서 캐릭터 이동 시, `GetAccel`과 `GetDrag` 함수에서 지면과 공중 상태의 가속도·마찰력을 구분해서 적용해야 조작감이 부드러워지는 이유가 무엇인가요? [answer] | SideViewRectTileMap에서 캐릭터 이동 시 `GetAccel`과 `GetDrag` 함수를 통해 지면과 공중 상태를 구분하여 가속도와 마찰력을 적용하는 이유는, 두 환경에서의 물리적 상호작용과 조작감의 특성이 다르기 때문입니다. **1. 지면 상태 (Ground)** * **고가의 가속도(`Accel`)와 마찰력(`Drag`):** 지면에 있을 때는 바닥과의 마찰이 존재하므로, 방향을 바꾸거나 멈추는 반응이 빨라야 자연스럽습니다. * `Accel`이 높으면 키를 누르는 즉시 캐릭터가 원하는 방향으로 빠르게 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | MotorEnable을 true로 설정하고 MotorSpeed를 100에서 10으로 줄였을 때 엔티티의 속도가 감소하는 원리가 무엇인가요? [answer] | Motor를 사용하는 Joint(RevoluteJointComponent, WheelJointComponent, PrismaticJointComponent)는 엔티티가 **설정된 목표 속도(MotorSpeed)에 도달하도록 힘을 가하는 방식**으로 동작합니다. 즉, MotorSpeed는 현재 속도가 아니라 **목표(target) 속도**입니다. * `MotorSpeed`가 100일 때: 엔티티는 속도가 100이 될 때까지 가속력을 받습니다. * `MotorSpeed`를 10으로 변경할 때: 엔티티는 이제 속도가 10이 될 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리를 사용하는 맵에서 특정 엔티티끼리의 운동 방식을 설정하는 방법을 알아봅시다. 다양한 JointComponent를 활용해 다양한 운동을 하는 엔티티를 만들어 월드 제작에 활용할 수 있습니다. # Joint Joint란 물리 법칙을 적용한 맵에서 특정 엔티티끼리만 연결해 서로 영향을 주고받을 수 있게 만드는 특정 연결부를 의미합니다. 아래의 그림과 같이 Entity A와 Entity B가 서로 영향을 주고받을 수 있도록 하는 연결부가 바로 Joint입니다. 기준 엔티티인 Entity A에 Joint 연결
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideviewbodyComponent를 활용하여 캐릭터가 지면에 있는지 공중에 있는지를 판별하고, 이에 따라 Accel/Drag 또는 AirAccel/AirDrag를 선택적으로 반환하는 GetAccel과 GetDrag 함수를 포함하는 스크립트를 작성해줘 [answer] | SideviewbodyComponent의 IsOnGround() 메서드를 호출하여 캐릭터가 지면에 있는지 판별합니다. 지면에 있는 경우 Accel과 Drag 값을, 공중에 있는 경우 AirAccel과 AirDrag 값을 반환하도록 GetAccel()과 GetDrag() 함수를 구현합니다. ```lua Property: [None] number MaxSpeed = 4 [None] number Accel = 10 [None] number Drag = 8 [None] number AirAccel = 6 [None] number AirD [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | PrismaticJointComponent를 사용하여 엔티티 A가 특정 방향으로 직선 운동하도록 LocalAnchorA와 LocalAnchorB를 설정하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `PrismaticJointComponent`가 6가지 JointComponent 중 하나로 언급되어 있고, Motor(`MotorEnable`, `MotorSpeed`)를 사용하여 엔티티에 특정 방향으로 운동하도록 힘을 가할 수 있다고 설명하고 있습니다. 그러나 **`PrismaticJointComponent`의 구체적인 프로퍼티(예: 운동 방향을 설정하는 프로퍼티 등)나 mLua 스크립트에서 해당 컴포넌트를 조작하는 정확한 메서드(예: `SetAxis`, `AddJoint` 등)에 대한 정보는 문서에 포함 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리를 사용하는 맵에서 특정 엔티티끼리의 운동 방식을 설정하는 방법을 알아봅시다. 다양한 JointComponent를 활용해 다양한 운동을 하는 엔티티를 만들어 월드 제작에 활용할 수 있습니다. # Joint Joint란 물리 법칙을 적용한 맵에서 특정 엔티티끼리만 연결해 서로 영향을 주고받을 수 있게 만드는 특정 연결부를 의미합니다. 아래의 그림과 같이 Entity A와 Entity B가 서로 영향을 주고받을 수 있도록 하는 연결부가 바로 Joint입니다. 기준 엔티티인 Entity A에 Joint 연결
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | Property 블록에 MaxSpeed, Accel, Drag, AirAccel, AirDrag 값을 설정하고, Method 블록에서 SideviewbodyComponent의 IsOnGround 결과를 활용해 지면/공중별 가속도와 마찰력을 반환하는 GetAccel, GetDrag 메서드를 구현하는 스크립트를 작성해줘 [answer] | 요청하신 기능은 `SideviewbodyComponent`의 `IsOnGround` 메서드를 활용하여 지면과 공중 상태에 따라 가속도(Accel)와 마찰력(Drag) 값을 다르게 반환하는 로직입니다. 참고 문서에 명시된 프로퍼티와 메서드 구현 방식을 그대로 적용하여 작성한 스크립트는 다음과 같습니다. ```lua Property: [None] number MaxSpeed = 4 -- 최대 속도 [None] number Accel = 10 -- 가속도 [None] number Drag = 8 -- 마찰력 [None] number [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | RevoluteJointComponent의 MotorEnable을 true로 설정하고 MotorSpeed를 100으로 지정하여 엔티티 A가 엔티티 B를 기준으로 회전하는 스크립트를 작성해줘 [answer] | 제시된 문서에는 `RevoluteJointComponent`의 `MotorEnable`과 `MotorSpeed` 프로퍼티가 존재한다는 정보만 있고, 이 프로퍼티를 직접 설정하는 mLua 메서드나 `AddJoint`와 같은 연결 메서드의 정확한 시그니처(인자)에 대한 구체적인 코드가 명시되어 있지 않습니다. 문서에 포함된 실제 mLua 예제는 `WeldJointComponent`와 `WheelJointComponent`의 메서드(`AddJoint`, `SetMotorEnable`, `SetMotorSpeed`) 사용법을 보여줄 뿐, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리를 사용하는 맵에서 특정 엔티티끼리의 운동 방식을 설정하는 방법을 알아봅시다. 다양한 JointComponent를 활용해 다양한 운동을 하는 엔티티를 만들어 월드 제작에 활용할 수 있습니다. # Joint Joint란 물리 법칙을 적용한 맵에서 특정 엔티티끼리만 연결해 서로 영향을 주고받을 수 있게 만드는 특정 연결부를 의미합니다. 아래의 그림과 같이 Entity A와 Entity B가 서로 영향을 주고받을 수 있도록 하는 연결부가 바로 Joint입니다. 기준 엔티티인 Entity A에 Joint 연결
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | JointComponent를 추가할 때 Size 프로퍼티에 숫자를 입력하는 것이 실제로 무엇을 의미하는지 알고 싶습니다. [answer] | JointComponent를 추가할 때 `Size` 프로퍼티에 입력하는 숫자는 **생성할 Joint의 개수**를 의미합니다. 즉, `Size`에 1을 입력하면 Joint가 1개 생성되고, 2를 입력하면 Joint가 2개 생성되는 방식으로 동작합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WheelJoint는 연결된 엔티티가 바퀴처럼 동작하도록 제한을 설정합니다. Motor를 사용한 TargetEntityRef는 MotorSpeed 값을 목표 속도로 사용합니다. | 주요 프로퍼티 | 설명 | | --- | --- | | **MaxMotorTorque** | 목표 모터 속도에 도달하기 위한 Joint의 모터에 적용할 수 있는 최대 힘을 설정합니다. | | **MotorEnable** | Motor를 사용할지 여부를 설정합니다. True일 경우 연결된 Entity가 LocalAxis 방향의 힘을 받습니다. | | *
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideviewbodyComponent의 MoveVelocity 값을 직접 수정해서 캐릭터를 이동시킬 때, 기존 PlayerControllerComponent의 기본 이동 로직과 충돌하거나 오작동하는 원인은 무엇인가요? [answer] | SideviewbodyComponent의 MoveVelocity 값을 직접 수정하여 캐릭터를 이동시킬 때 기존 PlayerControllerComponent의 기본 이동 로직과 충돌하거나 오작동하는 주된 원인은 **두 컴포넌트가 서로 독립적으로 캐릭터의 물리적 상태(속도)를 제어하기 때문**입니다. 구체적인 원인은 다음과 같습니다. 1. **이중 제어(Double Control) 충돌**: * `PlayerControllerComponent`는 기본적으로 유저의 키 입력을 감지하여 자체적인 가속/감속 로직을 수행하고 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 7. 유저의 키 입력이 없을 때는 감속하고 키 입력이 있을 때는 가속하도록 설정해봅시다. 아래와 같이 `UpdateVelocity` 함수와 `SignOf` 함수를 추가합니다. ```lua number SignOf(number value) { if value >= 0 then return 1 else return -1 end } void UpdateVelocity(number delta)
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideViewRectTileMap에서 SideviewbodyComponent의 IsOnGround 상태를 확인하여 지면에서는 Accel, 공중에서는 AirAccel을 반환하는 GetAccel 메서드와 지면에서는 Drag, 공중에서는 AirDrag를 반환하는 GetDrag 메서드를 구현하는 스크립트를 작성해줘 [answer] | SideViewRectTileMap 환경에서 `SideviewbodyComponent`의 `IsOnGround()` 메서드를 활용하여 지면 상태와 공중 상태에 따라 다른 가속도 및 마찰력 값을 반환하는 스크립트입니다. 요청하신 `GetAccel`과 `GetDrag` 메서드, 그리고 이를 저장할 프로퍼티를 포함하여 전체 스크립트 구조를 작성했습니다. ```lua Property: [None] number Accel = 10 -- 지면 가속도 [None] number AirAccel = 6 -- 공중 가속도 [None] number [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideViewbodyComponent의 IsOnGround 상태를 기반으로 지면에서는 Accel과 Drag, 공중에서는 AirAccel과 AirDrag 값을 각각 반환하는 GetAccel과 GetDrag 함수를 정의하고, 이를 통해 지면과 공중의 물리 특성을 구분하는 스크립트를 작성해줘 [answer] | SideViewbodyComponent의 `IsOnGround()` 메서드를 통해 캐릭터가 지면에 있는지를 판별하고, 그 상태에 따라 서로 다른 물리 상수를 적용하는 로직입니다. 지面上的에서는 반응이 빠르고 정지가 잘 되도록 `Accel`과 `Drag` 값을 사용하고, 공중에서는 관성을 더 느끼게 하거나 조작감을 부드럽게 하기 위해 `AirAccel`과 `AirDrag` 값을 사용합니다. 아래 코드는 해당 조건을 충족하는 `GetAccel`과 `GetDrag` 메서드를 포함하고 있습니다. ```lua Property: [None [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | row then self.InputDirection.y = self.InputDirection.y - 1 end if key == KeyboardKey.DownArrow then self.InputDirection.y = self.InputDirection.y + 1 self.IsCrouchKeyPressed = false end if key == KeyboardKey.LeftAlt or key == Keyboa