← 목록

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

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

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | SkillUpgrade(), DnaUpgrade(), SetMaxPow() 메소드에 지정된 실행 공간([server], [multicast])과 RenewUI()의 호출 주체를 단계별 번호 목록으로 나열하세요. [answer] | 요청하신 메서드의 실행 공간과 `RenewUI()` 호출 주체는 다음과 같습니다. 1. `SkillUpgrade()`: `[server]` 2. `DnaUpgrade()`: `[server]` 3. `SetMaxPow()`: `[multicast]` 4. `RenewUI()` 호출 주체: `SkillUpgrade()` 메서드와 `DnaUpgrade()` 메서드 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 구매 처리 실제 돈이 있는 상태에서 **DnaUpButton**을 클릭했을 때, 운동 기술과 DNA를 업그레이드 할 수 있도록 처리해봅시다. **UIManager**에서 `OnClickButton()`에서**SkillUpButton**와 **DnaUpButton**을 눌렀을 때 동작할 내용을 추가합니다. 1. **PlayerStats** 컴포넌트에서 새로운 `SkillUpgrade()` 메소드를 추가하고, 아래 내용을 입력합니다. 운동 레벨이 증가하면 해당 운동 레벨에 맞는 운동량을 설정하게 됩니다. ```lua

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅰ [question] | PlayerStats 컴포넌트에 SellPow() 메서드를 추가하여, 현재 힘값(CurrentPow)만큼 현재 돈값(CurrentMoney)을 증가시키는 SetMoney() 호출, 힘값을 0으로 초기화하는 SetPow(0) 호출, 그리고 PlayerController 컴포넌트의 SizeSet() 메서드를 호출해 캐릭터 크기를 기본으로 되돌리는 로직을 구현하는 스크립트를 작성해줘. [answer] | PlayerStats 컴포넌트에 `SellPow()` 메서드를 추가하고, 해당 메서드가 `SetMoney()`, `SetPow()`, 그리고 `PlayerController` 컴포넌트의 `SizeSet()`을 올바르게 호출하도록 구성하는 스크립트는 다음과 같습니다. 참고 문서에 제시된 로직을 기반으로 `SellPow()` 메서드와, 이를 지원하기 위한 `SetMoney()` 및 `SetPow()` 메서드를 함께 포함하였습니다. `SetMoney()`는 UI 갱신을 위해 `[multicast]` 실행 공간으로 설정되어 있으며, `S [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] | Maple GYM 만들기 Ⅱ [question] | UIManager 컴포넌트에 TextComponent 프로퍼티를 4개 추가하고 OnBeginPlay()에서 엔티티 경로를 통해 참조를 할당하는 과정은 어떻게 이루어지나요? [answer] | UIManager 컴포넌트에 TextComponent 정보를 가지는 프로퍼티 4개를 추가하고, `OnBeginPlay()` 메서드에서 엔티티 경로를 통해 각 TextComponent 참조를 할당하는 과정은 다음과 같습니다. 먼저, 아래 4개의 프로퍼티를 추가합니다. ```lua Property: [None] Component SkillLevelText = nil [None] Component DnaLevelText = nil [None] Component SkillUpButtonText = nil [None] Component D [followup] | _EntityService:GetEntityByPath() 호출 시 경로("/ui/UIGroup/SkillLevelText" 등)가 잘못되었거나 TextComponent가 없는 경우 mLua에서 어떤 에러가 발생하며, 이를 방지하기 위한 nil 체크 코드는 어떻게 작성하나요? [followup_answer] | 제공된 참고 문서에는 `_EntityService:GetEntityByPath()` 호출 시 경로가 잘못되었거나 TextComponent가 없는 경우 발생하는 구체적인 에러 유형에 대한 정보가 없습니다. 또한, 이를 방지하기 위한 nil 체크 코드의 예제나 권장 패턴도 문서에 포함되어 있지 않습니다. 문서에는 단순히 `_EntityService:GetEntityByPath("/ui/UIGroup/SkillLevelText").TextComponent`와 같이 직접 참조를 할당하는 코드만 제시되어 있으며, 오류 처리 로직에 대한 설 [scores] | [judge_reason] | [source_doc] | 상점에 알맞는 정보가 표시될 수 있도록 만들어봅시다. 1. **UIManager** 컴포넌트에 새로운 프로퍼티를 4개를 추가합니다. 이 프로퍼티들은 **TextComponent** 정보를 가집니다. ```lua Property: [None] Component SkillLevelText = nil [None] Component DnaLevelText = nil [None] Component SkillUpButtonText = nil [None] Componen

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | PlayerController 컴포넌트에 MoveSellPosition 메서드를 구현하여 _EntityService:GetEntityByPath("/maps/map01/SellNPC")로 NPC 위치를 조회하고, self.Movement:SetPosition을 통해 캐릭터를 해당 NPC의 Vector2 좌표로 이동시키는 스크립트를 작성해줘 [answer] | PlayerController 컴포넌트에 `MoveSellPosition` 메서드를 구현하는 스크립트는 다음과 같습니다. ```lua Property: [None] component Movement = nil Method: [server only] void MoveSellPosition() { local npcPos = _EntityService:GetEntityByPath("/maps/map01/SellNPC").TransformComponent.Position self.Movement:SetPosition(Ve [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] | MSW 기본 이벤트 함수 [question] | OnInitialize 함수에서 다른 엔티티 참조 시 nil을 받을 수 있는 이유와 권장하지 않는 이유를 3문장 이내로 설명하세요. [answer] | OnInitialize는 엔티티와 컴포넌트가 생성된 직후 호출되지만 다른 엔티티나 컴포넌트가 아직 초기화되지 않았을 수 있기 때문에 참조 시 nil을 받을 가능성이 있습니다. 이로 인해 예상치 못한 오류가 발생할 수 있으므로 다른 엔티티 또는 컴포넌트 참조는 권장되지 않습니다. 안정적인 참조가 필요한 경우 OnBeginPlay 함수에서 수행하는 것이 좋습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 스크립트를 활용하면 크리에이터만의 독창적인 월드를 자유자재로 만들 수 있습니다. 스크립트를 작성할 때는 필요에 따라 기본 이벤트 함수를 활용하게 됩니다. **기본 이벤트 함수**란 다른 함수에서 직접 호출하지 않아도 **특정 조건이 되면 자동으로 호출되는 함수**를 말합니다. 이번 과정에서는 기본 이벤트 함수의 종류와 호출 시점을 알아봅시다. # 기본 이벤트 함수 추가하기 기본 이벤트 함수를 추가해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Crea

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | SkillUpButton과 DnaUpButton은 Stats 컴포넌트의 메서드를 호출하는데, 이 두 메서드 실행 후 UI 갱신은 자동으로 이루어지나요? [answer] | 제공된 참고 문서에는 `SkillUpButton`과 `DnaUpButton`이 각각 `self.Stats:SkillUpGrade()`와 `self.Stats:DnaUpGrade()` 메서드를 호출하는 코드만 포함되어 있습니다. 문서에는 `SkillUpGrade()`나 `DnaUpGrade()` 메서드 내부 구현, 또는 UI 갱신(`SetShopInfo()` 등)이 자동 수행되는지에 대한 설명이 없습니다. 따라서 **UI 갱신이 자동으로 이루어지는지 여부는 알 수 없습니다.** 참고로, 문서에 제시된 다른 버튼(`ShopButto [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | if buttonName == "ShopButton" then self:SetShopInfo() -- 추가 self.ShopGroup:SetVisible(true, false) elseif buttonName == "SellButton" then self.Controller:MoveSellPosition() self:SetShopInfo() -- 추가 elseif buttonName == "ShopCloseButton" then self.ShopGroup:SetVisible(false, false)

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | UIManager 컴포넌트의 SetButtonHandler 메서드에서 매개변수 buttonPath를 이용해 _EntityService:GetEntityByPath로 엔티티를 조회한 뒤, ConnectEvent를 통해 ButtonClickEvent와 OnClickButton 메서드를 연결하는 스크립트를 작성해줘 [answer] | 요청하신 `SetButtonHandler` 메서드는 `buttonPath` 문자열을 받아 해당 경로의 엔티티를 조회하고, `ButtonClickEvent`가 발생하면 `OnClickButton` 메서드를 호출하도록 연결합니다. ```lua void SetButtonHandler(string buttonPath) { local button = _EntityService:GetEntityByPath(buttonPath) button:ConnectEvent(ButtonClickEvent, self.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] | MSW 기본 이벤트 함수 [question] | OnInitialize 함수에서 self.Entity 참조와 log 출력만 수행하는 올바른 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void OnInitialize() { -- self.Entity는 해당 스크립트가 적용된 엔티티를 참조합니다. local myEntity = self.Entity -- 콘솔 창에 엔티티 이름과 "Hello MapleStory Worlds!"를 출력합니다. log(myEntity.Name .. "Hello MapleStory Worlds") } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 스크립트를 활용하면 크리에이터만의 독창적인 월드를 자유자재로 만들 수 있습니다. 스크립트를 작성할 때는 필요에 따라 기본 이벤트 함수를 활용하게 됩니다. **기본 이벤트 함수**란 다른 함수에서 직접 호출하지 않아도 **특정 조건이 되면 자동으로 호출되는 함수**를 말합니다. 이번 과정에서는 기본 이벤트 함수의 종류와 호출 시점을 알아봅시다. # 기본 이벤트 함수 추가하기 기본 이벤트 함수를 추가해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Crea

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | ShopButton 클릭 시 self:SetShopInfo() 호출 후 self.ShopGroup:SetVisible(true, false)로 상점 UI를 표시하는 스크립트를 작성해줘 [answer] | ShopButton 클릭 시 `self:SetShopInfo()`를 호출한 뒤 `self.ShopGroup:SetVisible(true, false)`를 실행하여 상점 UI를 표시하는 로직은, 버튼 이름을 판별하는 조건문 안에 구현합니다. ```lua if buttonName == "ShopButton" then self:SetShopInfo() self.ShopGroup:SetVisible(true, false) end ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | if buttonName == "ShopButton" then self:SetShopInfo() -- 추가 self.ShopGroup:SetVisible(true, false) elseif buttonName == "SellButton" then self.Controller:MoveSellPosition() self:SetShopInfo() -- 추가 elseif buttonName == "ShopCloseButton" then self.ShopGroup:SetVisible(false, false)

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | SetTable() 메소드를 OnBeginPlay()에서 호출할 때, 이미 테이블에 값이 존재할 경우 덮어쓰기되는지 아니면 에러가 발생하는지 궁금합니다. [answer] | 제공된 참고 문서의 `OnBeginPlay()` 메서드 예제를 분석하면, 테이블 프로퍼티에 값을 대입할 때 기존 값이 존재하는지 여부와 관계없이 **새로운 테이블 참조가 덮어쓰기(대입)됩니다.** 에러는 발생하지 않습니다. ### 동작 원리 1. **참조 대입**: `self.SkillGradeTable = { ... }` 문장은 `self.SkillGradeTable` 변수가 가리키고 있던 이전 테이블 객체를 버리고, 새로 생성된 테이블 객체의 주소를 가리키도록 변경하는 것입니다. 2. **메모리 관리**: Lua의 가비지 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 운동 기술과 DNA는 돈을 사용해 업그레이드 할 수 있습니다. 그러므로 각각의 등급에서 증가하는 힘과 누적 가능한 힘, 필요한 금액 정보를 구성해 봅시다. > **Tip.** > 관리할 데이터가 많아질 경우 스크립트에 직접 입력하는 대신 공식을 사용하거나, 데이터셋을 사용해 효율적으로 관리할 수 있습니다. 1. **PlayerStats** 컴포넌트에 새로운 프로퍼티 2개를 추가합니다. ```lua Property: [None] table SkillGradeTable = {} -- 운동 스킬 관련 테

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | SetShopInfo() 코드에서 스킬 등급이 최종 등급에 도달했을 때와 DNA 등급이 최종 등급에 도달했을 때의 차이점을 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void SetShopInfo() { local skillGrade = math.floor(self.Stats.CurrentSkillGrade) local dnaGrade = math.floor(self.Stats.CurrentDnaGrade) self.SkillLevelText.Text = ("기술 레벨: "..skillGrade.."레벨") self.DnaLevelText.Text = ("DNA: "..self.Stats.DnaGradeTa [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua void SetShopInfo() { local skillGrade = math.floor(self.Stats.CurrentSkillGrade) local dnaGrade = math.floor(self.Stats.CurrentDnaGrade) self.SkillLevelText.Text = ("기술 레벨: "..skillGrade.."레벨") self.DnaLevelText.Text = ("DNA: "..self.Stats.DnaG

[task] | single_turn [pass] | ⏳ 미판정 [title] | MSW 기본 이벤트 함수 [question] | 기본 이벤트 함수는 기본적으로 서버에서 호출된다고 하는데, 크리에이터가 의도적으로 호출 공간을 다르게 설정할 수 있나요? [answer] | 네, 크리에이터는 의도에 따라 기본 이벤트 함수의 호출 공간을 다르게 설정할 수 있습니다. 메이플스토리 월드에서 제공하는 기본 이벤트 함수는 기본적으로 서버에서 호출되지만, 필요에 따라 실행 공간을 변경하여 다른 공간에서 실행되도록 설정할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 스크립트를 활용하면 크리에이터만의 독창적인 월드를 자유자재로 만들 수 있습니다. 스크립트를 작성할 때는 필요에 따라 기본 이벤트 함수를 활용하게 됩니다. **기본 이벤트 함수**란 다른 함수에서 직접 호출하지 않아도 **특정 조건이 되면 자동으로 호출되는 함수**를 말합니다. 이번 과정에서는 기본 이벤트 함수의 종류와 호출 시점을 알아봅시다. # 기본 이벤트 함수 추가하기 기본 이벤트 함수를 추가해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Crea

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | DnaUpgrade() 메소드에서 등급이 증가한 후 실행되는 SetMaxPow() 호출 문과, 해당 메소드가 받는 매개변수 타입을 표로 정리해서 설명하세요. [answer] | DnaUpgrade() 메소드에서 DNA 등급이 증가한 후 실행되는 `SetMaxPow()` 호출 문과 해당 메소드의 매개변수 정보는 다음과 같습니다. **1. SetMaxPow() 호출 문** `DnaUpgrade()` 메소드 내에서 `SetMaxPow()`는 증가한 등급에 해당하는 최대 힘 값(`MaxPow`)을 인자로 받아 호출됩니다. ```lua self:SetMaxPow(self.DnaGradeTable[self.CurrentDnaGrade]["MaxPow"]) ``` **2. SetMaxPow() 메소드 매개변수 정 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 구매 처리 실제 돈이 있는 상태에서 **DnaUpButton**을 클릭했을 때, 운동 기술과 DNA를 업그레이드 할 수 있도록 처리해봅시다. **UIManager**에서 `OnClickButton()`에서**SkillUpButton**와 **DnaUpButton**을 눌렀을 때 동작할 내용을 추가합니다. 1. **PlayerStats** 컴포넌트에서 새로운 `SkillUpgrade()` 메소드를 추가하고, 아래 내용을 입력합니다. 운동 레벨이 증가하면 해당 운동 레벨에 맞는 운동량을 설정하게 됩니다. ```lua

[task] | two_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | UIManager에서 SetButtonHandler를 통해 여러 버튼의 클릭 이벤트를 한 번에 연결하는 방식에서, 새로운 버튼을 추가할 때 buttonPaths 목록에 경로를 추가하면 자동으로 이벤트가 연결된다는 원리가 무엇인가요? [answer] | 새로운 버튼을 추가할 때 `buttonPaths` 목록에 경로를 추가하면 자동으로 이벤트가 연결되는 원리는 **반복문(Loop)과 데이터-로직 분리**에 있습니다. 구체적인 작동 원리는 다음과 같습니다. 1. **경로 목록의 동적 처리**: `OnBeginPlay()` 내부에서 `buttonPaths` 테이블은 단순히 버튼의 경로 문자열을 담고 있는 데이터입니다. `for i, path in pairs(buttonPaths) do` 반복문이 실행되면, 이 테이블에 포함된 모든 경로가 순서대로 한 번씩 처리됩니다. 2. **일 [followup] | 만약 buttonPaths에 존재하지 않는 잘못된 경로(예: "/ui/DefaultGroup/ErrorButton")를 입력했을 때 발생할 수 있는 예외 상황이나 에러를 방지하기 위해 추가해야 할 코드 처리는 무엇인가요? [followup_answer] | 제공된 참고 문서에는 `SetButtonHandler()` 메서드 내에서 `_EntityService:GetEntityByPath(buttonPath)` 호출 결과에 대한 nil 검사나 예외 처리 로직이 포함되어 있지 않습니다. 문서에 명시된 `SetButtonHandler()` 코드는 다음과 같이 엔티티를 찾은 후 즉시 이벤트를 연결하고 있습니다. ```lua void SetButtonHandler(string buttonPath) { local button = _EntityService:GetEntityByPath(b [scores] | [judge_reason] | [source_doc] | SELL 버튼을 클릭하면 캐릭터가 NPC가 배치된 위치로 이동할 수 있도록 만들어봅시다. 1. **UIManager**에서 `PlayerController`를 참조할 수 있도록 새로운 **Controller** 프로퍼티를 추가합니다. ```lua Property: [None] component Controller = nil ``` 2. **UIManager** 컴포넌트에 새로운 `SetButtonHandler()` 메소드를 추가하고, **string** 타입의 **buttonPath** 매개

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | UIManager 컴포넌트에 Controller 프로퍼티와 SetButtonHandler 메서드를 추가하여 OnBeginPlay에서 "/ui/DefaultGroup/ShopButton"과 "/ui/DefaultGroup/SellButton" 경로의 버튼을 등록하고, OnClickButton 핸들러에서 SellButton 클릭 시 PlayerController의 MoveSellPosition 메서드를 호출하는 스크립트를 작성해줘 [answer] | 요청하신 **UIManager** 컴포넌트 스크립트는 아래 코드와 같습니다. ```lua Property: [None] component Controller = nil Method: void OnBeginPlay() { local buttonPaths = { "/ui/DefaultGroup/ShopButton", "/ui/DefaultGroup/SellButton", } for i, path in pairs(buttonPaths) do self:SetButtonH [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] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | UIManager 컴포넌트의 OnBeginPlay 생명주기에서 _UserService.LocalPlayer를 통해 PlayerController 참조를 Controller 프로퍼티에 할당하고, buttonPaths 테이블의 각 경로를 반복문으로 순회하며 SetButtonHandler를 실행하는 초기화 로직을 작성해줘 [answer] | UIManager 컴포넌트에서 버튼 초기화 및 PlayerController 참조를 설정하는 로직은 `OnBeginPlay()` 생명주기 메서드 내에서 처리됩니다. 1. 먼저 클릭 이벤트를 연결할 버튼들의 경로를 담은 `buttonPaths` 테이블을 정의합니다. 2. `pairs` 반복문을 사용하여 해당 테이블의 각 경로를 순회하며 `SetButtonHandler()` 메서드를 호출하여 이벤트를 연결합니다. 3. `_UserService.LocalPlayer`를 통해 로컬 플레이어의 `PlayerController`를 가져 [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] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | UIManager 컴포넌트의 OnBeginPlay()에서 buttonPaths 테이블에 "/ui/UIGroup/ShopCloseButton", "/ui/UIGroup/SkillUpButton", "/ui/UIGroup/DnaUpButton" 경로를 추가하여 이벤트 핸들러 연결을 설정하는 스크립트를 작성해줘. [answer] | UIManager 컴포넌트에서 상점 UI를 제어하기 위해 `ShopGroup` 프로퍼티를 정의하고, `OnBeginPlay()`에서 상점 UI 그룹과 각 버튼의 경로를 설정하는 스크립트입니다. ```lua Property: [None] Entity ShopGroup = nil Method: [client only] void OnBeginPlay() { self.ShopGroup = _EntityService:GetEntityByPath("/ui/UIGroup") local buttonPaths = { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 상점 UI 제작 1. 새로운 **UI Group**을 추가하고, **DefaultShow** 값을 **true**로 설정합니다. 2. 아래와 같이 UI엔티티를 추가하고 배치합니다. UI엔티티의 이름은 이미지와 동일해야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1769512144899182516b8ee4d4248a16af41cc5d72f56.png "1") > **Tip.** > 이미지나 텍스트가 다른 UI엔티티에 가릴 경우 하이어라키 순서를 변경합니다.

[task] | single_turn [pass] | ⏳ 미판정 [title] | MSW 기본 이벤트 함수 [question] | Workspace에서 새 스크립트 컴포넌트를 생성하고 기본 이벤트 함수를 추가하는 구체적인 단계는 어떻게 되나요? [answer] | Workspace에서 새 스크립트 컴포넌트를 생성하고 기본 이벤트 함수를 추가하는 단계는 다음과 같습니다. 1. **Workspace** 뷰에서 **MyDesk**를 우클릭하여 나타나는 콘텍스트 메뉴에서 **Create Scripts** > **Create Component**를 클릭합니다. 2. 이 과정을 통해 새 스크립트 컴포넌트가 생성되고 스크립트 에디터가 열립니다. 3. 스크립트 에디터에서 **Function** 항목 옆의 **[+]** 버튼을 클릭합니다. 4. 드롭다운 목록에서 원하는 기본 이벤트 함수를 선택합니다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 스크립트를 활용하면 크리에이터만의 독창적인 월드를 자유자재로 만들 수 있습니다. 스크립트를 작성할 때는 필요에 따라 기본 이벤트 함수를 활용하게 됩니다. **기본 이벤트 함수**란 다른 함수에서 직접 호출하지 않아도 **특정 조건이 되면 자동으로 호출되는 함수**를 말합니다. 이번 과정에서는 기본 이벤트 함수의 종류와 호출 시점을 알아봅시다. # 기본 이벤트 함수 추가하기 기본 이벤트 함수를 추가해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Crea

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | UIManager 컴포넌트의 OnClickButton() 메서드에서 event.Entity.Name을 확인하여 ShopButton 클릭 시 self.ShopGroup:SetVisible(true, false)를, SellButton 클릭 시 self.Controller:MoveSellPosition()을 실행하는 스크립트를 작성해줘. [answer] | 요청하신 동작을 수행하기 위한 `UIManager` 컴포넌트 스크립트입니다. 상점 UI 그룹 엔티티를 참조하기 위한 `ShopGroup` 프로퍼티와, 버튼 클릭 시 해당 버튼 이름에 따라 상점 UI를 열거나 판매 위치로 이동하는 로직을 `OnClickButton()` 메서드에 구현했습니다. ```lua Property: [None] Entity ShopGroup = nil Method: [client only] void OnBeginPlay() { -- 상점 UI 그룹 엔티티 경로 설정 self.ShopGroup [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 상점 UI 제작 1. 새로운 **UI Group**을 추가하고, **DefaultShow** 값을 **true**로 설정합니다. 2. 아래와 같이 UI엔티티를 추가하고 배치합니다. UI엔티티의 이름은 이미지와 동일해야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1769512144899182516b8ee4d4248a16af41cc5d72f56.png "1") > **Tip.** > 이미지나 텍스트가 다른 UI엔티티에 가릴 경우 하이어라키 순서를 변경합니다.

[task] | instruction_following [pass] | ⏳ 미판정 [title] | MSW 기본 이벤트 함수 [question] | OnInitialize와 OnBeginPlay의 호출 시점 차이와 OnInitialize에서 다른 컴포넌트 참조 시 주의점을 표로 정리하세요. [answer] | OnInitialize와 OnBeginPlay의 호출 시점 차이와 OnInitialize에서의 주의점은 다음과 같습니다. | 구분 | OnInitialize | OnBeginPlay | | :--- | :--- | :--- | | **호출 시점** | 엔티티와 컴포넌트가 생성된 후에 **1회** 호출됩니다. | `OnInitialize` 함수가 호출되기 **전**에 호출됩니다. | | **타 컴포넌트/엔티티 참조** | **비추천**. 엔티티의 컴포넌트가 생성되기 전에 호출될 수 있어 다른 컴포넌트나 엔티티 참조 시 **nil** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 스크립트를 활용하면 크리에이터만의 독창적인 월드를 자유자재로 만들 수 있습니다. 스크립트를 작성할 때는 필요에 따라 기본 이벤트 함수를 활용하게 됩니다. **기본 이벤트 함수**란 다른 함수에서 직접 호출하지 않아도 **특정 조건이 되면 자동으로 호출되는 함수**를 말합니다. 이번 과정에서는 기본 이벤트 함수의 종류와 호출 시점을 알아봅시다. # 기본 이벤트 함수 추가하기 기본 이벤트 함수를 추가해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Crea

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | self.Stats.SkillGradeTable의 길이를 # 연산자로 구할 때, 테이블이 비어 있거나 nil인 경우 스크립트가 에러 없이 실행되려면 어떤 예외 처리가 필요한가요? [answer] | 제시된 참고 문서에는 `self.Stats.SkillGradeTable`이 `nil`이거나 비어 있는 경우를 처리하는 예외 처리 코드나 관련 API가 포함되어 있지 않습니다. 문서에는 `#self.Stats.SkillGradeTable`을 사용해 테이블 길이를 구한 뒤, `skillGrade >= #self.Stats.SkillGradeTable` 조건을 확인하는 로직만 제시되어 있으며, 테이블이 비어 있을 때(길이가 0일 때)나 `nil`일 때 발생하는 에러를 방지하기 위한 `if` 체크나 `pcall` 등의 예외 처리 방법은 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua void SetShopInfo() { local skillGrade = math.floor(self.Stats.CurrentSkillGrade) local dnaGrade = math.floor(self.Stats.CurrentDnaGrade) self.SkillLevelText.Text = ("기술 레벨: "..skillGrade.."레벨") self.DnaLevelText.Text = ("DNA: "..self.Stats.DnaG

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | self.Stats.DnaGradeTable[dnaGrade]["GradeName"]처럼 중첩된 테이블 접근을 할 때 dnaGrade가 0 또는 음수인 경우 nil 인덱스 오류를 방지하기 위해 어떤 가드가 필요한가요? [answer] | 제공된 참고 문서에는 `self.Stats.DnaGradeTable[dnaGrade]["GradeName"]` 같은 중첩 테이블 접근 시 `dnaGrade`가 0 또는 음수인 경우를 방지하기 위한 가드(예: `if dnaGrade < 1 then` 또는 `if dnaGrade == nil then` 등)가 명시적으로 설명되어 있지 않습니다. 문서에 포함된 `SetShopInfo()` 함수에서는 `dnaGrade`가 `#self.Stats.DnaGradeTable` (테이블 길이) 이상인지만 체크하여 최종 등급 여부를 판단할 뿐, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua void SetShopInfo() { local skillGrade = math.floor(self.Stats.CurrentSkillGrade) local dnaGrade = math.floor(self.Stats.CurrentDnaGrade) self.SkillLevelText.Text = ("기술 레벨: "..skillGrade.."레벨") self.DnaLevelText.Text = ("DNA: "..self.Stats.DnaG

[task] | two_turn [pass] | ⏳ 미판정 [title] | MSW 기본 이벤트 함수 [question] | OnInitialize 함수가 호출될 때 다른 엔티티나 컴포넌트를 참조하면 nil 오류가 발생할 수 있다고 하는데, 왜 그런지 구체적으로 설명해 줄 수 있나요? [answer] | `OnInitialize` 함수가 다른 엔티티나 컴포넌트를 참조할 때 `nil` 값이 반환될 수 있는 이유는 **호출 시점** 때문입니다. `OnInitialize`는 엔티티와 컴포넌트가 생성된 직후, `OnBeginPlay` 함수가 호출되기 전에 1회 호출되는 함수입니다. 이 시점에는 아직 월드 내의 모든 엔티티와 컴포넌트가 완전히 초기화되고 연결된 상태가 아닙니다. 구체적으로 다음과 같은 상황이 발생할 수 있습니다: 1. **다른 엔티티 미생성:** `_EntityService:GetEntityByPath` 등을 통해 다른 [followup] | OnInitialize에서 다른 엔티티 참조 시 nil을 방지하기 위해 어떤 대안이나 코드 패턴을 사용하는 것이 권장되는지 예시를 보여주세요. [followup_answer] | 참고 문서에 따르면, `OnInitialize`에서 다른 엔티티나 컴포넌트를 참조할 때 `nil`을 방지하기 위한 구체적인 코드 패턴이나 대안(예: nil 체크 후 재시도 로직 등)이 명시되어 있지 않습니다. 문서는 단순히 `OnInitialize` 내부에서 다른 엔티티나 컴포넌트를 참조하는 것을 **추천하지 않으며**, `nil`을 받아올 가능성이 있다고 경고할 뿐입니다. 대신, 문서에서 제시하는 권장 사항은 **다른 엔티티나 컴포넌트를 참조해야 하는 로직을 `OnBeginPlay` 함수에서 수행하는 것**입니다. `OnBeg [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 스크립트를 활용하면 크리에이터만의 독창적인 월드를 자유자재로 만들 수 있습니다. 스크립트를 작성할 때는 필요에 따라 기본 이벤트 함수를 활용하게 됩니다. **기본 이벤트 함수**란 다른 함수에서 직접 호출하지 않아도 **특정 조건이 되면 자동으로 호출되는 함수**를 말합니다. 이번 과정에서는 기본 이벤트 함수의 종류와 호출 시점을 알아봅시다. # 기본 이벤트 함수 추가하기 기본 이벤트 함수를 추가해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Crea

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | UIManager 컴포넌트의 OnClickButton() 메서드에서 SkillUpButton 클릭 시 self.Stats:SkillUpGrade()를, DnaUpButton 클릭 시 self.Stats:DnaUpGrade()를 호출하도록 분기문을 구현하는 스크립트를 작성해줘. [answer] | UIManager 컴포넌트에서 `OnClickButton()` 메서드를 사용하여 `SkillUpButton`과 `DnaUpButton` 클릭 시 각각 `self.Stats:SkillUpGrade()`와 `self.Stats:DnaUpGrade()`를 호출하도록 구현한 스크립트입니다. 참고 문서에 따르면, 버튼 클릭 이벤트는 `event.Entity.Name`을 통해 어떤 버튼이 눌렸는지 확인하고 분기 처리합니다. ```lua Method: [client only] void OnClickButton(any event) { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 상점 UI 제작 1. 새로운 **UI Group**을 추가하고, **DefaultShow** 값을 **true**로 설정합니다. 2. 아래와 같이 UI엔티티를 추가하고 배치합니다. UI엔티티의 이름은 이미지와 동일해야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1769512144899182516b8ee4d4248a16af41cc5d72f56.png "1") > **Tip.** > 이미지나 텍스트가 다른 UI엔티티에 가릴 경우 하이어라키 순서를 변경합니다.

[task] | single_turn [pass] | ⏳ 미판정 [title] | MSW 기본 이벤트 함수 [question] | OnInitialize 함수 내에서 self.Entity를 통해 자기 자신의 엔티티를 참조하는 것이 안전한가요? [answer] | 네, `OnInitialize` 함수 내에서 `self.Entity`를 통해 자기 자신의 엔티티를 참조하는 것은 안전합니다. `OnInitialize`는 엔티티와 컴포넌트가 생성된 후에 1회 호출되는 함수이며, 예제에서도 `local myEntity = self.Entity`를 사용하여 자기 자신이 적용된 엔티티를 참조하고 그 이름(`myEntity.Name`)을 콘솔에 출력하는 코드가 정상적으로 동작하도록 제시되어 있습니다. 다만, `OnInitialize`에서 다른 엔티티나 다른 컴포넌트를 참조하는 것은 추천하지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서 스크립트를 활용하면 크리에이터만의 독창적인 월드를 자유자재로 만들 수 있습니다. 스크립트를 작성할 때는 필요에 따라 기본 이벤트 함수를 활용하게 됩니다. **기본 이벤트 함수**란 다른 함수에서 직접 호출하지 않아도 **특정 조건이 되면 자동으로 호출되는 함수**를 말합니다. 이번 과정에서는 기본 이벤트 함수의 종류와 호출 시점을 알아봅시다. # 기본 이벤트 함수 추가하기 기본 이벤트 함수를 추가해 봅시다. 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Crea

[task] | code [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | UIManager 컴포넌트의 OnBeginPlay()에서 _EntityService:GetEntityByPath("/ui/UIGroup")을 호출하여 ShopGroup 프로퍼티에 할당하고, OnClickButton() 이벤트 핸들러에서 ShopCloseButton 클릭 시 SetVisible(false, false)를 실행하여 상점 UI를 닫는 스크립트를 작성해줘. [answer] | 요청하신 상점 UI를 열고 닫는 로직은 `UIManager` 컴포넌트에 프로퍼티, 메서드, 이벤트 핸들러를 구성하여 구현할 수 있습니다. 참고 문서에 따르면, `UIManager` 컴포넌트는 `Entity` 타입의 `ShopGroup` 프로퍼티를 가지며, `OnBeginPlay()`에서 `_EntityService:GetEntityByPath("/ui/UIGroup")`을 호출하여 해당 엔티티를 할당받습니다. 버튼 클릭 이벤트는 `OnClickButton()` 메서드를 통해 처리하며, `event.Entity.Name`을 비교하여 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 상점 UI 제작 1. 새로운 **UI Group**을 추가하고, **DefaultShow** 값을 **true**로 설정합니다. 2. 아래와 같이 UI엔티티를 추가하고 배치합니다. UI엔티티의 이름은 이미지와 동일해야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1769512144899182516b8ee4d4248a16af41cc5d72f56.png "1") > **Tip.** > 이미지나 텍스트가 다른 UI엔티티에 가릴 경우 하이어라키 순서를 변경합니다.

[task] | instruction_following [pass] | ⏳ 미판정 [title] | MSW 기본 이벤트 함수 [question] | OnBeginPlay 함수에서 다른 컴포넌트의 프로퍼티를 참조할 때 nil이 반환될 수 있는 이유와 이를 방지하기 위한 OnInitialize 활용 방법을 3문장 이내로 설명하세요. [answer] | OnBeginPlay 함수의 호출 순서가 보장되지 않아 다른 컴포넌트의 값이 초기화되기 전에 참조하면 nil이 반환될 수 있습니다. 이를 방지하기 위해 초기값 설정은 OnInitialize 함수에서 수행해야 합니다. OnInitialize는 OnUpdate 호출 직전에 1회 실행되어 OnBeginPlay 호출 시점에 프로퍼티 값이 안전하게 할당된 상태가 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 본격적으로 로직이 시작되는 시점(`OnInitialize` 함수 호출 이후, `OnUpdate` 호출 직전)에 1회 호출되는 함수입니다. 엔티티의 `OnBeginPlay` 함수는 다른 엔티티와 컴포넌트가 모두 생성된 뒤에 호출됩니다. 동적으로 생성된 엔티티도 해당 엔티티의 컴포넌트가 모두 생성된 후에 `OnBeginPlay` 함수가 호출됩니다. 그러므로 `OnInitialize` 함수와는 달리 `OnBeginPlay` 함수는 다른 엔티티 및 컴포넌트의 참조가 보장됩니다. ```lua void OnBeginPlay() { lo

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | SkillUpgrade()와 DnaUpgrade() 메서드가 [server] 실행 공간에 있는데, 왜 하단에서 self:RenewUI()를 호출할 때 [client] 메서드를 실행할 수 있나요? [answer] | 제공된 참고 문서에는 `SkillUpgrade()`와 `DnaUpgrade()` 메서드가 `[server]` 실행 공간에 있고, `RenewUI()` 메서드가 `[client]` 실행 공간에 있다는 사실만 명시되어 있습니다. 그러나 **서버에서 클라이언트 메서드(`[client]`)를 직접 호출할 수 있는 이유나, mLua 가 이를 허용하는 내부 동작 원리, 또는 서버-클라이언트 간 통신을 위한 특정 API(예: RPC, multicast 등)가 사용된다는 설명은 문서에 포함되어 있지 않습니다.** 문서에는 `SkillUpgra [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 구매 처리 실제 돈이 있는 상태에서 **DnaUpButton**을 클릭했을 때, 운동 기술과 DNA를 업그레이드 할 수 있도록 처리해봅시다. **UIManager**에서 `OnClickButton()`에서**SkillUpButton**와 **DnaUpButton**을 눌렀을 때 동작할 내용을 추가합니다. 1. **PlayerStats** 컴포넌트에서 새로운 `SkillUpgrade()` 메소드를 추가하고, 아래 내용을 입력합니다. 운동 레벨이 증가하면 해당 운동 레벨에 맞는 운동량을 설정하게 됩니다. ```lua

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | DnaUpgrade()에서 SetMaxPow()를 호출할 때 [multicast] 실행 공간이 적용되어 서버와 클라이언트 모두에 MaxPow가 갱신되는 원리가 무엇인가요? [answer] | mLua에서 `[multicast]` 실행 공간의 메서드는 서버에서 호출되면 해당 메서드가 클라이언트로도 전송되어 클라이언트에서도 실행됩니다. `DnaUpgrade()`는 `[server]` 실행 공간에서 실행되는 메서드입니다. 이 메서드 내에서 `[multicast]` 실행 공간인 `SetMaxPow()`를 호출하면, 서버에서 `SetMaxPow()`의 본문(`self.MaxPow = maxPow` 및 `self:RenewPow()`)이 실행된 후, 같은 코드가 클라이언트에도 전송되어 클라이언트에서도 동일하게 실행됩니다. 이로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 구매 처리 실제 돈이 있는 상태에서 **DnaUpButton**을 클릭했을 때, 운동 기술과 DNA를 업그레이드 할 수 있도록 처리해봅시다. **UIManager**에서 `OnClickButton()`에서**SkillUpButton**와 **DnaUpButton**을 눌렀을 때 동작할 내용을 추가합니다. 1. **PlayerStats** 컴포넌트에서 새로운 `SkillUpgrade()` 메소드를 추가하고, 아래 내용을 입력합니다. 운동 레벨이 증가하면 해당 운동 레벨에 맞는 운동량을 설정하게 됩니다. ```lua

[task] | single_turn [pass] | ⏳ 미판정 [title] | Maple GYM 만들기 Ⅱ [question] | OnClickButton 메서드에서 event.Entity.Name으로 버튼 이름을 가져오는 방식과, 버튼 컴포넌트 자체를 직접 참조하는 방식 중 mLua에서 권장되는 접근 방식은 무엇인가요? [answer] | 제공된 참고 문서에는 `OnClickButton` 메서드 내에서 `event.Entity.Name`을 사용하여 버튼 이름을 가져오는 방식의 예시만 포함되어 있습니다. 반면, **버튼 컴포넌트 자체를 직접 참조하는 방식(예: `self.ButtonComponent` 등)에 대한 설명이나 코드 예시는 문서에 존재하지 않습니다.** 따라서 문서 기준으로 판단할 때, 제공된 예제 코드(`SetShopInfo` 및 `OnClickButton` 부분)가 보여주듯 **이벤트 파라미터에서 `event.Entity.Name`을 추출하는 방식** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua void SetShopInfo() { local skillGrade = math.floor(self.Stats.CurrentSkillGrade) local dnaGrade = math.floor(self.Stats.CurrentDnaGrade) self.SkillLevelText.Text = ("기술 레벨: "..skillGrade.."레벨") self.DnaLevelText.Text = ("DNA: "..self.Stats.DnaG

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