[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | 얼음 타일 판별 및 마찰력 적용 과정을 단계별 번호 목록으로 정리하되, 각 단계의 핵심 메서드명만 기재하세요. [answer] | 1. `OnBeginPlay` 2. `OnUpdate` 3. `GetUnderfootTile` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | GetUnderfootTile 함수가 반환하는 값의 타입과 nil 처리 로직에 대한 설명을 3문장 이내로 작성하세요. [answer] | `GetUnderfootTile` 함수는 캐릭터가 밟고 있는 타일 정보를 반환하며, 아무 타일도 밟지 않는 경우 `nil`을 반환합니다. 따라서 반환값을 사용할 전에는 반드시 `nil`인지 확인하는 로직이 필요합니다. `nil`인 경우 추가적인 타일 이름 비교 처리를 건너뛰고 즉시 함수를 종료하는 것이 안전합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | two_turn [pass] | ⏳ 미판정 [title] | SideViewRectTile모드로 맵 만들기 [question] | SideViewRectTile 맵을 제작할 때 타일 셋(TileSet)을 생성하고 이미지를 추가하는 구체적인 절차는 무엇인가요? [answer] | SideViewRectTile 맵에서 타일 셋(TileSet)을 생성하고 이미지를 추가하는 절차는 다음과 같습니다. 1. **타일 셋 생성**: 타일 셋 팔레트(TileSet Palette)의 좌측 상단에 있는 **+** 버튼을 누른 뒤, **Create Empty TileSet** 옵션을 선택합니다. 생성된 새 타일 셋의 이름을 원하는 이름(예: TileSet)으로 변경합니다. 2. **이미지 추가**: 타일 셋 팔레트 하단의 **타일 추가** 버튼을 누르고 **Add ResourceStorage Image**를 선택합니다. [followup] | 타일 셋 팔레트에서 "Create Empty TileSet"을 선택한 후 이름을 "TileSet"으로 지정하고, 하단 버튼으로 "Add ResourceStorage Image"를 선택하여 미리 저장한 4개 이미지를 매핑하는 과정 중 에러가 발생했을 때 확인할 점은 무엇인가요? [followup_answer] | 제공된 참고 문서에는 타일 셋 생성 및 이미지 추가 과정 중 에러 발생 시의 구체적인 해결 방법이나 확인 사항(에러 코드, 로그 메시지, 일반적인 오류 원인 등)에 대한 정보가 포함되어 있지 않습니다. 문서에서는 단순히 다음 순서대로 조작하는 절차만 안내하고 있습니다: 1. 타일 셋 팔레트 좌측 상단 "+" 버튼 클릭 후 **Create Empty TileSet** 선택 및 이름 지정 2. 타일 셋 팔레트 하단 타일 추가 버튼 클릭 후 **Add ResourceStorage Image** 선택 3. Resource Picker에서 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 RectTileMapComponent와 KinematicbodyComponent는 탑다운뷰 게임 제작에는 적합하지만 횡스크롤 게임 제작에는 적합하지 않습니다. SideViewRectTile 모드는 RectTileMap을 활용해 손쉽게 횡스크롤 게임을 제작할 수 있도록 횡스크롤 방식의 이동, 점프, 타일과의 충돌 등을 지원합니다. 이번 시간에는 SideViewRectTile 모드에 대해 알아보고 맵을 제작해봅시다. > **더 알아보기** > SideViewRectTile 모드는 RectTile 모드를 기반으로
[task] | two_turn [pass] | ⏳ 미판정 [title] | 물리 사용하기 [question] | 기본 발판이나 타일이 물리 엔티티를 통과하는 문제를 해결하기 위해 TileMapComponent의 PhysicsInteractable 프로퍼티를 활성화해야 한다고 하는데, 이 프로퍼티가 활성화되지 않았을 때와 활성화되었을 때의 충돌 동작 차이는 무엇인가요? [answer] | 기본 맵과 기본 발판(타일)은 기본적으로 물리 법칙을 따르지 않기 때문에, 물리 엔티티(Dynamic 또는 Kinematic 등)가 기본 발판을 뚫고 지나가게 됩니다. `TileMapComponent`의 `PhysicsInteractable` 프로퍼티에 따른 충돌 동작 차이는 다음과 같습니다. **1. PhysicsInteractable가 비활성화(기본 상태)일 때** * 물리 엔티티와 타일(발판, 벽 등) 간의 상호 작용이 일어나지 않습니다. * 물리 엔티티는 타일이나 발판을 **뚫고 지나갑니다(통과합니다).** * [followup] | PhysicsRigidbodyComponent를 추가하지 않은 Static 타입 엔티티와 PhysicsInteractable이 활성화된 TileMapComponent 간의 충돌 이벤트 발생 여부도 함께 확인해 주세요. [followup_answer] | 참고 문서에 따르면, `PhysicsRigidbodyComponent`를 추가하지 않은 경우 해당 엔티티는 질량이 무한히 큰 **Static** 타입으로 취급됩니다. Static 타입은 Dynamic 타입과 충돌할 수 있다고 명시되어 있습니다. 한편, `PhysicsInteractable`이 활성화된 `TileMapComponent`는 물리 엔티티들이 충돌할 수 있는 지면과 벽의 역할을 하도록 만듭니다. 하지만 두 객체(Static 타입 엔티티와 활성화된 TileMap) 간의 **구체적인 충돌 이벤트 발생 여부**에 대한 명시적 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드의 맵과 엔티티에 물리 법칙 적용 방법을 알아봅시다. 물리 법칙을 활용해 엔티티가 서로 충돌해 튕기거나, 포물선 운동을 하며 날아가거나, 엔티티가 서로 연결되어 움직이게 하는 등 물리를 활용한 움직임을 다양하게 만들어낼 수 있습니다. [엔티티의 충돌](/docs?postId=175)과 [충돌 그룹 만들기](/docs?postId=754)를 함께 학습하길 권장합니다. # 맵에 물리 법칙 적용하기 기본 맵은 메이플스토리 맵 구성과 이동 원칙을 따르므로 물리 법칙은 기본 적용되어 있지 않습니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | Motor가 활성화될 때 속도가 변화하는 원리를 MotorSpeed 값을 예시로 들어 50자 이내로 설명하세요. [answer] | MotorSpeed 값이 목표 속도가 되어 현재 속도가 그 값에 맞춰 증가하거나 감소합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리를 사용하는 맵에서 특정 엔티티끼리의 운동 방식을 설정하는 방법을 알아봅시다. 다양한 JointComponent를 활용해 다양한 운동을 하는 엔티티를 만들어 월드 제작에 활용할 수 있습니다. # Joint Joint란 물리 법칙을 적용한 맵에서 특정 엔티티끼리만 연결해 서로 영향을 주고받을 수 있게 만드는 특정 연결부를 의미합니다. 아래의 그림과 같이 Entity A와 Entity B가 서로 영향을 주고받을 수 있도록 하는 연결부가 바로 Joint입니다. 기준 엔티티인 Entity A에 Joint 연결
[task] | two_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | 공중 상태에서의 조작감을 개선하기 위해 물리 값 적용 방식은 어떻게 다른가요? [answer] | 공중 상태에서의 조작감을 개선하기 위해, 캐릭터가 지면에 접촉되어 있는지(`IsOnGround`)에 따라 적용되는 가속도(Accel)와 마찰력(Drag) 값을 다르게 설정하는 방식을 사용합니다. 구체적인 적용 방식은 다음과 같습니다. 1. **프로퍼티 분리**: 지상용과 공중용 물리 상수를 각각 별도의 프로퍼티로 정의합니다. * `Accel`: 지상 가속도 * `Drag`: 지상 마찰력 * `AirAccel`: 공중 가속도 * `AirDrag`: 공중 마찰력 2. **상태 판별 함 [followup] | `AirAccel`과 `AirDrag` 프로퍼티가 `Accel`, `Drag`와 비교했을 때 어떤 값으로 설정되는지 문서에 명시된 수치와 함께 설명해 주세요. [followup_answer] | 문서에 명시된 수치에 따라, 공중 상태 물리 값(`AirAccel`, `AirDrag`)은 지상 상태 물리 값(`Accel`, `Drag`)보다 낮은 값으로 설정됩니다. 구체적인 설정 값은 다음과 같습니다. * **가속도**: * 지상 가속도 (`Accel`): **10** * 공중 가속도 (`AirAccel`): **6** * **마찰력**: * 지상 마찰력 (`Drag`): **8** * 공중 마찰력 (`AirDrag`): **4** 즉, 공중에서는 지상보다 가속도가 4만큼 [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] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | DistanceJointComponent의 주요 프로퍼티와 설명을 표로 정리하되, 헤더를 포함하여 총 2행만 출력하세요. [answer] | | 주요 프로퍼티 | 설명 | | --- | --- | | **Length** | Joint로 연결된 두 Entity가 유지할 거리를 설정합니다. | [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] | CustomPlayerController 스크립트를 DefaultPlayer에 추가했는데도 캐릭터가 움직이지 않을 때 어떤 부분을 먼저 확인해야 하는지 조언을 구합니다. [answer] | `CustomPlayerController` 스크립트를 `DefaultPlayer`에 추가했는데 캐릭터가 움직이지 않는다면, 아래 순서로 원인을 점검해 보세요. 1. **스크립트 컴포넌트 부착 위치 확인** 스크립트가 `MyDesk`에 있는 것이 아니라, 실제로 플레이어가 되는 `DefaultPlayer` 엔티티에 `CustomPlayerController` 컴포넌트가 추가되어 있는지 확인하세요. 문서에서는 "MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlaye [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | LocalAnchor의 위치 기준점을 설명하되, ColliderOffset과의 관계를 포함하여 3문장 이내로 답하세요. [answer] | LocalAnchor의 위치는 엔티티의 ColliderOffset을 원점으로 삼아 측정합니다. 따라서 ColliderOffset 값이 변경되면 Anchor의 기준점도 함께 이동하게 됩니다. 동일한 LocalAnchor 값을 사용하더라도 각 엔티티의 ColliderOffset이 다르면 실제 연결 위치가 달라집니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 물리를 사용하는 맵에서 특정 엔티티끼리의 운동 방식을 설정하는 방법을 알아봅시다. 다양한 JointComponent를 활용해 다양한 운동을 하는 엔티티를 만들어 월드 제작에 활용할 수 있습니다. # Joint Joint란 물리 법칙을 적용한 맵에서 특정 엔티티끼리만 연결해 서로 영향을 주고받을 수 있게 만드는 특정 연결부를 의미합니다. 아래의 그림과 같이 Entity A와 Entity B가 서로 영향을 주고받을 수 있도록 하는 연결부가 바로 Joint입니다. 기준 엔티티인 Entity A에 Joint 연결
[task] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `UpdateLookDirection` 함수에서 `self.InputDirection.x` 값에 따라 `LookDirectionX`가 설정되는 경우를 표로 정리해서 출력하세요. [answer] | 제공된 문서의 `UpdateLookDirection` 함수 코드를 분석한 결과, `self.InputDirection.x` 값에 따른 `LookDirectionX` 설정은 다음과 같습니다. | `self.InputDirection.x` 값 | 조건 | `controller.LookDirectionX` 값 | 설명 | | :--- | :--- | :--- | :--- | | `0` | `self.InputDirection.x ~= 0`이 `false` | **(변경 없음)** | 입력 방향이 0이면 `if` 블록이 실행되지 않아 이 [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] | instruction_following [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | IceTileChecker 스크립트에서 Drag 프로퍼티와 OnUpdate 함수의 코드만 출력하고, 실행 공간 어트리뷰트([client only])와 주석은 포함하지 마세요. [answer] | ```lua Property: [None] number IceDrag = 2 [None] number DefaultDrag = 0 Method: void OnUpdate(number delta) { local customController = self.Entity.CustomPlayerController local body = self.Entity.SideviewbodyComponent local underfootTile = body:GetUnderfootTile() customController.D [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] | InputService의 KeyDownEvent와 KeyUpEvent로 좌우 화살표 입력을 감지해 PlayerControllerComponent의 MoveVelocity를 변경하는 스크립트를 작성해줘 [answer] | `InputService`의 `KeyDownEvent`와 `KeyUpEvent`를 통해 좌우 화살표 키 입력을 감지하고, `PlayerControllerComponent`의 `MoveVelocity`를 변경하는 스크립트는 다음과 같이 작성할 수 있습니다. 참고 문서의 예제와 실제 mLua 문법을 기준으로, `OnBeginPlay`에서 `PlayerControllerComponent`를 참조하고, 이벤트 핸들러에서 `MoveVelocity`의 x 값을 조절하는 방식으로 구현했습니다. ```lua Property: [None] Pl [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | code [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | InputService의 KeyDownEvent와 KeyUpEvent로 DownArrow 키 입력 상태를 추적해 PlayerControllerComponent의 Crouch 메서드를 호출하거나 해제하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `PlayerControllerComponent`의 `Crouch` 메서드에 대한 정보가 포함되어 있지 않습니다. 따라서 해당 메서드를 직접 호출하는 코드를 작성할 수 없습니다. 대신, 제공된 문서에 근거하여 **DownArrow 키 입력 상태(`IsCrouchKeyPressed`)를 추적**하는 부분만 정확히 구현한 스크립트를 제공합니다. 이 스크립트는 `KeyDownEvent`와 `KeyUpEvent`를 통해 크로스 상태 여부를 `boolean` 프로퍼티에 기록합니다. 참고: 문서 예제에서는 `Playe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | PlayerControllerComponent를 비활성화하고 직접 입력을 처리할 때 어떤 순서로 코드를 작성해야 하는지 궁금합니다. [answer] | `PlayerControllerComponent`를 비활성화하고 직접 입력을 처리하는 코드를 작성할 때는 다음 순서를 따라야 합니다. 1. **스크립트 컴포넌트 생성 및 추가**: `MyDesk`에서 `CustomPlayerController`라는 이름의 새 스크립트 컴포넌트를 생성한 뒤, `DefaultPlayer` 엔티티에 추가합니다. 2. **프로퍼티 정의**: 입력 방향과 상태(점프, 쪼그려 앉기 등)를 기록할 프로퍼티를 정의합니다. 3. **컴포넌트 비활성화**: `OnBeginPlay` 함수 내에서 `PlayerC [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveVelocity`를 응용하면 크리에이터가 의도하는 게임의 콘셉트에 맞게 캐릭터의 움직임을 만들어낼 수 있습니다. 이번 예제에서는 눈과 얼음이 가득한 필드라는 콘셉트에 맞게 가속도와 마찰력 개념을 추가해 미끄러운 길을 걷는 듯한 움직임을 만들어보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 CustomPlayerController를 만든 뒤, DefaultPlayer에 추가합니다. 2. CustomPlayerController를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua
[task] | two_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideViewRectTileMap에서 캐릭터의 이동 속도를 제어할 때 가속도와 마찰력을 어떻게 설정해야 할까요? [answer] | SideViewRectTileMap에서 캐릭터의 이동 속도를 가속도와 마찰력으로 제어하려면, 지면에 있을 때와 공중에 있을 때 각각 다른 값을 적용하도록 로직을 구성해야 합니다. 이는 조작감을 향상시키는 데 중요합니다. ### 1. 프로퍼티 설정 아래와 같이 최대 속도, 지면/공중 가속도, 지면/공중 마찰력을 정의하는 프로퍼티를 추가합니다. ```lua Property: [None] number MaxSpeed = 4 -- 최대 속도 [None] number Accel = 10 -- 지면 가속도 [None] number Dra [followup] | `GetAccel`과 `GetDrag` 함수에서 `IsOnGround()` 기준으로 지면과 공중의 값을 어떻게 구분하여 반환하는지 코드 예시를 요청합니다. [followup_answer] | `SideviewbodyComponent`의 `IsOnGround()` 메서드를 호출하여 캐릭터가 지면에 있는지 확인하고, 그 결과에 따라 지면 또는 공중에 해당하는 가속도·마찰력 프로퍼티 값을 반환합니다. 아래는 요청하신 `GetAccel`과 `GetDrag` 함수의 코드 예시입니다. ```lua Method: -- 지면에 있을 때와 공중에 있을 때 적절한 가속도 값을 반환해 줍니다. number GetAccel() { local body = self.Entity.SideviewbodyComponent [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] | 충돌 그룹 만들기 [question] | 충돌 그룹 Monster 와 Item 만 활성화되지 않은 매트릭스를 전제로, MonsterComponent 가 TriggerEnterEvent 를 수신할 때 event.TriggerBodyEntity 의 CollisionGroup 이 Monster 인지 확인하여 조건이 맞을 때만 ItemComponent 를 self.Entity:Destroy() 로 삭제하는 스크립트를 작성해줘 [answer] | 충돌 그룹 매트릭스에서 `Monster`와 `Item` 사이의 충돌이 비활성화되어 있다면, 물리 엔진 레벨에서 두 그룹의 `TriggerEnterEvent`가 발생하지 않습니다. 따라서 `MonsterComponent`가 `Item`과 충돌한 `TriggerEnterEvent`를 수신하는 상황이 자체가 성립하지 않습니다. 하지만 질문의 의도가 "만약 이벤트가 수신되었다고 가정할 때, `TriggerBodyEntity`의 `CollisionGroup`이 `Monster`인지 확인하는 로직"을 구현하는 것이라면, 아래처럼 작성할 수 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 충돌 그룹 매트릭스(Matrix)는 충돌 그룹끼리의 충돌을 허용할지 말지를 결정할 때 사용합니다. 충돌 그룹을 생성하면 매트릭스에 자동으로 새로운 충돌 그룹이 생성됩니다. 충돌 그룹끼리의 충돌 허용 여부는 체크 박스를 선택해서 간단하게 설정할 수 있습니다. 매트릭스에 적힌 충돌 그룹끼리의 관계를 확인하고 충돌을 허용하고 싶다면 체크 박스를 활성화합니다. 1. **Panels - Collision Groups - Matrix**를 선택합니다. 2. 가로 세로의 그룹명을 확인한 뒤 충돌을 허용하면 체크 박스를 활성화합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | CustomPlayerController의 Drag 값을 매 프레임마다 변경하는 방식과 이벤트 기반 처리 방식 중 어떤 것이 성능에 유리한가요? [answer] | 제공된 참고 문서에는 `CustomPlayerController`의 `Drag` 값을 매 프레임(`OnUpdate`)마다 변경하는 방식에 대한 설명만 포함되어 있습니다. 이벤트 기반 처리 방식(예: 타일 진입/이탈 시점에만 값을 변경하는 방식)에 대한 설명, 두 방식 간의 성능 비교 데이터, 또는 권장 사항에 대한 정보는 문서에 존재하지 않습니다. 따라서 제공된 문서를 근거로 두 방식 중 어느 쪽이 성능에 더 유리한지 판단할 수 있는 정보는 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | OnUpdate 함수에서 UpdateVelocity를 호출할 때 [client only] 실행 공간 태그를 붙여야 하는 이유와, 이 태그가 붙지 않았을 때 발생할 수 있는 문제는 무엇인가요? [answer] | 제공된 참고 문서에는 `OnUpdate` 함수에 `[client only]` 태그를 붙여야 하는 **구체적인 이유**나, 이 태그가 없었을 때 발생하는 **기술적 문제점(예: 서버/클라이언트 동기화 충돌, 네트워크 오버헤드 등)**에 대한 설명이 포함되어 있지 않습니다. 문서에서는 단순히 8번 단계에서 `OnUpdate` 함수에 `[client only]` 태그를 붙여 `UpdateVelocity`를 호출하도록 지시하고, 9번 단계에서 이렇게 하면 "좌우 이동이 미끄러지듯 부드럽게" 된다고만 기술되어 있을 뿐, 태그가 없으면 왜 [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] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | OnBeginPlay에서 DefaultDrag를 저장할 때 CustomPlayerController가 아직 초기화되지 않아 에러가 발생하는 경우가 있나요? [answer] | 제공된 문서에는 `OnBeginPlay` 시점에 `CustomPlayerController`가 초기화되지 않아 에러가 발생하는 경우나 해당 문제를 방지하기 위한 지연 초기화(Lazy Initialization) 방법에 대한 내용이 포함되어 있지 않습니다. 문서에는 `OnBeginPlay`에서 `self.Entity.CustomPlayerController.Drag` 값을 `DefaultDrag` 프로퍼티에 저장하는 코드만 제시되어 있을 뿐, 컴포넌트 초기화 순서나 에러 처리 관련 설명은 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | IceDrag와 DefaultDrag 프로퍼티의 값이 0보다 작거나 같은 경우에도 정상적으로 동작할까요? [answer] | 제공된 문서에는 `IceDrag`와 `DefaultDrag` 프로퍼티가 0보다 작거나 같은 값(음수 또는 0)을 가질 때의 동작 방식에 대한 설명이 없습니다. 문서에서 확인 가능한 사실은 다음과 같습니다. 1. 예제 코드에서는 `IceDrag`의 기본값이 `2`, `DefaultDrag`의 기본값이 `0`으로 설정되어 있습니다. 2. `OnUpdate` 함수 내에서 캐릭터가 "Ice" 타일을 밟을 경우 `customController.Drag` 값이 `self.IceDrag`로, 그 외의 경우 `self.DefaultDrag` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | `InputDirection`의 y값을 변경할 때 `KeyboardKey.UpArrow`와 `DownArrow`에 따라 각각 1씩 빼거나 더하는 방식은 어떤 조작 방식을 의미하나요? [answer] | `KeyboardKey.UpArrow`와 `KeyboardKey.DownArrow` 입력에 따라 `InputDirection`의 y값을 각각 1씩 빼거나 더하는 방식은 **좌표계의 Y축 방향(상/하)을 입력 벡터에 반영하는 방식**입니다. 제공된 코드에서 이 로직은 다음과 같이 동작합니다: * `KeyboardKey.UpArrow`가 눌리면: `self.InputDirection.y = self.InputDirection.y - 1` * `KeyboardKey.DownArrow`가 눌리면: `self.InputDirecti [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] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | SideviewbodyComponent에서 EnableDownJump를 체크하고 DownJumpSpeed를 설정했는데, 왜 캐릭터가 여전히 공중에서 아래로 점프하는 동작이 적용되지 않나요? [answer] | 제공된 참고 문서에는 `SideviewbodyComponent`에서 `EnableDownJump`와 `DownJumpSpeed` 프로퍼티를 설정하는 방법(14번 항목)만 언급되어 있을 뿐, 이 설정이 적용되지 않을 때의 원인이나 해결 방법은 포함되어 있지 않습니다. 문서에는 `UpdateAnimationState` 함수 내에서 `body:IsOnGround()` 상태를 확인하여 `FALL` 상태 변경을 제어하는 로직(11번 항목)은 제시되어 있지만, `EnableDownJump`가 `false`로 되어 있거나 `DownJumpSp [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] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | UpdateAnimationState에서 self.IsCrouchKeyPressed를 참조하는데, 이 변수를 직접 선언하지 않아도 스크립트가 정상적으로 작동하는 원리가 무엇인가요? [answer] | 제시된 참고 문서에는 `UpdateAnimationState` 함수 내에서 `self.IsCrouchKeyPressed` 변수가 사용된다는 사실만 명시되어 있습니다. 그러나 해당 변수가 **직접 선언되지 않아도** 스크립트가 정상적으로 작동하는 원리나, 이 변수가 어떤 외부 메커니즘(예: 다른 컴포넌트에서 동기화되는 값, 내장 API의 자동 생성 변수 등)에 의해 생성되거나 관리되는지에 대한 설명은 문서에 포함되어 있지 않습니다. 따라서 제공된 정보만으로는 `self.IsCrouchKeyPressed`가 선언 없이도 접근 가능한 [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] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | PulleyJointComponent의 Ratio가 3일 때 Entity A와 B의 구속력(constraint force) 비율을 계산해 한 줄로 답하세요. [answer] | Ratio가 3일 때 Entity A의 구속력은 Entity B의 구속력의 1/3입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | RevoluteJoint는 엔티티의 회전과 관련된 제한을 설정합니다. UseLimits를 활성화한 후, LowerAngle, UpperAngle를 활용해 회전 각도를 제한할 수 있습니다. 엔티티가 회전할 때는 LocalAnchorA와 B가 만나는 지점을 공통의 Anchor로 사용합니다. 또한 Motor를 사용하면 Anchor를 기준으로 회전하는 힘을 받을 수 있습니다. | 주요 프로퍼티 | 설명 | | --- | --- | |**UseLimits** | 상대적 각도에 제한을 설정할지 여부를 결정합니다. | |**LowerAn
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | GetUnderfootTile 함수가 반환하는 값이 nil일 때를 어떻게 처리해야 하는지 궁금합니다. [answer] | `GetUnderfootTile` 함수는 캐릭터가 현재 밟고 있는 타일 정보를 반환하며, 캐릭터가 타일 위가 아니거나 타일 정보를 가져올 수 없는 경우 `nil`을 반환할 수 있습니다. `nil`인 경우를 처리하지 않고 `underfootTile.Name`과 같은 프로퍼티에 직접 접근하면 오류가 발생할 수 있으므로, `nil` 체크를 반드시 수행해야 합니다. 아래는 `GetUnderfootTile`이 `nil`을 반환하는 경우를 안전하게 처리하는 예시입니다. `nil`인 경우 즉시 함수를 종료(`return`)하여 후속 로직의 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 더 미끄러운 타일 만들기 `GetUnderfootTile` 함수를 사용하면 캐릭터가 현재 밟고 있는 타일이 무엇인지 알 수 있습니다. 이를 이용해서 얼음 타일을 밟으면 마찰력이 감소해 더 많이 미끄러지는 기능을 만들어 보겠습니다. 1. MyDesk 아래에 새 스크립트 컴포넌트 IceTileChecker를 만든 뒤, DefaultPlayer에 추가합니다. 2. IceTileChecker를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. ```lua Property : [None] numbe
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | StateComponent의 ChangeState 메서드에 "MOVE", "IDLE" 같은 문자열을 전달할 때, 해당 상태 이름은 어디에서 정의하거나 관리해야 하나요? [answer] | StateComponent의 `ChangeState` 메서드에 전달하는 상태 이름(예: "MOVE", "IDLE", "CROUCH", "FALL")은 제공된 문서 내에서 정의하거나 관리하는 방법에 대한 설명이 없습니다. 문서에는 `self.Entity.StateComponent:ChangeState("MOVE")`와 같이 문자열 인자를 사용하여 상태를 변경하는 **사용 예제**만 제시되어 있으며, 이 문자열 값들이 어디서 설정되거나 등록되는지에 대한 가이드는 포함되어 있지 않습니다. [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] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | PrismaticJointComponent의 Linear Motion 제한 원리를 3문장 이내로 요약하고, LocalAxis의 기준점을 명시하세요. [answer] | PrismaticJointComponent는 엔티티가 LocalAxis를 따라 선형 운동하도록 제한하며, LowerTranslation과 UpperTranslation 값을 설정하여 이동 가능한 최소 및 최대 거리를 정의합니다. LocalAxis의 위치는 LocalAnchor를 기준으로 결정됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | RevoluteJoint는 엔티티의 회전과 관련된 제한을 설정합니다. UseLimits를 활성화한 후, LowerAngle, UpperAngle를 활용해 회전 각도를 제한할 수 있습니다. 엔티티가 회전할 때는 LocalAnchorA와 B가 만나는 지점을 공통의 Anchor로 사용합니다. 또한 Motor를 사용하면 Anchor를 기준으로 회전하는 힘을 받을 수 있습니다. | 주요 프로퍼티 | 설명 | | --- | --- | |**UseLimits** | 상대적 각도에 제한을 설정할지 여부를 결정합니다. | |**LowerAn
[task] | single_turn [pass] | ⏳ 미판정 [title] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | OnUpdate 함수에서 UpdateVelocity, UpdateAction, UpdateAnimationState, UpdateLookDirection의 호출 순서가 특정 순서로 정해져 있는 건가요? [answer] | 제공된 문서의 `OnUpdate` 함수 예제 코드를 기준으로 보면, 함수 본문 내에서 호출되는 순서는 다음과 같습니다. 1. `self:UpdateVelocity(delta)` 2. `self:UpdateAction()` 3. `self:UpdateAnimationState()` 4. `self:UpdateLookDirection()` 이 순서는 문서에 제시된 코드 블록에 명시되어 있습니다. 하지만 문서에는 이 특정 순서가 반드시 지켜져야 하는 기술적 제약 사항인지, 혹은 단순한 예시인지에 대한 설명이 포함되어 있지 않습니다. [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] | SideViewRectTileMap에서 캐릭터 이동 제어 [question] | 공중 상태(`AirAccel`, `AirDrag`)의 값을 지면 상태(`Accel`, `Drag`)보다 작게 설정하는 것이 캐릭터의 물리적 움직임에 어떤 영향을 미치나요? [answer] | 제공된 문서를 기반으로 분석한 결과, `AirAccel`과 `AirDrag` 값을 지면 상태 값보다 작게 설정하는 것은 **공중에서의 조작 응답성과 속도를 제어**하는 데 영향을 미칩니다. 구체적인 영향은 다음과 같습니다. 1. **공중 가속도 (`AirAccel`)가 작을 경우:** * 캐릭터가 공중에 떠 있을 때 방향키를 눌러 속도를 변경하려는 반응이 지면보다 느려집니다. * 지면에서의 빠른 방향 전환에 비해 공중에서는 방향 전환이 더 부드럽거나 둔하게 느껴질 수 있습니다. 2. **공중 마찰력 ( [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] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 물리 joint 활용하기 [question] | 공 만들기 단계에서 PhysicsRigidbodyComponent와 PhysicsColliderComponent에 설정해야 할 값을 3문장 이내로 요약하시오. [answer] | PhysicsRigidbodyComponent의 BodyType을 Dynamic으로 설정하고, PhysicsColliderComponent의 ColliderType을 Circle로 변경한 후 CircleRadius를 스프라이트 크기에 맞게 조절해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | WheelJoint는 연결된 엔티티가 바퀴처럼 동작하도록 제한을 설정합니다. Motor를 사용한 TargetEntityRef는 MotorSpeed 값을 목표 속도로 사용합니다. | 주요 프로퍼티 | 설명 | | --- | --- | | **MaxMotorTorque** | 목표 모터 속도에 도달하기 위한 Joint의 모터에 적용할 수 있는 최대 힘을 설정합니다. | | **MotorEnable** | Motor를 사용할지 여부를 설정합니다. True일 경우 연결된 Entity가 LocalAxis 방향의 힘을 받습니다. | | *