[task] | code [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | 엔티티에 TweenFloatingComponent를 적용하여 AutoStart를 false로 설정한 후, OnBeginPlay에서 Amplitude와 OneCycleTime을 초기값으로 설정하고 5초 후 _TimerService:SetTimerOnce를 이용해 Amplitude 값을 2배로 변경하는 스크립트를 작성해줘 [answer] | 요청하신 스크립트는 엔티티에 `TweenFloatingComponent`가 이미 적용되어 있다는 전제 하에 작성됩니다. `AutoStart`를 `false`로 설정하는 것은 에디터에서 컴포넌트 프로퍼티를 직접 설정하거나, 스크립트 내에서 `OnBeginPlay` 전에 초기화하는 것이 일반적이며, 질문의 요구사항에 따라 `OnBeginPlay`에서 Amplitude와 OneCycleTime을 초기값으로 설정하고 5초 후 Amplitude를 2배로 변경하는 로직을 구현합니다. ```lua Property: [None] number I [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티에 동작을 만드는 세 가지 **Tween Component**의 개념을 이해합니다. 컴포넌트를 이용해 크리에이터가 원하는 엔티티 운동 방향과 폭을 조정할 수 있습니다. ##### 참고 가이드 [엔티티의 위치, 크기, 회전 조정](/docs?postId=82) # Tween Component 소개 **Tween Component**를 이용하여 엔티티에 운동성을 만들고, 세부 설정을 조정할 수 있습니다. 운동 성질에 따른 세 가지 컴포넌트가 있으며, 상황에 맞게 단독으로 사용하거나 조합하여 사용할 수 있습
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | 엔티티에 TweenCircularComponent를 적용하여 원운동의 반지름과 속도를 조정하는 프로퍼티를 설정하고, OnBeginPlay에서 SyncType을 Server로 명시적으로 설정하여 모든 클라이언트에서 동일한 원운동이 보이도록 하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `TweenCircularComponent`의 구체적인 프로퍼티 이름(반지름, 속도 등)이 명시되어 있지 않습니다. 문서에는 `TweenFloatingComponent`와 `TweenLineComponent`의 프로퍼티 및 사용 예시만 포함되어 있으며, `TweenCircularComponent`는 표에 "원점을 중심으로 원운동"이라고만 언급되어 있을 뿐, 설정 가능한 필드나 API 명세가 없습니다. 따라서 요청하신 대로 `TweenCircularComponent`의 반지름과 속도를 조정하는 정확한 프로퍼티 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티에 동작을 만드는 세 가지 **Tween Component**의 개념을 이해합니다. 컴포넌트를 이용해 크리에이터가 원하는 엔티티 운동 방향과 폭을 조정할 수 있습니다. ##### 참고 가이드 [엔티티의 위치, 크기, 회전 조정](/docs?postId=82) # Tween Component 소개 **Tween Component**를 이용하여 엔티티에 운동성을 만들고, 세부 설정을 조정할 수 있습니다. 운동 성질에 따른 세 가지 컴포넌트가 있으며, 상황에 맞게 단독으로 사용하거나 조합하여 사용할 수 있습
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | HandlePlayerActionEvent() 핸들러에서 Attack 상태 감지 시 WorkOut()을 호출하는 로직을 3문장 이내로 설명하세요. [answer] | `HandlePlayerActionEvent()` 핸들러는 캐릭터의 상태 변화 이벤트를 감지하며, 이벤트의 `ActionName`이 "Attack"으로 확인되면 `WorkOut()` 메소드를 호출합니다. `WorkOut()` 메소드는 서버 공간에서만 실행되도록 설정되어 있으므로, 이벤트가 클라이언트와 서버 모두에서 발생해도 실제 운동 로직은 서버에서 안전하게 처리됩니다. 이를 통해 `Ctrl`키 입력에 따른 힘 증가 로직이 서버의 데이터 무결성을 유지하면서 실행됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `Ctrl`키를 눌러 Attack 상태가 되면 운동을 하고, 힘이 증가하도록 만듭니다. 1. **PlayerController**에 **Component** 타입의 **Stats** 프로퍼티를 추가합니다. 이 프로퍼티는 **PlayerStats** 컴포넌트를 참고하게 됩니다. ```lua Property: [Sync] Component Stats = nil ``` 2. `OnBeginPlay()` 메소드에 **PlayerStats** 컴포넌트를 받아오도록 아래와 같이 작성합니다.**Playe
[task] | two_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | `TransformComponent`의 `Translate`와 `RigidbodyComponent`의 `Translate`를 사용하여 택시를 이동시키고 원숭이를 밀어내는 로직은 어떻게 구현하나요? [answer] | 참고 문서에 따르면, `TransformComponent`의 `Translate`는 물체의 위치를 직접 이동시키는 데 사용되고, `RigidbodyComponent`의 `Translate`는 물리 엔진에 영향을 주며 물체를 밀어내는 데 사용됩니다. 택시를 이동시키고 원숭이를 밀어내는 로직은 다음과 같이 구현할 수 있습니다. 1. **택시 이동 (`TransformComponent:Translate`)**: * 택시 엔티티에 스크립트를 붙여 `OnUpdate` 생명주기 메서드를 사용합니다. * `self.E [followup] | 택시와 원숭이 엔티티를 참조하는 변수 선언 및 `OnUpdate` 함수 안에서 두 컴포넌트의 `Translate` 메서드를 호출하는 구체적인 mLua 코드 예제를 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 `TransformComponent:Translate`를 사용하여 택시를 이동시키는 `OnUpdate` 코드 예제는 포함되어 있으나, `RigidbodyComponent:Translate`를 사용하여 원숭이를 밀어내는 구체적인 mLua 코드 예제는 명시적으로 제공되지 않았습니다. 또한, 다른 엔티티(원숭이)를 참조하는 변수 선언 방법(예: `FindEntityByName` 등)에 대한 API도 문서에 포함되어 있지 않습니다. 따라서 문서에 근거하여 **택시 이동 부분**만 정확히 재현할 수 있으며, 원숭이 밀 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 가이드는 [물체의 이동 Ⅰ](/docs?postId=123)을 따라 만든 월드에서 이어서 제작해야 정상적으로 동작합니다. 택시가 아잘린을 태우러 가야하는데 원숭이가 길을 가로 막고 있습니다. `TransformComponent`의 `Translate`를 이용하여 택시를 이동시키고 `RigidbodyComponent`의 `Translate` 함수를 사용하여 원숭이를 밀어내봅시다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/174790801778
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | TweenLineComponent의 StopType을 Oneway로 설정하고 DestinationCoordinateType을 Relative로 하여 원점 기준 X 100, Y 0 지점까지 2초 동안 Linear 방식으로 이동하는 스크립트를 작성해줘 [answer] | 요청하신 설정(StopType: Oneway, DestinationCoordinateType: Relative, X 100, Y 0, 2초, Linear)을 `TweenLineComponent`에 적용하는 스크립트입니다. 엔티티에 `TweenLineComponent`가 추가되어 있다고 가정하며, `OnBeginPlay` 라이프사이클에서 프로퍼티를 설정하도록 작성했습니다. `Positions` 프로퍼티는 테이블 구조로, `Size`와 좌표 값을 직접 할당해야 합니다. ```lua Method: [server] void SetupT [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 목적지까지 선형 운동을 하게 만들 때 사용합니다. 목적지까지 편도, 왕복 운동 여부와 더불어 가·감속, 도달 시 튕김 등 운동 방식을 설정할 수 있습니다. **TweenLineComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | ------ | --- | | TweenType | 기본값은 Linear입니다. 다른 모양의 운동 방식을 선택할 수 있습니다. 선형운동 종류별 설명은 하단의 참고자료를 참고하세요. | | Duration | 목적지까지 도달하는 데 걸리는 시간을 의미합니다. | |
[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | TransformComponent의 Translate 메서드를 사용하여 택시 엔티티가 정해진 방향으로 이동하도록 OnUpdate 함수에서 매 프레임씩 이동시키는 스크립트를 작성해줘. [answer] | `TransformComponent`의 `Translate` 메서드를 사용하면 엔티티의 현재 위치를 지정된 벡터만큼 이동시킬 수 있습니다. 매 프레임마다 일정한 방향으로 이동시키려면 `OnUpdate` 함수 안에서 `delta` (경과 시간) 값을 곱해 주어야 프레임 레이트(FPS)와 관계없이 일정한 속도로 이동하게 됩니다. 아래는 정해진 방향(예: X축 양의 방향)으로 매 프레임씩 택시를 이동시키는 스크립트 예시입니다. ```lua Property: [None] Vector2 MoveDirection = Vector2(1, 0 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 가이드는 [물체의 이동 Ⅰ](/docs?postId=123)을 따라 만든 월드에서 이어서 제작해야 정상적으로 동작합니다. 택시가 아잘린을 태우러 가야하는데 원숭이가 길을 가로 막고 있습니다. `TransformComponent`의 `Translate`를 이용하여 택시를 이동시키고 `RigidbodyComponent`의 `Translate` 함수를 사용하여 원숭이를 밀어내봅시다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/174790801778
[task] | two_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | Maple GYM에서 다양한 스탯을 저장하고 관리하기 위해 PlayerStats 컴포넌트를 생성하고 DefaultPlayer에 추가할 때, 각각의 프로퍼티에 [Sync] 속성을 부여하는 이유는 무엇이며 기본값은 어떻게 설정해야 하나요? [answer] | Maple GYM에서 `PlayerStats` 컴포넌트를 생성하여 다양한 스탯을 저장하고 관리할 때, 프로퍼티에 `[Sync]` 속성을 부여하는 이유는 클라이언트와 서버 간에 해당 값의 동기화를 보장하기 위해서입니다. `[Sync]`가 적용된 프로퍼티의 값은 서버에서 변경되면 클라이언트에도 자동으로 전달되어, 플레이어의 화면에 현재 힘, 돈, 등급 등의 정보가 실시간으로 정확하게 반영됩니다. 문서에서 제시한 Maple GYM의 스탯 정보 프로퍼티와 기본값 설정은 다음과 같습니다. ```lua Property: [Sync] num [followup] | PlayerStats 컴포넌트의 프로퍼티 선언 코드를 작성해 주시겠으며, 특히 CurrentPower와 MaxPower의 초기값 및 [Sync] 속성이 적용된 형태를 보여주세요. [followup_answer] | PlayerStats 컴포넌트에 스탯 정보를 저장하기 위한 프로퍼티 선언 코드는 다음과 같습니다. 모든 프로퍼티에 `[Sync]` 속성이 적용되어 있으며, `CurrentPower`의 초기값은 0, `MaxPower`의 초기값은 15로 설정되어 있습니다. ```lua Property: [Sync] number CurrentPower = 0 --현재 캐릭터의 힘 [Sync] number MaxPower = 15 --최대 누적 가능한 힘 [Sync] number CurrentMoney = 0 --현재 캐릭터의 돈 [Sync] numb [scores] | [judge_reason] | [source_doc] | Maple Gym에는 힘과 최대 누적 가능한 힘, 돈, 등급 등 다양한 스탯 정보가 필요합니다. 다양한 정보를 저장하고 관리할 수 있는 컴포넌트를 만들어 봅시다. 1. 새로운 **PlayerStats** 컴포넌트를 생성합니다. 2. **PlayerStats**컴포넌트를 **DefaultPlayer**에 추가합니다. 3. PlayerStats에 스탯 정보로 사용할 프로퍼티를 추가합니다. ```lua Property: [Sync] number CurrentPower = 0 --현재 캐릭터의 힘
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | TweenLineComponent의 AutoStart를 비활성화하고 OnBeginPlay() 메서드 내에서 5초 대기 후 컴포넌트 활성화 또는 시작 로직을 수행하여 지연 후 이동하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `TweenLineComponent`의 프로퍼티 목록(`AutoStart`, `Duration`, `StopType` 등)과 해당 프로퍼티의 기능 설명만 포함되어 있습니다. 문서에는 **`OnBeginPlay()`에서 `wait()` 함수를 사용하여 시간 지연을 걸고, `TweenLineComponent`를 프로그래밍 방식으로 활성화(Enable)하거나 시작(Start)하는 API나 메서드(예: `Start()`, `SetActive()`, `SetEnabled()` 등)가 존재한다는 정보가 없습니다.** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 목적지까지 선형 운동을 하게 만들 때 사용합니다. 목적지까지 편도, 왕복 운동 여부와 더불어 가·감속, 도달 시 튕김 등 운동 방식을 설정할 수 있습니다. **TweenLineComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | ------ | --- | | TweenType | 기본값은 Linear입니다. 다른 모양의 운동 방식을 선택할 수 있습니다. 선형운동 종류별 설명은 하단의 참고자료를 참고하세요. | | Duration | 목적지까지 도달하는 데 걸리는 시간을 의미합니다. | |
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | PlayerController 컴포넌트에 Stats 프로퍼티를 선언하고 OnBeginPlay()에서 초기화하는 절차를 단계별 번호 목록으로 정리하세요. [answer] | PlayerController 컴포넌트에 Stats 프로퍼티를 선언하고 초기화하는 절차는 다음과 같습니다. 1. **PlayerController**에 **Component** 타입의 **Stats** 프로퍼티를 추가합니다. 이 프로퍼티는 **PlayerStats** 컴포넌트를 참고하게 됩니다. ```lua Property: [Sync] Component Stats = nil ``` 2. `OnBeginPlay()` 메소드에 **PlayerStats** 컴포넌트를 받아오도록 작성합니다. 이렇게 하면 ** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `Ctrl`키를 눌러 Attack 상태가 되면 운동을 하고, 힘이 증가하도록 만듭니다. 1. **PlayerController**에 **Component** 타입의 **Stats** 프로퍼티를 추가합니다. 이 프로퍼티는 **PlayerStats** 컴포넌트를 참고하게 됩니다. ```lua Property: [Sync] Component Stats = nil ``` 2. `OnBeginPlay()` 메소드에 **PlayerStats** 컴포넌트를 받아오도록 아래와 같이 작성합니다.**Playe
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | OnUpdate 메서드의 실행 공간을 '사용하지 않음'으로 설정해야 하는 이유와, 이 설정이 적용되었을 때 MoveArea 메서드의 실행 공간이 client로 지정되어 있을 때 발생하는 동작 원리를 3문장 이내로 요약하세요. [answer] | OnUpdate의 실행 공간을 '사용하지 않음'으로 설정하면 서버와 클라이언트 양쪽에서 모두 호출되도록 되어, 서버에서 실행될 경우 보정 과정에서 캐릭터 위치가 튀는 현상을 방지합니다. 이때 MoveArea 메서드의 실행 공간이 client only로 지정되어 있으므로, OnUpdate가 서버에서 실행되더라도 MoveArea 함수 본문은 실제로 실행되지 않습니다. 결과적으로 프레임마다 위치 제한 로직이 수행되는 것은 클라이언트에서만 일어나며, 서버에서는 MoveArea 호출이 무시되어 안정적으로 동작합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 운동할수록 캐릭터가 커지고, 그 힘을 돈으로 바꿀 수 있는 월드, 'Maple GYM'을 만들어봅시다. # 이동 방식 변경 RigidBodyComponent의 **KinematicMove**를 활용해 캐릭터의 이동 방식을 변경해봅시다. **DefaultPlayer - RigidBodyComponent**에서 **KinematicMove**를 선택합니다. #### 이동 영역 제한 캐릭터의 이동 방식을 **KinematicMove**로 변경하면 캐릭터가 자유롭게 상하좌우로 이동하게 됩니다. 캐릭터가 지면 영
[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | EntityService:GetEntityByPath를 이용해 /maps/map01/Taxi 경로의 택시와 self.Entity의 원숭이 TransformComponent, RigidbodyComponent 참조를 OnBeginPlay에서 초기화하는 코드를 작성해줘 [answer] | 요청하신 기능은 `OnBeginPlay` 생명주기 메서드에서 `_EntityService:GetEntityByPath`를 호출하여 지정된 경로의 택시 엔티티를 찾고, 해당 택시와 자기 자신(`self.Entity`)의 `TransformComponent` 및 `RigidbodyComponent` 참조를 프로퍼티에 할당하는 방식입니다. 참고 문서에 기반한 mLua 스크립트 컴포넌트 코드는 다음과 같습니다. ```lua Property: Component MonkeyTransform = nil Component TaxiTransfo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | RigidbodyComponent를 활용해 질주하는 택시가 원숭이를 밀어낼 수 있도록 만들어 봅시다. 원숭이를 밀어내기 위해서는 원숭이가 택시 위치를 확인하고, 택시가 원숭이게 근접하면 원숭이의 RigidbodyComponent에 힘을 주도록 만들어봅시다. 1. **Workspace - MyDesk - Create Scripts - Create Component**을 선택해 새 스크립트 컴포넌트를 추가하고 이름을 **Monkey**로 변경합니다. 2. **Monkey** 엔티티에 **Monkey 컴포넌트**를 추가합니
[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | Monkey 엔티티에 RigidbodyComponent를 통해 택시가 접근 시 한 번만 원숭이를 밀어내는 동작을 구현하는 스크립트를 작성해줘 [answer] | 제시된 가이드에 따라, 택시가 원숭이에 접근하면 `RigidbodyComponent`에 힘을 가해 한 번만 밀어내는 동작을 구현하는 `Monkey` 스크립트 컴포넌트입니다. ```lua Property: Component MonkeyTransform = nil Component TaxiTransform = nil Component MonkeyRigidbody = nil boolean IsHit = false Method: void OnBeginPlay() { local taxi = _EntityService:G [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | RigidbodyComponent를 활용해 질주하는 택시가 원숭이를 밀어낼 수 있도록 만들어 봅시다. 원숭이를 밀어내기 위해서는 원숭이가 택시 위치를 확인하고, 택시가 원숭이게 근접하면 원숭이의 RigidbodyComponent에 힘을 주도록 만들어봅시다. 1. **Workspace - MyDesk - Create Scripts - Create Component**을 선택해 새 스크립트 컴포넌트를 추가하고 이름을 **Monkey**로 변경합니다. 2. **Monkey** 엔티티에 **Monkey 컴포넌트**를 추가합니
[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | 맵의 "/maps/map01/Taxi" 경로에 있는 택시 엔티티의 RigidbodyComponent를 제거하고, OnUpdate 메서드에서 TransformComponent.Position.x 값을 매 프레임마다 감소시켜 왼쪽에서 오른쪽으로 이동하게 하는 스크립트를 작성해줘 [answer] | 질문하신 내용에는 사실 관계의 오류가 있습니다. 1. **RigidbodyComponent 제거는 스크립트가 아닌 에디터에서 수행해야 합니다.** mLua 스크립트 API 문서에는 런타임 시 `RigidbodyComponent`를 제거하는 메서드가 제공되지 않습니다. StaticNPC 모델에서 `RigidbodyComponent`를 제거하는 것은 **WorkSpace - NativeModel**에서 모델을 선택한 후, 프로퍼티 에디터에서 해당 컴포넌트의 컨텍스트 메뉴를 통해 **Remove Component**를 선택하는 * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 용감한 시그너스 기사단 소속 아잘린이 먼저 고통의 미궁으로 출발한 나이트워커 부대에 합류할 수 있도록 택시를 불러봅시다. 부른 택시가 아잘린을 지나치지 않고 아잘린 앞에서 멈춰서 아잘린이 탑승할 수 있도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.gif "Example") # StaticNPC 모델 수정하기 StaticNPC 모델에서 Rigid
[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | OnUpdate에서 IsHit가 false일 때 택시와 원숭이의 Position.x 좌표를 비교하여 택시가 원숭이 x좌표보다 0.8 이상 가까워지면 MonkeyRigidbody:SetForce(Vector2(8,8))을 호출하는 로직을 작성해줘 [answer] | 요청하신 로직은 `IsHit`가 `false`일 때만 동작하며, 택시와 원숭이의 `Position.x` 좌표를 비교하여 택시가 원숭이의 x좌표보다 0.8 이상 가까워지면(`taxiPos.x > monkeyPos.x - 0.8`) `MonkeyRigidbody`에 힘을 가하고 다시는 밀리지 않도록 `IsHit`를 `true`로 변경하는 방식입니다. 참고 문서에 제시된 `OnUpdate` 로직을 mLua 스크립트 형식에 맞춰 작성한代码如下입니다. ```lua Property: Component MonkeyTransform = nil [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | RigidbodyComponent를 활용해 질주하는 택시가 원숭이를 밀어낼 수 있도록 만들어 봅시다. 원숭이를 밀어내기 위해서는 원숭이가 택시 위치를 확인하고, 택시가 원숭이게 근접하면 원숭이의 RigidbodyComponent에 힘을 주도록 만들어봅시다. 1. **Workspace - MyDesk - Create Scripts - Create Component**을 선택해 새 스크립트 컴포넌트를 추가하고 이름을 **Monkey**로 변경합니다. 2. **Monkey** 엔티티에 **Monkey 컴포넌트**를 추가합니
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | MoveArea() 메소드에서 캐릭터의 Y 좌표를 상하한계로 제한하기 위해 비교하는 두 개의 숫자 값과, 해당 값이 초과될 때 SetPosition 메서드에 전달하는 Vector2 인자 구성 방식을 표로 정리해서 답변하세요. [answer] | `MoveArea()` 메소드에서 캐릭터의 Y 좌표를 제한하기 위해 사용하는 두 개의 숫자 값과 `SetPosition` 메서드에 전달하는 `Vector2` 인자 구성 방식은 다음과 같습니다. | 구분 | 비교 조건 (Y 좌표 기준) | 초과/미달 시 `SetPosition` 인자 구성 | | :--- | :--- | :--- | | **상한계 제한** | `pos.y > -1.23` | `Vector2(pos.x, -1.23)` | | **하한계 제한** | `pos.y < -2.6` | `Vector2(pos.x, -2.6)` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 운동할수록 캐릭터가 커지고, 그 힘을 돈으로 바꿀 수 있는 월드, 'Maple GYM'을 만들어봅시다. # 이동 방식 변경 RigidBodyComponent의 **KinematicMove**를 활용해 캐릭터의 이동 방식을 변경해봅시다. **DefaultPlayer - RigidBodyComponent**에서 **KinematicMove**를 선택합니다. #### 이동 영역 제한 캐릭터의 이동 방식을 **KinematicMove**로 변경하면 캐릭터가 자유롭게 상하좌우로 이동하게 됩니다. 캐릭터가 지면 영
[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | 힘을 가한 직후 IsHit 프로퍼티를 true로 변경하여 이후 프레임에서 동일한 힘 적용이 반복되지 않도록 방지하는 처리를 포함하는 스크립트를 작성해줘 [answer] | 택시가 원숭이에 근접했을 때 `RigidbodyComponent`에 힘을 가하고, 해당 동작이 반복되지 않도록 `IsHit` 상태를 즉시 `true`로 변경하는 로직을 포함하는 스크립트입니다. ```lua Property: Component MonkeyTransform = nil Component TaxiTransform = nil Component MonkeyRigidbody = nil boolean IsHit = false Method: [server only] void OnBeginPlay() { loca [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | RigidbodyComponent를 활용해 질주하는 택시가 원숭이를 밀어낼 수 있도록 만들어 봅시다. 원숭이를 밀어내기 위해서는 원숭이가 택시 위치를 확인하고, 택시가 원숭이게 근접하면 원숭이의 RigidbodyComponent에 힘을 주도록 만들어봅시다. 1. **Workspace - MyDesk - Create Scripts - Create Component**을 선택해 새 스크립트 컴포넌트를 추가하고 이름을 **Monkey**로 변경합니다. 2. **Monkey** 엔티티에 **Monkey 컴포넌트**를 추가합니
[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | "/maps/map01/Azallin" 경로에 있는 아잘린 엔티티의 현재 TransformComponent.Position.x 값을 기준으로, "/maps/map01/Taxi" 경로에 있는 택시 엔티티가 아잘린의 x 좌표와 같아질 때까지 이동하다가 그 위치에서 멈추도록 OnUpdate 메서드를 구현하는 스크립트를 작성해줘 [answer] | 아잘린의 현재 x 좌표를 기준으로 택시가 해당 위치까지 이동하고, 도달하면 멈추도록 `OnUpdate` 메서드를 구현했습니다. 참고 문서의 예제에서 엔티티는 `_EntityService:GetEntityByPath`로 가져오며, 위치는 `TransformComponent.Position`을 통해 접근하고 수정하는 방식을 따랐습니다. ```lua Property: [None] Entity taxiEntity = nil [None] Entity azallinEntity = nil [None] number targetX = 0 Me [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 용감한 시그너스 기사단 소속 아잘린이 먼저 고통의 미궁으로 출발한 나이트워커 부대에 합류할 수 있도록 택시를 불러봅시다. 부른 택시가 아잘린을 지나치지 않고 아잘린 앞에서 멈춰서 아잘린이 탑승할 수 있도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.gif "Example") # StaticNPC 모델 수정하기 StaticNPC 모델에서 Rigid
[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | _EntityService:GetEntityByPath의 경로 문자열이 "/maps/map01/Azallin"처럼 고정되어 있어야 하는지, 아니면 맵 이름이나 엔티티 이름이 달라지면 경로 구조가 어떻게 바뀌는지 설명해 주세요. [answer] | 제공된 참고 문서에는 `_EntityService:GetEntityByPath` 메서드의 경로 문자열 구조(`/maps/맵이름/엔티티이름`)가 어떻게 결정되는지, 또는 맵 이름이나 엔티티 이름이 변경될 때 경로가 어떻게 변하는지에 대한 정보가 포함되어 있지 않습니다. 문서에서는 단순히 `/maps/map01/Azallin`이라는 문자열을 사용하여 엔티티를 가져오는 예시만 제시하고 있을 뿐, 경로 생성 규칙이나 구조에 대한 설명은 없습니다. 따라서 이 질문에 대한 정확한 답변은 제공된 문서만으로는 불가능합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 만든 택시는 멈추지 않고 계속 이동하고 있습니다. 택시는 아잘린이 서 있는 곳에서 멈춰야 하므로, 아잘린의 위치 정보를 이용해야 합니다. 택시가 이동하다 아잘린과의 거리가 가까워지면, 멈추도록 조건을 추가해봅시다. 1. **Taxi**컴포넌트에 새로운 **AzallinTransform** 프로퍼티를 추가하고, 타입을 **Component**로 변경합니다. ```lua Property: [Sync] Component AzallinTransform = nil ``` 2. `OnBeginP
[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | DefaultPlayer에 PlayerStats 컴포넌트를 추가하지 않고 일반 엔티티에 붙이면 어떤 문제가 발생하나요? [answer] | 제공된 참고 문서에는 `DefaultPlayer`에 `PlayerStats` 컴포넌트를 추가해야 하는 이유나, 일반 엔티티에 붙일 경우 발생하는 구체적인 문제점에 대한 설명이 포함되어 있지 않습니다. 문서에서는 Maple Gym 제작 가이드의 일환으로 "PlayerStats 컴포넌트를 DefaultPlayer에 추가합니다"라는 단계만 제시하고 있으며, 그 외 다른 엔티티에 적용했을 때의 부작용이나 기술적 한계에 대한 정보는 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Maple Gym에는 힘과 최대 누적 가능한 힘, 돈, 등급 등 다양한 스탯 정보가 필요합니다. 다양한 정보를 저장하고 관리할 수 있는 컴포넌트를 만들어 봅시다. 1. 새로운 **PlayerStats** 컴포넌트를 생성합니다. 2. **PlayerStats**컴포넌트를 **DefaultPlayer**에 추가합니다. 3. PlayerStats에 스탯 정보로 사용할 프로퍼티를 추가합니다. ```lua Property: [Sync] number CurrentPower = 0 --현재 캐릭터의 힘
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | WorkOut() 메소드 하단에 추가해야 하는 SizeSet() 호출 코드를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua -- WorkOut() 메소드 하단에 추가해야 하는 SizeSet() 호출 코드 self:SizeSet() ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 커지는 몸 구현 증가하는 힘의 크기만큼 캐릭터의 크기가 증가하는 기능을 구현하겠습니다. 1. **PlayerController** 컴포넌트에 새로운 `SizeSet()` 메소드를 생성합니다. 2. `SizeSet()` 메소드에 캐릭터의 크기가 **0.1**씩 커질 수 있도록 아래와 같이 작성합니다. ```lua void SizeSet() { local size = 1 + (0.1 * self.Stats.CurrentPow) self.Transform.Scale = Vecto
[task] | two_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | 택시가 아잘린의 위치에 도달하도록 조건을 설정할 때, 아잘린 엔티티의 TransformComponent를 어떻게 가져와야 하나요? [answer] | 택시가 아잘린의 위치에 도달하도록 하려면, `OnBeginPlay()` 함수 내에서 `_EntityService`의 `GetEntityByPath` 메서드를 사용하여 아잘린 엔티티를 먼저 가져온 후, 해당 엔티티의 `TransformComponent`에 접근하는 방식으로 처리합니다. 구체적인 과정은 다음과 같습니다. 1. `Property` 블록에 타입이 `Component`인 `AzallinTransform` 프로퍼티를 선언합니다. 2. `OnBeginPlay()`에서 `_EntityService:GetEntityByPat [followup] | 아잘린 엔티티를 엔티티 경로로 가져오는 _EntityService:GetEntityByPath 호출 방법과 OnBeginPlay()에서 AzallinTransform 프로퍼티에 값을 대입하는 코드를 보여주세요. [followup_answer] | `OnBeginPlay()` 함수에서 `_EntityService:GetEntityByPath()` 메서드를 호출하여 아잘린 엔티티를 가져오고, 해당 엔티티의 `TransformComponent`를 `self.AzallinTransform` 프로퍼티에 대입하는 코드는 다음과 같습니다. ```lua [server only] void OnBeginPlay() { local azallin = _EntityService:GetEntityByPath("/maps/map01/Azallin") self.AzallinTransfo [scores] | [judge_reason] | [source_doc] | 만든 택시는 멈추지 않고 계속 이동하고 있습니다. 택시는 아잘린이 서 있는 곳에서 멈춰야 하므로, 아잘린의 위치 정보를 이용해야 합니다. 택시가 이동하다 아잘린과의 거리가 가까워지면, 멈추도록 조건을 추가해봅시다. 1. **Taxi**컴포넌트에 새로운 **AzallinTransform** 프로퍼티를 추가하고, 타입을 **Component**로 변경합니다. ```lua Property: [Sync] Component AzallinTransform = nil ``` 2. `OnBeginP
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | UI 버튼 제작 과정에서 DefaultGroup에 추가해야 하는 텍스트 UI의 이름 두 개를 표로 정리하세요. [answer] | UI 버튼 제작 과정에서 **DefaultGroup**에 추가해야 하는 텍스트 UI의 이름 두 개는 다음과 같습니다. | UI 이름 | | :--- | | UIPower | | UIMoney | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 커지는 몸 구현 증가하는 힘의 크기만큼 캐릭터의 크기가 증가하는 기능을 구현하겠습니다. 1. **PlayerController** 컴포넌트에 새로운 `SizeSet()` 메소드를 생성합니다. 2. `SizeSet()` 메소드에 캐릭터의 크기가 **0.1**씩 커질 수 있도록 아래와 같이 작성합니다. ```lua void SizeSet() { local size = 1 + (0.1 * self.Stats.CurrentPow) self.Transform.Scale = Vecto
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | SizeSet() 메소드에서 캐릭터의 크기가 증가하는 로직을 3문장 이내로 설명하세요. [answer] | 캐릭터의 현재 힘(Stats.CurrentPow)에 0.1을 곱한 값을 1에 더해 크기 배율(size)을 계산합니다. 계산된 size 값을 Vector3(size, size, 1)로 변환하여 캐릭터의 X축과 Y축 크기를 동시에 조정합니다. 마지막으로 self.Transform.Scale에 해당 벡터를 대입함으로써 시각적으로 캐릭터가 커지도록 적용합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 커지는 몸 구현 증가하는 힘의 크기만큼 캐릭터의 크기가 증가하는 기능을 구현하겠습니다. 1. **PlayerController** 컴포넌트에 새로운 `SizeSet()` 메소드를 생성합니다. 2. `SizeSet()` 메소드에 캐릭터의 크기가 **0.1**씩 커질 수 있도록 아래와 같이 작성합니다. ```lua void SizeSet() { local size = 1 + (0.1 * self.Stats.CurrentPow) self.Transform.Scale = Vecto
[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | KinematicMove를 적용했을 때 OnUpdate의 실행 공간을 Server로 설정하면 캐릭터가 왜 튀는 것처럼 보이는지, 그리고 해결 방법은 무엇인가요? [answer] | KinematicMove를 적용한 상태에서 `OnUpdate()`의 실행 공간을 **Server**로 설정하면, 서버와 클라이언트 간 동기화 과정에서 위치 보정 충돌이 발생하여 캐릭터가 순간적으로 다른 위치로 이동하는 것처럼 보이는 현상(튀는 현상)이 발생합니다. 이 문제를 해결하기 위해 `OnUpdate()`의 실행 공간을 **사용하지 않음(설정 안 함)**으로 변경해야 합니다. 이렇게 하면 서버와 클라이언트 모두에서 `OnUpdate()`가 호출되며, 실제로는 **Client**에서 실행되는 `MoveArea()` 메서드가 프 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 운동할수록 캐릭터가 커지고, 그 힘을 돈으로 바꿀 수 있는 월드, 'Maple GYM'을 만들어봅시다. # 이동 방식 변경 RigidBodyComponent의 **KinematicMove**를 활용해 캐릭터의 이동 방식을 변경해봅시다. **DefaultPlayer - RigidBodyComponent**에서 **KinematicMove**를 선택합니다. #### 이동 영역 제한 캐릭터의 이동 방식을 **KinematicMove**로 변경하면 캐릭터가 자유롭게 상하좌우로 이동하게 됩니다. 캐릭터가 지면 영
[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | PlayerStats 컴포넌트에서 CurrentSkillGrade와 CurrentDanGrad의 초기값을 1로 설정하는 것이 게임 플레이에 어떤 영향을 미치나요? [answer] | 참고 문서에는 `CurrentSkillGrade`와 `CurrentDanGrad` 프로퍼티의 초기값이 1로 설정되어 있다는 사실과, 각각이 "현재 캐릭터의 운동 등급" 및 "현재 캐릭터의 DNA 등급"임을 나타내는 주석만 제시되어 있습니다. 문서에는 이 초기값이 게임 플레이 로직(예: 특정 등급에 도달해야만 해금되는 기능, 등급별 상이한 보상, 또는 등급 상승 조건 등)에 구체적으로 어떤 영향을 미치는지에 대한 설명이나 관련 코드 예제가 포함되어 있지 않습니다. 따라서 주어진 문서 범위 내에서 초기값 1이 게임 플레이에 미치는 구 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Maple Gym에는 힘과 최대 누적 가능한 힘, 돈, 등급 등 다양한 스탯 정보가 필요합니다. 다양한 정보를 저장하고 관리할 수 있는 컴포넌트를 만들어 봅시다. 1. 새로운 **PlayerStats** 컴포넌트를 생성합니다. 2. **PlayerStats**컴포넌트를 **DefaultPlayer**에 추가합니다. 3. PlayerStats에 스탯 정보로 사용할 프로퍼티를 추가합니다. ```lua Property: [Sync] number CurrentPower = 0 --현재 캐릭터의 힘
[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | 멀티캐스트 메서드에서 값을 설정할 때 클라이언트와 서버 중 어디에서 먼저 실행되는지 궁금해요. [answer] | 제공된 참고 문서에는 `multicast` 메서드가 클라이언트와 서버 중 어디에서 먼저 실행되는지에 대한 정보가 포함되어 있지 않습니다. 문서에는 `SetPow` 메서드가 `[multicast]` 속성을 가지고 있으며, `WorkOut()` 메서드 내에서 `self.Stats:SetPow(calePow)` 형태로 호출되는 코드 예시와, `Ctrl` 키 입력 시 로그가 출력되는 확인 단계만 언급되어 있을 뿐, 실행 순서나 네트워크 동기화 타이밍에 대한 설명은 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua [multicast] void SetPow (number currentPow) { self.CurrentPow = currentPow log(self.CurrentPow) } ``` 8. `WorkOut()` 메소드에 `SetPow()` 메소드를 호출할 수 있도록 가장 하단에 아래 내용을 추가 작성합니다. ```lua self.Stats:SetPow(calePow) ``` 9. `Ctrl`키를 누를 때마다 숫자가 증가하는
[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | CurrentPower와 MaxPower 모두 [Sync] 처리되어 있는데, 클라이언트에서 직접 MaxPower 값을 수정하는 스크립트 로직을 만들 수 있나요? [answer] | 불가능합니다. mLua 스크립트 규칙에 따르면 `[Sync]` 프로퍼티는 서버와 클라이언트 간에 동기화되는 값이지만, 값의 수정 권한은 기본적으로 서버에 있습니다. 클라이언트 스크립트( `[client only]` 또는 `[client]` 실행 공간)에서 `[Sync]` 프로퍼티를 직접 수정하는 로직은 정상적으로 동작하지 않으며, 서버의 값이 클라이언트로 동기화되는 것이 원칙입니다. 따라서 클라이언트에서 `MaxPower` 값을 변경하려면, 반드시 서버 측 로직( `[server only]` 또는 `[server]` 메서드)을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Maple Gym에는 힘과 최대 누적 가능한 힘, 돈, 등급 등 다양한 스탯 정보가 필요합니다. 다양한 정보를 저장하고 관리할 수 있는 컴포넌트를 만들어 봅시다. 1. 새로운 **PlayerStats** 컴포넌트를 생성합니다. 2. **PlayerStats**컴포넌트를 **DefaultPlayer**에 추가합니다. 3. PlayerStats에 스탯 정보로 사용할 프로퍼티를 추가합니다. ```lua Property: [Sync] number CurrentPower = 0 --현재 캐릭터의 힘
[task] | two_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | `SetPow()` 메서드를 `multicast`로 선언하고 `WorkOut()`에서 호출할 때, 클라이언트와 서버 간 `CurrentPow` 상태 동기화 방식에 대해 자세히 알려주세요 [answer] | 제공된 참고 문서에는 `SetPow()` 메서드가 `multicast`로 선언되어 있고, `WorkOut()` 메서드 내에서 `self.Stats:SetPow(calePow)` 형태로 호출되는 코드 조각만 포함되어 있습니다. 문서에는 `multicast` 메서드가 클라이언트와 서버 간에 어떻게 동작하는지, `CurrentPow` 프로퍼티의 동기화 메커니즘(예: `[Sync]` 속성의 역할, 네트워크 패킷 전송 방식, 상태 반영 순서 등)에 대한 기술적 설명이나 API 문서가 포함되어 있지 않습니다. 따라서 주어진 정보만으로는 ` [followup] | `SetPow()` 내부에서 `log(self.CurrentPow)`가 출력되는 주기와, `WorkOut()`의 `calePow` 계산 로직이 서버에서만 실행될 경우 발생할 수 있는 클라이언트 로그 누락 예외 상황은 무엇인가요? [followup_answer] | 제공된 참고 문서에는 `SetPow()` 메서드의 코드와 `WorkOut()`에서 이를 호출하는 한 줄, 그리고 "Ctrl키를 누를 때마다 숫자가 증가하는 로그가 출력되는지 확인"하는 단계를 확인하는 내용만 포함되어 있습니다. 문서에는 다음 사항에 대한 정보가 없습니다: 1. `WorkOut()` 메서드 전체 코드 및 `calePow` 계산 로직 2. `WorkOut()` 메서드의 실행 공간(`[server only]`, `[client only]`, `[multicast]` 등) 3. `Ctrl`키 입력 이벤트 처리 로직 4. [scores] | [judge_reason] | [source_doc] | ```lua [multicast] void SetPow (number currentPow) { self.CurrentPow = currentPow log(self.CurrentPow) } ``` 8. `WorkOut()` 메소드에 `SetPow()` 메소드를 호출할 수 있도록 가장 하단에 아래 내용을 추가 작성합니다. ```lua self.Stats:SetPow(calePow) ``` 9. `Ctrl`키를 누를 때마다 숫자가 증가하는
[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | 타겟 엔티티의 TransformComponent를 직접 참조하기 위해 [Sync] Component 타입의 프로퍼티를 선언하고, OnBeginPlay에서 _EntityService:GetEntityByPath로 가져와서 할당하는 코드가 어떤 순서로 작성되어야 합니까? [answer] | 타겟 엔티티의 `TransformComponent`를 직접 참조하기 위한 코드는 아래 순서로 작성해야 합니다. 1. **Property 블록**에서 `[Sync]` 속성을 가진 `Component` 타입의 프로퍼티를 선언합니다. 2. **Method 블록**의 `OnBeginPlay()` 함수(실행 공간: `[server only]`)에서 `_EntityService:GetEntityByPath`를 호출하여 엔티티를 가져옵니다. 3. 가져온 엔티티의 `TransformComponent`를 선언한 프로퍼티에 할당합니다. 구체 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 만든 택시는 멈추지 않고 계속 이동하고 있습니다. 택시는 아잘린이 서 있는 곳에서 멈춰야 하므로, 아잘린의 위치 정보를 이용해야 합니다. 택시가 이동하다 아잘린과의 거리가 가까워지면, 멈추도록 조건을 추가해봅시다. 1. **Taxi**컴포넌트에 새로운 **AzallinTransform** 프로퍼티를 추가하고, 타입을 **Component**로 변경합니다. ```lua Property: [Sync] Component AzallinTransform = nil ``` 2. `OnBeginP
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | UIManager의 OnBeginPlay()에서 실행 공간을 client only로 설정해야 하는 이유를 2문장 이내로 설명하세요. [answer] | UI는 클라이언트에서만 렌더링되고 표시되므로, UI 엔티티와 텍스트 컴포넌트에 접근하기 위해서는 실행 공간을 client only로 설정해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 전반적인 UI 관리를 위한 UIManager 스크립트 컴포넌트를 만들어 봅시다. **PlayerStats** 컴포넌트에서 힘을 증가시킬 때마다 **UIManager**에서 UI를 갱신하는 방식으로 구현하겠습니다. 1. 새로운 **UIManager** 컴포넌트를 생성합니다. 2. **Hierarchy - ui - DefaultGroup**에 생성한 **UIManager** 컴포넌트를 추가합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/176951343509088f9e