← 목록

mLua · Nemotron-CC 리프레이즈 (CPT)

총 8,200개 · 페이지 196/274
🔀 랜덤
불러오는 중…

[task] | wikipedia [title] | 아바타 애니메이션 제어하기 [category] | Guides [rephrased] | # 아바타 애니메이션 제어 아바타의 애니메이션 재생 상태를 프로그래밍 방식으로 제어하기 위해 **FrameEvent** 계열의 이벤트와 액션 상태 변경 이벤트를 활용할 수 있습니다. 이 과정에서 특정 프레임 지점에서 다른 애니메이션으로 전환하거나, 재생 속도와 반복 범위를 지정하는 방법을 다룹니다. ## SpriteAnimPlayerChangeFrameEvent 활용 아바타 애니메이션의 특정 프레임이 재생될 때 다른 애니메이션으로 변경하고자 하는 경우 **SpriteAnimPlayerChangeFrameEvent**를 사용합니 [original] | 다음의 예제 코드를 보면서 **FrameEvent**의 사용법을 알아봅시다. 1. 어떤 아바타 애니메이션의 2번째 프레임이 재생될 때 다른 애니메이션으로 변경하고 싶다고 가정합니다. 그렇다면 **SpriteAnimPlayerChangeFrameEvent**를 활용할 수 있을 것입니다. `OnBeginPlay` 함수를 추가하고, 위에서 설명한 대로 이벤트를 **Body**와 연결합니다. 구독 취소를 대비해 연결한 이벤트의 핸들러는 프로퍼티로 가지고 있도록 합니다. ```lua Property: [None] [chunk_id] | Guides:820:6

[task] | wikipedia [title] | 타이머 만들기 [category] | Guides [rephrased] | **카드 짝 맞추기 타이머 완성하기** 타이머 기능 구현 후, 시간이 0초에 도달한 이후에도 수치가 음수로 계속 감소하는 문제를 해결하는 과정입니다. 일반적인 사용자 경험 관점에서 카운트다운 타이머는 0초 도달 시 게임이 종료되어야 한다고 기대합니다. 따라서 0초가 되면 사용자 인터페이스(UI)를 비활성화하여 게임을 종료하도록 로직을 수정합니다. 이 수정을 위해 `CardPairGameLogic` 컴포넌트에서 다음 두 가지를 수행합니다. 첫째, `EndGame` 함수를 정의하여 게임 종료 시 UI를 끄도록 합니다. 이 함수는 [original] | 타이머를 완성했지만 이번에도 한 가지 추가하면 좋겠습니다 타이머가 0초가 된 이후에 수가 음수로 계속해서 감소하고 있습니다. 일반적으로 수가 줄어드는 모습을 보면, 0초가 되었을 때 게임이 종료될 거라 기대합니다. 그러나 지금은 0초 이후 수가 음수로 줄어들고 있습니다. 0초가 되면 ui가 꺼지게 만들어 봅시다. 1. **CardPairGameLogic** 로직의 `EndGame` 함수에 아래와 같이 작성합니다. ```lua [client only] void EndGame () { [chunk_id] | Guides:821:1

[task] | distill [title] | 타이머 만들기 [category] | Guides [rephrased] | # 카드 짝 맞추기 타이머 만들기 게임 시작 시 1초씩 감소하는 타이머를 구현합니다. ## 1. 로직 설정 (CardPairGameLogic) 게임 제한 시간과 남은 시간을 관리하는 프로퍼티를 추가합니다. ```lua Property: [None] number PlayTime = 60 [None] number RemainingTime = 0 ``` `StartGame()`에서 초기값을 설정하고, `OnUpdate`에서 매 프레임(`delta`)만큼 시간을 감소시킵니다. ```lua Method: [client only] [original] | # 타이머 만들기 게임을 시작하면 1초씩 감소하는 타이머를 만들어봅시다. 1. **CardPairGameLogic** 로직에 게임 제한 시간으로 사용할 **PlayTime** 프로퍼티와 시간을 줄이기 위해 사용할 **RemainingTime** 프로퍼티를 추가합니다. PlayTime 초깃값은 **60**으로 설정합니다. ```lua Property: [None] number PlayTime = 60 [None] number RemainingTime = 0 ``` > ** [chunk_id] | Guides:821:0

[task] | knowledge_list [title] | 아바타 애니메이션 제어하기 [category] | Guides [rephrased] | 1. `BodyActionStateChangeEvent`는 아바타의 `bodyActionState`를 변경하는 데 사용되는 이벤트이며, 무기 타입에 따른 별도의 애니메이션 지정 없이 사용할 수 있어 편리합니다. 2. `BodyActionStateChangeEvent`는 `MapleAvatarBodyActionState` 상수를 매개변수로 받아 애니메이션을 제어합니다. 3. `MapleAvatarBodyActionState`는 각 상태별로 사용할 몸통 액션(`CoreActionName`), 파츠 액션(`PartsActionName`) [original] | [BodyActionStateChangeEvent](/apiReference/Events/BodyActionStateChangeEvent)는 이름 그대로 아바타의 bodyActionState를 변경하는 이벤트입니다. 이 이벤트는 무기 타입에 따른 애니메이션을 별도로 지정할 필요가 없어 편리합니다. **BodyActionStateChangeEvent**는 **MapleAvatarBodyActionState**로 애니메이션을 제어합니다. **MapleAvatarBodyActionState**에는 각 상태별로 어떤 몸통 액션과 파츠 액 [chunk_id] | Guides:820:3

[task] | diverse_qa [title] | 아바타 애니메이션 제어하기 [category] | Guides [rephrased] | 질문: `ChangeFrameEvent` 함수 내에서 `event.FrameIndex == 2` 조건이 참일 때 어떤 처리가 수행됩니까? 답변: 아바타의 몸체 엔티티(`body`)에서 `SpriteAnimPlayerChangeFrameEvent` 구독을 취소한 후, `ActionStateChangedEvent`를 생성하여 `swingOF` 애니메이션을 0.5초 동안 루프 방식으로 재생하도록 이벤트를 전송합니다. 질문: 아바타 애니메이션을 제어하기 위해 스크립트 메서드에 붙여야 하는 실행 공간 속성은 무엇입니까? 답변: 아바타 애니 [original] | 3. 아까 저장한 **handler**를 통해 **SpriteAnimPlayerChangeFrameEvent** 구독을 취소합니다. `ChangeFrameEvent` 함수를 수정해 봅시다. ```lua [client] void ChangeFrameEvent(any event) { if event.FrameIndex == 2 then local body = self.Entity.AvatarRendererComponent:GetBodyEntity() [chunk_id] | Guides:820:7

[task] | extract_knowledge [title] | 아바타 애니메이션 제어하기 [category] | Guides [rephrased] | # 아바타 상태 기반 애니메이션 제어 ## 1. 개념 설명 아바타의 애니메이션을 제어하기 위해 상태 변경 시마다 이벤트를 수동으로 보내는 방식은 번거로울 수 있습니다. `AvatarStateAnimationComponent`는 아바타의 상태(`State`)와 재생할 애니메이션(`MapleAvatarBodyActionState`)을 매핑하는 **ActionSheet**를 제공합니다. `StateComponent`를 통해 아바타의 상태를 변경하면, `AvatarStateAnimationComponent`는 ActionSheet에서 [original] | 이미 정의된, 혹은 새로 정의할 아바타의 상태가 바뀔 때마다 매번 이벤트를 보내서 애니메이션을 변경하는 것도 번거로울 수 있습니다. 이벤트를 보내지 않고도 아바타 상태가 바뀔 때마다 애니메이션도 함께 변경되면 매우 편리할 것입니다. [AvatarStateAnimationComponent](/apiReference/Components/AvatarStateAnimationComponent)의 **ActionSheet**에 아바타 상태와 연결될 애니메이션을 설정하고 [StateComponent](/apiReference/Component [chunk_id] | Guides:820:4

[task] | distill [title] | 타이머 만들기 [category] | Guides [rephrased] | ### 카드 짝 맞추기 타이머: 선택 해제 및 비어있는 상태 확인 **선택 해제 (`DeselectCard`)** 현재 선택된 카드의 시각적 상태를 해제하고 참조를 초기화합니다. ```lua [client only] void DeselectCard() { self.SelectedCard:CardOff() self.SelectedCard = nil } ``` **비어있는 상태 확인 (`IsEmpty`)** `CardSpawnRoot` 하위의 모든 카드가 숨겨진 상태(`Visible == false`)인지 확인합니다 [original] | [client only] void DeselectCard() { self.SelectedCard:CardOff() self.SelectedCard = nil } [client only] boolean IsEmpty () { local cards = self.CardSpawnRoot.Children for i = 1, #cards do if cards[i].Visible then return false end end [chunk_id] | Guides:821:3

[task] | diverse_qa [title] | 타이머 만들기 [category] | Guides [rephrased] | 질문: 게임 제한 시간을 저장하기 위해 `CardPairGameLogic` 로직에 추가해야 하는 프로퍼티의 이름과 초깃값은 무엇인가요? 답변: 프로퍼티 이름은 `PlayTime`이며, 초깃값은 60으로 설정해야 합니다. 질문: `RemainingTime` 프로퍼티의 초깃값은 얼마인가요? 답변: `RemainingTime` 프로퍼티의 초깃값은 0입니다. 질문: 제작 중 게임을 빠르게 종료시켜 타이머 작동을 확인하기 위한 팁은 무엇인가요? 답변: `PlayTime`의 초깃값을 60 대신 작은 수로 입력하여 게임이 빠르게 종료되게 만 [original] | # 타이머 만들기 게임을 시작하면 1초씩 감소하는 타이머를 만들어봅시다. 1. **CardPairGameLogic** 로직에 게임 제한 시간으로 사용할 **PlayTime** 프로퍼티와 시간을 줄이기 위해 사용할 **RemainingTime** 프로퍼티를 추가합니다. PlayTime 초깃값은 **60**으로 설정합니다. ```lua Property: [None] number PlayTime = 60 [None] number RemainingTime = 0 ``` > ** [chunk_id] | Guides:821:0

[task] | extract_knowledge [title] | 아바타 애니메이션 제어하기 [category] | Guides [rephrased] | # 아바타 애니메이션 제어 ## 개념 설명 아바타 애니메이션은 클라이언트에서 재생되므로, 애니메이션 상태 변경을 위해 이벤트 구독 및 취소 로직은 반드시 클라이언트(`[client]`)에서 수행해야 합니다. `SpriteAnimPlayerChangeFrameEvent`를 통해 특정 프레임이 재생되는 시점을 감지하고, 해당 시점에 다른 애니메이션으로 전환하거나 이벤트 구독을 해제하여 애니메이션 전환을 제어할 수 있습니다. ## API 사용법 아바타 애니메이션 제어에 사용되는 주요 객체와 메서드는 다음과 같습니다. * **`A [original] | 3. 아까 저장한 **handler**를 통해 **SpriteAnimPlayerChangeFrameEvent** 구독을 취소합니다. `ChangeFrameEvent` 함수를 수정해 봅시다. ```lua [client] void ChangeFrameEvent(any event) { if event.FrameIndex == 2 then local body = self.Entity.AvatarRendererComponent:GetBodyEntity() [chunk_id] | Guides:820:7

[task] | extract_knowledge [title] | 아바타 애니메이션 제어하기 [category] | Guides [rephrased] | # 아바타 애니메이션 제어 ## 1. 개념 설명 메이플스토리 월드의 mLua 환경에서는 `ActionStateChangedEvent`와 `BodyActionStateChangeEvent`를 사용하여 아바타의 애니메이션을 제어할 수 있습니다. * **ActionStateChangedEvent**: 몸통(CoreActionName)과 파츠(PartsActionName)의 애니메이션을 각각 독립적으로 세밀하게 제어하는 이벤트입니다. 재생 속도, 재생 타입, 시작/종료 프레임을 지정할 수 있으나, 모든 액션 변경 시마다 명시적으로 [original] | 각 애니메이션의 총 프레임은 **AvatarItem Editor**에서 확인할 수 있습니다. 위와 같이 총 프레임을 확인한 뒤, 크리에이터가 재생하기를 원하는 애니메이션 시작 프레임(StartFrameIndex)과 종료 프레임(EndFrameIndex)을 설정하면 됩니다. 프레임을 설정할 때는 다음 사항을 주의해야 합니다. * 프레임은 양수로 설정해야 합니다. * 시작 프레임은 종료 프레임보다 작거나 같아야 합니다. * 종료 프레임은 총 애니메이션 프레임보다 작거나 같아야 합니다. * 프레임값을 잘못 설정하면 보정됩니다. * [chunk_id] | Guides:820:2

[task] | diverse_qa [title] | 타이머 만들기 [category] | Guides [rephrased] | 질문: 타이머가 0초가 된 이후에 발생하는 문제는 무엇인가요? 답변: 타이머가 0초가 된 이후에 수가 음수로 계속해서 감소하는 문제가 발생합니다. 질문: 사용자가 0초가 되었을 때 기대하는 게임의 동작은 무엇인가요? 답변: 0초가 되었을 때 게임이 종료될 거라 기대합니다. 질문: 0초가 되었을 때 UI를 어떻게 처리하도록 수정해야 하나요? 답변: 0초가 되면 UI가 꺼지게(비활성화) 만들어야 합니다. 질문: `CardPairGameLogic` 로직에서 게임을 종료하는 함수 이름은 무엇인가요? 답변: `EndGame` 함수입니다 [original] | 타이머를 완성했지만 이번에도 한 가지 추가하면 좋겠습니다 타이머가 0초가 된 이후에 수가 음수로 계속해서 감소하고 있습니다. 일반적으로 수가 줄어드는 모습을 보면, 0초가 되었을 때 게임이 종료될 거라 기대합니다. 그러나 지금은 0초 이후 수가 음수로 줄어들고 있습니다. 0초가 되면 ui가 꺼지게 만들어 봅시다. 1. **CardPairGameLogic** 로직의 `EndGame` 함수에 아래와 같이 작성합니다. ```lua [client only] void EndGame () { [chunk_id] | Guides:821:1

[task] | knowledge_list [title] | 타이머 만들기 [category] | Guides [rephrased] | 제시된 원문에는 두 개의 메서드(`DeselectCard`, `IsEmpty`)에 대한 코드 블록만 포함되어 있으며, `CardOff` 메서드의 정의나 `Visible` 프로퍼티의 구체적인 타입 정보, `CardSpawnRoot`의 초기화 방식 등에 대한 설명이 없습니다. 따라서 원문에 명시된 정보(실행 공간, 함수 시그니처, 내부 로직)에 기반하여 사실만 추출합니다. 1. `DeselectCard` 메서드는 `[client only]` 실행 공간에서 동작하며, 매개변수가 없고 반환 타입이 `void`인 클라이언트 전용 메서드입니 [original] | [client only] void DeselectCard() { self.SelectedCard:CardOff() self.SelectedCard = nil } [client only] boolean IsEmpty () { local cards = self.CardSpawnRoot.Children for i = 1, #cards do if cards[i].Visible then return false end end [chunk_id] | Guides:821:3

[task] | wikipedia [title] | 타이머 만들기 [category] | Guides [rephrased] | **카드 짝 맞추기 타이머 만들기** 본 섹션에서는 카드 짝 맞추기 게임에서 카드 선택 취소 및 게임 종료 조건을 확인하기 위해 사용하는 두 가지 클라이언트 전용 메서드를 소개합니다. 첫 번째 메서드인 `DeselectCard`는 현재 선택된 카드의 선택 상태를 해제하는 역할을 합니다. 이 메서드는 클라이언트에서만 실행되며(`[client only]`), 먼저 `self.SelectedCard` 참조를 통해 선택된 카드 객체의 `CardOff` 메서드를 호출하여 시각적으로 선택을 해제한 뒤, `self.SelectedCard` [original] | [client only] void DeselectCard() { self.SelectedCard:CardOff() self.SelectedCard = nil } [client only] boolean IsEmpty () { local cards = self.CardSpawnRoot.Children for i = 1, #cards do if cards[i].Visible then return false end end [chunk_id] | Guides:821:3

[task] | extract_knowledge [title] | 아바타 애니메이션 제어하기 [category] | Guides [rephrased] | # 아바타 애니메이션 제어 및 프레임 이벤트 ## 1. 개념 설명 메이플스토리 월드에서 아바타의 동작(애니메이션)을 제어하는 방식은 크게 세 가지로 구분됩니다. 각 방식은 제어의 세밀함, 설정의 편의성, 그리고 무기 연동 능력에서 차이를 보입니다. 또한, 재생 중인 애니메이션의 상태(프레임 정보)를 실시간으로 파악하기 위해 프레임 이벤트가 제공됩니다. 이를 통해 특정 프레임이 도달했을 때 다른 애니메이션으로 전환하는 등 정밀한 제어가 가능합니다. ### 애니메이션 제어 방법 비교 | 제어 방법 | 주요 특징 (장점) | 한 [original] | 애니메이션 변경 과정을 정리하면 다음과 같습니다. 위에서 알아본 3가지 아바타 애니메이션 제어 방법의 장단점을 정리하면 아래 표와 같습니다. 각 방법은 장단점이 명확하므로 크리에이터의 의도에 맞는 방법을 적절히 선택하면 됩니다. | 아바타 애니메이션 제어 방법 | 장점 | 단점 | | :---: | --- | --- | | ActionStateChangedEvent | <ul> <li>몸통과 파츠 애니메이션을 각각 다르게 조절할 수 있습니다.</li> <li>재생 속도, 재생 타입, 애니메이션 시작/종료 프레임을 세밀하게 설 [chunk_id] | Guides:820:5

[task] | knowledge_list [title] | 타이머 만들기 [category] | Guides [rephrased] | 제시된 문서의 코드를 분석하여 추출한 핵심 사실 목록입니다. 1. `CardSpawnRoot`, `SelectedCard`, `TimeText` 프로퍼티는 `[None]` 동기화 속성을 가지며, 각각 `/ui/CardPairGameUI/UI_Board/UI_Blocks/UI_Block_Group` 경로, `nil` 초기값, `/ui/CardPairGameUI/UI_Board/Background/Title/Timer_Background/UI_Time/UI_Time_Text` 경로로 초기화됩니다. 2. `OnUpdate` 메서드는 ` [original] | ```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 Method: [client only] void OnUpdate (number delta) { sel [chunk_id] | Guides:821:2

[task] | extract_knowledge [title] | 타이머 만들기 [category] | Guides [rephrased] | # 카드 짝 맞추기 게임: 타이머 종료 로직 구현 본 절에서는 카드 짝 맞추기 게임에서 타이머가 0초가 되었을 때 게임 UI를 비활성화하여 게임이 정상적으로 종료되도록 하는 방법을 다룹니다. 일반적인 타이머는 0초 도달 시 게임이 종료되어야 하지만, 구현이 누락되면 수가 음수로 계속 감소하는 오류가 발생합니다. 이를 방지하기 위해 `RemainingTime`이 0 이하가 되는 시점에 `EndGame` 함수를 호출하고, 해당 함수 내에서 UI 컴포넌트의 `Enable` 속성을 `false`로 설정하는 절차를 설명합니다. ## 1. [original] | 타이머를 완성했지만 이번에도 한 가지 추가하면 좋겠습니다 타이머가 0초가 된 이후에 수가 음수로 계속해서 감소하고 있습니다. 일반적으로 수가 줄어드는 모습을 보면, 0초가 되었을 때 게임이 종료될 거라 기대합니다. 그러나 지금은 0초 이후 수가 음수로 줄어들고 있습니다. 0초가 되면 ui가 꺼지게 만들어 봅시다. 1. **CardPairGameLogic** 로직의 `EndGame` 함수에 아래와 같이 작성합니다. ```lua [client only] void EndGame () { [chunk_id] | Guides:821:1

[task] | extract_knowledge [title] | 타이머 만들기 [category] | Guides [rephrased] | # 카드 짝 맞추기 게임 타이머 구현 본 절에서는 메이플스토리 월드의 mLua 스크립트 언어를 사용하여 게임 제한 시간 타이머를 생성하고, 해당 시간을 UI에 실시간으로 반영하는 방법을 다룹니다. ## 1. 개념 설명 타이머는 게임의 제한 시간을 관리하는 논리입니다. `CardPairGameLogic` 컴포넌트 내에서 총 플레이 시간(`PlayTime`)을 정의하고, 매 프레임 업데이트 시점의 시간 차이(`delta`)를 누적하여 남은 시간(`RemainingTime`)을 감소시킵니다. 이렇게 계산된 남은 시간은 `CardBo [original] | # 타이머 만들기 게임을 시작하면 1초씩 감소하는 타이머를 만들어봅시다. 1. **CardPairGameLogic** 로직에 게임 제한 시간으로 사용할 **PlayTime** 프로퍼티와 시간을 줄이기 위해 사용할 **RemainingTime** 프로퍼티를 추가합니다. PlayTime 초깃값은 **60**으로 설정합니다. ```lua Property: [None] number PlayTime = 60 [None] number RemainingTime = 0 ``` > ** [chunk_id] | Guides:821:0

[task] | wikipedia [title] | 타이머 만들기 [category] | Guides [rephrased] | # 카드 짝 맞추기 타이머 만들기 본 섹션은 메이플스토리 월드 스크립트 언어 mLua를 사용하여 게임에 1초 간격으로 감소하는 타이머를 구현하는 과정을 설명한다. 구현은 `CardPairGameLogic` 로직 컴포넌트와 `CardBoard` UI 컴포넌트를 중심으로 이루어지며, 서버 또는 클라이언트 실행 공간 구분, 프로퍼티 정의, 그리고 UI 텍스트 업데이트 로직을 포함한다. ## 타이머 로직 구현 게임 시작 시점에 제한 시간을 설정하고, 프레임 업데이트마다 남은 시간을 차감하는 로직을 `CardPairGameLogic` [original] | # 타이머 만들기 게임을 시작하면 1초씩 감소하는 타이머를 만들어봅시다. 1. **CardPairGameLogic** 로직에 게임 제한 시간으로 사용할 **PlayTime** 프로퍼티와 시간을 줄이기 위해 사용할 **RemainingTime** 프로퍼티를 추가합니다. PlayTime 초깃값은 **60**으로 설정합니다. ```lua Property: [None] number PlayTime = 60 [None] number RemainingTime = 0 ``` > ** [chunk_id] | Guides:821:0

[task] | diverse_qa [title] | 타이머 만들기 [category] | Guides [rephrased] | 질문: `DeselectCard()` 메서드의 실행 공간은 무엇인가요? 답변: `DeselectCard()` 메서드는 클라이언트에서만 실행되도록 `[client only]` 속성이 지정되어 있습니다. 질문: `DeselectCard()` 메서드에서 `self.SelectedCard` 가 `nil` 이 아닌 경우, 어떤 처리가 수행되나요? 답변: `self.SelectedCard` 에 `CardOff()` 메서드가 호출되어 카드의 선택 상태가 해제된 후, `self.SelectedCard` 변수의 값이 `nil` 로 설정됩니다. [original] | [client only] void DeselectCard() { self.SelectedCard:CardOff() self.SelectedCard = nil } [client only] boolean IsEmpty () { local cards = self.CardSpawnRoot.Children for i = 1, #cards do if cards[i].Visible then return false end end [chunk_id] | Guides:821:3

[task] | distill [title] | 메이플스토리 월드 루아 기초 [category] | Guides [rephrased] | # 루아 기초: 변수 메이플스토리 월드 스크립트는 **루아** 기반입니다. 변수는 데이터를 저장하는 공간으로, 전역과 지역으로 나뉩니다. ## 변수 범위 | 유형 | 설명 | | --- | --- | | **전역(Global)** | 선언 없이 어디서든 접근 가능. **메이플스토리 월드에서는 사용 비권장.** 공유 값은 [Property](/docs/?postId=205) 사용. | | **지역(Local)** | 정의된 함수/구문 범위(scope) 내에서만 유효. 범위 종료 시 파괴. | ## 핵심 규칙 및 예제 * [original] | # 학습 과정 소개 메이플스토리 월드에서는 **루아**라는 언어를 사용하여 스크립트를 작성합니다. 이번 시간에는 **루아**의 기본 사용법과 메이플스토리 월드에서 사용하는 예제를 함께 살펴보겠습니다. # 변수 변수란 데이터를 저장하는 메모리 공간, 값을 담아두는 그릇입니다. ## 변수의 범위 루아에서 사용하는 변수는 아래의 두 가지로 나뉩니다. | 변수 | 설명 | | --- | --- | | 전역(global) 변수 | 어느 곳이든 접근 가능한 변수로 아무 선언 없이 사용하면 전역 변수입니다. **단, 메이플스토리 [chunk_id] | Guides:822:0

[task] | extract_knowledge [title] | 타이머 만들기 [category] | Guides [rephrased] | # 카드 짝 맞추기 타이머 관련 로직 ## 개념 설명 이 절에서는 카드 짝 맞추기 게임에서 카드 선택 해제 및 게임 종료 조건 판정(모든 카드 소진 여부)을 처리하는 클라이언트 측 로직을 다룹니다. `DeselectCard` 메서드는 현재 선택된 카드를 비활성화하고 참조를 해제하며, `IsEmpty` 메서드는 카드 스폰 루트 객체의 자식들 중 가시적인 카드가 남아있는지 검사하여 게임 진행 상태를 판단합니다. ## API 사용법 두 메서드 모두 `[client only]` 실행 공간에서 동작하며, 클라이언트 로컬 상태 관리에만 사 [original] | [client only] void DeselectCard() { self.SelectedCard:CardOff() self.SelectedCard = nil } [client only] boolean IsEmpty () { local cards = self.CardSpawnRoot.Children for i = 1, #cards do if cards[i].Visible then return false end end [chunk_id] | Guides:821:3

[task] | diverse_qa [title] | 타이머 만들기 [category] | Guides [rephrased] | 질문: `CardPairGameLogic` 스크립트 컴포넌트에서 `PlayTime` 속성의 기본 값은 얼마입니까? 답변: `PlayTime` 속성의 기본 값은 60입니다. 질문: `OnBeginPlay()` 메서드가 실행되는 실행 공간은 어디입니까? 답변: `OnBeginPlay()` 메서드는 `[client only]` 실행 공간에서 실행됩니다. 질문: 게임 시작 시 `StartGame()` 함수 내에서 `self.RemainingTime` 변수에 어떤 값이 할당됩니까? 답변: `self.PlayTime`의 값이 `self.R [original] | #### 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 [chunk_id] | Guides:821:4

[task] | extract_knowledge [title] | 아바타 애니메이션 제어하기 [category] | Guides [rephrased] | # 아바타 애니메이션 프레임 제어: FrameEvent 활용 아바타의 특정 애니메이션 프레임 재생 시점을 감지하여 다른 애니메이션으로 전환하는 기능은 `SpriteAnimPlayerChangeFrameEvent`와 `ActionStateChangedEvent`를 조합하여 구현합니다. 이 섹션에서는 클라이언트 공간에서 아바타 몸체(Body) 엔티티를 통해 이벤트를 구독하고, 조건에 따라 새로운 액션을 전송하는 과정과 잠재적 무한 루프 문제 해결 방법을 다룹니다. ## 개념 설명 아바타 애니메이션 제어 시 `SpriteAnimPl [original] | 다음의 예제 코드를 보면서 **FrameEvent**의 사용법을 알아봅시다. 1. 어떤 아바타 애니메이션의 2번째 프레임이 재생될 때 다른 애니메이션으로 변경하고 싶다고 가정합니다. 그렇다면 **SpriteAnimPlayerChangeFrameEvent**를 활용할 수 있을 것입니다. `OnBeginPlay` 함수를 추가하고, 위에서 설명한 대로 이벤트를 **Body**와 연결합니다. 구독 취소를 대비해 연결한 이벤트의 핸들러는 프로퍼티로 가지고 있도록 합니다. ```lua Property: [None] [chunk_id] | Guides:820:6

[task] | knowledge_list [title] | 메이플스토리 월드 루아 기초 [category] | Guides [rephrased] | 제공된 문서 내용에만 기반하여 핵심 사실을 추출한 목록입니다. 1. 메이플스토리 월드의 스크립트는 **루아(Lua)** 언어를 사용하여 작성됩니다. 2. 루아에서 변수는 전역(global) 변수와 지역(local) 변수로 구분되며, 전역 변수는 선언 없이 어디서나 접근 가능하지만 메이플스토리 월드에서는 사용을 권장하지 않습니다. 3. 전역 변수처럼 스크립트 전체에서 참조 가능한 값을 정의하려면 **Property** 블록을 사용해야 합니다. 4. 지역 변수는 정의된 함수 또는 구문의 범위(scope) 내에서만 유효하며, 해당 범위 [original] | # 학습 과정 소개 메이플스토리 월드에서는 **루아**라는 언어를 사용하여 스크립트를 작성합니다. 이번 시간에는 **루아**의 기본 사용법과 메이플스토리 월드에서 사용하는 예제를 함께 살펴보겠습니다. # 변수 변수란 데이터를 저장하는 메모리 공간, 값을 담아두는 그릇입니다. ## 변수의 범위 루아에서 사용하는 변수는 아래의 두 가지로 나뉩니다. | 변수 | 설명 | | --- | --- | | 전역(global) 변수 | 어느 곳이든 접근 가능한 변수로 아무 선언 없이 사용하면 전역 변수입니다. **단, 메이플스토리 [chunk_id] | Guides:822:0

[task] | diverse_qa [title] | 타이머 만들기 [category] | Guides [rephrased] | 질문: `UpdateText` 메서드에서 남은 시간을 텍스트 컴포넌트에 표시할 때 어떤 수학적 함수를 사용하나요? 답변: `math.floor` 함수를 사용하여 남은 시간(`remainingTime`)을 소수점 이하를 버림한 정수 형태로 변환한 뒤 `tostring`으로 문자열화하여 표시합니다. 질문: `SetCards` 메서드에서 카드 덱의 총 개수(`deckCount`)는 어디서 조회하나요? 답변: `_DataService:GetRowCount("CardSet")`을 호출하여 "CardSet" 데이터셋의 행 수를 조회합니다. [original] | ```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 Method: [client only] void OnUpdate (number delta) { sel [chunk_id] | Guides:821:2

[task] | distill [title] | 타이머 만들기 [category] | Guides [rephrased] | # 카드 짝 맞추기 타이머 만들기 ## Property - `CardSpawnRoot`: 카드 스폰 루트 엔티티 경로. - `SelectedCard`: 현재 선택된 카드 (`Card` 타입). - `TimeText`: 남은 시간 표시용 UI 텍스트 엔티티 경로. ## 핵심 로직 및 API ### 1. 타이머 텍스트 업데이트 `OnUpdate`에서 매 프레임 `_CardPairGameLogic.RemainingTime`을 읽어 `TimeText`의 `TextComponent.Text`에 정수 값으로 표시합니다. ```lua M [original] | ```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 Method: [client only] void OnUpdate (number delta) { sel [chunk_id] | Guides:821:2

[task] | knowledge_list [title] | 타이머 만들기 [category] | Guides [rephrased] | 1. `CardPairGameLogic` 컴포넌트의 `CardPairGameUI` 속성은 `[None]` 동기화 플래그를 가지며, `/ui/CardPairGameUI` 경로의 `Entity` 타입 참조 값으로 초기화됩니다. 2. `CardPairGameLogic` 컴포넌트의 `PlayTime` 속성은 `[None]` 동기화 플래그를 가지며, 초기값이 60인 `number` 타입 변수입니다. 3. `CardPairGameLogic` 컴포넌트의 `RemainingTime` 속성은 `[None]` 동기화 플래그를 가지며, 초기값이 0인 [original] | #### 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 [chunk_id] | Guides:821:4

[task] | distill [title] | 타이머 만들기 [category] | Guides [rephrased] | # CardPairGameLogic `[client only]` 컴포넌트로, 카드 짝 맞추기 게임의 타이머 및 카드 클릭 로직을 처리합니다. ## Property | 속성 | 타입 | 설명 | | :--- | :--- | :--- | | `CardPairGameUI` | `Entity` | UI 엔티티 참조 (`/ui/CardPairGameUI`) | | `PlayTime` | `number` | 게임 총 시간 (초) | | `RemainingTime` | `number` | 남은 시간 (초) | ## Method ### [original] | #### 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 [chunk_id] | Guides:821:4

[task] | knowledge_list [title] | 메이플스토리 월드 루아 기초 [category] | Guides [rephrased] | ```lua -- 문서에 포함된 핵심 사실 추출 ``` 1. `table.remove(array, index)` 함수는 테이블에서 특정 인덱스에 위치한 값을 제거하며, 제거 후 해당 인덱스의 값은 다음 인덱스의 값으로 대체됩니다. 2. 사전(Dictionary)은 `key = value` 형태로 정의되는 테이블 자료 구조이며, 데이터를 빠르게 검색하기 위해 사용됩니다. 3. 사전의 값을 읽을 때는 `myDictionary.key` 또는 `myDictionary["key"]` 문법을 사용하며, 이는 해당 키에 매핑된 값을 반환합니다 [original] | 배열에서 값을 제거할 때는 `table.remove()` 함수를 사용합니다. ```lua local array = {11, 22, 33, 44, 55} -- 1번 인덱스를 제거 table.remove(array, 1) log(array[1]) -- 22 ``` > **더 알아보기** > 스크립트 에디터에서 테이블에서 활용할 수 있는 다양한 함수들을 확인할 수 있습니다. > ## 사전(Dictionary) 사전은 **key - value** 형태의 테이블입니다. 자료 구조에서 데이터를 빠르게 검색하기 위해 주로 사용합니다. [chunk_id] | Guides:822:2

[task] | distill [title] | 메이플스토리 월드 루아 기초 [category] | Guides [rephrased] | # 테이블(Table)과 사전(Dictionary) ## 배열 값 제거 `table.remove(array, index)`로 특정 인덱스의 값을 제거합니다. ```lua local array = {11, 22, 33, 44, 55} table.remove(array, 1) log(array[1]) -- 22 ``` ## 사전(Dictionary) `key - value` 형태의 테이블로, 데이터 검색에 사용합니다. ### 생성 및 접근 `key = value` 형식으로 정의하며, 콤마(,)로 구분합니다. ```lua local [original] | 배열에서 값을 제거할 때는 `table.remove()` 함수를 사용합니다. ```lua local array = {11, 22, 33, 44, 55} -- 1번 인덱스를 제거 table.remove(array, 1) log(array[1]) -- 22 ``` > **더 알아보기** > 스크립트 에디터에서 테이블에서 활용할 수 있는 다양한 함수들을 확인할 수 있습니다. > ## 사전(Dictionary) 사전은 **key - value** 형태의 테이블입니다. 자료 구조에서 데이터를 빠르게 검색하기 위해 주로 사용합니다. [chunk_id] | Guides:822:2

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