← 목록

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

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

[task] | diverse_qa [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 질문: `UIBuyPopup` 컴포넌트에서 아이템 정보를 표시하기 위해 추가된 새로운 프로퍼티의 이름과 타입은 무엇인가요? 답변: 프로퍼티의 이름은 `ItemId`이며, 타입은 `string`입니다. 질문: `OnBeginPlay` 함수에서 `self.Entity:SetEnable(false)`를 호출하는 주된 목적은 무엇인가요? 답변: 구매 팝업 UI가 기본적으로 비활성화 상태로 시작하도록 하여, 필요할 때만 활성화되게 하기 위함입니다. 질문: `OnBeginPlay` 함수에서 닫기 버튼(`btn_close`) 클릭 시 실행되 [original] | 상점 UI에서 선택한 아이템의 정보를 표시합니다. 구매할 개수를 입력할 수 있습니다. 확인 버튼을 누르면 구매를 진행합니다. 1. `UIBuyPopup` 컴포넌트를 생성하고, BuyPopup UI엔티티에 추가합니다. 1. 새로운 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 2. `OnBeginPlay` 함수를 추가합니다. 닫기 버튼을 눌러 UI를 닫을 수 있도록 작성합니다. ```lua [client only] [chunk_id] | Guides:1117:3

[task] | wikipedia [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # UIShopItemSlot UIShopItemSlot 컴포넌트는 상점 아이템 슬롯의 데이터를 설정하고 구매 이벤트를 처리하기 위한 UI 컴포넌트입니다. 이 컴포넌트는 `ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot` 경로에 위치한 엔티티에 추가하여 적용됩니다. 컴포넌트에는 아이템 식별자를 저장하기 위한 `ItemId` 프로퍼티가 포함되며, 이는 `[None]` 동기화 옵션을 가진 `string` 타입으로 초기값이 빈 문자열("")입니다. ```lua [original] | # UIShopItemSlot 1. UIShopItemSlot 컴포넌트를 생성하고, **ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot**에 추가합니다. 2. **ItemId** 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 3. `SetData()` 함수를 생성하고, **itemId, itemPrice** 매개변수를 추가합니다. UI에서 데이터 값이 보이도록 [chunk_id] | Guides:1117:2

[task] | knowledge_list [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 1. `btn_accept` 엔티티(`"/ui/DefaultGroup/Shop/BuyPopup/btn_accept"`)의 `HandleButtonClickEvent` 이벤트 핸들러는 `ButtonClickEvent` 객체를 매개변수로 수신하며, 실행 공간은 클라이언트(`Client`)입니다. 2. 이벤트 핸들러 내부에서 `event.Entity`를 로컬 변수 `Entity`로 할당하여 이벤트 발생 원본 엔티티에 접근할 수 있습니다. 3. `self.Entity:GetChildByName("input_count")` 메서드를 호출하여 [original] | ```lua Event Handler: [entity: btn_accept(/ui/DefaultGroup/Shop/BuyPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------- [chunk_id] | Guides:1117:4

[task] | distill [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # UIInventoryItemSlot 수정 `UIInventoryItemSlot` 컴포넌트에 `ButtonClickEvent` 핸들러를 추가하여, 슬롯 선택 시 판매 팝업(`UISellPopup`)을 활성화합니다. **동작 규칙:** 1. `self.ItemId`가 빈 문자열(`""`)이면 함수를 즉시 종료합니다. 2. `_EntityService:GetEntityByPath`로 팝업 엔티티를 조회합니다. 3. `UISellPopup` 컴포넌트의 `SetData` 메서드를 호출하여 `SlotIndex`, `ItemId`, `I [original] | # UIInventoryItemSlot 수정 `UIInventoryItemSlot` 컴포넌트에서 상품을 선택하면 판매 팝업이 나타나도록 만들어봅시다. 1. Event Handler에 **ButtonClickEvent**를 추가합니다. 판매 팝업이 활성화되도록 아래와 같이 작성합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- 슬롯에 아이템이 있을 때만 if self.ItemId == "" the [chunk_id] | Guides:1117:5

[task] | wikipedia [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 상점 로직의 구매 확정 기능을 구현하기 위해서는 버튼 컴포넌트(`ButtonComponent`)의 클릭 이벤트를 처리하는 이벤트 핸들러를 정의해야 합니다. 제공된 예제에서는 `/ui/DefaultGroup/Shop/BuyPopup/btn_accept` 경로에 위치한 `btn_accept` 엔티티의 `ButtonClickEvent`를 수신하는 `HandleButtonClickEvent` 함수가 정의되어 있습니다. 이 핸들러는 클라이언트 공간에서 실행되며, 이벤트 파라미터로 `event.Entity`를 전달받습니다. 함수 본문에서는 [original] | ```lua Event Handler: [entity: btn_accept(/ui/DefaultGroup/Shop/BuyPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------- [chunk_id] | Guides:1117:4

[task] | wikipedia [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # UIInventoryItemSlot 수정 `UIInventoryItemSlot` 컴포넌트에서 상품을 선택했을 때 판매 팝업이 표시되도록 로직을 구현해야 합니다. 이를 위해 해당 컴포넌트에 `Event Handler` 블록을 추가하고, `ButtonClickEvent`를 처리하는 핸들러를 정의합니다. 핸들러 내부에서는 먼저 슬롯에 아이템이 존재하는지 확인합니다. `self.ItemId`가 빈 문자열(`""`)인 경우, 즉 아이템이 없을 경우에는 함수를 즉시 종료합니다. 아이템이 존재할 경우, `_EntityService:Get [original] | # UIInventoryItemSlot 수정 `UIInventoryItemSlot` 컴포넌트에서 상품을 선택하면 판매 팝업이 나타나도록 만들어봅시다. 1. Event Handler에 **ButtonClickEvent**를 추가합니다. 판매 팝업이 활성화되도록 아래와 같이 작성합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- 슬롯에 아이템이 있을 때만 if self.ItemId == "" the [chunk_id] | Guides:1117:5

[task] | knowledge_list [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 1. `UIBuyPopup` 컴포넌트는 BuyPopup UI 엔티티에 추가되어 상점 UI에서 선택한 아이템 정보를 표시하고, 구매 개수 입력 및 확인 버튼 클릭 시 구매 진행을 담당합니다. 2. `UIBuyPopup` 컴포넌트에는 `[None]` 동기화 속성인 `string` 타입의 프로퍼티 `ItemId`가 선언되며, 초기값은 빈 문자열(`""`)입니다. 3. `[client only]` 실행 공간의 `OnBeginPlay` 함수는 초기화 시 `self.Entity:SetEnable(false)`를 호출하여 UI 엔티티를 비활성화 [original] | 상점 UI에서 선택한 아이템의 정보를 표시합니다. 구매할 개수를 입력할 수 있습니다. 확인 버튼을 누르면 구매를 진행합니다. 1. `UIBuyPopup` 컴포넌트를 생성하고, BuyPopup UI엔티티에 추가합니다. 1. 새로운 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 2. `OnBeginPlay` 함수를 추가합니다. 닫기 버튼을 눌러 UI를 닫을 수 있도록 작성합니다. ```lua [client only] [chunk_id] | Guides:1117:3

[task] | extract_knowledge [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 상점 로직 만들기: 상품 리스트 초기화 ## 개념 설명 상점 UI에서 상품 목록을 표시하기 위해 `Data` 컴포넌트(또는 유사한 데이터 소스)에 저장된 아이템 정보를 로드하고, 스크롤 뷰 내부에 아이템 슬롯 엔티티를 생성하여 배치하는 과정입니다. 이 과정은 클라이언트 화면에서만 수행되므로 `[client only]` 실행 공간으로 지정됩니다. ## API 사용법 ### 주요 서비스 및 메서드 - **`_Data`**: 아이템 정보(`ItemTable`)와 행 수(`ItemTableRowCount`)를 제공합니다. - ** [original] | ```lua [client only] void InitializeItemList() { -- 상품 리스트에 아이템을 인덱스 순서로 배치합니다. local itemTable = _Data.ItemTable local itemCount = _Data.ItemTableRowCount -- 아이템 개수만큼 빈 슬롯 준비 local shopItemSlots = {} for i = 1, itemCount [chunk_id] | Guides:1117:1

[task] | distill [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 상점 로직 만들기 Ⅱ: 구매 팝업 (`UIBuyPopup`) 상점 UI에서 선택된 아이템 정보 표시, 구매 개수 입력, 구매 진행 기능을 담당합니다. ## 1. 컴포넌트 생성 `UIBuyPopup` 컴포넌트를 생성하고 BuyPopup UI 엔티티에 추가합니다. ## 2. 프로퍼티 선택된 아이템 ID를 저장합니다. ```lua Property: [None] string ItemId = "" ``` ## 3. 초기화 및 닫기 기능 (`OnBeginPlay`) 클라이언트에서만 실행되며, 초기 비활성화 및 닫기 버튼(`btn_ [original] | 상점 UI에서 선택한 아이템의 정보를 표시합니다. 구매할 개수를 입력할 수 있습니다. 확인 버튼을 누르면 구매를 진행합니다. 1. `UIBuyPopup` 컴포넌트를 생성하고, BuyPopup UI엔티티에 추가합니다. 1. 새로운 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 2. `OnBeginPlay` 함수를 추가합니다. 닫기 버튼을 눌러 UI를 닫을 수 있도록 작성합니다. ```lua [client only] [chunk_id] | Guides:1117:3

[task] | knowledge_list [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 제시된 원문에는 `UISellPopup` 컴포넌트의 상세 정보(속성, 메서드 정의, 이벤트 등)가 포함되어 있지 않으며, `UIInventoryItemSlot` 컴포넌트 수정 내용과 `UISellPopup`에 대한 호출 코드 예제만 존재합니다. 따라서 원문에 명시된 사실만 기반으로 핵심 내용을 추출하면 다음과 같습니다. 1. `UIInventoryItemSlot` 컴포넌트에는 `self` 실행 공간의 `HandleButtonClickEvent(ButtonClickEvent event)` 이벤트 핸들러를 추가하여 버튼 클릭 시 동작 [original] | # UIInventoryItemSlot 수정 `UIInventoryItemSlot` 컴포넌트에서 상품을 선택하면 판매 팝업이 나타나도록 만들어봅시다. 1. Event Handler에 **ButtonClickEvent**를 추가합니다. 판매 팝업이 활성화되도록 아래와 같이 작성합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- 슬롯에 아이템이 있을 때만 if self.ItemId == "" the [chunk_id] | Guides:1117:5

[task] | wikipedia [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | ## 상점 로직 만들기 Ⅱ 본 가이드는 메이플스토리 월드 스크립트 언어 mLua를 사용하여 상점 UI에서 선택한 아이템의 정보를 표시하고, 구매할 개수를 입력받아 확인 버튼 클릭 시 구매를 진행하는 로직을 구현하는 방법을 설명합니다. ### 1. `UIBuyPopup` 컴포넌트 생성 및 추가 먼저 `UIBuyPopup` 컴포넌트를 생성하고, 해당 컴포넌트를 BuyPopup UI 엔티티에 추가합니다. ### 2. 프로퍼티 추가 아이템 식별자를 저장하기 위해 `string` 타입의 프로퍼티 `ItemId`를 추가합니다. `` [original] | 상점 UI에서 선택한 아이템의 정보를 표시합니다. 구매할 개수를 입력할 수 있습니다. 확인 버튼을 누르면 구매를 진행합니다. 1. `UIBuyPopup` 컴포넌트를 생성하고, BuyPopup UI엔티티에 추가합니다. 1. 새로운 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 2. `OnBeginPlay` 함수를 추가합니다. 닫기 버튼을 눌러 UI를 닫을 수 있도록 작성합니다. ```lua [client only] [chunk_id] | Guides:1117:3

[task] | diverse_qa [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 질문: 위 코드에서 `btn_accept` 버튼 클릭 시 어떤 이벤트 핸들러가 실행되나요? 답변: `HandleButtonClickEvent` 이벤트 핸들러가 실행됩니다. 질문: `HandleButtonClickEvent` 함수 내에서 입력받은 아이템 개수를 어떻게 획득하나요? 답변: `self.Entity:GetChildByName("input_count")`를 통해 `input_count` 자식 엔티티를 찾고, 해당 엔티티의 `TextInputComponent.Text` 속성 값을 `tonumber` 함수로 변환하여 개수를 획 [original] | ```lua Event Handler: [entity: btn_accept(/ui/DefaultGroup/Shop/BuyPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------- [chunk_id] | Guides:1117:4

[task] | extract_knowledge [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 상점 로직 구현: UIShop 컴포넌트 본 절에서는 `UIShop` 컴포넌트를 사용하여 상점 UI의 초기화 및 버튼 연동 로직을 구현하는 방법을 설명합니다. ## 1. 개념 설명 `UIShop` 컴포넌트는 상점 패널의 UI 요소들을 관리하고, 외부 버튼(상점 열기/닫기)과의 이벤트를 연결하는 역할을 수행합니다. 이 컴포넌트는 클라이언트에서 실행되며, 엔티티 경로를 통해 필요한 UI 객체를 찾습니다. 주요 구성 요소는 다음과 같습니다: * **itemUI**: 상점 슬롯에 표시될 아이템 UI 객체. * **scrol [original] | # UIShop 1. 새로운 `UIShop` 컴포넌트를 생성합니다. **ui - DefaultGroup - Shop**에 컴포넌트를 추가합니다. 1. 새로운 **itemUI, scrollView, ShopBtnPath, SyncTable** 프로퍼티를 추가합니다. ```lua Property: [None] Entity itemUI = nil [None] Entity scrollView = nil [None] string ShopBtnPath = "/ui/DefaultG [chunk_id] | Guides:1117:0

[task] | diverse_qa [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 질문: `UIInventoryItemSlot` 컴포넌트에서 상품을 선택했을 때 어떤 UI 요소가 활성화되어야 하는가? 답변: 판매 팝업(SellPopup)이 활성화되어야 한다. 질문: 판매 팝업이 나타나도록 하기 위해 `UIInventoryItemSlot`에 추가해야 하는 Event Handler의 이름은 무엇인가? 답변: ButtonClickEvent 질문: 아래 코드가 수행하는 주요 로직을 설명하시오. ```lua if self.ItemId == "" then return end ``` 답변: 해당 슬롯에 아이템이 존 [original] | # UIInventoryItemSlot 수정 `UIInventoryItemSlot` 컴포넌트에서 상품을 선택하면 판매 팝업이 나타나도록 만들어봅시다. 1. Event Handler에 **ButtonClickEvent**를 추가합니다. 판매 팝업이 활성화되도록 아래와 같이 작성합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- 슬롯에 아이템이 있을 때만 if self.ItemId == "" the [chunk_id] | Guides:1117:5

[task] | distill [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | **상점 판매 로직 (Sell)** 클라이언트 측 UI 버튼 이벤트 핸들러에서 `_Shop:Sell` API를 호출하여 인벤토리 슬롯의 아이템을 판매합니다. **API 시그니처** `_Shop:Sell(InventorySlotIndex: number, Count: number)` * `InventorySlotIndex`: 판매할 아이템이 위치한 인벤토리 슬롯 인덱스 * `Count`: 판매할 아이템 개수 **동작 규칙 및 주의사항** 1. **실행 공간**: 클라이언트(`Client`)에서 트리거됩니다. 2. **입 [original] | ```lua [entity: btn_accept(/ui/DefaultGroup/Shop/SellPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------------------------- [chunk_id] | Guides:1117:7

[task] | extract_knowledge [title] | 7. 상점 UI 만들기 [category] | Guides [rephrased] | # 7. 상점 UI 만들기 ## 개념 설명 상점 UI는 인벤토리 프리셋을 기반으로 구성되며, 구매 및 판매 동작을 위한 팝업 UI를 포함합니다. 인벤토리 프리셋을 UI 그룹에 추가하면 `UIInventory`, `UIItemSlot` 컴포넌트가 자동으로 생성됩니다. 상점에서는 불필요한 메소(Coin) 패널과 개수 표시 UI를 제거하고, 상품 정보(이름, 가격)를 표시하기 위한 텍스트와 스프라이트 엔티티를 추가해야 합니다. UI의 렌더링 순서는 엔티티의 배치 순서에 따라 결정되므로, 팝업 UI는 배경이 되는 상점 또는 인벤토리 U [original] | # 상점 UI 만들기 인벤토리 프리셋을 활용해 상점 UI를 만들어 봅시다. 1. **Preset List - UI - 인벤토리**를 선택해 DefaultGroup에 추가해 배치합니다. 2. 자동으로 inventory_1 UI엔티티에 추가된 UIInventory 컴포넌트를 **제거**합니다. 3. UIItemSlot 컴포넌트를 **삭제**합니다. > **Tip.** > 인벤토리 프리셋을 UI 그룹에 추가하면, UIInventory, UIItemSlot 컴포넌트가 자동으로 생성됩니다. 3. 상점에서 필요하지 [chunk_id] | Guides:1116:0

[task] | wikipedia [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | **9. 상점 로직 만들기Ⅱ** 상점 기능 구현 시, 사용자가 입력한 수량만큼 아이템을 판매하는 로직은 클라이언트 측 버튼 이벤트 핸들러를 통해 처리됩니다. 아래 코드 예제는 `btn_accept` 버튼이 클릭되었을 때 발생하는 `HandleButtonClickEvent` 핸들러를 보여줍니다. ```lua [entity: btn_accept(/ui/DefaultGroup/Shop/SellPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { -------- [original] | ```lua [entity: btn_accept(/ui/DefaultGroup/Shop/SellPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------------------------- [chunk_id] | Guides:1117:7

[task] | knowledge_list [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 제시된 문서 원문에 포함된 정보만 바탕으로 핵심 사실을 추출하여 정리합니다. 1. `HandleButtonClickEvent`는 `btn_accept` 엔티티(`/ui/DefaultGroup/Shop/SellPopup/btn_accept`)에 배치되며, `ButtonComponent`가 송신하는 네이티브 이벤트를 처리하기 위한 이벤트 핸들러입니다. 2. 해당 이벤트 핸들러는 클라이언트 공간(Space: Client)에서 실행되며, 매개변수로 `ButtonClickEvent` 타입의 `event` 객체를 전달받습니다. 3. 이벤트 [original] | ```lua [entity: btn_accept(/ui/DefaultGroup/Shop/SellPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------------------------- [chunk_id] | Guides:1117:7

[task] | diverse_qa [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 질문: UIShopItemSlot 컴포넌트를 어떤 UI 경로에 추가해야 하나요? 답변: **ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot** 경로에 추가해야 합니다. 질문: UIShopItemSlot에서 아이템의 고유 식별자를 저장하기 위해 추가하는 프로퍼티의 이름과 타입은 무엇인가요? 답변: 이름은 **ItemId**이고 타입은 **string**입니다. 질문: SetData 함수에서 아이템 정보가 없으면 어떻게 처리되나요? 답변: `log_error`로 [original] | # UIShopItemSlot 1. UIShopItemSlot 컴포넌트를 생성하고, **ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot**에 추가합니다. 2. **ItemId** 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 3. `SetData()` 함수를 생성하고, **itemId, itemPrice** 매개변수를 추가합니다. UI에서 데이터 값이 보이도록 [chunk_id] | Guides:1117:2

[task] | knowledge_list [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 1. `UISellPopup` 컴포넌트는 인벤토리에서 선택한 아이템의 판매 개수를 입력하고 확인하여 판매를 진행하기 위해 `SellPopup`에 추가되는 UI 컴포넌트입니다. 2. `UISellPopup` 컴포넌트는 `[None]` 동기화 속성을 가진 `integer` 타입의 `InventorySlotIndex` 프로퍼티를 가지며 기본값은 `0`입니다. 3. `[client only]` 실행 공간의 `OnBeginPlay` 함수는 시작 시 `self.Entity:SetEnable(false)`를 호출하여 엔티티를 비활성화하고, 자식 [original] | 인벤토리에서 아이템을 눌러 판매할 아이템의 개수를 입력하고, 확인 버튼을 눌러 판매할 수 있도록 작성합니다. 1. `UISellPopup` 컴포넌트를 생성하고, SellPopup에 추가합니다. 2. integer 타입의 **InventorySlotIndex** 프로퍼티를 추가합니다. ```lua Property: [None] integer InventorySlotIndex = 0 ``` 3. **OnBeginPlay** 함수를 추가하고, 닫기 버튼을 ButtonClickEvent와 연결하도록 아 [chunk_id] | Guides:1117:6

[task] | extract_knowledge [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 상점 로직 만들기 II: UIInventoryItemSlot 수정 ## 개념 설명 `UIInventoryItemSlot` 컴포넌트는 인벤토리 슬롯을 표현하는 UI 요소입니다. 사용자가 특정 슬롯의 아이템을 클릭할 때, 해당 아이템의 판매를 위해 `UISellPopup`을 활성화하고 필요한 데이터(슬롯 인덱스, 아이템 ID, 수량)를 전달해야 합니다. 이 과정은 슬롯 컴포넌트에 버튼 클릭 이벤트를 처리하는 핸들러를 추가하여 구현합니다. ## API 사용법 1. **이벤트 핸들러 추가**: `UIInventoryItemSlot` [original] | # UIInventoryItemSlot 수정 `UIInventoryItemSlot` 컴포넌트에서 상품을 선택하면 판매 팝업이 나타나도록 만들어봅시다. 1. Event Handler에 **ButtonClickEvent**를 추가합니다. 판매 팝업이 활성화되도록 아래와 같이 작성합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- 슬롯에 아이템이 있을 때만 if self.ItemId == "" the [chunk_id] | Guides:1117:5

[task] | distill [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 상점 로직 만들기 Ⅱ: 판매 팝업 인벤토리 아이템을 선택해 판매 수량을 입력하고 확인하는 `UISellPopup` 컴포넌트 구현 가이드입니다. ## 1. 컴포넌트 생성 및 프로퍼티 `UISellPopup` 컴포넌트를 생성하고 `SellPopup` 에디터 객체에 추가합니다. `integer` 타입의 인벤토리 슬롯 인덱스를 저장하기 위한 프로퍼티를 선언합니다. ```lua Property: [None] integer InventorySlotIndex = 0 ``` ## 2. 초기화 및 닫기 버튼 연동 `OnBeginPlay` [original] | 인벤토리에서 아이템을 눌러 판매할 아이템의 개수를 입력하고, 확인 버튼을 눌러 판매할 수 있도록 작성합니다. 1. `UISellPopup` 컴포넌트를 생성하고, SellPopup에 추가합니다. 2. integer 타입의 **InventorySlotIndex** 프로퍼티를 추가합니다. ```lua Property: [None] integer InventorySlotIndex = 0 ``` 3. **OnBeginPlay** 함수를 추가하고, 닫기 버튼을 ButtonClickEvent와 연결하도록 아 [chunk_id] | Guides:1117:6

[task] | diverse_qa [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 질문: 제시된 코드에서 `btn_accept` 버튼 클릭 시 어떤 서비스가 호출되어 판매가 진행되나요? 답변: `_Shop` 서비스의 `Sell` 메서드가 호출되어 판매가 진행됩니다. 질문: 판매할 아이템의 개수는 어떤 컴포넌트를 통해 읽어 오나요? 답변: `input_count`라는 이름의 자식 엔티티의 `TextInputComponent`에서 `Text` 속성을 읽어 옵니다. 질문: `tonumber(inputEntity.TextInputComponent.Text)` 구문의 역할은 무엇인가요? 답변: 텍스트 입력 필드에서 읽 [original] | ```lua [entity: btn_accept(/ui/DefaultGroup/Shop/SellPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------------------------- [chunk_id] | Guides:1117:7

[task] | extract_knowledge [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 9. 상점 로직 만들기 II: 아이템 구매 처리 ## 개념 설명 이 절에서는 상점 UI의 '확인' 버튼 클릭 시, 사용자가 입력한 아이템 개수만큼 구매를 진행하는 로직을 구현하는 방법을 다룹니다. 이 과정은 클라이언트 공간에서 버튼 이벤트(`HandleButtonClickEvent`)를 감지하고, 해당 UI 하위 컴포넌트에서 입력 값을 추출한 후, 서버 공간의 `_Shop` 서비스를 통해 실제 구매 트랜잭션을 수행하는 구조로 이루어집니다. ## API 사용법 구현에 필요한 주요 API와 컴포넌트 접근 방법은 다음과 같습니다. [original] | ```lua Event Handler: [entity: btn_accept(/ui/DefaultGroup/Shop/BuyPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------- [chunk_id] | Guides:1117:4

[task] | extract_knowledge [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 상점 아이템 슬롯 로직 (UIShopItemSlot) 본 절에서는 메이플스토리 월드(mLua) 환경에서 상점 UI의 아이템 슬롯 컴포넌트 `UIShopItemSlot`을 구현하는 방법을 다룹니다. 이 컴포넌트는 아이템 데이터(아이콘, 이름, 가격)를 표시하고, 사용자가 아이템을 클릭했을 때 구매 팝업을 호출하는 역할을 수행합니다. ## 1. 개념 및 구조 `UIShopItemSlot`은 상점 목록(`Shop_ScrollView`) 내부에 배치되는 개별 아이템 표시 객체입니다. - **데이터 바인딩**: 외부에서 아이템 ID [original] | # UIShopItemSlot 1. UIShopItemSlot 컴포넌트를 생성하고, **ui - DefaultGroup - Shop - ShopPanel - Shop_ScrollView - Item_Slot**에 추가합니다. 2. **ItemId** 프로퍼티를 추가합니다. ```lua Property: [None] string ItemId = "" ``` 3. `SetData()` 함수를 생성하고, **itemId, itemPrice** 매개변수를 추가합니다. UI에서 데이터 값이 보이도록 [chunk_id] | Guides:1117:2

[task] | knowledge_list [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | ```lua -- 문서에 포함된 핵심 사실 목록 1. UIItemSlot 컴포넌트의 이름을 UIInventoryItemSlot으로 변경해야 하며, 이 컴포넌트는 ui - DefaultGroup - Inventory - InventoryPanel - Inventory_ScrollView - item_Slot 경로에 추가되어 있습니다. 2. UIInventoryItemSlot 컴포넌트에는 [None] 동기화 속성인 integer 타입의 SlotIndex(기본값 0), string 타입의 ItemId(기본값 ""), integer 타입 [original] | UIInventoryItemSlot 컴포넌트 내용을 변경해 UI 인벤토리에서 아이템 섬네일과 개수를 표시할 수 있도록 아래와 같이 작성합니다. 중간 확인을 위해 인벤토리에서 아이템을 누르면 삭제되도록 만들어봅시다. # UIInventoryItemSlot 수정 1. **UIItemSlot** 컴포넌트의 이름을 `UIInventoryItemSlot` 로 변경합니다. >**Tip.** > **ui - DefaultGroup - Inventory - InventoryPanel - Inventory_ScrollView [chunk_id] | Guides:1118:0

[task] | diverse_qa [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | 질문: `UISellPopup` 컴포넌트는 어떤 목적을 위해 생성되는가? 답변: 인벤토리에서 아이템을 눌러 판매할 아이템의 개수를 입력하고, 확인 버튼을 눌러 판매할 수 있도록 하기 위해 생성된다. 질문: `UISellPopup`에 추가되는 `InventorySlotIndex` 프로퍼티의 타입과 초기값은 무엇인가? 답변: 타입은 `integer`이며 초기값은 `0`이다. 질문: `OnBeginPlay` 함수 내에서 `self.Entity:SetEnable(false)`가 호출되는 이유는 무엇인가? 답변: 팝업 창이 초기에는 비활 [original] | 인벤토리에서 아이템을 눌러 판매할 아이템의 개수를 입력하고, 확인 버튼을 눌러 판매할 수 있도록 작성합니다. 1. `UISellPopup` 컴포넌트를 생성하고, SellPopup에 추가합니다. 2. integer 타입의 **InventorySlotIndex** 프로퍼티를 추가합니다. ```lua Property: [None] integer InventorySlotIndex = 0 ``` 3. **OnBeginPlay** 함수를 추가하고, 닫기 버튼을 ButtonClickEvent와 연결하도록 아 [chunk_id] | Guides:1117:6

[task] | distill [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | ### 6. UIInventoryItemSlot 수정 인벤토리 슬롯 클릭 시 아이템 삭제 기능을 구현합니다. 1. **`UIInventoryItemSlot`** 컴포넌트의 `[self]` Event Handler에 `HandleButtonClickEvent`를 추가/수정합니다. * `ItemId`가 비어 있으면(`""`) 함수를 종료합니다. * `_UserService.LocalPlayer.SimpleInventory`의 `ItemStacks`에서 해당 `SlotIndex`의 아이템 개수(`Count`)를 [original] | 지금까지 만든 인벤토리가 정상적으로 작동하는지 확인해봅시다. 임의의 데이터를 추가해 인벤토리의 슬롯을 눌러 지울 수 있는지 확인합니다. 정상적으로 작동하는 것을 확인했으면 확인용을 추가한 코드와 설정을 다시 변경합니다. 1. `UIInventoryItemSlot` 컴포넌트의 Event Handler에 `ButtonClickEvent` 내용을 수정합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- Parame [chunk_id] | Guides:1118:1

[task] | extract_knowledge [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 9. 상점 로직 만들기 Ⅱ: 판매 처리 이벤트 핸들링 ## 개념 설명 상점 UI에서 사용자가 판매를 확정할 때, 입력된 아이템 개수를 서버에 전달하여 실제 거래를 처리하는 과정입니다. `btn_accept` 버튼의 클릭 이벤트를 수신하여, 인벤토리 슬롯 인덱스와 판매 개수를 파라미터로 `_Shop` 서비스의 `Sell` 메서드를 호출합니다. 판매 요청이 전송된 후 해당 팝업 UI의 활성화를 해제하여 중복 클릭을 방지합니다. ## API 사용법 * **`_Shop:Sell(slotIndex, count)`**: 지정된 인벤 [original] | ```lua [entity: btn_accept(/ui/DefaultGroup/Shop/SellPopup/btn_accept) HandleButtonClickEvent (ButtonClickEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ButtonComponent -- Space: Client --------------------------------- [chunk_id] | Guides:1117:7

[task] | distill [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | **TargetUserSync 동기화 범위** `TargetUserSync` 속성은 값 변경 시 **조작 제어권(Ownership)이 있는 클라이언트에만** 동기화됩니다. 제어권이 없는 다른 클라이언트에서는 해당 속성 변경이 감지되지 않으며, 동작상 `[None]`과 동일하게 취급됩니다. ```lua Property: [TargetUserSync] integer meso = 0 Method: [server only] void IncreaseMeso() { self.meso += 1 } ``` * **동작 규칙**: [original] | meso 프로퍼티를 TargetUserSync로 변경한 뒤 서버에서 PlayerEntity A의 `IncreaseMeso()`를 호출하면, PlayerEntity A의 조작 제어권이 있는 Client A에만 meso 값이 동기화됩니다. Client B의 PlayerEntity A에는 변경이 일어나지 않는, None과 동일하게 처리됩니다. ```lua Property: [TargetUserSync] integer meso = 0 Method: [server only] void IncreaseMeso() { self.meso + [chunk_id] | Guides:1119:1

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