[task] | extract_knowledge [title] | 공동 제작 [category] | Guides [rephrased] | # 메이커 공동 제작 관리 ## 개념 설명 그룹 월드에서는 여러 작업자가 동시에 접속하여 월드를 편집할 수 있습니다. 이 과정에서 작업자는 특정 항목을 **Check Out**하여 잠금 상태(다른 사용자가 편집 불가)로 만들고, 작업 완료 후 **Check In**하여 변경 사항을 월드에 반영합니다. 또한, 리비전 되돌리기나 외부 파일(`.mod`) 가져오기 등 월드 전체 구조에 중대한 영향을 미치는 작업은 '복구 모드'가 활성화된 상태에서만 수행할 수 있습니다. ## API 및 기능 사용법 ### 1. 공동 작업자 확인 현재 [original] | 함께 제작하는 그룹 월드에서 **Panels - Cooperation**을 누릅니다. 해당 월드에 함께 접속 중인 사람들의 닉네임과 메이커 아이디가 보입니다. ## Local Changes 그룹 월드에서 작업자가 Check Out한 항목을 모아 볼 수 있는 창입니다. Hierarchy, Workspace에서 내가 변경한 항목을 확인하고, 한 번에 **Check In**할 수 있습니다. **Panels - Cooperation - Local Changes**를 눌러 창을 엽니다. ## 복구 모드 그룹 월드의 리비전을 되돌리기나 [chunk_id] | Guides:670:1
[task] | diverse_qa [title] | 공동 제작 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 공동 제작을 시작하기 위해 우선적으로 수행해야 할 절차는 무엇인가요? 답변: 우선 그룹을 형성하고, 멤버 권한을 설정해야 합니다. 질문: 월드의 크기가 크거나 작업자의 수가 많은 경우에 적합한 공동 제작 방식은 무엇인가요? 답변: 로컬에서의 공동 제작 방식을 활용해 외부에서 스크립트를 작성하고, 다시 메이플스토리 월드로 싱크 시키는 방법을 사용할 수 있습니다. 질문: 멤버의 작업 현황을 실시간으로 확인하면서 메이커 내에서 동시에 월드를 제작하고자 할 때 사용하는 기능은 무엇인가요? 답변: 메이커의 C [original] | # 학습 과정 소개 다양한 사람들이 함께 모여 월드를 제작할 수 있는 방법에 대해 알아봅시다. ##### 참고 가이드 * [그룹 생성과 멤버 관리](/docs/?postId=1325"target":"_self"}) * [공동 제작 그룹 멤버의 등급과 권한](/docs/?postId=1077) * [LocalWorkspace](/docs/?postId=1165) * [ExtendedScriptFormat](/docs/?postId=1166) # 공동 제작 함께 월드를 제작하기 위해서는 우선 그룹을 형성하고, 멤버 권한을 설정해 [chunk_id] | Guides:670:0
[task] | knowledge_list [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | 1. `CardBoard` 컴포넌트의 `Property` 블록에 `[None]` 동기화 속성을 가진 `Component` 타입의 `SelectedCard` 프로퍼티를 선언하며, 초기값은 `nil`입니다. 2. `CardBoard` 컴포넌트의 `SelectCard` 메서드는 `[client only]` 실행 공간에서 동작하며, `Card` 타입의 매개변수 `card`를 받아 `self.SelectedCard`에 대입하고 `card:CardOn()`을 호출합니다. 3. `CardBoard` 컴포넌트의 `DeselectCard` 메서드는 [original] | 1. **CardBoard** 컴포넌트에서 새로운 프로퍼티를 추가하고 프로퍼티 타입을 **Component**로 지정합니다. ```lua Property: [None] Card SelectedCard = nil ``` 2. CardBoard 컴포넌트에서 `SelctCard` 함수를 찾습니다. 매개 변수를 추가하고 타입을 Component로 변경합니다. Component를 **Card**로 지정합니다. ```lua [client only] void SelectCard (C [chunk_id] | Guides:671:1
[task] | distill [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | # 카드 짝 맞추기: 섞기와 선택 ## 1. 카드 섞기 및 쌍 생성 `CardBoard` 컴포넌트의 `SetCards()`에서 카드 쌍을 생성하고 섞습니다. 1. **쌍 생성**: `for` 루프를 `deckCount / 2`로 변경하여 각 카드를 2번씩 `cardTable`에 삽입합니다. ```lua for i = 1, (deckCount / 2) do table.insert(cardTable, deckTable[i]) table.insert(cardTable, deckTable[i [original] | # 카드 섞기 카드 보여주기에 성공했으니 이번에는 한 쌍의 카드가 나오게 만들어 봅시다. 1. **CardBoard** 컴포넌트의 `SetCards()` 함수에서 세 번째 `for i = 1, deckCount do`를 찾습니다. 처음에는 deckCount의 수만큼 실행했지만, 이번에는 deckCount의 절반만큼만 실행하기 위해 (deckCount / 2)로 변경합니다. 그 절반을 동일하게 두 번 불러와 쌍을 이루는 판을 만듭니다. `table.insert`는 [table](/apiReference/Lua/table) 레 [chunk_id] | Guides:671:0
[task] | wikipedia [title] | 공동 제작 [category] | Guides [rephrased] | # 메이플스토리 월드 공동 제작 가이드 메이플스토리 월드(MapleStory Worlds)에서는 다수의 사용자가 협력하여 월드를 제작할 수 있습니다. 공동 제작을 시작하기 위해서는 먼저 제작 그룹을 형성하고 멤버별 권한을 설정해야 하며, 구체적인 그룹 생성 및 멤버 관리 절차는 관련 가이드([그룹 생성과 멤버 관리](/docs/?postId=1325), [공동 제작 그룹 멤버의 등급과 권한](/docs/?postId=1077))를 참고해야 합니다. 그룹이 형성된 후에는 월드의 규모와 작업 환경에 따라 두 가지 공동 제작 방식 중 [original] | # 학습 과정 소개 다양한 사람들이 함께 모여 월드를 제작할 수 있는 방법에 대해 알아봅시다. ##### 참고 가이드 * [그룹 생성과 멤버 관리](/docs/?postId=1325"target":"_self"}) * [공동 제작 그룹 멤버의 등급과 권한](/docs/?postId=1077) * [LocalWorkspace](/docs/?postId=1165) * [ExtendedScriptFormat](/docs/?postId=1166) # 공동 제작 함께 월드를 제작하기 위해서는 우선 그룹을 형성하고, 멤버 권한을 설정해 [chunk_id] | Guides:670:0
[task] | distill [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | # 카드 짝 맞추기: 카드 선택 로직 **CardBoard** 컴포넌트와 **Card** 컴포넌트 간의 상태를 동기화하여 카드 선택/해제 기능을 구현합니다. ## 1. CardBoard 컴포넌트 수정 ### 프로퍼티 추가 현재 선택된 카드를 저장하기 위해 `Component` 타입의 프로퍼티를 추가합니다. ```lua Property: [None] Card SelectedCard = nil ``` ### 메서드 구현 카드 선택 및 해제 로직을 정의합니다. ```lua Method: [client only] void Sel [original] | 1. **CardBoard** 컴포넌트에서 새로운 프로퍼티를 추가하고 프로퍼티 타입을 **Component**로 지정합니다. ```lua Property: [None] Card SelectedCard = nil ``` 2. CardBoard 컴포넌트에서 `SelctCard` 함수를 찾습니다. 매개 변수를 추가하고 타입을 Component로 변경합니다. Component를 **Card**로 지정합니다. ```lua [client only] void SelectCard (C [chunk_id] | Guides:671:1
[task] | extract_knowledge [title] | 스크립트 라이프 사이클 [category] | Guides [rephrased] | # 스크립트 라이프 사이클 (Script Lifecycle) ## 1. 개념 설명 mLua 스크립트는 서버(Server)와 클라이언트(Client)의 실행 환경에 따라 라이프 사이클이 달라집니다. 특히 **제작 중인 월드**와 **출시된 월드** 간에는 맵 로드 방식의 차이에 따라 스크립트 호출 시점이 달라질 수 있습니다. * **월드의 정의**: 월드는 최상위 레벨의 엔티티입니다. 실행 환경에 따라 하나씩 생성되며, 동시에 여러 월드가 존재할 수 있습니다. 다만, 서로 다른 월드 간의 엔티티는 상호작용하거나 영향을 미치지 [original] | 서버와 클라이언트가 호출되는 전체 흐름을 알아봅시다. 플레이 라이프 사이클은 **제작 중인 월드**와 **출시된 월드**에서 약간의 차이가 있습니다. 가장 큰 차이점은 맵을 불러오는 방식입니다. * **제작 중인 월드**에서 플레이할 때는 10개의 맵을 만들었더라도 플레이어가 있는 맵만 불러옵니다. * **출시된 월드**에서는 플레이어 유무와 상관없이 모든 맵을 불러옵니다. 이와 같은 차이를 알고 있다면 **제작 중인 월드** 또는 **출시된 월드**에서 크리에이터 의도대로 동작하지 않는 무언가가 있을 때, 그 원인이 잘못된 [chunk_id] | Guides:668:1
[task] | extract_knowledge [title] | 스크립트 라이프 사이클 [category] | Guides [rephrased] | # 스크립트 라이프 사이클 ## 1. 개념 설명 메이플스토리 월드(mLua)에서 스크립트 컴포넌트는 **기본 이벤트 함수**와 **사용자 정의 함수**로 구성되며, 실행 환경(서버/클라이언트)에 따라 라이프 사이클의 차이가 존재합니다. * **기본 이벤트 함수**: 메이플스토리 월드 시스템이 특정 조건에서 자동으로 호출하는 함수입니다. 크리에이터는 호출 시점을 수정할 수 없으며, 기본적으로 **서버 공간**에서 실행됩니다. * 주요 함수: `OnInitialize`, `OnUpdate`, `OnBeginPlay` [original] | # 학습 과정 소개 기본 이벤트 함수의 라이프 사이클과 플레이할 때의 전체 라이프 사이클을 알아봅시다. 라이프 사이클을 이해하면 특정 함수가 언제 불리는지 예상할 수 있고, 전체 월드의 동작을 고려하며 제작할 수 있습니다. # 기본 이벤트 함수의 라이프 사이클 월드에 필요한 로직을 만들기 위해서는 컴포넌트 스크립트를 만들어야만 합니다. 필요한 컴포넌트 스크립트를 만들 때 호출되는 시점을 예상해 의도한 로직에 맞게 동작할 수 있도록 작성해야 합니다. 라이프 사이클의 개념을 익혀두면 전체 흐름을 파악할 수 있기에 스크립트를 작성 [chunk_id] | Guides:668:0
[task] | extract_knowledge [title] | 공동 제작 [category] | Guides [rephrased] | # 메이플스토리 월드 공동 제작: Cooperation 기능 ## 1. 개념 설명 메이플스토리 월드에서는 두 가지 공동 제작 방식을 지원합니다. 1. **LocalWorkspace**: 외부에서 스크립트를 작성 후 싱크하는 방식 (대규모 월드, 다수 작업자). 2. **Cooperation**: 메이커(Maker) 내에서 월드에 접속 중인 멤버들과 동시에 월드를 편집하는 방식 (소규모~중규모 월드, 실시간 작업 현황 확인 필요 시). 본 절에서는 **Cooperation** 기능을 중심으로, 메이커 내에서 엔트리(Entry)와 [original] | # 학습 과정 소개 다양한 사람들이 함께 모여 월드를 제작할 수 있는 방법에 대해 알아봅시다. ##### 참고 가이드 * [그룹 생성과 멤버 관리](/docs/?postId=1325"target":"_self"}) * [공동 제작 그룹 멤버의 등급과 권한](/docs/?postId=1077) * [LocalWorkspace](/docs/?postId=1165) * [ExtendedScriptFormat](/docs/?postId=1166) # 공동 제작 함께 월드를 제작하기 위해서는 우선 그룹을 형성하고, 멤버 권한을 설정해 [chunk_id] | Guides:670:0
[task] | distill [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | **[Guides] 응용 제작 가이드 > 카드 짝 맞추기: 카드 섞기, 선택하기** ### Card 컴포넌트 카드의 색상 변경과 클릭 이벤트를 처리합니다. ```lua Property: [None] string SpriteRUID = "" Method: void CardOn () { self.Entity.SpriteGUIRendererComponent.Color = Color(81/255,81/255,81/255,1) } void CardOff () { self.Entity.SpriteGUIRendererCom [original] | ```lua Property: [None] string SpriteRUID = "" Method: void CardOn () { self.Entity.SpriteGUIRendererComponent.Color = Color(81/255,81/255,81/255,1) } void CardOff () { self.Entity.SpriteGUIRendererComponent.Color = Color(255/255,255/255,255/255,1) } Event Handler: [self] HandleButtonClic [chunk_id] | Guides:671:3
[task] | diverse_qa [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | 질문: CardBoard 컴포넌트에 선택된 카드를 저장하기 위해 추가하는 프로퍼티의 이름과 타입은 무엇인가요? 답변: 프로퍼티 이름은 `SelectedCard`이며, 타입은 `Component`로 지정하고 초기값은 `nil`로 설정합니다. 질문: `SelectCard` 함수의 실행 공간(Execution Space)은 무엇이며, 이 함수는 어떤 작업을 수행하나요? 답변: 실행 공간은 `[client only]`이며, 매개 변수로 전달된 `card`를 `self.SelectedCard`에 저장하고 해당 카드의 `CardOn()` 메 [original] | 1. **CardBoard** 컴포넌트에서 새로운 프로퍼티를 추가하고 프로퍼티 타입을 **Component**로 지정합니다. ```lua Property: [None] Card SelectedCard = nil ``` 2. CardBoard 컴포넌트에서 `SelctCard` 함수를 찾습니다. 매개 변수를 추가하고 타입을 Component로 변경합니다. Component를 **Card**로 지정합니다. ```lua [client only] void SelectCard (C [chunk_id] | Guides:671:1
[task] | wikipedia [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | # 카드 짝 맞추기: 카드 섞기 및 선택 처리 이 문서는 메이플스토리 월드(MapleStory Worlds)의 카드 짝 맞추기 게임 제작 가이드 중, 카드 덱을 섞어 쌍을 구성하는 로직과 사용자 입력을 처리하여 카드 상태를 변경하는 방법을 다룹니다. ## 카드 섞기 및 쌍 구성 카드가 화면에 표시되는 것을 확인한 후, 게임 로직에 따라 한 쌍을 이루는 카드가 나올 수 있도록 카드 테이블을 구성하고 섞는 과정을 수행합니다. 1. **CardBoard** 컴포넌트의 `SetCards()` 함수 내에서 카드 배열을 생성하는 `f [original] | # 카드 섞기 카드 보여주기에 성공했으니 이번에는 한 쌍의 카드가 나오게 만들어 봅시다. 1. **CardBoard** 컴포넌트의 `SetCards()` 함수에서 세 번째 `for i = 1, deckCount do`를 찾습니다. 처음에는 deckCount의 수만큼 실행했지만, 이번에는 deckCount의 절반만큼만 실행하기 위해 (deckCount / 2)로 변경합니다. 그 절반을 동일하게 두 번 불러와 쌍을 이루는 판을 만듭니다. `table.insert`는 [table](/apiReference/Lua/table) 레 [chunk_id] | Guides:671:0
[task] | diverse_qa [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | 질문: 카드 짝 맞추기 게임에서 카드를 쌍으로 만들기 위해 `SetCards()` 함수의 `for` 루프 조건을 어떻게 수정해야 하는가? 답변: 원래 `deckCount`만큼 실행되던 루프 조건을 `(deckCount / 2)`로 변경해야 한다. 질문: 다음 코드는 어떤 목적으로 작성되었는가? ```lua for i = 1, (deckCount / 2) do table.insert(cardTable, deckTable[i]) table.insert(cardTable, deckTable[i]) end ``` 답변: 덱 [original] | # 카드 섞기 카드 보여주기에 성공했으니 이번에는 한 쌍의 카드가 나오게 만들어 봅시다. 1. **CardBoard** 컴포넌트의 `SetCards()` 함수에서 세 번째 `for i = 1, deckCount do`를 찾습니다. 처음에는 deckCount의 수만큼 실행했지만, 이번에는 deckCount의 절반만큼만 실행하기 위해 (deckCount / 2)로 변경합니다. 그 절반을 동일하게 두 번 불러와 쌍을 이루는 판을 만듭니다. `table.insert`는 [table](/apiReference/Lua/table) 레 [chunk_id] | Guides:671:0
[task] | distill [title] | 여러 개의 카드 보여주기 [category] | Guides [rephrased] | # 여러 개의 카드 보여주기 `CardSet` 데이터셋과 `[DataService](/apiReference/Services/DataService)`를 활용해 카드 덱을 생성, 섞고 배치합니다. 1. **Card** 컴포넌트에 RUID 프로퍼티 추가: ```lua Property: [None] string SpriteRUID = "" ``` 2. **CardBoard** 컴포넌트의 `SetCards()` 구현: 데이터셋에서 RUID를 읽어 `deckTable`에 저장 후, Fisher-Yates [original] | 하나의 카드를 보여주는 것에 성공했으니, 이제는 모든 카드를 켜줄 차례입니다. 아래 그림과 같이 모든 카드가 나타나게 만들어 봅시다. # 여러 개의 카드 보여주기 하나의 카드가 잘 나타나는 걸 확인했으니 이제는 모든 카드를 모든 카드를 뒤섞어 보여줄 차례입니다. 이 과정에서 다양한 함수와 이전에 완성한 **CardSet** 데이터 셋을 활용합니다. [DataService](/apiReference/Services/DataService)를 참고하세요. 1. **Card** 컴포넌트를 활용해 여러 개의 RUID 값을 가지고 올 수 [chunk_id] | Guides:672:0
[task] | knowledge_list [title] | 여러 개의 카드 보여주기 [category] | Guides [rephrased] | 제시된 문서 내용을 바탕으로 추출한 핵심 사실 목록입니다. 1. `Card` 컴포넌트에는 동기화되지 않는 `[None]` 속성으로 `string` 타입의 `SpriteRUID` 프로퍼티가 선언되어 있습니다. 2. `CardBoard` 컴포넌트의 `SetCards()` 메서드는 클라이언트에서만 실행되도록 `[client only]` 실행 공간 제약이 적용됩니다. 3. `SetCards()` 함수 내부에서 `_DataService:GetRowCount("CardSet")` 메서드를 호출하여 `CardSet` 데이터셋의 행 개수를 `d [original] | 하나의 카드를 보여주는 것에 성공했으니, 이제는 모든 카드를 켜줄 차례입니다. 아래 그림과 같이 모든 카드가 나타나게 만들어 봅시다. # 여러 개의 카드 보여주기 하나의 카드가 잘 나타나는 걸 확인했으니 이제는 모든 카드를 모든 카드를 뒤섞어 보여줄 차례입니다. 이 과정에서 다양한 함수와 이전에 완성한 **CardSet** 데이터 셋을 활용합니다. [DataService](/apiReference/Services/DataService)를 참고하세요. 1. **Card** 컴포넌트를 활용해 여러 개의 RUID 값을 가지고 올 수 [chunk_id] | Guides:672:0
[task] | distill [title] | 여러 개의 카드 보여주기 [category] | Guides [rephrased] | **핵심 변경 사항** `CreateCardEntities()` 함수에 `cardTable` 매개 변수를 추가하여, 루프를 통해 다수의 카드를 생성하고 개별 스프라이트를 할당합니다. **1. `CreateCardEntities()` 수정** - 매개 변수: `cardTable` - 생성: `_SpawnService:SpawnByModelId` 호출 시 이름에 인덱스(`"Card " .. tostring(i)`)를 포함하여 고유하게 지정 - 컴포넌트 접근: `card.Card.SpriteRUID` 및 `card.SpriteGUIRe [original] | ```lua local cardCount = #cardTable for i = 1, cardCount do local spriteRUID = cardTable[i] ``` 6. `CreateCardEntities()` 함수에서 `local card = _SpawnService:SpawnByModelId(cardModelId, "Card", Vector3(0,0,0), self.CardSpawnRoot)`를 찾습니다. `"Card"` 부분을 `"Card " .. tostring(i)`로 변경하며 아 [chunk_id] | Guides:672:1
[task] | wikipedia [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | # 카드 짝 맞추기: 카드 섞기, 선택하기 이 문서는 메이플스토리 월드의 '카드 짝 맞추기' 응용 제작 가이드 중 카드의 선택 및 해제 로직을 구현하는 과정을 설명합니다. 해당 과정은 `CardBoard` 컴포넌트와 `CardPairGameLogic` 로직, 그리고 `Card` 컴포넌트 간의 상호작용을 통해 완성됩니다. ## CardBoard 컴포넌트 구현 `CardBoard` 컴포넌트에서는 현재 선택된 카드를 관리하기 위해 새로운 프로퍼티와 메서드를 정의합니다. 첫째, `SelectedCard` 프로퍼티를 추가하여 현재 선 [original] | 1. **CardBoard** 컴포넌트에서 새로운 프로퍼티를 추가하고 프로퍼티 타입을 **Component**로 지정합니다. ```lua Property: [None] Card SelectedCard = nil ``` 2. CardBoard 컴포넌트에서 `SelctCard` 함수를 찾습니다. 매개 변수를 추가하고 타입을 Component로 변경합니다. Component를 **Card**로 지정합니다. ```lua [client only] void SelectCard (C [chunk_id] | Guides:671:1
[task] | wikipedia [title] | 여러 개의 카드 보여주기 [category] | Guides [rephrased] | # 여러 개의 카드 보여주기 이 섹션에서는 이전에 단일 카드를 렌더링하는 방법을 확인한 이후, **CardSet** 데이터 세트와 관련 API를 활용하여 모든 카드를 무작위로 섞어 배치하는 과정을 설명합니다. 데이터 접근에 사용되는 [DataService](/apiReference/Services/DataService) API를 참조해야 합니다. ## 1. Card 컴포넌트 프로퍼티 수정 **Card** 컴포넌트를 수정하여 여러 개의 RUID 값을 저장할 수 있도록 프로퍼티를 추가합니다. 아래 코드를 **Card** 컴포넌트의 [original] | 하나의 카드를 보여주는 것에 성공했으니, 이제는 모든 카드를 켜줄 차례입니다. 아래 그림과 같이 모든 카드가 나타나게 만들어 봅시다. # 여러 개의 카드 보여주기 하나의 카드가 잘 나타나는 걸 확인했으니 이제는 모든 카드를 모든 카드를 뒤섞어 보여줄 차례입니다. 이 과정에서 다양한 함수와 이전에 완성한 **CardSet** 데이터 셋을 활용합니다. [DataService](/apiReference/Services/DataService)를 참고하세요. 1. **Card** 컴포넌트를 활용해 여러 개의 RUID 값을 가지고 올 수 [chunk_id] | Guides:672:0
[task] | diverse_qa [title] | 여러 개의 카드 보여주기 [category] | Guides [rephrased] | 질문: 문서에서 여러 개의 카드를 보여주기 위해 어떤 데이터셋을 활용합니까? 답변: 이전에 완성한 **CardSet** 데이터셋을 활용합니다. 질문: Card 컴포넌트에 여러 개의 RUID 값을 가지고 오기 위해 추가해야 하는 프로퍼티의 이름과 타입은 무엇입니까? 답변: 프로퍼티 이름은 `SpriteRUID`이며, 타입은 `string`입니다. 질문: `SetCards()` 함수가 수행하는 주요 역할은 무엇입니까? 답변: 카드를 배치하는 역할을 하는 함수입니다. 질문: 아래 코드의 `SetCards()` 함수에서 `deckTa [original] | 하나의 카드를 보여주는 것에 성공했으니, 이제는 모든 카드를 켜줄 차례입니다. 아래 그림과 같이 모든 카드가 나타나게 만들어 봅시다. # 여러 개의 카드 보여주기 하나의 카드가 잘 나타나는 걸 확인했으니 이제는 모든 카드를 모든 카드를 뒤섞어 보여줄 차례입니다. 이 과정에서 다양한 함수와 이전에 완성한 **CardSet** 데이터 셋을 활용합니다. [DataService](/apiReference/Services/DataService)를 참고하세요. 1. **Card** 컴포넌트를 활용해 여러 개의 RUID 값을 가지고 올 수 [chunk_id] | Guides:672:0
[task] | knowledge_list [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | 제시된 문서 `[Guides] 응용 제작 가이드 > 카드 짝 맞추기 카드 섞기, 선택하기` 기반의 핵심 사실 목록입니다. **1. Property 정의** * `CardSpawnRoot` 프로퍼티는 `[None]` 동기화 속성을 가지며 타입은 `Entity`이고, 기본값은 `/ui/CardParirGameUi/UI_Board/UI_Blocks/UI_Block_Group` 경로입니다. * `SelectedCard` 프로퍼티는 `[None]` 동기화 속성을 가지며 타입은 `Card`이고, 기본값은 `nil`입니다. **2. [original] | ```lua Property: [None] Entity CardSpawnRoot = /ui/CardParirGameUi/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil Method: [client only] Void SetCards() { local deckTable = {} local cardTable = {} local deckCount = _DataService:GetRowCount("CardSet") [chunk_id] | Guides:671:2
[task] | knowledge_list [title] | 여러 개의 카드 보여주기 [category] | Guides [rephrased] | 1. `CreateCardEntities()` 함수 내에서 `cardTable` 배열의 길이를 `#cardTable` 연산자로 구한 후, 1부터 해당 길이까지 반복문을 사용하여 각 카드 데이터를 처리합니다. 2. 반복문 내에서 `cardTable[i]` 인덱스 접근을 통해 현재 순번의 스프라이트 RUID(`spriteRUID`)를 로컬 변수로 추출합니다. 3. `_SpawnService:SpawnByModelId(cardModelId, "Card " .. tostring(i), Vector3(0,0,0), self.CardSpawn [original] | ```lua local cardCount = #cardTable for i = 1, cardCount do local spriteRUID = cardTable[i] ``` 6. `CreateCardEntities()` 함수에서 `local card = _SpawnService:SpawnByModelId(cardModelId, "Card", Vector3(0,0,0), self.CardSpawnRoot)`를 찾습니다. `"Card"` 부분을 `"Card " .. tostring(i)`로 변경하며 아 [chunk_id] | Guides:672:1
[task] | diverse_qa [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | 질문: `SetCards` 메서드에서 카드 덱을 생성하기 위해 `_DataService`의 어떤 메서드를 사용하여 "CardSet" 데이터의 행 수를 구합니까? 답변: `_DataService:GetRowCount("CardSet")` 메서드를 사용하여 행 수를 구합니다. 질문: `SetCards` 메서드에서 카드의 스프라이트 ID(spriteRUID)는 "CardSet" 데이터의 어느 열에 위치해 있습니까? 답변: "CardSet" 데이터의 1열에 위치해 있습니다. 질문: `SetCards` 메서드에서 `deckTable`을 [original] | ```lua Property: [None] Entity CardSpawnRoot = /ui/CardParirGameUi/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil Method: [client only] Void SetCards() { local deckTable = {} local cardTable = {} local deckCount = _DataService:GetRowCount("CardSet") [chunk_id] | Guides:671:2
[task] | wikipedia [title] | 여러 개의 카드 보여주기 [category] | Guides [rephrased] | **여러 개의 카드 표시하기** 여러 장의 카드를 동시에 화면에 표시하기 위해서는 카드 목록을 순회하며 각 카드를 개별 엔티티로 생성하는 로직이 필요합니다. 이 과정은 `CreateCardEntities()` 함수를 수정하여 구현합니다. 먼저, 전달된 카드 테이블(`cardTable`)의 길이를 확인하고, 해당 인덱스 범위로 `for` 문을 사용하여 순회합니다. 순회 과정에서 각 인덱스(`i`)에 해당하는 스프라이트 리소스 ID(`spriteRUID`)를 추출합니다. ```lua local cardCount = #card [original] | ```lua local cardCount = #cardTable for i = 1, cardCount do local spriteRUID = cardTable[i] ``` 6. `CreateCardEntities()` 함수에서 `local card = _SpawnService:SpawnByModelId(cardModelId, "Card", Vector3(0,0,0), self.CardSpawnRoot)`를 찾습니다. `"Card"` 부분을 `"Card " .. tostring(i)`로 변경하며 아 [chunk_id] | Guides:672:1
[task] | distill [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | ## 카드 짝 맞추기: 섞기 및 선택 `CardPairGame` 컴포넌트는 `CardSet` 데이터 기반 덱 생성, 셔플, 엔티티 스폰 및 선택 상태 관리를 담당합니다. ### 1. 프로퍼티 * `CardSpawnRoot` (`Entity`): 카드가 생성될 UI 루트 경로. * `SelectedCard` (`Card`): 현재 선택된 카드 참조. ### 2. 덱 생성 및 셔플 (`SetCards`) `[client only]` 1. `_DataService:GetRowCount("CardSet")`으로 카드 수(`d [original] | ```lua Property: [None] Entity CardSpawnRoot = /ui/CardParirGameUi/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil Method: [client only] Void SetCards() { local deckTable = {} local cardTable = {} local deckCount = _DataService:GetRowCount("CardSet") [chunk_id] | Guides:671:2
[task] | extract_knowledge [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | # 카드 패 생성 및 선택 인터랙션 구현 본 절에서는 카드 게임 로직의 핵심인 카드 쌍 생성(Shuffle)과 사용자 입력 처리(Card Selection)를 mLua 스크립트와 컴포넌트를 통해 구현하는 방법을 다룬다. ## 1. 개념 설명 ### 1.1 카드 쌍 생성 및 셔플링 (Shuffling) 단순히 카드를 무작위로 배치하는 것만으로는 게임이 성립하지 않으므로, 서로 같은 그림이 있는 '쌍(Pair)'을 만들어야 한다. 이를 위해 전체 카드 수(`deckCount`)의 절반만큼만 반복문을 수행하여, 동일한 카드 객체를 [original] | # 카드 섞기 카드 보여주기에 성공했으니 이번에는 한 쌍의 카드가 나오게 만들어 봅시다. 1. **CardBoard** 컴포넌트의 `SetCards()` 함수에서 세 번째 `for i = 1, deckCount do`를 찾습니다. 처음에는 deckCount의 수만큼 실행했지만, 이번에는 deckCount의 절반만큼만 실행하기 위해 (deckCount / 2)로 변경합니다. 그 절반을 동일하게 두 번 불러와 쌍을 이루는 판을 만듭니다. `table.insert`는 [table](/apiReference/Lua/table) 레 [chunk_id] | Guides:671:0
[task] | diverse_qa [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | 질문: 제공된 `CardPairGameLogic` 스크립트에서 `StartGame` 메서드의 실행 공간은 무엇인가요? 답변: `StartGame` 메서드는 `[client only]` 실행 공간에서 동작합니다. 질문: `CardPairGameLogic` 컴포넌트의 `OnBeginPlay` 이벤트 핸들러는 어떤 메서드를 호출하나요? 답변: `OnBeginPlay` 이벤트 핸들러는 `self:StartGame()` 메서드를 호출합니다. 질문: `Card` 컴포넌트(첫 번째 코드 블록)의 `HandleButtonClickEvent`에 [original] | ```lua Property: [None] string SpriteRUID = "" Method: void CardOn () { self.Entity.SpriteGUIRendererComponent.Color = Color(81/255,81/255,81/255,1) } void CardOff () { self.Entity.SpriteGUIRendererComponent.Color = Color(255/255,255/255,255/255,1) } Event Handler: [self] HandleButtonClic [chunk_id] | Guides:671:3
[task] | knowledge_list [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | 제시된 문서에 포함된 정보만을 바탕으로 핵심 사실을 정리한 목록입니다. 1. `Card` 컴포넌트의 `SpriteRUID` 프로퍼티는 `[None]` 동기화 속성을 가지며 기본값이 빈 문자열(`""`)인 `string` 타입입니다. 2. `Card` 컴포넌트의 `CardOn` 메서드는 실행 공간 제약이 없으며, `self.Entity.SpriteGUIRendererComponent.Color`를 `Color(81/255,81/255,81/255,1)`로 설정하는 `void` 함수입니다. 3. `Card` 컴포넌트의 `CardOff [original] | ```lua Property: [None] string SpriteRUID = "" Method: void CardOn () { self.Entity.SpriteGUIRendererComponent.Color = Color(81/255,81/255,81/255,1) } void CardOff () { self.Entity.SpriteGUIRendererComponent.Color = Color(255/255,255/255,255/255,1) } Event Handler: [self] HandleButtonClic [chunk_id] | Guides:671:3
[task] | wikipedia [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | 다음은 제공된 mLua 스크립트 코드를 바탕으로 작성된 기술 문서입니다. ```lua Property: [None] Entity CardSpawnRoot = /ui/CardParirGameUi/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil Method: [client only] Void SetCards() { local deckTable = {} local cardTable = {} local deckCount = _DataService [original] | ```lua Property: [None] Entity CardSpawnRoot = /ui/CardParirGameUi/UI_Board/UI_Blocks/UI_Block_Group [None] Card SelectedCard = nil Method: [client only] Void SetCards() { local deckTable = {} local cardTable = {} local deckCount = _DataService:GetRowCount("CardSet") [chunk_id] | Guides:671:2
[task] | diverse_qa [title] | 여러 개의 카드 보여주기 [category] | Guides [rephrased] | 질문: 여러 개의 카드를 생성할 때, 카드 엔티티의 이름을 구별하기 위해 어떤 문자열 처리를 해야 하는가? 답변: `"Card"` 부분을 `"Card " .. tostring(i)`로 변경하여 인덱스 값이 포함된 고유한 이름을 부여해야 한다. 질문: 다음 코드 조각의 `tostring(i)`는 어떤 역할을 하는가? ```lua local card = _SpawnService:SpawnByModelId(cardModelId, "Card " .. tostring(i), Vector3(0,0,0), self.CardSpawnRoot) [original] | ```lua local cardCount = #cardTable for i = 1, cardCount do local spriteRUID = cardTable[i] ``` 6. `CreateCardEntities()` 함수에서 `local card = _SpawnService:SpawnByModelId(cardModelId, "Card", Vector3(0,0,0), self.CardSpawnRoot)`를 찾습니다. `"Card"` 부분을 `"Card " .. tostring(i)`로 변경하며 아 [chunk_id] | Guides:672:1
[task] | extract_knowledge [title] | 카드 섞기, 선택하기 [category] | Guides [rephrased] | # 카드 선택 및 해제 로직 구현 ## 1. 개념 설명 카드 짝 맞추기 게임에서 사용자는 카드를 클릭하여 선택하거나 해제할 수 있습니다. 이 과정은 **CardBoard** 컴포넌트가 현재 선택된 카드(`SelectedCard`)를 관리하고, **Card** 컴포넌트의 상태(`CardOn`, `CardOff`)를 제어하며, **CardPairGameLogic**이 클릭 이벤트를 수신받아 해당 로직을 처리하는 구조로 이루어져 있습니다. - **CardBoard**: 현재 선택된 카드 인스턴스를 저장하고, 선택/해제 메서드를 제공 [original] | 1. **CardBoard** 컴포넌트에서 새로운 프로퍼티를 추가하고 프로퍼티 타입을 **Component**로 지정합니다. ```lua Property: [None] Card SelectedCard = nil ``` 2. CardBoard 컴포넌트에서 `SelctCard` 함수를 찾습니다. 매개 변수를 추가하고 타입을 Component로 변경합니다. Component를 **Card**로 지정합니다. ```lua [client only] void SelectCard (C [chunk_id] | Guides:671:1