[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | 삼각형을 그리고 싶은데 Loop를 켜도 꼭짓점 사이가 안 이어지고 끊어져 보이는데, 포인트 개수나 순서 때문인가요? [answer] | 참고 문서에 따르면, `LineRendererComponent`의 `Loop` 프로퍼티는 활성화 시 **시작점과 끝점을 이어 닫힌 선**을 그려줍니다. 따라서 `Loop`를 켜고도 꼭짓점 사이가 이어지지 않고 끊어져 보인다면, 주로 **포인트 개수(Size) 설정** 또는 **Points 추가 방식** 때문일 가능성이 높습니다. 문서의 지침에 따라 삼각형을 올바르게 그리는 방법은 다음과 같습니다. ### 1. 포인트 개수(Size) 확인 삼각형은 꼭짓점 3개가 필요합니다. 문서의 "삼각형 그리기" 섹션에 따르면 `Size`에 * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 LineRendererComponent를 활용해 다양한 선을 월드에 자유롭게 그릴 수 있습니다. # LineRendererComponent LineRendererComponent는 점의 개수를 지정해 MapleTile, RectTile 위에서 원하는 직선, 곡선을 그릴 수 있습니다. LineRendererComponent 하나당 하나의 선을 그릴 수 있으므로, 여러 선을 표현하고 싶다면 여러 개의 LineRendererComponent가 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티는 아래와 같습니다.
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent의 IsSmooth를 활성화하고 Points Size를 5로 설정한 후, Position을 (0,0), (1,1), (2,0), (3,1), (4,0)으로 지정하여 부드러운 S자형 곡선을 그리는 스크립트를 작성해줘 [answer] | LineRendererComponent의 `IsSmooth`를 활성화하고 5개의 점을 통해 부드러운 S자형 곡선을 그리려면, 해당 컴포넌트가 포함된 엔티티의 스크립트에서 `OnBeginPlay` 시점에 포인트를 설정하면 됩니다. 제공된 문서의 `DrawCircle` 예제를 참고하여, `LineRendererComponent`의 `Points` 프로퍼티를 조작하는 방식으로 코드를 작성합니다. `IsSmooth`를 `true`로 설정하고, 요청하신 5개 좌표에 해당하는 `LinePoint` 객체를 생성하여 추가합니다. ```lua [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 LineRendererComponent를 활용해 다양한 선을 월드에 자유롭게 그릴 수 있습니다. # LineRendererComponent LineRendererComponent는 점의 개수를 지정해 MapleTile, RectTile 위에서 원하는 직선, 곡선을 그릴 수 있습니다. LineRendererComponent 하나당 하나의 선을 그릴 수 있으므로, 여러 선을 표현하고 싶다면 여러 개의 LineRendererComponent가 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티는 아래와 같습니다.
[task] | two_turn [pass] | ⏳ 미판정 [title] | 메이플 이동 개념 이해하기 [question] | RigidbodyComponent의 IsBlockvertialLine 프로퍼티가 활성화되어 있을 때, 점프 동작과 수직선 지형과의 충돌 처리는 어떻게 이루어집니까? [answer] | RigidbodyComponent의 `IsBlockvertialLine` 프로퍼티가 활성화되어 있으면, 캐릭터가 점프를 하더라도 수직선 지형을 통과하지 못하게 됩니다. 즉, 지면 발판과 붙어 있든 떨어져 있든 상관없이 수직 방향의 지형(벽, 기둥 등)이 점프 동작의 이동 경로를 차단하는 충돌 처리가 이루어집니다. 이 프로퍼티는 맵 내부의 **모든** 수직 지형에 대해 통과를 막습니다. 만약 맵의 일부 레이어에서만 수직 지형 통과를 막고 다른 레이어(예: 잔디)에서는 통과하게 하고 싶다면, `RigidbodyComponent`의 ` [followup] | IsBlockvertialLine이 활성화된 상태에서 캐릭터가 특정 맵 레이어의 타일만 막고 싶을 때 TileMapComponent의 설정은 어떻게 변경해야 하며, Hierarchy에서 해당 레이어를 선택하는 구체적인 절차는 무엇입니까? [followup_answer] | `RigidbodyComponent`의 `IsBlockvertialLine`은 맵 내부의 모든 수직 지형을 차단하기 때문에, 특정 맵 레이어의 타일만 막고 싶다면 해당 맵 레이어에 적용된 `TileMapComponent`의 `IsBlockvertialLine`을 활성화해야 합니다. **Hierarchy에서 해당 레이어를 선택하는 구체적인 절차와 설정 방법은 다음과 같습니다.** 1. **Hierarchy에서 맵 레이어 선택** * Hierarchy에서 막고자 하는 맵 레이어(예: `MapleMapLayer_1`)를 [scores] | [judge_reason] | [source_doc] | #### 수직선 지형 지면 발판과 붙어있든, 떨어져 있든 점프로 수직 발판을 통과하지 못하게 만들고 싶다면 RigidbodyComponent의 **IsBlockvertialLine**을 활성화합니다. | IsBlockvertialLine활성화 | IsBlockvertialLine비활성화 | | --- | --- | || | ##### 특정 레이어의 수직선 지형만 막기 RigidbodyComponent의 **IsBlockvertialLine**를 활성화하면 맵 내부의 모든 수직 지형을 통과하지 못합니다. 만약 일부 맵 레이어에서
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent의 Size 프로퍼티를 OnUpdate 메서드에서 매 프레임마다 변화시켜 선의 두께가 주기적으로 변하는 애니메이션 효과를 구현하는 스크립트를 작성해줘 [answer] | LineRendererComponent의 `Size` 프로퍼티를 `OnUpdate`에서 매 프레임마다 변경하여 선의 두께가 주기적으로 변하는 애니메이션을 구현하는 스크립트입니다. 참고 문서에 따르면 `LineRendererComponent`는 `Size` 프로퍼티를 가지고 있으며, 이를 통해 선을 그릴 수 있습니다. 두께를 주기적으로 변화시키려면 `math.sin` 함수를 사용하여 시간에 따라 변하는 값을 계산하고, 이를 `Size`에 적용합니다. ```lua Property: [None] number BaseSize = 1.0 [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] | two_turn [pass] | ⏳ 미판정 [title] | RectTileMap에서 캐릭터 이동 제어 [question] | RectTileMap 환경에서 KinematicbodyComponent를 활용하여 캐릭터의 이동 속도를 제어하는 기본 원리와 주요 프로퍼티는 무엇인가요? [answer] | RectTileMap 환경에서 캐릭터의 이동을 제어하는 핵심은 `KinematicbodyComponent`입니다. 이 컴포넌트를 통해 캐릭터를 2차원 평면에서 이동시키고 점프 동작을 수행하며, 그림자 표현도 가능합니다. 캐릭터의 이동 속도를 제어하는 데 가장 직접적으로 사용되는 프로퍼티는 **`SpeedFactor`**입니다. ### 이동 속도 제어 원리 및 주요 프로퍼티 1. **`SpeedFactor` (이동 속력 가중치)** * 캐릭터가 이동할 때 X축과 Y축의 속력에 곱해지는 값입니다. * 값을 [followup] | SpeedFactor 프로퍼티가 이동 속력에 영향을 미치는 구체적인 방식과, 가속도 관련 구형 프로퍼티(Acceleration)와의 차이점에 대해 설명해 주세요. [followup_answer] | `SpeedFactor`는 캐릭터의 이동 속력에 직접적으로 곱해지는 **가중치** 역할을 합니다. 구체적으로 캐릭터가 이동할 때 X축과 Y축의 속력에 이 값이 곱해지며, `SpeedFactor`의 값이 클수록 이동 속력이 빨라집니다. 즉, 기본 이동 속도에 배율로 작용하여 최종 이동 속도를 결정합니다. 반면, 구형 프로퍼티인 `Acceleration`은 현재 **더 이상 사용되지 않습니다**. 가속도 관련 동작을 구현하거나 이동 속도를 조절해야 할 경우에는 반드시 `SpeedFactor` 프로퍼티를 사용해야 합니다. `Accele [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 RectTileMap에서는 KinematicbodyComponent로 캐릭터의 이동을 제어합니다. 크리에이터는 KinematicbodyComponent를 통해 캐릭터를 2차원 평면에서 자유롭게 움직이고 점프하게 할 수 있습니다. 또한 그림자를 그릴 수도 있습니다. 이번 시간에는 KinematicbodyComponent에 대해 알아보고 간단한 예제를 통해 활용법을 살펴봅시다. ##### 참고 API Reference [KinematicbodyComponent](/apiReference/Components/Ki
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | TrailDrawer 컴포넌트를 초기화할 때 Init 메서드의 인자로 self.Entity를 전달해야 하는 이유는 무엇인가요? [answer] | `TrailDrawer:Init(self.Entity)` 메서드에서 `self.Entity`를 인자로 전달하는 이유는, 스폰된 Trail 엔티티가 **어떤 객체의 움직임**을 따라 선을 그어야 하는지를 알려주기 위해서입니다. 참고 문서의 예제 코드를 보면, `TrailEntity`는 `SpawnByModelId`로 생성된 별도의 엔티티입니다. 이 `TrailEntity`에 부착된 `TrailDrawer` 컴포넌트는 스스로 움직이지 않으며, 외부에서 주입받은 대상 엔티티의 위치 변화를 추적하여 선을 그립니다. `self.Entit [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] | instruction_following [pass] | ⏳ 미판정 [title] | 메이플 이동 개념 이해하기 [question] | 발판 위에서 이동할 때 빨간색 발판과 초록색 발판의 교차 지점을 지나는 경우와 점프하여 초록색 발판으로 넘어가는 경우의 이동 규칙 차이를 표로 정리해서 알려 주세요. [answer] | 발판 위에서 이동할 때 교차 지점 통과와 점프를 통한 발판 전환에 따른 이동 규칙 차이는 다음과 같습니다. | 구분 | 교차 지점 통과 (발판 유지) | 점프하여 발판 전환 | | :--- | :--- | :--- | | **전제 조건** | 현재 밟고 있는 발판(예: 빨간색)과 다른 발판(예: 초록색)이 교차하는 지점을 지나갈 때 | 교차하는 지점에서 플레이어 캐릭터가 점프를 수행할 때 | | **발판 관계** | 현재 밟고 있는 발판(빨간색)과의 관계가 유지됩니다. | 현재 밟고 있던 발판과의 관계가 끊어지고, 새로운 발판(초 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드 제작에 필수적인 이동 방식 중 메이플스토리 이동 방식을 따르는 RigidbodyComponent 특성을 알아봅시다. 이동은 [메이플 타일 맵 만들기](/docs?postId=747)와 함께 학습하기 권장합니다. # 메이플스토리 이동 방식 RigidbodyComponent는 메이플스토리 이동 방식처럼 이동하고자 할 때 사용합니다. 이동 방식은 지형 종류와 밀접한 연관이 있기에 TileMapComponent를 함께 사용해 메이플스토리식 이동 방식을 만들 수 있습니다. 이때 타일 위에서 이동은 Rigidbo
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 충돌 그룹 만들기 [question] | 기본 충돌 그룹 3개와 크리에이터가 만들 수 있는 최대 충돌 그룹 수를 표로 정리해서 출력하세요. [answer] | 기본 충돌 그룹과 크리에이터가 만들 수 있는 최대 충돌 그룹 수는 아래 표와 같습니다. | 구분 | 내용 | | :--- | :--- | | **기본 충돌 그룹** | Default, TriggerBox, HitBox (총 3개) | | **크리에이터 생성 가능 수** | 최대 15개 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다. # 충돌 그룹 기능 충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 **Default, TriggerBox, HitBox**가 있으며 크리에이터가 만든 충돌 그룹을 포함해 **최대 15개**까지 만들 수 있습니다. * **Defa
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 충돌 그룹 만들기 [question] | 충돌 그룹을 사용해 TriggerEnterEvent 조건 분기를 생략할 수 있는 장점을 2문장 이내로 요약하세요. [answer] | 충돌 그룹을 지정하면 스크립트 내에서 엔티티의 종류를 확인하는 조건 분기를 작성할 필요가 없습니다. 이는 코드 복잡도를 줄여 주고, 월드의 성능을 최적화하는 데 도움이 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다. # 충돌 그룹 기능 충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 **Default, TriggerBox, HitBox**가 있으며 크리에이터가 만든 충돌 그룹을 포함해 **최대 15개**까지 만들 수 있습니다. * **Defa
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent의 Points Size를 4로 설정하고 Position을 (0,0), (2,2), (4,0), (2,-2)로 지정하며 Loop를 활성화하여 마름모 모양의 닫힌 선을 그리는 스크립트를 작성해줘 [answer] | LineRendererComponent는 엔티티에 직접 추가된 컴포넌트로, 스크립트를 통해 `self.Entity.LineRendererComponent`로 접근하여 `Points`를 조작할 수 있습니다. 사용자가 요청한 마름모 모양의 닫힌 선을 그리기 위해서는 다음 단계를 수행해야 합니다. 1. `LineRendererComponent`의 `Points`를 초기화(Clear)합니다. 2. `Loop` 프로퍼티를 `true`로 설정하여 시작점과 끝점을 이어 닫힌 선으로 만듭니다. 3. `LinePoint` 객체를 생성하여 지정한 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 LineRendererComponent를 활용해 다양한 선을 월드에 자유롭게 그릴 수 있습니다. # LineRendererComponent LineRendererComponent는 점의 개수를 지정해 MapleTile, RectTile 위에서 원하는 직선, 곡선을 그릴 수 있습니다. LineRendererComponent 하나당 하나의 선을 그릴 수 있으므로, 여러 선을 표현하고 싶다면 여러 개의 LineRendererComponent가 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티는 아래와 같습니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 충돌 그룹 만들기 [question] | HitComponent에 충돌 그룹을 지정하는 과정을 단계별 번호 목록으로 3단계만 작성하세요. [answer] | 1. 충돌 그룹을 설정할 엔티티에 HitComponent 또는 확장한 HitComponent를 추가합니다. 2. HitComponent의 CollisionGroup 프로퍼티에서 사용할 충돌 그룹을 지정합니다. 3. CollisionGroup 옆에 있는 [패널 열기] 버튼을 눌러 CollisionGroup 패널을 열어 충돌 그룹을 확인하거나 수정할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다. # 충돌 그룹 기능 충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 **Default, TriggerBox, HitBox**가 있으며 크리에이터가 만든 충돌 그룹을 포함해 **최대 15개**까지 만들 수 있습니다. * **Defa
[task] | two_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | TweenLogic을 활용해 엔티티의 위치를 부드럽게 이동시키는 기본 원리와 구조는 어떻게 되나요? [answer] | `TweenLogic`은 엔티티의 위치나 회전 값을 지정된 시간 동안 미리 정의된 이징(Easing) 곡선을 따라 부드럽게 변화시키는 로직을 처리하는 서비스입니다. 이를 통해 갑자기 점프하는 움직임이 아닌, 자연스러운 가속·감속 또는 탄성(바운스) 효과를 구현할 수 있습니다. 기본 원리와 구조는 크게 **타겟 값 정의**, **트위인 실행**, **프레임별 값 적용**의 세 단계로 구성됩니다. ### 1. 기본 원리 1. **현재 상태 저장**: `OnBeginPlay()`에서 엔티티의 현재 위치(`TransformCompo [followup] | `PlayTween`으로 X, Y 좌표를 각각 다른 이징(EaseType)으로 변경하고 `OnUpdate`에서 `TransformComponent.Position`에 할당하는 구체적인 코드 구현 방법은 무엇인가요? [followup_answer] | `PlayTween`으로 X, Y 좌표를 각각 다른 이징(EaseType)으로 변경하고 `OnUpdate`에서 `TransformComponent.Position`에 할당하는 구체적인 구현 방법은 다음과 같습니다. 1. **Property 정의**: `OnUpdate`에서 위치를 갱신하기 위해 X, Y 좌표를 저장할 프로퍼티(`posX`, `posY`)를 선언합니다. 2. **OnBeginPlay**: * 현재 엔티티의 위치를 가져와 `posX`, `posY`에 초기값을 설정합니다. * `_TweenLog [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] | Map Layer 1에서 2로 이동할 때와 Layer 2에서 1로 이동할 때 수직 발판 통과 가능 여부에 대한 차이를 단계별 번호 목록으로 설명해 주세요. [answer] | 지형 Layer에 따라 수직 발판 통과 가능 여부가 달라지는 이유는 타일이 속한 Layer가 다르면 발판이 서로 이어져 있지 않기 때문입니다. Layer 1에서 2로 이동할 때와 Layer 2에서 1로 이동할 때의 차이는 다음과 같습니다. 1. **Layer 1에서 Layer 2로 이동할 때**: * 플레이어 캐릭터는 Layer 1의 발판 위에 있습니다. * 이때 캐릭터는 Layer 2에 속한 수직선 발판을 무시합니다. * 따라서 수직 발판을 통과하여 Layer 2의 발판으로 이동할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드 제작에 필수적인 이동 방식 중 메이플스토리 이동 방식을 따르는 RigidbodyComponent 특성을 알아봅시다. 이동은 [메이플 타일 맵 만들기](/docs?postId=747)와 함께 학습하기 권장합니다. # 메이플스토리 이동 방식 RigidbodyComponent는 메이플스토리 이동 방식처럼 이동하고자 할 때 사용합니다. 이동 방식은 지형 종류와 밀접한 연관이 있기에 TileMapComponent를 함께 사용해 메이플스토리식 이동 방식을 만들 수 있습니다. 이때 타일 위에서 이동은 Rigidbo
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 메이플 이동 개념 이해하기 [question] | Climbable 타입에서 아바타가 사다리를 내려와 발판을 밟았을 때 SortingLayer가 어떻게 유지되는지 3문장 이내로 설명해 주세요. [answer] | Climbable 타입에서는 아바타가 마지막으로 탄 사다리나 로프의 SortingLayer가 기준이 됩니다. 따라서 아바타가 사다리에서 내려와 발판을 밟더라도 발판의 레이어가 아닌 사다리의 SortingLayer 값을 유지합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **RigidbodyComponent의 LayerSettingType** 타입을 변경해 메이플스토리 이동을 따르게 설정합니다. 혹은 사다리/로프/발판의 SortingLayer와 RigidbodyComponent를 가진 Entity의 SortingLayer들과의 관계를 변경해 메이플스토리 이동과 다르게 설정할 수 있습니다. 아래와 같이 Layer1에 타일을 그리고, Layer1,2,3,4에 각각 사다리를 배치했을 때 각 타입에 따라 아바타와 사다리의 관계가 어떻게 변하는지 살펴보겠습니다. DefaultPlayer에는 Rigidbod
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent와 SpritePattern 머티리얼을 활용해 정해진 좌표 목록을 따라 부드러운 곡선으로 선을 그리는 스크립트를 작성해줘 [answer] | LineRendererComponent와 SpritePattern 머티리얼을 활용해 정해진 좌표 목록을 따라 부드러운 곡선으로 선을 그리는 방법은 다음과 같습니다. ### 1. 사전 준비 (에디터 작업) 스크립트 실행 전, 에디터에서 아래 설정을 완료해야 합니다. 1. **머티리얼 생성**: `Workspace - MyDesk - Create Material`로 새 머티리얼을 생성합니다. 2. **셰이더 선택**: 생성한 머티리얼의 프로퍼티 창에서 `Shader - LineRenderer - SpritePattern`를 선택합니 [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] | code [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent의 Width를 10으로 설정하고 Points Size를 2로 하여 (0,0)과 (10,0) 위치 사이에 굵은 직선을 그리는 스크립트를 작성해줘 [answer] | LineRendererComponent를 사용해 두 점 사이를 굵은 직선으로 연결하려면, 엔티티에 LineRendererComponent가 포함되어 있어야 하며, 프로퍼티는 다음과 같이 설정해야 합니다. * **Points Size**: 2 (선을 구성하는 정점의 개수) * **Points Position**: (0, 0) 과 (10, 0) * **Points Width**: 10 * **Points Color**: 원하는 색상 (예: Color.white) 아래 스크립트는 `OnBeginPlay` 시점에 Line [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 LineRendererComponent를 활용해 다양한 선을 월드에 자유롭게 그릴 수 있습니다. # LineRendererComponent LineRendererComponent는 점의 개수를 지정해 MapleTile, RectTile 위에서 원하는 직선, 곡선을 그릴 수 있습니다. LineRendererComponent 하나당 하나의 선을 그릴 수 있으므로, 여러 선을 표현하고 싶다면 여러 개의 LineRendererComponent가 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티는 아래와 같습니다.
[task] | code [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent의 Points Size를 3으로 설정하고 Color를 각각 다르게 지정하여 (0,0)부터 (3,0)까지의 직선 구간에서 색상이 자연스럽게 섞이는 효과를 구현하는 스크립트를 작성해줘 [answer] | LineRendererComponent의 `Points` 프로퍼티에서 `Size`를 3으로 설정하면 직선 구간을 구성하는 정점 3개가 생성됩니다. 이 3개 점 각각의 `Color`를 다르게 지정하면, 색이 교차하는 지점에서 자연스럽게 섞이는 효과를 볼 수 있습니다. 제공된 참고 문서에는 `LineRendererComponent`의 `Points`를 통해 색상과 위치를 설정하는 방식(`LinePoint` 객체 생성 및 `Points:Add` 호출)과 `Size` 프로퍼티가 점의 개수를 의미한다는 내용이 포함되어 있습니다. 따라서 아 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 LineRendererComponent를 활용해 다양한 선을 월드에 자유롭게 그릴 수 있습니다. # LineRendererComponent LineRendererComponent는 점의 개수를 지정해 MapleTile, RectTile 위에서 원하는 직선, 곡선을 그릴 수 있습니다. LineRendererComponent 하나당 하나의 선을 그릴 수 있으므로, 여러 선을 표현하고 싶다면 여러 개의 LineRendererComponent가 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티는 아래와 같습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | EraseTail 함수에서 PointLives[1]의 수명이 0 이하가 될 때에만 점을 제거하는 로직이, 선의 꼬리가 갑자기 끊어지는 것처럼 보이는 현상을 방지하는 데 어떻게 기여하나요? [answer] | 제시된 문서의 `EraseTail` 함수 코드를 분석하면, `PointLives[1]`의 수명이 0 이하가 될 때에만 점을 제거하는 로직이 선의 꼬리가 갑자기 끊어지는 현상을 방지하는 데 기여하는 방식은 다음과 같습니다. 1. **점의 순차적 제거:** `EraseTail` 함수는 매 프레임 `OnUpdate`가 호출될 때마다 `PointLives` 테이블의 모든 요소(점의 남은 수명)에서 `delta`(경과 시간)를 뺍니다. 2. **첫 번째 점(가장 오래된 점) 모니터링:** 이 로직은 테이블의 첫 번째 인덱스인 `Poin [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] | TriggerComponent와 HitComponent에 기본으로 지정되는 충돌 그룹의 이름은 각각 무엇인가요? [answer] | `TriggerComponent`에 기본으로 지정되는 충돌 그룹의 이름은 **TriggerBox**이고, `HitComponent`에 기본으로 지정되는 충돌 그룹의 이름은 **HitBox**입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다. # 충돌 그룹 기능 충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 **Default, TriggerBox, HitBox**가 있으며 크리에이터가 만든 충돌 그룹을 포함해 **최대 15개**까지 만들 수 있습니다. * **Defa
[task] | two_turn [pass] | ⏳ 미판정 [title] | 충돌 그룹 만들기 [question] | 기본 충돌 그룹(Default, TriggerBox, HitBox)의 역할과 크리에이터가 추가할 수 있는 최대 충돌 그룹 수에 대해 설명해 주세요. [answer] | 기본 충돌 그룹(Default, TriggerBox, HitBox)의 역할과 크리에이터가 추가할 수 있는 최대 충돌 그룹 수는 다음과 같습니다. **기본 충돌 그룹의 역할** * **Default**: 충돌 그룹을 지정할 때 기본으로 지정되는 그룹입니다. 충돌 그룹을 찾을 수 없는 경우에도 자동으로 **Default**로 지정됩니다. * **TriggerBox**: **TriggerComponent**에 기본으로 지정되는 충돌 그룹입니다. * **HitBox**: **HitComponent**에 기본으로 지정되는 충돌 [followup] | 충돌 그룹 매트릭스에서 특정 그룹끼리만 충돌하도록 설정할 때, 기존 스크립트에서 `TriggerEnterEvent` 핸들러 내부의 `PlayerComponent` 확인 로직을 제거해도 안전할까요? [followup_answer] | 네, 충돌 그룹 매트릭스를 통해 엔티티마다 다른 충돌 그룹을 지정하고 두 그룹끼리만 충돌하도록 설정해두었다면, `TriggerEnterEvent` 핸들러 내부에서 `PlayerComponent` 여부를 확인하는 로직을 제거해도 안전합니다. 참고 문서에서 설명하듯, 충돌 그룹을 사용하면 스크립트마다 충돌을 감지하는 컴포넌트를 사용해 충돌 감지 조건을 작성하지 않아도 됩니다. 즉, 물리 시스템 수준에서 이미 "플레이어"와 "아이템" 그룹끼리만 충돌하도록 제어하고 있으므로, 이벤트가 발생했다는 것 자체가 조건에 맞는 충돌임을 의미합니다 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다. # 충돌 그룹 기능 충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 **Default, TriggerBox, HitBox**가 있으며 크리에이터가 만든 충돌 그룹을 포함해 **최대 15개**까지 만들 수 있습니다. * **Defa
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 메이플 이동 개념 이해하기 [question] | RigidbodyComponent의 LayerSettingType이 All일 때 발판과 사다리를 밟거나 타는 경우의 SortingLayer 반영 규칙을 표로 정리해 주세요. [answer] | RigidbodyComponent의 LayerSettingType이 `All`일 때, 아바타(AvatarRendererComponent)의 SortingLayer는 다음과 같은 규칙으로 결정됩니다. | 상황 | 반영되는 SortingLayer 기준 | | :--- | :--- | | **발판 밟고 있을 때** | 밟고 있는 **발판의 SortingLayer** | | **사다리/로프 타고 있을 때** | 탄 **사다리/로프의 SortingLayer** | 이 설정은 메이플스토리의 기본 이동 방식을 따르도록 아바타의 레이어가 현재 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **RigidbodyComponent의 LayerSettingType** 타입을 변경해 메이플스토리 이동을 따르게 설정합니다. 혹은 사다리/로프/발판의 SortingLayer와 RigidbodyComponent를 가진 Entity의 SortingLayer들과의 관계를 변경해 메이플스토리 이동과 다르게 설정할 수 있습니다. 아래와 같이 Layer1에 타일을 그리고, Layer1,2,3,4에 각각 사다리를 배치했을 때 각 타입에 따라 아바타와 사다리의 관계가 어떻게 변하는지 살펴보겠습니다. DefaultPlayer에는 Rigidbod
[task] | single_turn [pass] | ⏳ 미판정 [title] | 충돌 그룹 만들기 [question] | CollisionGroup 프로퍼티 옆에 있는 [패널 열기] 버튼을 누르면 어떤 패널이 열리나요? [answer] | CollisionGroup 프로퍼티 옆에 있는 **[패널 열기]** 버튼을 누르면 **CollisionGroup** 패널이 열립니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다. # 충돌 그룹 기능 충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 **Default, TriggerBox, HitBox**가 있으며 크리에이터가 만든 충돌 그룹을 포함해 **최대 15개**까지 만들 수 있습니다. * **Defa
[task] | single_turn [pass] | ⏳ 미판정 [title] | 충돌 그룹 만들기 [question] | 크리에이터가 직접 추가할 수 있는 충돌 그룹의 최대 수는 몇 개인가요? [answer] | 크리에이터가 직접 추가할 수 있는 충돌 그룹의 최대 수는 **15개**입니다. 참고로 기본으로 제공되는 `Default`, `TriggerBox`, `HitBox` 3개 그룹을 포함하여 총 15개까지 설정할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다. # 충돌 그룹 기능 충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 **Default, TriggerBox, HitBox**가 있으며 크리에이터가 만든 충돌 그룹을 포함해 **최대 15개**까지 만들 수 있습니다. * **Defa
[task] | single_turn [pass] | ⏳ 미판정 [title] | 충돌 그룹 만들기 [question] | 기본 충돌 그룹 중 TriggerComponent에 기본으로 지정되는 그룹은 무엇인가요? [answer] | 기본 충돌 그룹 중 TriggerComponent에 기본으로 지정되는 그룹은 **TriggerBox**입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다. # 충돌 그룹 기능 충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 **Default, TriggerBox, HitBox**가 있으며 크리에이터가 만든 충돌 그룹을 포함해 **최대 15개**까지 만들 수 있습니다. * **Defa
[task] | two_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | LineRendererComponent를 사용해 다양한 선을 그리는 기본 원리와 주요 프로퍼티에 대해 설명해 주세요. [answer] | LineRendererComponent는 MapleTile 또는 RectTile 위에 직선과 곡선을 그리는 데 사용되는 컴포넌트입니다. 이 컴포넌트는 선을 구성하는 점(정점)의 개수를 지정하여 형태를 결정하며, 하나의 LineRendererComponent 인스턴스는 항상 하나의 선만 표현합니다. 따라서 여러 개의 선을 동시에 화면에 출력하려면 LineRendererComponent가 여러 개 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티와 동작 원리는 다음과 같습니다. **1. IsSmooth** * **활성화(True) [followup] | IsSmooth와 Loop를 활성화했을 때와 비활성화했을 때 시각적 차이가 어떻게 나타나며, 여러 개의 선을 동시에 표현하려면 엔티티 구조를 어떻게 구성해야 하나요? [followup_answer] | ### IsSmooth와 Loop 활성화/비활성화에 따른 시각적 차이 LineRendererComponent의 `IsSmooth`와 `Loop` 프로퍼티는 선의 형태를 결정짓는 핵심 요소로, 활성화 여부에 따라 다음과 같은 시각적 차이가 발생합니다. **1. IsSmooth (부드러운 곡선 vs 날카로운 꺾임)** * **활성화(True)**: 지정된 정점(Points)들을 부드럽게 연결하여 **곡선**을 그립니다. 정점 사이가 직선으로 이어지지 않고 완만한 곡면으로 연결됩니다. * **비활성화(False)**: 정점들을 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 LineRendererComponent를 활용해 다양한 선을 월드에 자유롭게 그릴 수 있습니다. # LineRendererComponent LineRendererComponent는 점의 개수를 지정해 MapleTile, RectTile 위에서 원하는 직선, 곡선을 그릴 수 있습니다. LineRendererComponent 하나당 하나의 선을 그릴 수 있으므로, 여러 선을 표현하고 싶다면 여러 개의 LineRendererComponent가 포함된 엔티티를 사용해야 합니다. 주요 프로퍼티는 아래와 같습니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | SpawnService를 활용해 Trail 엔티티를 스폰할 때 parent 인자로 nil을 전달하면 엔티티가 어디에 배치되며, 다른 엔티티의 자식으로 만들고 싶으면 어떻게 수정해야 하나요? [answer] | SpawnService의 `SpawnByModelId` 메서드에서 parent 인자로 `nil`을 전달하면, 스폰된 엔티티는 특정 부모 엔티티에 종속되지 않고 맵의 루트 레벨(또는 기본 스폰 위치)에 배치됩니다. 즉, 다른 엔티티의 자식이 아닌 독립된 엔티티로 생성됩니다. 다른 엔티티의 자식으로 만들고 싶다면, parent 인자로 해당 엔티티 객체를 전달해야 합니다. 예를 들어, 스크립트가 붙어 있는 엔티티(`self.Entity`)의 자식으로 만들려면 `self.Entity`를 마지막 인자로 전달합니다. ```lua Prope [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] | code [pass] | ⏳ 미판정 [title] | 메이플 이동 개념 이해하기 [question] | TileMapComponent의 Layer 정보를 활용해 플레이어 캐릭터의 SortingLayer를 현재 밟고 있는 타일 레이어에 따라 자동으로 변경시키는 스크립트를 작성해줘 [answer] | 주어진 참고 문서에는 `RigidbodyComponent`가 있는 엔티티(예: 플레이어 캐릭터)의 `SortingLayer`가 **현재 밟고 있는 `TileMap` Layer를 자동으로 따라 변경된다**는 사실만 명시되어 있습니다. 문서에는 이 자동 변경 동작을 **스크립트로 직접 구현하는 API**(예: 현재 밟고 있는 Layer를 조회하는 메서드, `SortingLayer`를 직접 설정하는 메서드, 또는 Layer 변경 이벤트를 수신하는 핸들러)에 대한 구체적인 설명이나 코드가 **없습니다**. 따라서 제공된 문서 근거만으로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드 제작에 필수적인 이동 방식 중 메이플스토리 이동 방식을 따르는 RigidbodyComponent 특성을 알아봅시다. 이동은 [메이플 타일 맵 만들기](/docs?postId=747)와 함께 학습하기 권장합니다. # 메이플스토리 이동 방식 RigidbodyComponent는 메이플스토리 이동 방식처럼 이동하고자 할 때 사용합니다. 이동 방식은 지형 종류와 밀접한 연관이 있기에 TileMapComponent를 함께 사용해 메이플스토리식 이동 방식을 만들 수 있습니다. 이때 타일 위에서 이동은 Rigidbo
[task] | single_turn [pass] | ⏳ 미판정 [title] | 메이플 이동 개념 이해하기 [question] | 맵 바운더리를 무시해서 지형 밖에서도 캐릭터가 이동하게 만들려면 어떤 프로퍼티를 활성화해야 하나요? [answer] | 맵 바운더리를 무시하여 맵 지형 밖에서도 캐릭터가 이동할 수 있도록 하려면 `RigidbodyComponent`의 **`IgnoreMoveBoundary`** 프로퍼티를 활성화해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### 수직선 지형 지면 발판과 붙어있든, 떨어져 있든 점프로 수직 발판을 통과하지 못하게 만들고 싶다면 RigidbodyComponent의 **IsBlockvertialLine**을 활성화합니다. | IsBlockvertialLine활성화 | IsBlockvertialLine비활성화 | | --- | --- | || | ##### 특정 레이어의 수직선 지형만 막기 RigidbodyComponent의 **IsBlockvertialLine**를 활성화하면 맵 내부의 모든 수직 지형을 통과하지 못합니다. 만약 일부 맵 레이어에서
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 메이플 이동 개념 이해하기 [question] | None 타입에서 크리에이터가 설정한 RigidbodyComponent를 가진 Entity의 SortingLayer가 Default일 때 사다리를 타도 SortingLayer가 유지되는 원리를 단계별 번호 목록으로 작성해 주세요. [answer] | **RigidbodyComponent의 LayerSettingType이 `None`일 때 SortingLayer가 유지되는 원리** 1. **설정 확인**: `RigidbodyComponent`의 `LayerSettingType`이 `None`으로 설정되어 있음을 확인합니다. 이 타입은 크리에이터가 직접 설정한 `RigidbodyComponent`를 가진 Entity의 `SortingLayer` 값을 따릅니다. 2. **기본값 적용**: 해당 Entity의 `SortingLayer` 값이 `Default`로 설정되어 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **RigidbodyComponent의 LayerSettingType** 타입을 변경해 메이플스토리 이동을 따르게 설정합니다. 혹은 사다리/로프/발판의 SortingLayer와 RigidbodyComponent를 가진 Entity의 SortingLayer들과의 관계를 변경해 메이플스토리 이동과 다르게 설정할 수 있습니다. 아래와 같이 Layer1에 타일을 그리고, Layer1,2,3,4에 각각 사다리를 배치했을 때 각 타입에 따라 아바타와 사다리의 관계가 어떻게 변하는지 살펴보겠습니다. DefaultPlayer에는 Rigidbod
[task] | single_turn [pass] | ⏳ 미판정 [title] | 다양한 선 그리기 [question] | OnEndPlay에서 TrailEntity가 nil이 아닌지 확인 후 Destroy를 호출하는 로직이 생략되면 어떤 오류나 버그가 생길 수 있나요? [answer] | 네, `OnEndPlay`에서 `self.TrailEntity`가 `nil`인지 확인하는 로직이 생략되면 **nil 참조 오류(nil reference error)** 또는 **스크립트 실행 실패**가 발생할 수 있습니다. 메이플스토리 월드의 mLua 환경에서 객체가 `nil` 상태인 경우 해당 객체에 대한 메서드 호출(예: `:Destroy()`)은 유효하지 않으며, 이는 런타임 오류를 유발합니다. 특히 `OnBeginPlay`에서 `SpawnByModelId`가 실패하거나 아직 스폰이 완료되지 않은 상태에서 `OnEndPlay [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