[task] | code [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | KinematicbodyComponent의 ApplyClimbableRotation 프로퍼티를 False로 설정하여 사다리 기울기에 영향을 받지 않도록 하는 스크립트를 작성해줘 [answer] | `KinematicbodyComponent`의 `ApplyClimbableRotation` 프로퍼티는 True인 경우 캐릭터가 회전하거나 기울어진 사다리를 탈 때 사다리의 기울기에 맞춰 자세가 변하고, False로 설정하면 사다리의 기울기나 회전에 영향을 받지 않고 직립 자세를 유지합니다. 이 프로퍼티는 컴포넌트의 속성이므로, 스크립트에서 해당 엔티티의 `KinematicbodyComponent`를 참조하여 `ApplyClimbableRotation` 값을 `false`로 설정하면 됩니다. 아래는 캐릭터 엔티티에 적용하는 예제 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 RectTileMap에서는 KinematicbodyComponent로 캐릭터의 이동을 제어합니다. 크리에이터는 KinematicbodyComponent를 통해 캐릭터를 2차원 평면에서 자유롭게 움직이고 점프하게 할 수 있습니다. 또한 그림자를 그릴 수도 있습니다. 이번 시간에는 KinematicbodyComponent에 대해 알아보고 간단한 예제를 통해 활용법을 살펴봅시다. ##### 참고 API Reference [KinematicbodyComponent](/apiReference/Components/Ki
[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | `TweenLogic` 서비스의 `MoveTo()` 메서드를 사용해 엔티티가 현재 위치에서 x축 0.5만큼 이동하도록 4.0초간 `EaseType.BounceEaseOut`으로 트윈을 생성하고, `LoopType`을 `TweenLoopType.PingPong`으로 설정하며 `AutoDestroy`를 false로 한 뒤 `OnEndPlay`에서 해당 트윈을 수동으로 파괴하는 스크립트를 작성해줘. [answer] | 요청하신 조건을 만족하는 mLua 스크립트는 다음과 같습니다. `OnBeginPlay`에서 `_TweenLogic:MoveTo()`를 호출하여 트윈을 생성하고, 반환된 `Tweener` 객체의 속성을 설정한 뒤, `OnEndPlay`에서 `Destroy()`를 호출하여 트윈을 정리합니다. ```lua Property: [None] any tween = nil Method: [server only] void OnBeginPlay() { local targetX = self.Entity.TransformComponent.Po [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하
[task] | single_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | 점프를 더 높이 하게 만들고 싶을 때 JumpSpeed만 조절하면 되나요, 아니면 다른 프로퍼티도 함께 고려해야 하나요? [answer] | **JumpSpeed**만 조절하는 것이 가장 직접적인 방법이지만, 점프의 체감 높이나 지속 시간에 영향을 주는 **JumpDrag** 프로퍼티도 함께 고려하는 것이 좋습니다. ### 1. JumpSpeed (점프 속력) * **역할:** 점프를 시작할 때 캐릭터가 위로 튀어 오르는 초기 속력을 결정합니다. * **조절 효과:** 값을 **크게** 할수록 점프의 초기 속력이 빨라져 더 높은 곳까지 날아오릅니다. ### 2. JumpDrag (점프 속력 감소량) * **역할:** 점프 중 지심으로 떨어지는 속력 감소량( [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 RectTileMap에서는 KinematicbodyComponent로 캐릭터의 이동을 제어합니다. 크리에이터는 KinematicbodyComponent를 통해 캐릭터를 2차원 평면에서 자유롭게 움직이고 점프하게 할 수 있습니다. 또한 그림자를 그릴 수도 있습니다. 이번 시간에는 KinematicbodyComponent에 대해 알아보고 간단한 예제를 통해 활용법을 살펴봅시다. ##### 참고 API Reference [KinematicbodyComponent](/apiReference/Components/Ki
[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | `TweenLogic` 서비스의 `MoveTo()` 메서드를 활용해 엔티티가 y축 5.0 위치까지 1.0초간 `EaseType.BounceEaseIn`으로 이동하도록 하며, `LoopCount`를 -1로 설정해 무한 반복되도록 하고 `OnEndPlay`에서 `Destroy()`를 호출해 메모리 누수를 방지하는 스크립트를 작성해줘. [answer] | 요청하신 조건에 따라 `TweenLogic` 서비스의 `MoveTo()` 메서드를 활용한 스크립트는 다음과 같습니다. ```lua Property: [None] any tween = nil Method: [server only] void OnBeginPlay() { -- 현재 엔티티의 x 위치를 유지하고 y 위치를 5.0으로 이동 local targetPosition = Vector2(self.Entity.TransformComponent.Position.x, 5.0) -- MoveTo 호출: (엔 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하
[task] | two_turn [pass] | ⏳ 미판정 [title] | 메이플 타일맵 만들기 [question] | 지우개 커서를 사용하여 지형을 삭제할 때, 타일과 다른 엔티티를 분리하여 삭제하는 옵션은 어떻게 설정하는가? [answer] | 지우개 커서를 선택한 후, 지우개 커서 옵션을 변경하여 타일과 다른 엔티티를 분리하여 삭제할 수 있습니다. 구체적인 설정 방법은 다음과 같습니다: 1. **TileOnly**: 이 옵션을 선택하면 타일만 지울 수 있습니다. 2. **TileExceptOnly**: 이 옵션을 선택하면 타일 외 다른 엔티티만 지울 수 있습니다. 참고로, 전체 지우개 커서는 지형뿐만 아니라 다른 엔티티까지도 삭제하므로 주의가 필요합니다. 따라서 원하는 대상만 삭제하려면 위 두 옵션 중 하나를 선택하는 것이 좋습니다. [followup] | TileOnly 또는 TileExceptOnly 옵션을 변경하여 특정 대상만 삭제하는 로직을 구현하기 위해, 해당 지우개 커서 설정 값을 mLua 스크립트 내에서 제어하는 API나 프로퍼티가 있는지? [followup_answer] | 제공된 참고 문서에는 지우개 커서의 `TileOnly` 또는 `TileExceptOnly` 옵션을 mLua 스크립트 내에서 제어하는 API나 프로퍼티에 대한 정보가 없습니다. 문서에는 해당 옵션들이 지우개 커서 설정에서 변경될 수 있다는 사실만 언급되어 있으며, 이를 스크립트로 조작하는 방법은 설명되어 있지 않습니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 여러 가지 지형과 이동 방식을 제공하고 있습니다. 이번 시간에는 가장 기본이 되는 지형인 메이플스토리 형태의 타일 맵에 대해 알아보겠습니다. 메이플스토리 형태의 지형은 메이플스토리 형태의 이동과 매우 밀접한 연관이 있습니다. > **더 알아보기** > 메이플스토리 형태의 이동에 대해서는 [메이플 이동 개념 이해하기](/docs?postId=750)를 참고해주세요. # 메이플스토리 형태의 지형 메이플스토리 형태의 지형은 타일 에디터에서 MapleTile 모드를 선택한 후 만들 수
[task] | code [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | KinematicbodyComponent의 EnableJump 프로퍼티를 True로 설정하고 JumpSpeed를 15.0으로 조정하여 점프 기능을 활성화하는 스크립트를 작성해줘 [answer] | KinematicbodyComponent는 컴포넌트 프로퍼티를 직접 스크립트에서 설정하는 것이 아니라, 에디터의 **Workspace - DefaultPlayer - Property** 창에서 해당 컴포넌트를 선택하여 값을 조정하는 방식으로 구성됩니다. 참고 문서에 따르면, `KinematicbodyComponent`의 프로퍼티는 다음과 같이 설정합니다. 1. **EnableJump**: `True`로 설정하여 점프 기능을 활성화합니다. 2. **JumpSpeed**: `15.0`으로 설정하여 점프 속력을 조절합니다. mL [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 RectTileMap에서는 KinematicbodyComponent로 캐릭터의 이동을 제어합니다. 크리에이터는 KinematicbodyComponent를 통해 캐릭터를 2차원 평면에서 자유롭게 움직이고 점프하게 할 수 있습니다. 또한 그림자를 그릴 수도 있습니다. 이번 시간에는 KinematicbodyComponent에 대해 알아보고 간단한 예제를 통해 활용법을 살펴봅시다. ##### 참고 API Reference [KinematicbodyComponent](/apiReference/Components/Ki
[task] | single_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | OnUpdate에서 kb.EnableTileCollision을 지면에 있을 때만 true로 설정하는 코드의 목적은 무엇인가요? [answer] | `kb.EnableTileCollision`을 `kb:IsOnGround()`의 결과에 따라 설정하는 코드의 목적은 **캐릭터가 지면에 닿아 있을 때만 타일과 충돌하도록 제한하기** 위함입니다. 구체적으로 설명하면 다음과 같습니다. 1. **공중 상태에서의 충돌 방지**: 캐릭터가 점프하여 공중에 있을 때 `kb:IsOnGround()`는 `false`가 됩니다. 이때 `EnableTileCollision`도 `false`가 되어, 캐릭터가 공중에서 타일과 충돌하지 않게 됩니다. 이는 캐릭터가 벽이나 지형의 측면을 타고 올라가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 장애물 타일 피하기 점프로만 넘어갈 수 있는 장애물을 만들고, 장애물을 밟으면 캐릭터가 죽도록 설정해 봅시다. 1. 맵에 Trap 타일을 배치합니다. 2. **MyDesk** 아래에 새 스크립트 컴포넌트 **CheckTrapTile**를 만든 뒤, **DefaultPlayer**에 추가합니다. 3. 아래와 같이 **CheckTrapTile**을 작성합니다. ```lua Property: [None] string CurrentTileName = "" Met
[task] | two_turn [pass] | ⏳ 미판정 [title] | 메이플 타일맵 만들기 [question] | 선 칠하기 모드에서 격자 보조선의 '점', '선', '면' 영역을 클릭할 때 생성되는 지형의 형태와 대각선 지형 생성 조건은 무엇인가? [answer] | 선 칠하기 모드에서 격자 형태의 보조선(그리드)을 클릭하면 클릭한 위치에 따라 생성되는 지형의 모양이 달라집니다. 구체적인 형태와 대각선 지형 생성 조건은 다음과 같습니다. 1. **점(점 클릭)** * **생성되는 지형:** 보조선이 교차하는 점을 클릭하면 그 지점에 **작은 지형**이 생성됩니다. 2. **선(선 클릭)** * **생성되는 지형:** 선을 클릭하면 **양쪽 교차 지점을 포함한 선까지** 지형이 생성됩니다. 3. **면(면 클릭)** * **생성되는 지형:** 면을 클릭하 [followup] | 아래와 옆 선에 이미 지형이 존재하는 상태에서 면의 가운데를 클릭했을 때, mLua 스크립트 관점에서 해당 대각선 타일의 좌표 또는 상태를 확인하기 위한 접근 방식은? [followup_answer] | 제공된 참고 문서에는 대각선 타일의 좌표나 상태를 확인하기 위한 mLua 스크립트 접근 방식(특정 API, 메서드, 프로퍼티 등)에 대한 정보가 포함되어 있지 않습니다. 문서에는 대각선 지형이 생성되는 **조건**(아래와 옆 선에 지형이 있는 상태에서 면의 가운데를 클릭)만 설명되어 있을 뿐, 생성된 타일의 데이터를 스크립트로 조회하거나 수정하는 방법에 대한 내용은 없습니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 여러 가지 지형과 이동 방식을 제공하고 있습니다. 이번 시간에는 가장 기본이 되는 지형인 메이플스토리 형태의 타일 맵에 대해 알아보겠습니다. 메이플스토리 형태의 지형은 메이플스토리 형태의 이동과 매우 밀접한 연관이 있습니다. > **더 알아보기** > 메이플스토리 형태의 이동에 대해서는 [메이플 이동 개념 이해하기](/docs?postId=750)를 참고해주세요. # 메이플스토리 형태의 지형 메이플스토리 형태의 지형은 타일 에디터에서 MapleTile 모드를 선택한 후 만들 수
[task] | two_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent와 SpritePattern 셰이더를 조합해 선을 그리는 기본 절차가 어떻게 되나요? [answer] | LineRendererComponent와 SpritePattern 셰이더를 조합해 선을 그리는 기본 절차는 다음과 같습니다. 1. **머티리얼 생성 및 셰이더 설정** * Workspace > MyDesk > Create Material을 선택해 새로운 Material을 생성합니다. * 생성한 머티리얼의 프로퍼티 창에서 Shader 항목을 `LineRenderer` > `SpritePattern`으로 선택합니다. * `SpriteRUID`에 사용할 이미지를 지정합니다. * 필요 시 `O [followup] | LinePoints 수가 10000개를 초과하거나 IsSmooth를 활성화했을 때 발생하는 제한 사항과 성능 문제는 무엇인가요? [followup_answer] | LinePoints 수와 IsSmooth 옵션 사용 시 발생하는 제한 사항은 다음과 같습니다. 1. **LinePoints 수 제한 (10,000개 초과 시)** * `LinePoints`의 총 개수가 **10,000개**를 초과하면, 10,000번째 지점 이후에 추가된 `LinePoints`는 **선이 그려지지 않습니다**. 2. **IsSmooth 활성화 시 제한 (약 1,000개)** * `IsSmooth` 옵션을 활성화하면, 그릴 수 있는 `LinePoints`의 총 개수가 **약 1,000개** [scores] | [judge_reason] | [source_doc] | 머티리얼의 SpritePattern 셰이더를 활용해 선을 그릴 수 있습니다. 머티리얼 활용 방법은 [머티리얼 활용하기](docs/?postId=828)를 참고하세요. LineRendererComponent에 활용하는 스프라이트로는 유저 리소스와 복제한 MSW 리소스를 사용할 수 있습니다. MSW 리소스 복제 방법은 [리소스 관리](docs/?postId=690)를 참고하세요. 1. **Workspace - MyDesk - Create Material**을 선택해 새로운 Material을 만듭니다. 2. 생성한 머티리얼의 프로퍼티
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | 서버 측에서 posX, posY 프로퍼티를 갱신하고 클라이언트 측에서 이를 읽어 렌더링하는 구조가 아니라면, 현재 스크립트처럼 서버에서만 위치를 변경하는 방식의 한계점은 무엇인가요? [answer] | 제시된 문서의 `BallComponent` 스크립트 예시를 분석할 때, 서버에서만 위치를 변경하는 방식(`[server only]` 속성)의 한계점은 다음과 같습니다. **1. 클라이언트에서 직접 위치 변경이 불가능함** 문서 예시에서 `OnUpdate` 메서드가 `[server only]`로 선언되어 있습니다. ```lua [server only] void OnUpdate(number delta) { -- 프레임마다 변경되는 posX, PosY 프로퍼티 값을 TransformComponent.Position에 할당 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 높은 곳에서 공을 던졌을 때 공이 앞으로 나아감과 동시에 통통 튀게 만들어 봅시다. 1. 새로운 Model_Ball 모델을 생성합니다. TransformComponent, SpriteRendererComponent를 추가하고, 아래의 Ruid를 사용합니다. * SpriteRuid: d4dddd1f07d445939433f70cd1aa82fa 2. 새로운 BallComponent 생성하고, Model Ball에 추가합니다. 3. 공이 돌면서 날아가게 만들기 위해 `PlayTween()`과 `RotateTo()`를
[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | `TweenLogic` 서비스의 `MoveTo()` 메서드를 이용해 엔티티가 시작 위치에서 x축 10.0 위치까지 2.0초 동안 `EaseType.Linear`로 이동하도록 하고, 트윈이 끝나면 자동으로 파괴되도록 설정하는 스크립트를 작성해줘. [answer] | `_TweenLogic:MoveTo()` 메서드를 사용해 엔티티를 이동시키는 스크립트입니다. 요구사항에 따라: 1. **목적지**: 현재 y좌표를 유지하고 x좌표를 10.0으로 설정 (`Vector2(10.0, self.Entity.TransformComponent.Position.y)`). 2. **시간**: 2.0초. 3. **이징 타입**: `EaseType.Linear`. 4. **자동 파괴**: 트윈이 끝나면 자동으로 파괴되도록 `AutoDestroy`를 `true`로 설정합니다. (문서 예시에서는 `false`로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하
[task] | single_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | 타일 셋 편집 모드에서 이동 가능 여부를 체크한 뒤 빨간색 화살표 아이콘을 가진 타일을 선택하면, 해당 타일 위를 캐릭터가 걸을 수 없게 되는 것인가요? [answer] | 네, 그렇습니다. 타일 셋 편집 모드에서 **이동 가능 여부**를 체크한 상태로 빨간색 화살표 아이콘을 가진 타일을 선택하면, 해당 타일은 **이동 불가 타일**로 설정됩니다. 따라서 캐릭터는 그 타일 위를 걸을 수 없게 됩니다. 반대로 초록색 화살표 아이콘은 이동 가능 타일을 의미합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 밟으면 속도가 증가하는 타일을 만들어 봅시다. 1. 타일맵 모드를 RectTile로 설정합니다. 2. 타일 셋 팔레트 좌측 상단의 **[+]** 버튼을 누른 뒤, **Create TileSet From Template - BnB** 타일 셋을 선택합니다. 3. 타일 셋의 이름을 **BnB TileSet**으로 설정합니다. 4. 타일 셋 팔레트 우측 상단의 편집 버튼을 눌러 타일 속성 편집 모드로 들어갑니다. 5. 편집 대상에서 **이동 가능 여부**를
[task] | single_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | IncreaseSpeedFactor 메서드에서 SpeedFactor를 증가시킬 때 x와 y 값을 동시에 1씩 더하고 있는데, 이는 이동 방향과 무관하게 모든 축의 속도가 증가한다는 의미인가요? [answer] | 네, 맞습니다. `IncreaseSpeedFactor` 메서드에서 `Vector2(oldSpeedFactor.x + 1, oldSpeedFactor.y + 1)`을 사용하므로, x축과 y축의 속도 계수(`SpeedFactor`)가 모두 1씩 증가합니다. 이는 캐릭터가 현재 어떤 방향으로 이동 중이든, 또는 방향과 무관하게 수평(x) 이동 속도와 수직(y) 이동 속도가 동시에 증가한다는 의미입니다. `KinematicbodyComponent.SpeedFactor`는 벡터 타입으로 x와 y 값을 각각 가지며, 이 두 값이 모두 동일하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 밟으면 속도가 증가하는 타일을 만들어 봅시다. 1. 타일맵 모드를 RectTile로 설정합니다. 2. 타일 셋 팔레트 좌측 상단의 **[+]** 버튼을 누른 뒤, **Create TileSet From Template - BnB** 타일 셋을 선택합니다. 3. 타일 셋의 이름을 **BnB TileSet**으로 설정합니다. 4. 타일 셋 팔레트 우측 상단의 편집 버튼을 눌러 타일 속성 편집 모드로 들어갑니다. 5. 편집 대상에서 **이동 가능 여부**를
[task] | single_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | CheckTrapTile 스크립트 컴포넌트를 DefaultPlayer에 추가하지 않고 맵의 다른 오브젝트에 붙였을 때 발생하는 문제는 무엇인가요? [answer] | CheckTrapTile 스크립트가 DefaultPlayer에 연결되지 않고 맵의 다른 오브젝트에 부착될 경우, 해당 스크립트는 플레이어의 이동이나 상태 변화를 추적할 수 없게 됩니다. 이 스크립트는 `self.Entity`를 통해 현재 스크립트가 부착된 엔티티(오브젝트)의 `KinematicbodyComponent`와 `PlayerComponent`에 접근하도록 작성되어 있습니다. 맵 오브젝트는 일반적으로 플레이어처럼 `KinematicbodyComponent`를 보유하거나, `PlayerComponent`를 가지고 있지 않습니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 장애물 타일 피하기 점프로만 넘어갈 수 있는 장애물을 만들고, 장애물을 밟으면 캐릭터가 죽도록 설정해 봅시다. 1. 맵에 Trap 타일을 배치합니다. 2. **MyDesk** 아래에 새 스크립트 컴포넌트 **CheckTrapTile**를 만든 뒤, **DefaultPlayer**에 추가합니다. 3. 아래와 같이 **CheckTrapTile**을 작성합니다. ```lua Property: [None] string CurrentTileName = "" Met
[task] | instruction_following [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | CheckTrapTile 스크립트에서 Trap 타일 감지 시 캐릭터 사망 처리를 수행하는 메서드와 이벤트 핸들러의 코드만 출력하고, 나머지 설명은 주석으로 작성하세요. [answer] | ```lua Property: [None] string CurrentTileName = "" Method: [client only] void OnUpdate(number delta) { local kb = self.Entity.KinematicbodyComponent -- 지면에 있을 때만 타일과 충돌합니다. kb.EnableTileCollision = kb:IsOnGround() -- 'Trap' 타일을 밟으면 죽습니다. 신중하게 점프하세요! if self.CurrentTileName == [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 장애물 타일 피하기 점프로만 넘어갈 수 있는 장애물을 만들고, 장애물을 밟으면 캐릭터가 죽도록 설정해 봅시다. 1. 맵에 Trap 타일을 배치합니다. 2. **MyDesk** 아래에 새 스크립트 컴포넌트 **CheckTrapTile**를 만든 뒤, **DefaultPlayer**에 추가합니다. 3. 아래와 같이 **CheckTrapTile**을 작성합니다. ```lua Property: [None] string CurrentTileName = "" Met
[task] | single_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | Buff 타일과 Trap 타일을 같은 Layer3에 배치할 때, 캐릭터가 두 타일이 겹치는 부분에 서 있으면 어떤 타일의 속성이 우선 적용되나요? [answer] | 제시된 문서에는 Buff 타일과 Trap 타일이 같은 Layer3에 겹쳐 배치되었을 때의 우선순위 규칙에 대한 정보가 포함되어 있지 않습니다. 문서에는 Layer3에 **Buff 타일을 배치하는 방법**(13단계)과 **Buff/Trap 타일 셋을 만드는 과정**(9~12단계)만 설명되어 있을 뿐, 두 타일이 물리적으로 겹치는 경우의 충돌 처리나 이벤트 우선순위 로직에 대해서는 언급이 없습니다. 따라서 현재 제공된 문서를 근거로 어떤 타일의 속성이 우선 적용되는지 답변할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 밟으면 속도가 증가하는 타일을 만들어 봅시다. 1. 타일맵 모드를 RectTile로 설정합니다. 2. 타일 셋 팔레트 좌측 상단의 **[+]** 버튼을 누른 뒤, **Create TileSet From Template - BnB** 타일 셋을 선택합니다. 3. 타일 셋의 이름을 **BnB TileSet**으로 설정합니다. 4. 타일 셋 팔레트 우측 상단의 편집 버튼을 눌러 타일 속성 편집 모드로 들어갑니다. 5. 편집 대상에서 **이동 가능 여부**를
[task] | instruction_following [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | CheckTrapTile 컴포넌트의 Property, Method, Event Handler 구성 요소와 각 블록의 핵심 역할(현재 타일명 저장, 지면 충돌 제어 및 사망 판정, 타일 진입 이벤트 처리)을 표로 정리하세요. [answer] | CheckTrapTile 컴포넌트의 구성 요소와 각 블록의 핵심 역할은 다음과 같습니다. | 구성 요소 (블록) | 핵심 역할 | 상세 설명 | | :--- | :--- | :--- | | **Property** | 현재 타일명 저장 | `CurrentTileName` 프로퍼티를 정의하여 캐릭터가 가장 최근에 진입한 타일의 이름을 저장합니다. | | **Method** | 지면 충돌 제어 및 사망 판정 | `OnUpdate` 메서드에서 실행되며, 캐릭터가 지면에 있을 때만 타일 충돌을 활성화합니다. 또한 현재 타일명이 "Trap" [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 장애물 타일 피하기 점프로만 넘어갈 수 있는 장애물을 만들고, 장애물을 밟으면 캐릭터가 죽도록 설정해 봅시다. 1. 맵에 Trap 타일을 배치합니다. 2. **MyDesk** 아래에 새 스크립트 컴포넌트 **CheckTrapTile**를 만든 뒤, **DefaultPlayer**에 추가합니다. 3. 아래와 같이 **CheckTrapTile**을 작성합니다. ```lua Property: [None] string CurrentTileName = "" Met
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | 문서의 TrailDrawer 컴포넌트에서 선이 사라지는 로직을 담당하는 메서드 이름과, 해당 메서드가 호출되는 주기를 3문장 이내로 설명하세요. [answer] | 선이 사라지는 로직을 담당하는 메서드 이름은 `EraseTail`입니다. 이 메서드는 `OnUpdate` 함수 내부에서 매 프레임마다 호출됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 플레이어를 따라 다니는 모델을 만들어, 플레이어의 움직임을 따라 선이 그려지고, 사라지게 만들어봅시다. 1. Trail 모델을 생성하고, TransformComponent와 LineRendererComponent를 추가합니다. 2. 새로운 TrailDrawer 컴포넌트를 생성하고, Trail 모델에 추가합니다. ```lua [None] Vector3 PrevPos = Vector3(0,0,0) [None] number Threshold = 0.1 [None] number P
[task] | single_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | RectTileEnterEvent 이벤트의 매개변수 중 TileInfo.Name 값은 언제 갱신되며, 이 값이 이전 타일 이름으로 남아있을 수 있는 이유가 있나요? [answer] | `RectTileEnterEvent` 이벤트의 `TileInfo.Name` 값은 캐릭터가 **새로운 타일에 진입하는 시점**에 갱신됩니다. 이 값이 이전 타일 이름으로 남아있을 수 있는 이유는 다음과 같습니다. 1. **이벤트 발생 시점**: `RectTileEnterEvent`는 캐릭터가 타일 경계를 넘어 새로운 타일 영역에 들어올 때만 발생합니다. 캐릭터가 같은 타일 위에 머무르고 있을 때는 이 이벤트가 발생하지 않습니다. 2. **초기값 또는 마지막 진입 타일**: 스크립트에서 `CurrentTileName`과 같은 프 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 장애물 타일 피하기 점프로만 넘어갈 수 있는 장애물을 만들고, 장애물을 밟으면 캐릭터가 죽도록 설정해 봅시다. 1. 맵에 Trap 타일을 배치합니다. 2. **MyDesk** 아래에 새 스크립트 컴포넌트 **CheckTrapTile**를 만든 뒤, **DefaultPlayer**에 추가합니다. 3. 아래와 같이 **CheckTrapTile**을 작성합니다. ```lua Property: [None] string CurrentTileName = "" Met
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | _OnBeginPlay() 내에서 _UtilLogic:RandomIntegerRange()로 계산된 값을 _TweenLogic에 전달할 때, 소수점 계산 오류로 인해 예상보다 먼 거리까지 날아가는 문제를 해결하려면 어떤 수치를 조정해야 하나요? [answer] | `_UtilLogic:RandomIntegerRange()`는 정수 범위를 반환하며, 이 값을 소수로 나누어 거리(또는 회전 각도)를 계산할 때 소수점 오차나 반올림 문제가 발생할 수 있습니다. 참고 문서의 예제 코드를 보면, `RandomIntegerRange`로 얻은 값을 단순히 `/10` 또는 `/100`으로 나누는 방식이 사용되고 있습니다. 예상보다 먼 거리까지 날아가는 문제를 해결하려면, **나눗셈의 분모(디바이저) 값을 조정**하거나 **RandomIntegerRange의 범위를 축소**해야 합니다. 구체적으로 조정해 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 높은 곳에서 공을 던졌을 때 공이 앞으로 나아감과 동시에 통통 튀게 만들어 봅시다. 1. 새로운 Model_Ball 모델을 생성합니다. TransformComponent, SpriteRendererComponent를 추가하고, 아래의 Ruid를 사용합니다. * SpriteRuid: d4dddd1f07d445939433f70cd1aa82fa 2. 새로운 BallComponent 생성하고, Model Ball에 추가합니다. 3. 공이 돌면서 날아가게 만들기 위해 `PlayTween()`과 `RotateTo()`를
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | OnUpdate 메서드 내에서 선의 포인트가 추가되지 않도록 반환(return)하는 조건에 포함된 변수명과 그 비교 연산자를 표로 정리해서 출력하세요. [answer] | OnUpdate 메서드 내에서 선의 포인트가 추가되지 않도록 반환(return)하는 조건은 다음과 같습니다. | 변수명 | 비교 연산자 | | :--- | :--- | | `dist` < `self.Threshold` | `<` (작다) | *참고: `dist`는 `Vector3.Distance(self.PrevPos, currPos)`로 계산된 값이며, `self.Threshold`는 프로퍼티로 정의된 임계값입니다.* [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 플레이어를 따라 다니는 모델을 만들어, 플레이어의 움직임을 따라 선이 그려지고, 사라지게 만들어봅시다. 1. Trail 모델을 생성하고, TransformComponent와 LineRendererComponent를 추가합니다. 2. 새로운 TrailDrawer 컴포넌트를 생성하고, Trail 모델에 추가합니다. ```lua [None] Vector3 PrevPos = Vector3(0,0,0) [None] number Threshold = 0.1 [None] number P
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | OnEndPlay 메서드에서 TrailEntity가 nil인지 확인하는 조건문과 파괴 처리 코드를 3문장 이내의 설명과 함께 제시하세요. [answer] | `OnEndPlay` 메서드에서 `self.TrailEntity`가 `nil`이 아닌지 확인하여, 값이 존재할 때만 `Destroy()`를 호출합니다. 이는 스폰된 객체가 없거나 이미 삭제된 상태에서 파괴를 시도하는 것을 방지하기 위함입니다. ```lua void OnEndPlay () { if self.TrailEntity ~= nil then self.TrailEntity:Destroy() end } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 3. 새로운 TrailSpawner 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 4. TrailSpawner 컴포넌트에 움직임에 따라 선이 스폰되도록 `SpawnService`를 활용해 아래와 같이 작성합니다. SpawnByModelId에는 Trail의 ID를 입력해야합니다. 예시의 ID를 사용하면 정상 동작하지 않으므로 주의해 작성하세요. ```lua Property: [None] Entity TrailEntity = nil Method: [client
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | BounceEaseOut 이징 타입을 적용했을 때 공이 바닥에 닿지 않고 허공에서 튕기는 것처럼 보이는 현상을 방지하려면 yDestination 값을 어떻게 설정해야 하나요? [answer] | BounceEaseOut 이징 타입은 시작점에서 끝점으로 이동하면서 중간에 여러 번 튀는(반동하는) 동작을 시뮬레이션합니다. 이 이징의 특성상, **이징 프로세스가 완료되는 시점(즉, tweenDuration이 지난 시점)에 엔티티는 반드시 `to` 값(목적지)에 정확히 도달하게 됩니다.** 따라서 공이 바닥에 닿지 않고 허공에서 멈추거나 떠 있는 것처럼 보이는 현상은 `yDestination` 값이 실제 바닥의 Y 좌표보다 높게 설정되었기 때문입니다. 이 현상을 방지하려면 **`yDestination` 값을 공이 최종적으로 멈 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 높은 곳에서 공을 던졌을 때 공이 앞으로 나아감과 동시에 통통 튀게 만들어 봅시다. 1. 새로운 Model_Ball 모델을 생성합니다. TransformComponent, SpriteRendererComponent를 추가하고, 아래의 Ruid를 사용합니다. * SpriteRuid: d4dddd1f07d445939433f70cd1aa82fa 2. 새로운 BallComponent 생성하고, Model Ball에 추가합니다. 3. 공이 돌면서 날아가게 만들기 위해 `PlayTween()`과 `RotateTo()`를
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent의 Size 값을 3으로 설정했는데 왜 선이 제대로 안 그려지고 있죠? [answer] | LineRendererComponent의 `Size` 값을 3으로 설정했지만 선이 제대로 그려지지 않는 가장 흔한 원인은 `Points`에 실제 위치(`Position`) 정보가 올바르게 입력되지 않았기 때문입니다. 문서 내용에 따르면 `Size`는 단순히 선을 구성할 점의 개수(용량)를 지정할 뿐이며, 실제 선이 그려지려면 각 점에 대한 `Position` 값이 반드시 설정되어야 합니다. 또한, 최소 2개 이상의 점이 위치 정보를 가져야만 선이 연결되어 그려집니다. 따라서 `Size`를 3으로 설정했다면, `Points` 목록 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 LineRendererComponent를 활용해 다양한 선을 월드에 자유롭게 그릴 수 있습니다. # LineRendererComponent LineRendererComponent는 점의 개수를 지정해 MapleTile, RectTile 위에서 원하는 직선, 곡선을 그릴 수 있습니다. LineRendererComponent 하나당 하나의 선을 그릴 수 있으므로, 여러 선을 표현하고 싶다면 여러 개의 LineRendererComponent가 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티는 아래와 같습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | IsSmooth를 켜면 곡선이 되는데, 특정 지점만 날카롭게 꺾이고 나머지만 부드럽게 만들 수 있는 방법이 있을까요? [answer] | 제공된 문서에 따르면, `IsSmooth` 프로퍼티는 컴포넌트 전체에 적용되는 전역 설정이며, 선의 일부 지점만 날카롭게 하고 나머지만 부드럽게 만드는 개별 제어 기능이 존재하지 않습니다. 문서에서 `IsSmooth`의 동작 방식은 다음과 같이 설명하고 있습니다. * **활성화 시**: 부드러운 곡선으로 그려집니다. * **비활성화 시**: 날카로운 꺾은 선으로 그려집니다. 따라서 특정 지점만 날카롭게 표현하려면 `IsSmooth`를 비활성화한 상태에서 날카로운 꺾임이 필요한 부분을 표현하고, 부드러운 곡선이 필요한 부분 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 LineRendererComponent를 활용해 다양한 선을 월드에 자유롭게 그릴 수 있습니다. # LineRendererComponent LineRendererComponent는 점의 개수를 지정해 MapleTile, RectTile 위에서 원하는 직선, 곡선을 그릴 수 있습니다. LineRendererComponent 하나당 하나의 선을 그릴 수 있으므로, 여러 선을 표현하고 싶다면 여러 개의 LineRendererComponent가 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티는 아래와 같습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | Trap 타일을 밟았을 때 캐릭터가 즉시 사망하도록 처리하려면 어떤 이벤트 핸들러와 메서드를 조합해야 하나요? [answer] | RectTileMap에서 Trap 타일을 밟았을 때 캐릭터가 즉시 사망하도록 처리하려면, **`HandleRectTileEnterEvent`** 이벤트 핸들러와 **`OnUpdate`** 메서드를 조합해야 합니다. 작동 원리는 다음과 같습니다. 1. **`HandleRectTileEnterEvent`**: 캐릭터가 타일 위에 올라가는 순간 해당 타일의 이름(`TileInfo.Name`)을 저장합니다. 2. **`OnUpdate`**: 매 프레임마다 현재 저장된 타일 이름이 "Trap"인지 확인하고, 동시에 캐릭터가 지면에 있는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 장애물 타일 피하기 점프로만 넘어갈 수 있는 장애물을 만들고, 장애물을 밟으면 캐릭터가 죽도록 설정해 봅시다. 1. 맵에 Trap 타일을 배치합니다. 2. **MyDesk** 아래에 새 스크립트 컴포넌트 **CheckTrapTile**를 만든 뒤, **DefaultPlayer**에 추가합니다. 3. 아래와 같이 **CheckTrapTile**을 작성합니다. ```lua Property: [None] string CurrentTileName = "" Met
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | AddPoint 메서드에서 LineRendererComponent 에 추가되는 점의 색상 생성 방식을 코드 블록으로만 출력하되, 설명은 주석으로 작성하세요. [answer] | ```lua [client only] void AddPoint(Vector3 pos) { local line = self.Entity.LineRendererComponent local pointPos = Vector2(pos.x, pos.y + 0.25) -- 각 채널(R, G, B)에 0.0부터 1.0 사이의 무작위 실수를 부여하여 랜덤 색상을 생성합니다. local r = _UtilLogic:RandomDouble() local g = _UtilLogic:RandomDouble() [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 플레이어를 따라 다니는 모델을 만들어, 플레이어의 움직임을 따라 선이 그려지고, 사라지게 만들어봅시다. 1. Trail 모델을 생성하고, TransformComponent와 LineRendererComponent를 추가합니다. 2. 새로운 TrailDrawer 컴포넌트를 생성하고, Trail 모델에 추가합니다. ```lua [None] Vector3 PrevPos = Vector3(0,0,0) [None] number Threshold = 0.1 [None] number P
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | 머티리얼 생성 후 Shader를 LineRenderer - SpritePattern으로 변경했는데, 선의 두께와 위치를 조정하려면 LineRendererComponent의 어떤 프로퍼티를 수정해야 하나요? [answer] | LineRendererComponent의 **Size**와 **Position** 프로퍼티를 수정하여 선의 두께와 위치를 조정합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 머티리얼의 SpritePattern 셰이더를 활용해 선을 그릴 수 있습니다. 머티리얼 활용 방법은 [머티리얼 활용하기](docs/?postId=828)를 참고하세요. LineRendererComponent에 활용하는 스프라이트로는 유저 리소스와 복제한 MSW 리소스를 사용할 수 있습니다. MSW 리소스 복제 방법은 [리소스 관리](docs/?postId=690)를 참고하세요. 1. **Workspace - MyDesk - Create Material**을 선택해 새로운 Material을 만듭니다. 2. 생성한 머티리얼의 프로퍼티
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LinePoints를 15,000개 설정했는데 일부 선이 안 보일 때, IsSmooth 설정과 무관하게 공통적인 원인은 무엇인가요? [answer] | LinePoints 수가 10,000개를 초과하는 경우, 그 이후에 추가된 LinePoints는 선이 그려지지 않습니다. 따라서 15,000개를 설정했을 때 일부 선이 안 보이는 공통적인 원인은 10,000개 한도 초과이며, 이는 IsSmooth 설정과 무관하게 적용되는 제한입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 머티리얼의 SpritePattern 셰이더를 활용해 선을 그릴 수 있습니다. 머티리얼 활용 방법은 [머티리얼 활용하기](docs/?postId=828)를 참고하세요. LineRendererComponent에 활용하는 스프라이트로는 유저 리소스와 복제한 MSW 리소스를 사용할 수 있습니다. MSW 리소스 복제 방법은 [리소스 관리](docs/?postId=690)를 참고하세요. 1. **Workspace - MyDesk - Create Material**을 선택해 새로운 Material을 만듭니다. 2. 생성한 머티리얼의 프로퍼티
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | SpawnByModelId 호출 시 필요한 파라미터 네 개를 표로 정리해서 출력하세요. [answer] | SpawnByModelId 호출 시 필요한 파라미터 네 개는 다음과 같습니다. | 순서 | 파라미터 | 설명 | | :--- | :--- | :--- | | 1 | modelId | 스폰할 모델의 ID (문서 예시: `"8ae67c69-32ac-40e3-82b1-03d140e3-82b1-03d1409be467"`) | | 2 | name | 스폰된 엔티티의 이름 (문서 예시: `"Trail"`) | | 3 | position | 스폰될 위치 (문서 예시: `Vector3.zero`) | | 4 | parent | 부모 엔티티 (문 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 3. 새로운 TrailSpawner 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 4. TrailSpawner 컴포넌트에 움직임에 따라 선이 스폰되도록 `SpawnService`를 활용해 아래와 같이 작성합니다. SpawnByModelId에는 Trail의 ID를 입력해야합니다. 예시의 ID를 사용하면 정상 동작하지 않으므로 주의해 작성하세요. ```lua Property: [None] Entity TrailEntity = nil Method: [client