[task] | code [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | DefalutPlayer에 PlayerStats 컴포넌트를 추가하여 Score 프로퍼티를 관리하고, CardPairGameLogic의 OnCardClicked에서 _UserService.LocalPlayer를 통해 AddScore(10)을 호출해 카드 짝이 맞을 때마다 점수를 증가시키는 스크립트를 작성해줘 [answer] | 카드 짝이 맞을 때마다 점수를 증가시키기 위해 **PlayerStats** 컴포넌트를 **DefalutPlayer**에 추가하고, **CardPairGameLogic**의 `OnCardClicked` 메서드에서 `_UserService.LocalPlayer`를 통해 점수를 호출하는 방법을 설명합니다. ### 1. PlayerStats 컴포넌트 작성 **DefalutPlayer** 엔티티에 추가할 **PlayerStats** 컴포넌트 스크립트입니다. `Score` 프로퍼티와 점수를 증가시키는 `AddScore` 메서드를 포함합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 점수 만들기 카드 짝 맞출 때마다 일정한 점수가 증가하게 만들어봅시다. 1. **PlayerStats** 컴포넌트를 **DefalutPlayer**에 추가합니다. **PlayerStats** 컴포넌트는 점수 증가를 담당합니다. 2. **PlayerStats** 컴포넌트에 number 타입 프로퍼티를 아래와 같이 추가합니다. ```lua Property: [None] number Score = 0 ``` 3. 초깃값이 0인 **Score** 프로퍼티에 점수가 더해질 수 있도록 `A
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 효과음 재생 위치와 해당 RUID를 매칭하여 정리하세요. [answer] | 카드 짝 맞추기 게임에서 효과음을 재생하는 위치(코드 삽입 지점)와 해당 음원의 RUID는 다음과 같이 매칭됩니다. | 효과음 발생 상황 | 코드 삽입 위치 (함수 내) | RUID | | :--- | :--- | :--- | | **카드 선택 시** | `cardboard:SelectCard(newCard)` 아래 | `0c57ceb6897c4955b1a4e860c6895868` | | **카드 선택 해제 시** | 첫 번째 `cardboard:DeselectCard()` 아래 | `0c57ceb6897c4955b1a4e860c [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임을 다 만들었지만 어쩐지 심심한 느낌이 들지 않나요? 마지막으로 배경음악과 효과음을 추가해서 게임을 완성해봅시다. # 배경음악 설정하기 1. **Preset List - Background Music**을 선택합니다. 2. 원하는 BGM을 선택한 뒤, **Hierarchy - maps - map01**을 선택합니다. 프로퍼티 창에서 **SoundComponent**가 추가된 걸 확인할 수 있습니다. **Audio Play**를 눌러 음악을 확인합니다. **BGM, PlayOnEnable** 프로퍼티가 활성화 되어있는지
[task] | single_turn [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | TimeText와 ScoreText의 텍스트를 갱신하기 위해 OnUpdate에서 UpdateText()를 호출하는데, 매 프레임마다 실행되는 것이 성능에 문제가 될 수 있을까요? [answer] | 네, 매 프레임마다 `OnUpdate`에서 `UpdateText()`를 호출하는 것은 성능에 문제를 일으킬 수 있습니다. 문제의 핵심은 `UpdateText()` 함수 내부에서 수행되는 작업입니다. 이 함수는 다음과 같은 동작을 수행합니다: 1. `_CardPairGameLogic.RemainingTime` 값을 읽습니다. 2. `math.floor()`을 통해 정수로 변환합니다. 3. `tostring()`을 통해 문자열로 변환합니다. 4. `self.TimeText.TextComponent.Text`에 해당 문자열을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardSpawnRoot = /ui/CardPairGameUI/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil [None] Entity TimeText = /ui/CardPairGameUI/UI_Board/Background/Title/Timer_Background/UI_Time/UI_Time_Text [None] Entity ScoreText = /ui/CardPairGameUI/UI_Board/Backgro
[task] | two_turn [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | 게임 시간 관리 로직에 대해 질문이 있습니다 [answer] | 카드 짝 맞추기 게임의 시간 관리 로직은 `PlayTime`과 `RemainingTime`이라는 두 개의 숫자 프로퍼티를 사용하여 구현됩니다. 1. **초기화**: 게임이 시작될 때(`OnBeginPlay`) `StartGame` 메서드가 호출되며, `RemainingTime` 값이 전체 게임 시간인 `PlayTime` 값으로 설정됩니다. 2. **시간 감소**: `OnUpdate` 메서드가 매 프레임마다 실행되며, 전달받은 `delta` 값만큼 `RemainingTime`을 감소시킵니다. 3. **게임 종료**: `Rema [followup] | `OnUpdate`에서 `RemainingTime`이 0 이하가 되었을 때 `EndGame`을 호출하지만, 이때 UI를 비활성화하기 전에 남은 점수 합산 처리나 결과 알림을 추가하려면 어떤 메서드를 사용해야 하나요? [followup_answer] | 제공된 참고 문서에는 `EndGame` 메서드 내에서 `self.CardPairGameUI.Enable = false`를 호출하여 UI를 비활성화하는 로직만 포함되어 있습니다. 문서에는 남은 점수 합산 처리나 결과 알림을 위한 별도의 메서드, API, 또는 이벤트 핸들러가 정의되어 있지 않습니다. 따라서 주어진 문서 범위 내에서 이러한 추가 처리를 위한 구체적인 메서드나 API를 사용하라고 명시된 내용은 없습니다. 기존 문서의 `EndGame` 로직은 다음과 같습니다: ```lua [client only] void EndGam [scores] | [judge_reason] | [source_doc] | #### CardPairGameLogic 로직 ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true
[task] | two_turn [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | `OnCardClicked` 이벤트에서 카드가 쌍으로 일치할 때 처리되는 과정을 자세히 설명해 주세요 [answer] | `OnCardClicked` 이벤트에서 카드가 쌍으로 일치할 때 처리되는 과정은 다음과 같습니다. 1. **유효성 검증**: 먼저 전달된 `card` 파라미터와 UI의 `CardBoard` 컴포넌트가 유효한지(`isvalid`) 확인합니다. 유효하지 않으면 함수를 즉시 종료합니다. 2. **현재 선택된 카드 확인**: `CardBoard`의 `SelectedCard` 프로퍼티를 통해 이전에 선택되어 있던 카드(`oldCard`)와 이번에 클릭한 카드(`newCard`)를 확인합니다. 3. **쌍 일치 조건 판별**: `old [followup] | `cardboard:IsEmpty()`가 true일 때 `SetCards()`를 다시 호출하여 카드 보드를 초기화하는 코드 블록을 작성해 주세요. [followup_answer] | ```lua if cardboard:IsEmpty() then cardboard:SetCards() end ``` [scores] | [judge_reason] | [source_doc] | #### CardPairGameLogic 로직 ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | 반환 타입을 추론할 수 없는 일반 루아 함수의 결과를 받을 때, Type Annotation을 적용하면 스크립트 어시스트에서 어떤 변화를 보게 되나요? [answer] | 반환 타입을 추론할 수 없는 일반 Lua 함수의 결과를 받을 때, `---@type` 어노테이션을 적용하면 스크립트 에디터의 **스크립트 어시스트** 기능(퀵 인포, 시그니처 헬퍼, 코드 컴플리션 등)이 해당 변수의 타입 정보를 인식하여 도움을 줍니다. 구체적인 변화는 다음과 같습니다: 1. **타입 인식**: 에디터가 해당 변수가 어떤 타입(예: `string`, `number`, 특정 컴포넌트 등)인지 명확히 파악합니다. 2. **어시스트 기능 활성화**: * **퀵 인포(Quick Info)**: 변수 위에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **어노테이션**(Annotation)은 코드에 추가하여 사용하는 일종의 메타데이터입니다. 스크립트에 `--` 기호를 사용한 주석(Comment)은 스크립트 작성에 참고 역할만 하는 반면, `---@` 형태로 **어노테이션**을 작성하면 **퀵 인포**나 **시그니처 헬퍼**, **코드 컴플리션** 등 스크립트 어시스트의 도움을 받을 수 있습니다. 본 과정을 통해 메이플스토리 월드에서 제공하는 **어노테이션**의 종류와 활용 방법을 알아봅시다. > **더 알아보기** > 퀵 인포, 시그니처 헬퍼, 코드 컴플리
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | `table<Entity>`와 `table<string, Entity>`처럼 Table 타입을 지정하는 문법은 어떻게 다른가요? [answer] | `table<Entity>`와 `table<string, Entity>`는 Table의 **키(Key) 타입** 지정 유무에 따라 문법과 의미가 다릅니다. 1. **`table<Entity>` (Value 타입만 지정)** * **의미:** 테이블의 값(Value) 타입만 `Entity`로 지정하고, 키(Key) 타입은 명시하지 않는 경우입니다. * **활용:** 키가 정수(index)인 리스트 형태이거나, 키의 타입을 엄격하게 제한하지 않고 값의 타입만 어시스트(퀵 인포, 코드 컴플리션)로 활용하고 싶을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **어노테이션**(Annotation)은 코드에 추가하여 사용하는 일종의 메타데이터입니다. 스크립트에 `--` 기호를 사용한 주석(Comment)은 스크립트 작성에 참고 역할만 하는 반면, `---@` 형태로 **어노테이션**을 작성하면 **퀵 인포**나 **시그니처 헬퍼**, **코드 컴플리션** 등 스크립트 어시스트의 도움을 받을 수 있습니다. 본 과정을 통해 메이플스토리 월드에서 제공하는 **어노테이션**의 종류와 활용 방법을 알아봅시다. > **더 알아보기** > 퀵 인포, 시그니처 헬퍼, 코드 컴플리
[task] | two_turn [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | 선택된 카드를 해제하는 `DeselectCard` 메서드가 nil 안전성을 어떻게 처리하는지 궁금합니다. [answer] | 제공된 참고 문서에 따르면, `DeselectCard` 메서드는 **nil 안전성 검사를 수행하지 않습니다.** 문서에 명시된 `DeselectCard` 메서드의 구현은 다음과 같습니다: ```lua [client only] void DeselectCard() { self.SelectedCard:CardOff() self.SelectedCard = nil } ``` 이 코드에서 `self.SelectedCard`에 `nil` 안전성 확인(예: `isvalid()` 체크 등)이 없기 때문에, `self.Select [followup] | `self.SelectedCard`가 nil인 상태에서 `CardOff`가 호출되면 어떤 에러가 발생하며, 이를 방지하기 위해 추가해야 할 코드 수정 예시는 무엇입니까? [followup_answer] | `self.SelectedCard`가 `nil`인 상태에서 `CardOff`가 호출되면, `nil` 값에 대해 메서드 호출(`:CardOff()`)을 시도하는 것이므로 **Lua 런타임 에러**가 발생합니다. 일반적으로 "attempt to index a nil value" 또는 "attempt to call a nil value"와 유사한 오류 메시지가 출력되며 스크립트가 중단됩니다. 이를 방지하기 위해 `DeselectCard` 메서드 내에서 `self.SelectedCard`가 유효한지(즉, `nil`이 아닌지) 먼저 확인하 [scores] | [judge_reason] | [source_doc] | [client Only] void ClearCardEntities () { local cardEntities = self.CardSpawnRoot.Children for i = 1, #cardEntities do cardEntities[i]:Destroy() end } [client only] void SelectCardCard (Card card) { self.SelectedCard = card card:CardOn() } [client only] void
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | `--` 주석과 `---@` 어노테이션의 차이점이 무엇이며, 왜 후자가 스크립트 에디터의 도움을 받기 위한 메타데이터로 중요한가요? [answer] | `--` 주석과 `---@` 어노테이션의 주요 차이점과 중요성은 다음과 같습니다. **1. 역할의 차이** * **`--` 주석 (Comment):** 스크립트 작성 시 참고용으로만 사용되며, 실제 코드 실행이나 에디터의 자동 완성 기능에는 영향을 주지 않습니다. * **`---@` 어노테이션 (Annotation):** 코드에 추가되는 일종의 메타데이터입니다. 스크립트 에디터가 이 정보를 읽어 다양한 어시스트 기능을 활성화합니다. **2. 스크립트 에디터 도움(어시스트)과의 연관성** `---@` 어노테이션은 변수의 타 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **어노테이션**(Annotation)은 코드에 추가하여 사용하는 일종의 메타데이터입니다. 스크립트에 `--` 기호를 사용한 주석(Comment)은 스크립트 작성에 참고 역할만 하는 반면, `---@` 형태로 **어노테이션**을 작성하면 **퀵 인포**나 **시그니처 헬퍼**, **코드 컴플리션** 등 스크립트 어시스트의 도움을 받을 수 있습니다. 본 과정을 통해 메이플스토리 월드에서 제공하는 **어노테이션**의 종류와 활용 방법을 알아봅시다. > **더 알아보기** > 퀵 인포, 시그니처 헬퍼, 코드 컴플리
[task] | code [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | `_UserService.LocalPlayer` 의 `PlayerStats` 에 점수를 추가하고, `CardBoard` 의 `SelectedCard` 를 비교하여 `IsPairOf` 가 참일 때만 카드를 소거하는 `OnCardClicked` 이벤트 핸들러를 포함해줘. [answer] | 사용자가 요청한 `OnCardClicked` 이벤트 핸들러는 `Card` 타입의 인자를 받으며, `CardBoard`의 `SelectedCard`와 비교하여 `IsPairOf`가 참일 경우에만 카드를 소거하고 `_UserService.LocalPlayer`의 `PlayerStats`에 점수를 추가하는 로직을 포함해야 합니다. 참고 문서의 `CardPairGameLogic` 스크립트에서 해당 로직이 어떻게 구현되는지 확인하면, `isvalid` 체크, `CardBoard` 접근, `oldCard`/`newCard` 비교, `Sele [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### CardPairGameLogic 로직 ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true
[task] | two_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | 여러 값을 할당받는 경우 Type Annotation을 지정할 때 주의해야 할 점은 무엇인가요? [answer] | 여러 값을 할당받을 때 Type Annotation을 지정하는 주의사항은 다음과 같습니다. **1. 타입은 앞의 값부터 순서대로 적용됩니다.** 여러 값을 한 줄에 받아들이는 경우, Type Annotation에 지정한 타입은 좌측(앞)의 변수부터 순서대로 매핑됩니다. **2. 뒤의 값만 따로 타입을 지정할 수 없습니다.** 예를 들어 `local a, b, c = ...` 와 같이 세 값을 받아들이는데, 두 번째 값 `b`에만 타입을 지정하고 첫 번째 값 `a`는 지정하지 않는 것 같은 **부분 지정은 불가능**합니다. 타입을 [followup] | `local strValue, intValue = TestFunction()`처럼 두 값을 받는 함수에서 앞의 값만 `string`으로 타입을 지정하고 뒤의 값은 지정하지 않는 '일부 적용'의 허용 범위와 한계를 설명해 주세요. [followup_answer] | `local strValue, intValue = TestFunction()`과 같이 여러 값을 할당받을 때 타입을 일부만 지정하는 '일부 적용'의 허용 범위와 한계는 다음과 같습니다. **1. 허용 범위: 앞의 값부터 연속하여 지정 가능** 여러 값을 한 줄에 받아들이는 경우, 첫 번째 값부터 시작하여 연속적으로 타입을 지정하는 것은 허용됩니다. 예를 들어 두 값을 받을 때 첫 번째 값인 `strValue`에만 `string` 타입을 지정하는 것은 가능합니다. ```lua ---@type string local strValue [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **어노테이션**(Annotation)은 코드에 추가하여 사용하는 일종의 메타데이터입니다. 스크립트에 `--` 기호를 사용한 주석(Comment)은 스크립트 작성에 참고 역할만 하는 반면, `---@` 형태로 **어노테이션**을 작성하면 **퀵 인포**나 **시그니처 헬퍼**, **코드 컴플리션** 등 스크립트 어시스트의 도움을 받을 수 있습니다. 본 과정을 통해 메이플스토리 월드에서 제공하는 **어노테이션**의 종류와 활용 방법을 알아봅시다. > **더 알아보기** > 퀵 인포, 시그니처 헬퍼, 코드 컴플리
[task] | code [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | 60초 제한 시간 동안 카드 짝을 찾아 성공 시마다 10점을 획득하고, 모든 카드가 소거되면 자동으로 새 카드 세트를 배치하는 `CardPairGameLogic` 스크립트를 작성해줘. [answer] | 요청하신 조건(60초 제한, 성공 시 10점 획득, 모든 카드 소거 시 자동 재배치)을 충족하는 `CardPairGameLogic` 스크립트는 다음과 같습니다. ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### CardPairGameLogic 로직 ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | TestFunction()과 같이 함수를 반환하는 함수의 결과값에 타입 어노테이션을 적용하려면 어떤 코드를 작성해야 하나요? [answer] | 함수를 반환하는 함수(고차 함수)의 결과값에 타입 어노테이션을 적용하려면, `TestFunction()` 호출 결과를 로컬 변수에 할당하는 줄 위에 `---@type function(...):...` 형식의 주석을 작성하면 됩니다. 참고 문서에 따르면, 구체적인 예시는 다음과 같습니다. ```lua local function TestFunction() return function(paramA, paramB) return "strValue", false end end ---@type function( [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Function은 아래와 같은 문법으로 타입을 지정합니다. ```lua ---@type function(param_name: PARAM_TYPE):RETURN_TYPE ``` ##### 사용 예시 ```lua ---@type function() local testFunction = function() end ``` ```lua ---@type function(testParamA:string, testParamB:Entity) local testFunction = function(testParamA, testParamB) end
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | Entity 타입의 객체를 매개변수로 받는 함수를 정의할 때, 어노테이션 문법에서 Entity를 어떻게 표기해야 하나요? [answer] | Entity 타입의 객체를 매개변수로 받는 함수를 정의할 때는 `---@type` 어노테이션에서 매개변수 이름 뒤에 `:Entity`라고 표기합니다. 예를 들어, `testParamA`가 Entity 타입인 함수를 정의하는 문법은 다음과 같습니다. ```lua ---@type function(testParamA:Entity) local testFunction = function(testParamA) end ``` 여러 매개변수가 있는 경우에도 각 매개변수 뒤에 쉼표(,)를 사용하여 구분하고, Entity 타입인 매개변수에는 ` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Function은 아래와 같은 문법으로 타입을 지정합니다. ```lua ---@type function(param_name: PARAM_TYPE):RETURN_TYPE ``` ##### 사용 예시 ```lua ---@type function() local testFunction = function() end ``` ```lua ---@type function(testParamA:string, testParamB:Entity) local testFunction = function(testParamA, testParamB) end
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | StartGame 함수에서 카드 보드를 초기화하기 위해 호출되는 메서드 이름을 코드 블록으로만 출력하세요. [answer] | ```lua cardboard:SetCards() ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true self.RemainingTime = self
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | Type Annotation을 붙인 함수를 호출할 때, 편집기에서 시그니처 헬퍼나 퀵 인포를 통해 어떤 정보를 확인할 수 있나요? [answer] | Type Annotation을 붙인 함수를 호출할 때, 편집기에서 다음 두 가지 정보를 확인할 수 있습니다. 1. **시그니처 헬퍼(Signature Helper)**: 함수 호출 시점에 매개변수의 이름과 타입, 그리고 반환 타입을 자동으로 표시하여 올바른 인자를 전달할 수 있도록 돕습니다. 2. **퀵 인포(Quick Info)**: 마우스를 호버하거나 커서를 올렸을 때, 해당 함수의 시그니처(매개변수 타입과 반환 타입)를 상세히 확인할 수 있습니다. 예를 들어, 아래 코드에서 `test` 함수를 호출할 때 시그니처 헬퍼와 퀵 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Function은 아래와 같은 문법으로 타입을 지정합니다. ```lua ---@type function(param_name: PARAM_TYPE):RETURN_TYPE ``` ##### 사용 예시 ```lua ---@type function() local testFunction = function() end ``` ```lua ---@type function(testParamA:string, testParamB:Entity) local testFunction = function(testParamA, testParamB) end
[task] | two_turn [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | 게임이 종료되었는지 확인하기 위한 `IsEmpty` 메서드의 동작 원리를 설명해 주세요. [answer] | `IsEmpty` 메서드는 카드 짝 맞추기 게임이 모두 완료되었는지, 즉 화면에 남아 있는 카드가 없는지 확인하는 로직입니다. 이 메서드는 `CardSpawnRoot`라는 컨테이너 아래에 배치된 모든 자식 엔티티(카드)를 순회하며 각 카드의 가시성(`Visible`)을 점검하는 방식으로 작동합니다. 구체적인 동작 원리는 다음과 같습니다. 1. **카드 목록 조회**: `self.CardSpawnRoot.Children`을 통해 카드가 생성된 루트 객체의 모든 자식 엔티티 리스트를 가져옵니다. 2. **순회 및 가시성 확인** [followup] | `self.CardSpawnRoot.Children` 리스트에서 `Visible` 속성이 true인 카드가 하나라도 있으면 false를 반환하는 로직이, 카드가 뒤집혀 있거나 제거된 상태와 어떻게 구별되는지 코드 예시를 통해 보여주세요. [followup_answer] | `IsEmpty` 메서드가 `Visible` 속성만 기준으로 판단하는 이유는, 카드 짝 맞추기 게임에서 '제거'된 카드는 실제로 엔티티가 삭제되는 것이 아니라 `Visible`을 `false`로 설정하여 화면에서 숨기는 방식을 사용하기 때문입니다. 참고 문서의 코드 예시를 보면 카드의 상태 변화가 어떻게 이루어지는지 명확히 확인할 수 있습니다. 1. **카드 선택 시 (`SelectCardCard`)**: * `card:CardOn()`을 호출하여 카드의 색상을 변경합니다 (뒤집힌 상태로 보이게 함). * [scores] | [judge_reason] | [source_doc] | [client Only] void ClearCardEntities () { local cardEntities = self.CardSpawnRoot.Children for i = 1, #cardEntities do cardEntities[i]:Destroy() end } [client only] void SelectCardCard (Card card) { self.SelectedCard = card card:CardOn() } [client only] void
[task] | single_turn [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | OnUpdate에서 시간 차감 시 왜 0 이하가 된 시점과 정확히 일치하지 않고 한 프레임 늦게 게임이 종료되는 것 같은지 원인이 궁금합니다. [answer] | `OnUpdate`에서 시간이 0 이하가 된 시점과 게임 종료 사이에 프레임 단위의 지연이 발생하는 원인은 **이벤트 처리의 순서** 때문입니다. 참고 문서의 `OnUpdate` 코드를 보면 다음과 같습니다. ```lua [client only] void OnUpdate (number delta) { self.RemainingTime = self.RemainingTime - delta if self.RemainingTime <= 0 then self:EndGame() end } ``` 이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | #### CardPairGameLogic 로직 ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 게임 종료 조건인 RemainingTime 변수가 0 이하가 되었을 때 실행되는 메서드 이름과 해당 메서드에서 수행되는 동작을 3문장 이내로 설명하세요. [answer] | `EndGame` 메서드에서 실행됩니다. 이 메서드는 `CardPairGameUI` 엔티티의 `Enable` 속성을 `false`로 설정하여 UI를 비활성화하는 동작을 수행합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true self.RemainingTime = self
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | 스크립트에서 함수의 매개변수와 반환값 타입을 지정할 때, 여러 값을 반환하는 경우 괄호를 어떻게 사용하여 구별해야 하나요? [answer] | mLua에서 함수의 매개변수와 반환값 타입을 지정할 때, 여러 값을 반환하는 경우와 함께 다른 값을 지정하고 싶다면 **괄호 `()`** 를 사용하여 각각의 타입을 묶어서 구분합니다. ### 문법 여러 값을 반환하는 함수 타입을 지정하려면, 해당 함수 타입 자체를 괄호로 묶은 뒤 쉼표 `,` 뒤에 추가적으로 지정할 타입을 적습니다. ```lua ---@type (function(매개변수명:타입, ...):반환타입1, 반환타입2, ...), 추가타입 ``` ### 사용 예시 아래 예시는 함수가 `AttackComponent`와 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Function은 아래와 같은 문법으로 타입을 지정합니다. ```lua ---@type function(param_name: PARAM_TYPE):RETURN_TYPE ``` ##### 사용 예시 ```lua ---@type function() local testFunction = function() end ``` ```lua ---@type function(testParamA:string, testParamB:Entity) local testFunction = function(testParamA, testParamB) end
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 문서의 OnCardClicked 메서드에서 카드가 짝이 맞을 때 재생되는 효과음 ID와 볼륨 값을 2줄의 표로 정리하세요. [answer] | OnCardClicked 메서드에서 카드가 짝이 맞을 때 재생되는 효과음 정보는 다음과 같습니다. | 효과음 ID | 볼륨 값 | | :--- | :--- | | 0c57ceb6897c4955b1a4e860c6895868 | 0.7 | | 3b79d37626de4023a600e90d7e1595f8 | 0.7 | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true self.RemainingTime = self
[task] | single_turn [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | Param Annotation을 붙여놓았는데도 스크립트 어시스트가 매개변수 타입을 인식하지 못할 때, 가장 흔한 원인은 무엇인가요? [answer] | 제공된 문서에는 Param Annotation을 사용했을 때 스크립트 어시스트가 매개변수 타입을 인식하지 못하는 원인에 대한 설명이 포함되어 있지 않습니다. 따라서 이 질문에 대한 답변을 제공하기 위해 추가적인 정보가 필요합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **Param Annotation**을 사용해 대상이 되는 함수의 매개 변수 타입을 지정하여 스크립트 어시스트의 도움을 받을 수 있습니다. **Param Annotation**은 함수 정의문에 사용합니다. 아래와 같은 문법으로 **Param Annotation**을 사용합니다. ```lua ---@param param_name PARAM_TYPE ``` ##### 사용 예시 ```lua ---@param testParamA Entity local function TestFunction(testParamA) end ``` ```
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 배경음악, 효과음 만들기 [question] | 코드만 출력하고 설명은 주석으로 [answer] | ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true local cardboard = self.CardPairGameUI.CardBoard -- 새로운 카드판이 나타날 때 효과음 재생 _SoundSe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 게임을 다 만들었지만 어쩐지 심심한 느낌이 들지 않나요? 마지막으로 배경음악과 효과음을 추가해서 게임을 완성해봅시다. # 배경음악 설정하기 1. **Preset List - Background Music**을 선택합니다. 2. 원하는 BGM을 선택한 뒤, **Hierarchy - maps - map01**을 선택합니다. 프로퍼티 창에서 **SoundComponent**가 추가된 걸 확인할 수 있습니다. **Audio Play**를 눌러 음악을 확인합니다. **BGM, PlayOnEnable** 프로퍼티가 활성화 되어있는지
[task] | code [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | `---@type string` 어노테이션을 적용하여 `TestFunction` 에서 반환하는 문자열 값을 변수에 할당하고, `log` 함수를 통해 출력하는 스크립트를 작성해줘 [answer] | `TestFunction`이 반환하는 문자열 값은 반환 타입을 에디터가 자동으로 추론하지 못할 수 있으므로, `---@type string` 어노테이션을 적용하여 변수의 타입을 명시적으로 지정합니다. 이렇게 하면 스크립트 어시스트가 해당 변수가 문자열 타입임을 인식하고 퀵 인포나 코드 컴플리션 기능을 제공합니다. 아래는 요청하신 내용을 담은 스크립트 예시입니다. ```lua local function TestFunction() return "strValue" end ---@type string local strValue [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **어노테이션**(Annotation)은 코드에 추가하여 사용하는 일종의 메타데이터입니다. 스크립트에 `--` 기호를 사용한 주석(Comment)은 스크립트 작성에 참고 역할만 하는 반면, `---@` 형태로 **어노테이션**을 작성하면 **퀵 인포**나 **시그니처 헬퍼**, **코드 컴플리션** 등 스크립트 어시스트의 도움을 받을 수 있습니다. 본 과정을 통해 메이플스토리 월드에서 제공하는 **어노테이션**의 종류와 활용 방법을 알아봅시다. > **더 알아보기** > 퀵 인포, 시그니처 헬퍼, 코드 컴플리
[task] | code [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | `_CardPairGameLogic.RemainingTime` 값이 0 이하가 되었을 때 `self.TimeText`와 `self.ScoreText`의 `TextComponent.Text`를 각각 "Time Up"과 "Game Over"로 변경하는 [client only] OnUpdate 스크립트를 작성해줘. [answer] | `_CardPairGameLogic.RemainingTime` 값이 0 이하가 되었을 때 텍스트를 변경하는 로직을 포함하는 스크립트입니다. 참고 문서에 포함된 `Property` 블록의 엔티티 경로와 `UpdateText` 메서드의 구조를 기반으로 작성했습니다. ```lua Property: [None] Entity TimeText = /ui/CardPairGameUI/UI_Board/Background/Title/Timer_Background/UI_Time/UI_Time_Text [None] Entity ScoreText = [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardSpawnRoot = /ui/CardPairGameUI/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil [None] Entity TimeText = /ui/CardPairGameUI/UI_Board/Background/Title/Timer_Background/UI_Time/UI_Time_Text [None] Entity ScoreText = /ui/CardPairGameUI/UI_Board/Backgro
[task] | two_turn [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | 카드 짝 맞추기 게임의 점수 시스템이 어떻게 작동하는지 설명해 주세요 [answer] | 카드 짝 맞추기 게임의 점수 시스템은 플레이어의 플레이 시간과 카드 매칭 성공 여부를 기반으로 작동합니다. 주요 작동 방식은 다음과 같습니다. 1. **플레이 시간 관리**: * 게임 시작 시(`StartGame`) `RemainingTime`이 `PlayTime`(기본 60초)으로 초기화됩니다. * 매 프레임마다 `OnUpdate` 함수가 호출되어 `RemainingTime`에서 `delta`(경과 시간)를 뺍니다. * `RemainingTime`이 0 이하가 되면 `EndGame` 함수가 호 [followup] | `_UserService.LocalPlayer`의 `PlayerStats`에 점수를 추가하는 코드가 특정 조건에서만 실행되는 이유와, 게임 종료 시 점수 초기화나 저장 로직이 필요한지 궁금합니다. [followup_answer] | `_UserService.LocalPlayer.PlayerStats:AddScore(10)` 코드가 특정 조건에서만 실행되는 이유와 게임 종료 시 점수 처리에 대해 참고 문서를 근거로 설명해 드립니다. **1. 점수 추가 코드가 특정 조건에서만 실행되는 이유** `OnCardClicked` 함수 내에서 점수 추가 로직은 다음 두 가지 조건이 모두 충족될 때만 실행됩니다. 1. **선택된 카드가 존재할 때 (`oldCard ~= nil`)**: 첫 번째 카드를 선택할 때는 `oldCard`가 `nil`이므로 점수 로직에 진입하지 [scores] | [judge_reason] | [source_doc] | #### CardPairGameLogic 로직 ```lua Property: [None] Entity CardPairGameUI = /ui/CardPairGameUI [None] number PlayTime = 60 [None] number RemainingTime = 0 Method: [client only] void OnBeginPlay() { self:StartGame() } [client only] void StartGame() { self.CardPairGameUI.Enable = true
[task] | code [pass] | ⏳ 미판정 [title] | 점수 만들기 [question] | `self.ScoreText`의 `TextComponent`에 현재 점수(`me.PlayerStats.Score`)와 함께 "Score: "라는 접두어가 포함되도록 표시되도록 수정하는 `UpdateText()` 메서드를 가진 [client only] 스크립트를 작성해줘. [answer] | `UpdateText()` 메서드 내부에서 `tostring()`으로 변환한 점수 문자열 앞에 `"Score: "`를 붙여 `self.ScoreText.TextComponent.Text`에 할당하도록 수정하면 됩니다. ```lua Property: [None] Entity TimeText = /ui/CardPairGameUI/UI_Board/Background/Title/Timer_Background/UI_Time/UI_Time_Text [None] Entity ScoreText = /ui/CardPairGameUI/UI_Boar [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua Property: [None] Entity CardSpawnRoot = /ui/CardPairGameUI/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil [None] Entity TimeText = /ui/CardPairGameUI/UI_Board/Background/Title/Timer_Background/UI_Time/UI_Time_Text [None] Entity ScoreText = /ui/CardPairGameUI/UI_Board/Backgro
[task] | code [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | `---@type table<integer, string>` 어노테이션을 사용하여 숫자 키와 문자열 값으로 이루어진 테이블을 생성하고, 1~3 인덱스에 "A", "B", "C" 를 저장하는 스크립트를 작성해줘 [answer] | `---@type table<integer, string>` 어노테이션을 사용하여 숫자 키와 문자열 값으로 이루어진 테이블을 생성하고, 1~3 인덱스에 "A", "B", "C"를 저장하는 스크립트는 다음과 같습니다. ```lua Property: [None] Method: [server only] void OnBeginPlay() { ---@type table<integer, string> local testTable = {} testTable[1] = "A" testTable[2] = "B" testTable[3] [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **어노테이션**(Annotation)은 코드에 추가하여 사용하는 일종의 메타데이터입니다. 스크립트에 `--` 기호를 사용한 주석(Comment)은 스크립트 작성에 참고 역할만 하는 반면, `---@` 형태로 **어노테이션**을 작성하면 **퀵 인포**나 **시그니처 헬퍼**, **코드 컴플리션** 등 스크립트 어시스트의 도움을 받을 수 있습니다. 본 과정을 통해 메이플스토리 월드에서 제공하는 **어노테이션**의 종류와 활용 방법을 알아봅시다. > **더 알아보기** > 퀵 인포, 시그니처 헬퍼, 코드 컴플리
[task] | code [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | `---@type table<string, Entity>` 어노테이션을 사용하여 엔티티를 키와 값으로 저장하는 테이블을 선언하고, `_EntityService:GetEntityByPath("/maps/map01/obj")` 로 조회한 엔티티를 해당 테이블에 삽입하는 스크립트를 작성해줘 [answer] | `---@type table<string, Entity>` 어노테이션을 사용하여 엔티티를 키와 값으로 저장하는 테이블을 선언하고, `_EntityService:GetEntityByPath`로 조회한 엔티티를 삽입하는 스크립트는 다음과 같습니다. ```lua Property: [None] ---@type table<string, Entity> EntityTable = {} Method: [server only] void OnBeginPlay() { -- 경로로 엔티티 조회 local targetEntity = _En [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **어노테이션**(Annotation)은 코드에 추가하여 사용하는 일종의 메타데이터입니다. 스크립트에 `--` 기호를 사용한 주석(Comment)은 스크립트 작성에 참고 역할만 하는 반면, `---@` 형태로 **어노테이션**을 작성하면 **퀵 인포**나 **시그니처 헬퍼**, **코드 컴플리션** 등 스크립트 어시스트의 도움을 받을 수 있습니다. 본 과정을 통해 메이플스토리 월드에서 제공하는 **어노테이션**의 종류와 활용 방법을 알아봅시다. > **더 알아보기** > 퀵 인포, 시그니처 헬퍼, 코드 컴플리
[task] | code [pass] | ⏳ 미판정 [title] | 어노테이션 활용하기 [question] | `---@type string, integer` 어노테이션을 사용하여 `TestFunction` 에서 반환하는 문자열과 정수 두 가지 값을 각각 변수에 할당하는 스크립트를 작성해줘 [answer] | `TestFunction`이 문자열과 정수를 반환하도록 정의하고, `---@type string, integer` 어노테이션을 적용하여 두 값을 각각 변수에 할당하는 스크립트는 다음과 같습니다. ```lua local function TestFunction() return "strValue", 5 end ---@type string, integer local strValue, intValue = TestFunction() ``` 여기서 `---@type string, integer`는 `TestFunction`의 반환 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **어노테이션**(Annotation)은 코드에 추가하여 사용하는 일종의 메타데이터입니다. 스크립트에 `--` 기호를 사용한 주석(Comment)은 스크립트 작성에 참고 역할만 하는 반면, `---@` 형태로 **어노테이션**을 작성하면 **퀵 인포**나 **시그니처 헬퍼**, **코드 컴플리션** 등 스크립트 어시스트의 도움을 받을 수 있습니다. 본 과정을 통해 메이플스토리 월드에서 제공하는 **어노테이션**의 종류와 활용 방법을 알아봅시다. > **더 알아보기** > 퀵 인포, 시그니처 헬퍼, 코드 컴플리