← 목록

mLua · Nemotron SDG 질문-응답 (SFT)

총 21,567개 · 페이지 370/719
🔀 랜덤
불러오는 중…

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | `TweenLineComponent`를 사용해 엔티티를 이동시킬 때, 서버에서 시작하여 모든 클라이언트에 동기화되게 하되, 특정 클라이언트에서만 다른 이동 방식을 보이게 하고 싶다면 `SyncType` 프로퍼티를 어떻게 활용해야 하나요? [answer] | `TweenLineComponent`의 `SyncType` 프로퍼티는 서버와 클라이언트 중 어디에서 컴포넌트가 동작하고 동기화될지를 결정하는 옵션입니다. 질문하신 상황(서버에서 시작하여 모든 클라이언트에 동기화되되, 특정 클라이언트에서만 다른 이동 방식을 보이게 함)은 `SyncType` 프로퍼티만으로 해결할 수 없습니다. `SyncType`의 옵션은 다음과 같습니다: * **Default**: Server에서 동작하며 모든 Client에게 동일하게 보입니다. * **ClientOnly**: 해당 Client에서만 동작하고 [followup] | `SyncType`을 `Default`로 설정한 상태에서 `AutoStart`가 `true`이면, 서버와 클라이언트 모두에서 `OnBeginPlay()` 시점에 운동이 동시에 시작되는지, 아니면 서버에서만 시작되어 클라이언트로 동기화되는지, 그리고 `Positions`의 `Size` 값을 0으로 설정하면 어떤 오류가 발생하거나 어떻게 동작하는지 설명해 주세요. [followup_answer] | `SyncType`을 `Default`로 설정하고 `AutoStart`를 `true`로 한 경우의 동작 방식과 `Positions`의 `Size`를 0으로 설정했을 때의 동작은 다음과 같습니다. **1. `SyncType` = `Default` 및 `AutoStart` = `true`인 경우의 시작 시점** `SyncType`이 `Default`로 설정되면 컴포넌트는 **Server에서 동작하며** 모든 Client에게 동일하게 보입니다. 따라서 `AutoStart`가 활성화되어 있어도, 운동은 **서버에서만 시작**됩니다. 클라 [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 목적지까지 선형 운동을 하게 만들 때 사용합니다. 목적지까지 편도, 왕복 운동 여부와 더불어 가·감속, 도달 시 튕김 등 운동 방식을 설정할 수 있습니다. **TweenLineComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | ------ | --- | | TweenType | 기본값은 Linear입니다. 다른 모양의 운동 방식을 선택할 수 있습니다. 선형운동 종류별 설명은 하단의 참고자료를 참고하세요. | | Duration | 목적지까지 도달하는 데 걸리는 시간을 의미합니다. | |

[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | Taxi 컴포넌트에 AzallinTransform 프로퍼티를 설정하고, OnUpdate() 루프 내에서 현재 택시 위치의 x 좌표와 아잘린 위치의 x 좌표를 비교하여 택시가 아잘린을 지나치지 않도록 조건부 이동 로직을 구현하는 스크립트를 작성해줘 [answer] | 제시된 참고 문서의 내용을 바탕으로, 택시가 아잘린의 위치에서 멈추도록 하는 `Taxi` 컴포넌트 스크립트를 작성했습니다. 1. **AzallinTransform** 프로퍼티를 `Component` 타입으로 선언하여 아잘린의 Transform 컴포넌트를 저장합니다. 2. **OnBeginPlay()**에서 `_EntityService`를 사용하여 아잘린 엔티티의 경로를 통해 엔티티를 가져오고, 해당 엔티티의 `TransformComponent`를 프로퍼티에 할당합니다. 3. **OnUpdate()**에서 택시의 현재 위치(` [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] | OnBeginPlay에서 self.Stats = self.Entity.PlayerStats로 할당할 때, PlayerStats 컴포넌트가 아직 초기화되지 않았거나 nil인 경우 발생할 수 있는 오류와 이를 방지하기 위한 주의사항은 무엇인가요? [answer] | 제공된 참고 문서에는 `OnBeginPlay()`에서 `self.Stats = self.Entity.PlayerStats`를 할당할 때 **PlayerStats 컴포넌트가 초기화되지 않았거나 nil인 경우 발생하는 구체적인 오류 유형(예: nil reference error 등)이나 이를 방지하기 위한 명시적인 주의사항(예: nil 체크 코드 예제 등)에 대한 정보가 포함되어 있지 않습니다.** 문서에서 제시된 내용은 단순히 `OnBeginPlay()` 내에서 해당 할당 문장을 작성하도록 안내하는 것뿐이며, 오류 처리 로직이나 안 [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] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | `OnBeginPlay()`에서 `_EntityService:GetEntityByPath`를 통해 택시를 조회할 때, 경로가 `/maps/map01/Taxi`로 고정되어 있는데 맵 이름이나 엔티티 이름이 바뀌면 에러가 나는 것을 방지하기 위해 어떤 방법을 써야 할까요? [answer] | 제공된 참고 문서에는 `_EntityService:GetEntityByPath` 메서드의 사용 예시(`/maps/map01/Taxi`)와 `OnBeginPlay`에서 엔티티를 조회하여 컴포넌트 참조를 할당하는 방식만 설명되어 있습니다. 문서에는 **경로가 변경되었을 때 에러를 방지하기 위한 방법(예: 경로 검증, 네임스페이스 검색, 빈값 처리 등)** 에 대한 설명이나 API가 포함되어 있지 않습니다. 따라서 주어진 문서 범위 내에서는 경로 변경에 따른 에러 방지 방법을 설명할 수 없습니다. [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] | Maple GYM 만들기 Ⅰ [question] | PlayerController 컴포넌트에 Stats.CurrentPow 값이 0.1씩 증가할 때마다 Transform.Scale이 1부터 선형적으로 커지는 SizeSet() 메서드를 구현하고, WorkOut() 메서드 마지막에 self:SizeSet()을 호출하여 Ctrl키 입력 시 크기가 변하는 스크립트를 작성해줘 [answer] | PlayerController 컴포넌트에 `SizeSet()` 메서드를 추가하고, `WorkOut()` 메서드 마지막에 이를 호출하도록 구현하면 됩니다. `Stats.CurrentPow` 값이 0.1씩 증가할 때마다 캐릭터의 스케일(Scale)이 1부터 선형적으로 증가하도록 로직을 구성했습니다. ```lua Property: [None] number Stats = 0 Method: [client only] void SizeSet() { local size = 1 + (0.1 * self.Stats) self.Ent [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] | WorkOut 메서드 내부에서 SizeSet 호출을 가장 아래에 배치해야 하는 이유는 무엇이며, 다른 순서로 호출하면 어떤 문제가 발생할 수 있나요? [answer] | 참고 문서에 따르면, `WorkOut()` 메서드 내에서 `SizeSet()` 호출을 가장 아래에 배치하는 이유나 다른 순서로 호출했을 때 발생하는 구체적인 문제에 대한 설명이 없습니다. 문서는 단순히 "`WorkOut()`에 `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] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | PlayerStats 컴포넌트에서 CurrentSkillGrade와 CurrentDanGrad 프로퍼티를 사용하여 운동 등급과 DNA 등급 정보를 저장하고, 이 값들이 1 이상으로 유지되도록 초기화 및 동기화되는 스크립트를 작성해줘 [answer] | PlayerStats 컴포넌트에 운동 등급과 DNA 등급 정보를 저장하고, 이 값들이 1 이상으로 유지되도록 초기화 및 동기화하는 스크립트입니다. 문서에 따르면 `_DataStorageService`의 `GetGlobalDataStorage`, `SetAsync`, `GetAsync` 메서드를 사용하여 데이터를 저장하고 불러올 수 있으며, `OnBeginPlay` 생명주기 메서드에서 초기화를 수행하는 것이 일반적입니다. 값이 1보다 작을 경우 1로 재설정하는 로직을 포함하여 요청하신 조건을 충족합니다. ```lua Propert [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] | if calePow > self.Stats.MaxPow then 구문에서 MaxPow를 초과하는 경우 calePow 값을 MaxPow로 재할당하는 로직의 목적은 무엇이며, 이 로직이 없다면 어떤 현상이 일어나나요? [answer] | `if calePow > self.Stats.MaxPow then calePow = self.Stats.MaxPow end` 구문의 목적은 캐릭터의 힘(Pow)이 설정된 최대치(`MaxPow`)를 넘지 않도록 제한하는 것입니다. 이를 통해 힘 값이 시스템에서 허용하는 범위를 벗어나는 것을 방지합니다. 이 로직이 없다면 다음과 같은 현상이 발생합니다. 1. **힘 값의 무한 누적**: `WorkOut()` 메서드가 호출될 때마다 `CurrentPow`에 `WeightBonus`가 더해지므로, `MaxPow` 제한이 없으면 힘 값 [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] | Maple GYM 만들기 Ⅰ [question] | PlayerController에서 PlayerStats 컴포넌트를 참조하여 WorkOut 로직을 구현할 때, Stats 프로퍼티의 초기화 및 OnBeginPlay에서의 할당 방식은 어떻게 되나요? [answer] | `PlayerController` 컴포넌트에서 `PlayerStats` 컴포넌트를 참조하여 `WorkOut` 로직을 구현할 때, 프로퍼티 초기화 및 할당 방식은 다음과 같습니다. **1. Stats 프로퍼티 정의** `PlayerController` 컴포넌트의 `Property` 블록에 `Component` 타입의 `Stats` 프로퍼티를 추가합니다. 이 프로퍼티는 다른 엔티티나 컴포넌트를 참조하기 위해 사용되며, 동기화(Sync) 설정을 적용하여 클라이언트와 서버 간 상태가 유지되도록 합니다. 초기값은 `nil`로 설정합니다. [followup] | WorkOut() 메서드 내에서 calePow가 MaxPow를 초과하는 경우의 처리 로직과, 최종 결정된 힘을 PlayerStats의 SetPow() 메서드에 전달하는 구체적인 코드 구현이 어떻게 되는지 알려주세요. [followup_answer] | `WorkOut()` 메서드 내에서 `MaxPow` 초과 처리 및 `SetPow()` 호출 로직은 다음과 같이 구현합니다. 1. **초과 처리 로직**: 현재 힘(`CurrentPow`)에 운동 증가량(`WeightBonus`)을 더한 임시 변수 `calePow`를 생성합니다. 이 값이 최대 힘(`MaxPow`)을 초과하는 경우, `calePow`를 `MaxPow`로 고정하여 힘이 누적되지 않도록 제한합니다. 2. **SetPow() 전달**: 제한 처리가 완료된 최종 힘 값(`calePow`)을 `PlayerStats` 컴포 [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] | SetPow 메서드 내에서 힘 UI 갱신을 위해 추가해야 하는 코드 라인만 출력하고, 그 용도를 주석으로 설명하세요. [answer] | ```lua self:RenewPow() -- 힘이 증가할 때마다 힘 UI를 갱신하기 위해 RenewPow() 메서드를 호출합니다. ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua void OnBeginPlay() { if self:IsClient() then self.UiManager = _EntityService:GetEntityByPath("/ui/DefaultGroup").UIManager end } ``` 9. **PlayerStats** 컴포넌트에 `RenewPow()` 메소드를 생성하고 아래 내용을 추가합니다. ```lua [client only] void

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | OnBeginPlay에서 UIManager를 초기화하기 위해 GetEntityByPath 함수에 전달하는 경로 문자열과, 이 초기화가 수행되는 조건부 블록의 이름은 무엇인지 두 줄 이내로 답하세요. [answer] | 경로 문자열은 `/ui/DefaultGroup`이며, 조건부 블록은 `if self:IsClient() then`입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua void OnBeginPlay() { if self:IsClient() then self.UiManager = _EntityService:GetEntityByPath("/ui/DefaultGroup").UIManager end } ``` 9. **PlayerStats** 컴포넌트에 `RenewPow()` 메소드를 생성하고 아래 내용을 추가합니다. ```lua [client only] void

[task] | two_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | UI 매니저를 초기화하고 힘 및 돈 UI를 갱신하는 메서드 구조를 어떻게 구성해야 하는지 궁금합니다. [answer] | 참고된 Maple GYM 제작 가이드에 따르면, UI 매니저 초기화와 힘(Pow)·돈(Money) UI 갱신은 **PlayerStats** 컴포넌트 내에서 클라이언트 공간(`[client only]`)을 중심으로 구성합니다. 구체적인 구성 방법은 다음과 같습니다. 1. **UI 매니저 초기화 (`OnBeginPlay`)** * `OnBeginPlay` 생명주기 메서드에서 `self:IsClient()` 조건을 확인하여 클라이언트에서만 실행되도록 합니다. * `_EntityService:GetEntityBy [followup] | `OnBeginPlay`에서 `UiManager`를 가져오는 코드와 `RenewPow`, `RenewMoney` 메서드 구현 예시를 보여주세요. [followup_answer] | 참고된 Maple GYM 제작 가이드에 따르면, `UiManager` 초기화와 `RenewPow`, `RenewMoney` 메서드 구현은 다음과 같이 구성됩니다. 1. **`OnBeginPlay`에서 `UiManager` 초기화** - `OnBeginPlay` 메서드 내에서 `self:IsClient()`를 통해 클라이언트 환경인지 확인합니다. - 클라이언트인 경우, `_EntityService:GetEntityByPath("/ui/DefaultGroup")`으로 UI 그룹 엔티티를 조회하고, 해당 엔티티의 `UIMan [scores] | [judge_reason] | [source_doc] | ```lua void OnBeginPlay() { if self:IsClient() then self.UiManager = _EntityService:GetEntityByPath("/ui/DefaultGroup").UIManager end } ``` 9. **PlayerStats** 컴포넌트에 `RenewPow()` 메소드를 생성하고 아래 내용을 추가합니다. ```lua [client only] void

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | PlayerController 컴포넌트에서 Stats.CurrentPow에 접근하기 위해 별도의 서비스 호출이나 이벤트 핸들러가 필요한가요? [answer] | PlayerController 컴포넌트에서 `Stats.CurrentPow`에 접근하기 위해 별도의 서비스 호출이나 이벤트 핸들러는 필요하지 않습니다. 참고 문서의 예제 코드에서 `SizeSet()` 메서드 내부에 `local size = 1 + (0.1 * self.Stats.CurrentPow)`라고 직접 참조하고 있습니다. 이는 `Stats`가 PlayerController 컴포넌트 자체의 프로퍼티(또는 해당 컴포넌트에 포함된 데이터)로서, `self.Stats.CurrentPow` 형식으로 직접 접근할 수 있음을 의미합니다 [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] | NPCSellPow 컴포넌트의 OnEnterTriggerBody 메서드에서 PlayerStats 컴포넌트가 존재하지 않을 때의 처리 로직을 2문장 이내로 설명하세요. [answer] | `entity.PlayerStats`가 `nil`인 경우 즉시 함수를 종료하여后续 처리를 중단합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 힘 판매하기 환전을 담당하고 있는 NPC에게 다가가면 모든 힘 값을 0으로 변경하고, 감소한 힘만큼 돈이 증가하도록 만들어봅시다. 1. 판매를 담당할 NPC를 배치하고, 이름을 **SellNPC**로 변경합니다. > **Tip** > 만약 배치한 NPC가 다른 오브젝트들의 뒤에 배치될 경우 NPC의 SpriteRendererComponent의 SortingLayer 값을 변경합니다. 2. NPC의 **RigidBodComponent**의 **Gravity** 프로퍼티의 값을 0으로 변경합니다. NPC

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | UIPower와 UIMoney 텍스트 UI를 복제하여 생성할 때, 두 객체의 이름과 역할을 명확히 구분하기 위해 어떤 설정을 변경해야 하나요? [answer] | **UIPower**와 **UIMoney** 텍스트 UI를 복제하여 생성할 때, 두 객체의 이름과 역할을 명확히 구분하기 위해 변경해야 하는 설정은 **객체의 이름(Name)** 입니다. 구체적인 설정 변경 사항은 다음과 같습니다. 1. **UIPower**: `DefaultGroup`에 추가한 첫 번째 텍스트 UI의 이름을 **UIPower**로 변경합니다. 이 UI는 캐릭터의 힘(Stats) 정보를 표시하는 역할을 합니다. 2. **UIMoney**: **UIPower**를 복제하여 생성한 두 번째 텍스트 UI의 이름을 [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] | Transform.Scale에 Vector3(size, size, 1)을 적용할 때, Z축 값이 1로 고정되는 것이 캐릭터의 평면적 확대 효과에 어떤 영향을 주나요? [answer] | `Vector3(size, size, 1)`을 `Transform.Scale`에 적용하면 X축과 Y축의 크기는 `size` 값에 따라 함께 확대되지만, Z축(깊이)은 항상 1로 고정됩니다. 이 설정은 캐릭터가 2D 평면(화면 앞뒤 방향)으로는 두꺼워지지 않고, 오직 화면 좌우(X)와 상하(Y) 방향에서만 비율이 동일하게 커지는 **등비율 평면 확대** 효과를 만듭니다. 만약 Z축 값도 `size`로 변경했다면 캐릭터가 화면을 향해 돌출되거나 깊이가 변하는 3D 확대가 되었을 것입니다. 따라서 Z축을 1로 고정하는 것은 2D 스타일 [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] | PlayerStats 컴포넌트에서 UI 갱신 메서드(RenewPow, RenewMoney)의 실행 공간은 무엇이며, 해당 메서드들이 호출하는 UIManager 메서드 이름을 표로 정리하세요. [answer] | PlayerStats 컴포넌트에서 UI 갱신을 담당하는 `RenewPow`와 `RenewMoney` 메서드의 실행 공간은 모두 **client only**입니다. 해당 메서드들이 호출하는 UIManager 메서드 이름은 다음과 같습니다. | 메서드 이름 | 실행 공간 | 호출하는 UIManager 메서드 | | :--- | :--- | :--- | | `RenewPow` | client only | `UISetPower` | | `RenewMoney` | client only | `UISetMoney` | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua void OnBeginPlay() { if self:IsClient() then self.UiManager = _EntityService:GetEntityByPath("/ui/DefaultGroup").UIManager end } ``` 9. **PlayerStats** 컴포넌트에 `RenewPow()` 메소드를 생성하고 아래 내용을 추가합니다. ```lua [client only] void

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | `TweenLineComponent`를 사용하여 엔티티를 원점에서 특정 위치로 선형 이동시키고, 도착 후 자동으로 컴포넌트가 삭제되도록 설정하려면 어떤 프로퍼티를 어떻게 바꿔야 하나요? [answer] | `TweenLineComponent`를 사용하여 엔티티를 원점에서 특정 위치로 선형 이동시키고, 도착 후 자동으로 컴포넌트가 삭제되도록 설정하려면 아래 프로퍼티를 설정해야 합니다. 1. **DestinationCoordinateType**: `Absolute`로 설정합니다. * 목적지 위치를 절대 좌표로 인식하게 하여, 입력한 값이 월드 좌표의 특정 위치를 의미하도록 합니다. 2. **Positions**: 이동할 목적지 좌표를 설정합니다. * `Size`를 `1`로 설정하여 목적지를 하나 추가합니다. [followup] | `AutoDestroy` 프로퍼티를 활성화하고 `StopType`을 `Oneway`로 설정한 상태에서, `DestinationCoordinateType`이 `Relative`일 때와 `Absolute`일 때 `Positions`에 입력해야 할 좌표 값의 차이를 코드 예시와 함께 설명해 주세요. [followup_answer] | `DestinationCoordinateType` 설정에 따라 `Positions`에 입력해야 할 좌표 값의 의미와 계산 방식이 달라집니다. ### 1. `DestinationCoordinateType = Relative` (상대 좌표) * **의미**: 엔티티의 **현재 위치(원점)**를 기준으로 한 **이동 벡터(오프셋)**입니다. * **입력 값**: 엔티티가 현재 위치에서 얼마나, 어떤 방향으로 움직일지 나타내는 값입니다. * **예시**: 엔티티가 현재 `(5, 5)` 위치에 있고, 오른쪽으로 10칸, 위로 3 [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 목적지까지 선형 운동을 하게 만들 때 사용합니다. 목적지까지 편도, 왕복 운동 여부와 더불어 가·감속, 도달 시 튕김 등 운동 방식을 설정할 수 있습니다. **TweenLineComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | ------ | --- | | TweenType | 기본값은 Linear입니다. 다른 모양의 운동 방식을 선택할 수 있습니다. 선형운동 종류별 설명은 하단의 참고자료를 참고하세요. | | Duration | 목적지까지 도달하는 데 걸리는 시간을 의미합니다. | |

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | 힘을 판매하는 SellPow 메서드의 코드 블록만 출력하고, 각 줄의 의미를 주석으로만 설명하세요. [answer] | ```lua void SellPow() { self:SetMoney(self.CurrentMoney + self.CurrentPow) self:SetPow(0) self.Entity:GetComponent("PlayerController"):SizeSet() } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 힘 판매하기 환전을 담당하고 있는 NPC에게 다가가면 모든 힘 값을 0으로 변경하고, 감소한 힘만큼 돈이 증가하도록 만들어봅시다. 1. 판매를 담당할 NPC를 배치하고, 이름을 **SellNPC**로 변경합니다. > **Tip** > 만약 배치한 NPC가 다른 오브젝트들의 뒤에 배치될 경우 NPC의 SpriteRendererComponent의 SortingLayer 값을 변경합니다. 2. NPC의 **RigidBodComponent**의 **Gravity** 프로퍼티의 값을 0으로 변경합니다. NPC

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | `TweenLineComponent`의 `StopType`을 `RepeatRoundTrip`으로 설정하여 왕복 운동을 반복하게 할 때, 왕복 경로에서 정점(원점)에 도달할 때마다 다른 가감속 효과를 적용하고 싶다면 어떻게 구성해야 하나요? [answer] | `TweenLineComponent`의 `StopType`을 `RepeatRoundTrip`으로 설정하는 것만으로는 원점(출발점)에 도달할 때마다 *다르게* 가감속 효과를 적용하는 것이 불가능합니다. 문서에 명시된 `TweenLineComponent`의 프로퍼티와 동작 방식을 살펴보면 다음과 같은 제한이 있습니다: 1. **단일 운동 방식 지정**: `TweenType`은 전진(원점 -> 목적지) 구간과 `ReturnTweenType`은 반환(목적지 -> 원점) 구간에 각각 **하나**의 운동 방식을 지정합니다. 2. **이 [followup] | `UseReturnTweenType`을 활성화했을 때 `ReturnTweenType`과 `ReturnDuration`이 왕복 경로 반환 시에만 적용되는지, 아니면 왕복 전체에 적용되는지, 그리고 `Positions`에 3개 이상의 점을 입력했을 때 `Interpolation`이 `None`과 `SplineTypeA`로 각각 설정되면 엔티티의 이동 궤적이 어떻게 달라지는지 구체적으로 설명해 주세요. [followup_answer] | `TweenLineComponent`의 프로퍼티 동작 방식에 대해 설명드립니다. ### 1. `UseReturnTweenType`, `ReturnTweenType`, `ReturnDuration`의 적용 범위 `UseReturnTweenType`을 활성화했을 때, `ReturnTweenType`과 `ReturnDuration`은 **왕복 경로 중 반환 구간(목적지 -> 원점)에만** 적용됩니다. * **전진 구간 (원점 -> 목적지):** `TweenType`과 `Duration`이 적용됩니다. * **반환 구간 (목적 [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 목적지까지 선형 운동을 하게 만들 때 사용합니다. 목적지까지 편도, 왕복 운동 여부와 더불어 가·감속, 도달 시 튕김 등 운동 방식을 설정할 수 있습니다. **TweenLineComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | ------ | --- | | TweenType | 기본값은 Linear입니다. 다른 모양의 운동 방식을 선택할 수 있습니다. 선형운동 종류별 설명은 하단의 참고자료를 참고하세요. | | Duration | 목적지까지 도달하는 데 걸리는 시간을 의미합니다. | |

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | PlayerStats 컴포넌트에서 entity.PlayerStats == nil 체크를 하지 않으면 어떤 오류가 발생하나요? [answer] | 제공된 참고 문서에는 `entity.PlayerStats == nil` 체크를 하지 않았을 때 구체적으로 어떤 오류가 발생하는지에 대한 설명이 포함되어 있지 않습니다. 문서에는 해당 체크가 "PlayerStats 컴포넌트가 있는 엔티티가 접근했는지 확인"하기 위한 목적으로 제시되어 있을 뿐, 체크 생략 시 발생되는 구체적인 오류 메시지나 시스템 동작에 대한 정보는 찾을 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 힘 판매하기 환전을 담당하고 있는 NPC에게 다가가면 모든 힘 값을 0으로 변경하고, 감소한 힘만큼 돈이 증가하도록 만들어봅시다. 1. 판매를 담당할 NPC를 배치하고, 이름을 **SellNPC**로 변경합니다. > **Tip** > 만약 배치한 NPC가 다른 오브젝트들의 뒤에 배치될 경우 NPC의 SpriteRendererComponent의 SortingLayer 값을 변경합니다. 2. NPC의 **RigidBodComponent**의 **Gravity** 프로퍼티의 값을 0으로 변경합니다. NPC

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | PlayerStats 컴포넌트의 WeightBonus 프로퍼티를 활용해 운동 시 증가하는 힘의 양을 결정하고, 이 보너스 값을 기반으로 CurrentPower를 업데이트하는 로직을 포함하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `PlayerStats` 컴포넌트의 프로퍼티 정의(`CurrentPower`, `MaxPower`, `WeightBonus` 등)와 `_DataStorageService`를 이용한 데이터 저장/조회 예제만 포함되어 있습니다. 문서에는 **`WeightBonus`를 활용해 `CurrentPower`를 업데이트하는 구체적인 함수(예: 운동 실행 함수)나 이벤트 핸들러가 정의되어 있지 않습니다.** 또한, `CurrentPower`가 `MaxPower`를 초과할 수 있는지, 아니면 초과 시 어떻게 처리되는지에 대한 [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] | PlayerStats 컴포넌트의 SetMoney 메서드 정의 시 실행 공간 설정과 매개변수 타입을 표로 정리해서 출력하세요. [answer] | PlayerStats 컴포넌트의 `SetMoney` 메서드 정의 시 실행 공간과 매개변수 타입은 다음과 같습니다. | 항목 | 내용 | | :--- | :--- | | **실행 공간** | `[multicast]` | | **매개변수 타입** | `number` (이름: `currentMoney`) | ```lua [multicast] void SetMoney(number currentMoney) { self.CurrentMoney = currentMoney self:RenewMoney() } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 힘 판매하기 환전을 담당하고 있는 NPC에게 다가가면 모든 힘 값을 0으로 변경하고, 감소한 힘만큼 돈이 증가하도록 만들어봅시다. 1. 판매를 담당할 NPC를 배치하고, 이름을 **SellNPC**로 변경합니다. > **Tip** > 만약 배치한 NPC가 다른 오브젝트들의 뒤에 배치될 경우 NPC의 SpriteRendererComponent의 SortingLayer 값을 변경합니다. 2. NPC의 **RigidBodComponent**의 **Gravity** 프로퍼티의 값을 0으로 변경합니다. NPC

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | NPC가 다른 오브젝트 뒤에 가려질 때 SpriteRendererComponent의 SortingLayer 값을 어떻게 변경해야 하나요? [answer] | NPC가 다른 오브젝트 뒤에 가려지는 문제를 해결하기 위해 SpriteRendererComponent의 SortingLayer 값을 변경하는 구체적인 절차나 사용 가능한 SortingLayer 값 목록은 제공된 문서에 포함되어 있지 않습니다. 문서에는 NPC가 다른 오브젝트 뒤에 배치될 경우, **SpriteRendererComponent**의 **SortingLayer** 값을 변경해야 한다는 사실과 그 목적(가려지지 않도록 하기 위함)만 언급되어 있을 뿐, 실제로 어떤 값으로 설정해야 하는지나 구체적인 변경 방법은 설명되어 있 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 힘 판매하기 환전을 담당하고 있는 NPC에게 다가가면 모든 힘 값을 0으로 변경하고, 감소한 힘만큼 돈이 증가하도록 만들어봅시다. 1. 판매를 담당할 NPC를 배치하고, 이름을 **SellNPC**로 변경합니다. > **Tip** > 만약 배치한 NPC가 다른 오브젝트들의 뒤에 배치될 경우 NPC의 SpriteRendererComponent의 SortingLayer 값을 변경합니다. 2. NPC의 **RigidBodComponent**의 **Gravity** 프로퍼티의 값을 0으로 변경합니다. NPC

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | SetPow 메소드를 Multicast로 설정해야 하는 구체적인 이유는 무엇이며, server only로 남겨두면 UI 갱신 시 어떤 문제가 발생하나요? [answer] | `SetPow()` 메서드를 **Multicast**로 설정해야 하는 구체적인 이유는 이 메서드가 **클라이언트와 서버 양쪽에서 실행될 수 있어야 하기 때문**입니다. 참고 문서에 따르면, `SetPow()` 메서드는 `PlayerController` 컴포넌트의 `WorkOut()`에서 호출됩니다. `WorkOut()`은 **server only**로 설정되어 있어 서버에서 실행되지만, `SetPow()` 메서드 내부에서 **UI를 갱신하는 메서드도 함께 호출**해야 합니다. UI 갱신은 클라이언트 공간에서 이루어져야 하므로, ` [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] | NPC 위치로 이동 기능을 구현하기 위해 버튼 클릭 시 실행해야 하는 로직의 핵심 동작만 3문장 이내로 요약하세요. [answer] | NPC 위치로 이동 기능의 핵심 동작은 버튼 클릭 시 특정 NPC의 좌표 정보를 조회하는 것입니다. 이어서 조회한 좌표 기준으로 플레이어의 위치를 해당 NPC 위치로 설정합니다. 마지막으로 이동이 완료되었음을 확인하거나 관련 UI를 업데이트하는 처리를 수행합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 버튼 UI 제작 #### 상점 버튼 제작 1. **DefaultGroup**에 UI 버튼을 추가하고, 자유롭게 버튼 형태를 수정합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/17695121955247cf8228045bc45d49b963f35fcf1855b.png "shop") 2. 버튼의 이름을 **ShopButton**으로 변경하고,**TextComponent**를 추가합니다. ![[object Object]](https://mod-file.dn.nexonc

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | ShopButton 복제 후 SellButton으로 변경하는 과정에 필요한 메뉴명(Duplicate)과 버튼 이름 변경 순서를 단계별 번호 목록으로 작성하세요. [answer] | 판매 버튼(SellButton)을 제작하는 과정은 다음과 같은 단계로 진행됩니다. 1. 제작한 **SHOP** 버튼을 선택합니다. 2. 콘텍스트 메뉴에서 **Duplicate**를 눌러 같은 모양의 UI 버튼을 복제합니다. 3. 복제된 버튼의 이름을 **SellButton**으로 변경합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 버튼 UI 제작 #### 상점 버튼 제작 1. **DefaultGroup**에 UI 버튼을 추가하고, 자유롭게 버튼 형태를 수정합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/17695121955247cf8228045bc45d49b963f35fcf1855b.png "shop") 2. 버튼의 이름을 **ShopButton**으로 변경하고,**TextComponent**를 추가합니다. ![[object Object]](https://mod-file.dn.nexonc

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | SellPow() 메소드에서 SetMoney 호출 시 self.CurrentMoney + self.CurrentPow 값을 그대로 전달하는 것이 가능한가요? [answer] | 네, 가능합니다. 제공된 문서의 `SellPow()` 메소드 예제 코드에서 `self:SetMoney(self.CurrentMoney + self.CurrentPow)` 구문을 직접 사용하여 `SetMoney` 메소드에 전달하고 있습니다. `SetMoney` 메소드는 `number` 타입의 매개변수를 받도록 정의되어 있으며, `self.CurrentMoney`와 `self.CurrentPow`의 합산 결과는 숫자 값이므로 이를 그대로 전달하는 것이 mLua 문법상 문제가 없습니다. 참고로 문서에 제시된 `SellPow()` 메소 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 힘 판매하기 환전을 담당하고 있는 NPC에게 다가가면 모든 힘 값을 0으로 변경하고, 감소한 힘만큼 돈이 증가하도록 만들어봅시다. 1. 판매를 담당할 NPC를 배치하고, 이름을 **SellNPC**로 변경합니다. > **Tip** > 만약 배치한 NPC가 다른 오브젝트들의 뒤에 배치될 경우 NPC의 SpriteRendererComponent의 SortingLayer 값을 변경합니다. 2. NPC의 **RigidBodComponent**의 **Gravity** 프로퍼티의 값을 0으로 변경합니다. NPC

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | SetButtonHandler 메소드의 구현 로직만 추출하여 출력하고, 각 줄의 역할을 설명하는 주석으로만 작성하세요. [answer] | ```lua void SetButtonHandler(string buttonPath) { local button = _EntityService:GetEntityByPath(buttonPath) -- 전달된 경로를 통해 버튼 엔티티를 검색하고 참조를 button 변수에 저장 button:ConnectEvent(ButtonClickEvent, self.OnClickButton) -- 버튼 엔티티의 ButtonClickEvent 이벤트 발생 시 OnClickButton 메서드가 호출되도록 연결 } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SELL 버튼을 클릭하면 캐릭터가 NPC가 배치된 위치로 이동할 수 있도록 만들어봅시다. 1. **UIManager**에서 `PlayerController`를 참조할 수 있도록 새로운 **Controller** 프로퍼티를 추가합니다. ```lua Property: [None] component Controller = nil ``` 2. **UIManager** 컴포넌트에 새로운 `SetButtonHandler()` 메소드를 추가하고, **string** 타입의 **buttonPath** 매개

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | buttonPaths 테이블에 포함된 버튼 경로와 해당 버튼 클릭 시 실행되는 PlayerController 메소드 이름을 2열 표로 정리하세요. [answer] | buttonPaths 테이블에 포함된 버튼 경로와 클릭 시 실행되는 PlayerController 메소드는 다음과 같습니다. | 버튼 경로 | PlayerController 메소드 | | :--- | :--- | | /ui/DefaultGroup/ShopButton | (없음) | | /ui/DefaultGroup/SellButton | MoveSellPosition() | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | SELL 버튼을 클릭하면 캐릭터가 NPC가 배치된 위치로 이동할 수 있도록 만들어봅시다. 1. **UIManager**에서 `PlayerController`를 참조할 수 있도록 새로운 **Controller** 프로퍼티를 추가합니다. ```lua Property: [None] component Controller = nil ``` 2. **UIManager** 컴포넌트에 새로운 `SetButtonHandler()` 메소드를 추가하고, **string** 타입의 **buttonPath** 매개

← → 방향키로 페이지 이동 · 숫자 입력 후 Enter로 점프