[task] | distill [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | `UIInventoryItemSlot` 컴포넌트는 인벤토리 슬롯에 아이템 아이콘과 개수를 표시하고, 초기 상태를 리셋하기 위해 `SetData()`와 `Clear()` 메서드를 제공합니다. ### 1. 프로퍼티 설정 기존 프로퍼티를 삭제하고 아래 값을 추가합니다. ```lua Property: [None] integer SlotIndex = 0 [None] string ItemId = "" [None] integer ItemCount = 0 ``` ### 2. 메서드 구현 **`SetData()`** 인벤토리 데이터 테이블에 [original] | UIInventoryItemSlot 컴포넌트 내용을 변경해 UI 인벤토리에서 아이템 섬네일과 개수를 표시할 수 있도록 아래와 같이 작성합니다. 중간 확인을 위해 인벤토리에서 아이템을 누르면 삭제되도록 만들어봅시다. # UIInventoryItemSlot 수정 1. **UIItemSlot** 컴포넌트의 이름을 `UIInventoryItemSlot` 로 변경합니다. >**Tip.** > **ui - DefaultGroup - Inventory - InventoryPanel - Inventory_ScrollView [chunk_id] | Guides:1118:0
[task] | wikipedia [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | **TargetUserSync와 프로퍼티 동기화 최적화** `TargetUserSync`는 특정 조작 제어권(Operator)을 가진 클라이언트에게만 프로퍼티 변경 사항을 동기화하는 최적화 기법입니다. 기본 동기화 방식(`None`)은 변경 사항이 모든 관련 클라이언트에 전파되는 반면, `TargetUserSync`를 적용하면 해당 엔티티의 조작 제어권을 가진 클라이언트에게만 값이 갱신됩니다. 예를 들어, `meso` 프로퍼티의 동기화 모드를 `TargetUserSync`로 설정한 상태에서 서버 측에서 PlayerEntity A [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
[task] | knowledge_list [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | 1. `UIInventoryItemSlot` 컴포넌트의 `[self]` 실행 공간 Event Handler인 `HandleButtonClickEvent(ButtonClickEvent event)`는 `event.Entity` 매개변수를 통해 엔티티를 참조하며, `self.ItemId`가 빈 문자열(`""`)인 경우 함수를 즉시 종료(`return`)합니다. 2. `UIInventoryItemSlot` 컴포넌트의 `HandleButtonClickEvent` 핸들러 내에서 `_UserService.LocalPlayer.SimpleInv [original] | 지금까지 만든 인벤토리가 정상적으로 작동하는지 확인해봅시다. 임의의 데이터를 추가해 인벤토리의 슬롯을 눌러 지울 수 있는지 확인합니다. 정상적으로 작동하는 것을 확인했으면 확인용을 추가한 코드와 설정을 다시 변경합니다. 1. `UIInventoryItemSlot` 컴포넌트의 Event Handler에 `ButtonClickEvent` 내용을 수정합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- Parame [chunk_id] | Guides:1118:1
[task] | wikipedia [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | 상점과 인벤토리 시스템의 동작을 검증하기 위해 임시 테스트 코드를 적용하고, 인벤토리 슬롯의 아이템 삭제 기능이 정상적으로 작동하는지 확인하는 과정입니다. 이 단계에서는 임의의 아이템 데이터를 추가하여 슬롯 클릭 시 아이템이 제거되는지 테스트한 후, 테스트 완료 시 해당 임시 설정을 원복해야 합니다. 먼저 `UIInventoryItemSlot` 컴포넌트 내의 `ButtonClickEvent` 이벤트 핸들러 로직을 수정합니다. 아래 코드는 슬롯에 아이템이 존재할 때만(`ItemId`가 빈 문자열이 아닐 때) 실행되며, 해당 슬롯 인 [original] | 지금까지 만든 인벤토리가 정상적으로 작동하는지 확인해봅시다. 임의의 데이터를 추가해 인벤토리의 슬롯을 눌러 지울 수 있는지 확인합니다. 정상적으로 작동하는 것을 확인했으면 확인용을 추가한 코드와 설정을 다시 변경합니다. 1. `UIInventoryItemSlot` 컴포넌트의 Event Handler에 `ButtonClickEvent` 내용을 수정합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- Parame [chunk_id] | Guides:1118:1
[task] | diverse_qa [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | 질문: 인벤토리 슬롯의 아이템을 삭제하는 기능을 확인하기 위해 `UIInventoryItemSlot` 컴포넌트의 어떤 Event Handler를 수정해야 하나요? 답변: `ButtonClickEvent` 핸들러인 `HandleButtonClickEvent`를 수정해야 합니다. 질문: `HandleButtonClickEvent` 함수 내에서 슬롯에 아이템이 없을 때 수행되는 로직은 무엇인가요? 답변: `self.ItemId`가 빈 문자열(`""`)인 경우 함수를 즉시 종료(return)하도록 처리되어 있습니다. 질문: `UIInv [original] | 지금까지 만든 인벤토리가 정상적으로 작동하는지 확인해봅시다. 임의의 데이터를 추가해 인벤토리의 슬롯을 눌러 지울 수 있는지 확인합니다. 정상적으로 작동하는 것을 확인했으면 확인용을 추가한 코드와 설정을 다시 변경합니다. 1. `UIInventoryItemSlot` 컴포넌트의 Event Handler에 `ButtonClickEvent` 내용을 수정합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- Parame [chunk_id] | Guides:1118:1
[task] | wikipedia [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 상점 로직 만들기 Ⅱ: 인벤토리 아이템 판매 처리 이 섹션에서는 인벤토리에 보관된 아이템을 선택하여 판매할 수 있는 UI 로직을 구현하는 방법을 다룹니다. 플레이어는 인벤토리에서 특정 아이템을 클릭하면 팝업 창이 열리며, 해당 창에서 판매할 아이템의 수량을 입력하고 확인 버튼을 통해 판매를 완료할 수 있습니다. 구현 과정은 `UISellPopup` 컴포넌트 생성, 프로퍼티 정의, 초기화 함수 작성, 데이터 설정 함수 구현, 그리고 이벤트 핸들러 연결의 순서로 진행됩니다. ## 1. 컴포넌트 생성 및 프로퍼티 정의 먼저, 판 [original] | 인벤토리에서 아이템을 눌러 판매할 아이템의 개수를 입력하고, 확인 버튼을 눌러 판매할 수 있도록 작성합니다. 1. `UISellPopup` 컴포넌트를 생성하고, SellPopup에 추가합니다. 2. integer 타입의 **InventorySlotIndex** 프로퍼티를 추가합니다. ```lua Property: [None] integer InventorySlotIndex = 0 ``` 3. **OnBeginPlay** 함수를 추가하고, 닫기 버튼을 ButtonClickEvent와 연결하도록 아 [chunk_id] | Guides:1117:6
[task] | knowledge_list [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | 1. `meso` 프로퍼티에 `[TargetUserSync]` 속성을 적용하면, 해당 값은 해당 엔티티의 조작 제어권을 가진 클라이언트에게만 동기화됩니다. 2. `[TargetUserSync]` 속성이 적용된 `meso` 프로퍼티의 타입은 `integer`이며, 기본값은 `0`입니다. 3. 서버에서 `PlayerEntity A`의 `IncreaseMeso()` 메서드를 호출하면, `PlayerEntity A`의 조작 제어권이 있는 `Client A`에게만 `meso` 값이 동기화됩니다. 4. 조작 제어권이 없는 다른 클라이언트(예: [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
[task] | extract_knowledge [title] | 9. 상점 로직 만들기Ⅱ [category] | Guides [rephrased] | # 상점 로직: 아이템 판매 팝업 (UISellPopup) 구현 ## 1. 개념 설명 `UISellPopup` 컴포넌트는 인벤토리의 특정 슬롯에 있는 아이템을 판매하기 위한 UI 로직을 담당합니다. 이 컴포넌트는 특정 아이템의 정보(아이콘, 이름, 현재 보유 수량)를 받아 팝업 UI에 표시하고, 사용자가 판매할 개수를 입력한 후 확인 버튼을 통해 판매 처리를 진행하도록 설계됩니다. ## 2. API 사용법 및 구현 단계 ### 2.1. 컴포넌트 생성 및 프로퍼티 정의 `UISellPopup` 컴포넌트를 생성하여 `SellPop [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] | # 9. 상점 로직 만들기 II: 구매 팝업 컴포넌트 구현 본 절에서는 상점 UI에서 선택된 아이템의 정보를 표시하고, 구매 개수를 입력받아 확인 버튼 클릭 시 구매를 진행하는 `UIBuyPopup` 컴포넌트의 구현 방법을 다룹니다. ## 1. 개념 설명 상점 시스템에서 개별 아이템 구매를 처리하기 위해 전용 팝업 UI 엔티티와 이를 제어하는 스크립트 컴포넌트가 필요합니다. `UIBuyPopup` 컴포넌트는 다음과 같은 역할을 수행합니다. 1. **초기화**: 게임 시작 시 비활성화 상태로 유지되도록 설정합니다. 2. ** [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] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | 제공된 문서의 내용을 바탕으로 `TargetUserSync` 프로퍼티 동기화 방식에 대한 핵심 사실을 추출하여 목록으로 정리하였습니다. * `TargetUserSync`는 `Sync` 프로퍼티 동기화를 특정 유저로 한정하여 최적화하는 방식으로, 플레이어가 스스로 조작하는 `PlayerEntity`에 포함된 컴포넌트의 프로퍼티에만 적용됩니다. * `TargetUserSync` 프로퍼티 값이 서버에서 변경되면, 해당 `PlayerEntity`를 조작할 수 있는 유저(해당 플레이어)에게만 동기화되며, 다른 유저에게는 동기화되지 [original] | # 학습 과정 소개 프로퍼티 동기화 방식 중 하나인 TargetUserSync에 대해 알아봅니다. ##### 참고 가이드 * [프로퍼티](/docs/?postId=205) * [프로퍼티 동기화](/docs/?postId=208) * [서버와 클라이언트](/docs/?postId=207) # TargetUserSync 알아보기 TargetUserSync는 Sync 프로퍼티 동기화를 좀 더 특정해 최적화하는 방식입니다. TargetUserSync는 플레이어가 스스로 조작하는 PlayerEntity에 포함된 컴포넌트의 프로퍼티만을 [chunk_id] | Guides:1119:0
[task] | diverse_qa [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | 질문: UIItemSlot 컴포넌트를 어떤 이름으로 변경해야 합니까? 답변: UIItemSlot 컴포넌트의 이름을 UIInventoryItemSlot 으로 변경해야 합니다. 질문: UIInventoryItemSlot 컴포넌트가 추가되는 기본 경로(ui - DefaultGroup - Inventory - InventoryPanel - Inventory_ScrollView - item_Slot)는 무엇입니까? 답변: ui - DefaultGroup - Inventory - InventoryPanel - Inventory_ScrollV [original] | UIInventoryItemSlot 컴포넌트 내용을 변경해 UI 인벤토리에서 아이템 섬네일과 개수를 표시할 수 있도록 아래와 같이 작성합니다. 중간 확인을 위해 인벤토리에서 아이템을 누르면 삭제되도록 만들어봅시다. # UIInventoryItemSlot 수정 1. **UIItemSlot** 컴포넌트의 이름을 `UIInventoryItemSlot` 로 변경합니다. >**Tip.** > **ui - DefaultGroup - Inventory - InventoryPanel - Inventory_ScrollView [chunk_id] | Guides:1118:0
[task] | distill [title] | LocaleDataSet [category] | Guides [rephrased] | # 로컬라이징 LocaleDataSet 월드 텍스트 번역 시 필수적으로 사용하는 전용 DataSet입니다. **Default**와 **WebSync** 두 종류로 구분됩니다. ## 종류별 특징 및 사용 규칙 ### 1. Default * **연동**: 공식 홈페이지 번역 관리와 연동되지 않음. * **구조**: `Key`, `Source`, `Note` 컬럼 기본 포함. 크리에이터가 직접 언어 코드 컬럼을 추가/관리 가능. * **제약**: 언어 코드는 중복 추가 불가. * **적용**: 번역량이 적어 메이커에서 [original] | # 학습 과정 소개 월드의 텍스트 번역 시 필수적으로 사용해야 하는 LocaleDataSet에 대해 알아봅시다. ##### 참고 가이드 [로컬라이징의 이해](docs/?postId=951) [포맷에 맞게 로컬라이징하기](docs/?postId=968) [자동 번역](docs/?postId=1072) # LocaleDataSet 소개 LocaleDataSet은 번역을 위한 전용 DataSet입니다. LocaleDataSet은 **Default, WebSync** 두 종류가 있습니다. LocaleDataSet은 **Workspa [chunk_id] | Guides:1120:0
[task] | distill [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | # TargetUserSync와 프로퍼티 동기화 최적화 ## 개념 `TargetUserSync`는 `Sync` 동기화의 최적화 버전으로, **PlayerEntity**에 포함된 컴포넌트의 프로퍼티만 대상으로 합니다. 서버에서 값이 변경되면, 해당 PlayerEntity를 조작하는 **유저에게만** 동기화합니다. * **적용 범위**: 개인 재화, 업적, 소모품 등 다른 유저 참조가 불필요한 데이터. * **제약**: * `PlayerEntity`가 아닌 다른 Entity의 컴포넌트에서 사용 시 `None` 동기화 [original] | # 학습 과정 소개 프로퍼티 동기화 방식 중 하나인 TargetUserSync에 대해 알아봅니다. ##### 참고 가이드 * [프로퍼티](/docs/?postId=205) * [프로퍼티 동기화](/docs/?postId=208) * [서버와 클라이언트](/docs/?postId=207) # TargetUserSync 알아보기 TargetUserSync는 Sync 프로퍼티 동기화를 좀 더 특정해 최적화하는 방식입니다. TargetUserSync는 플레이어가 스스로 조작하는 PlayerEntity에 포함된 컴포넌트의 프로퍼티만을 [chunk_id] | Guides:1119:0
[task] | knowledge_list [title] | LocaleDataSet [category] | Guides [rephrased] | 제공된 문서 내용에 기반하여 **LocaleDataSet**과 관련된 핵심 사실을 추출한 목록입니다. * `LocaleDataSet`은 월드의 텍스트 번역 시 필수적으로 사용해야 하는 전용 DataSet이며, 생성 방법은 `Workspace - MyDesk - Create LocaleDataSet`에서 `Default` 또는 `WebSync` 중 하나를 선택하는 것입니다. * `Default` 종류의 `LocaleDataSet`은 기본적으로 `Key`, `Source`, `Note` 컬럼이 포함되며, 크리에이터가 직접 컬럼 [original] | # 학습 과정 소개 월드의 텍스트 번역 시 필수적으로 사용해야 하는 LocaleDataSet에 대해 알아봅시다. ##### 참고 가이드 [로컬라이징의 이해](docs/?postId=951) [포맷에 맞게 로컬라이징하기](docs/?postId=968) [자동 번역](docs/?postId=1072) # LocaleDataSet 소개 LocaleDataSet은 번역을 위한 전용 DataSet입니다. LocaleDataSet은 **Default, WebSync** 두 종류가 있습니다. LocaleDataSet은 **Workspa [chunk_id] | Guides:1120:0
[task] | diverse_qa [title] | LocaleDataSet [category] | Guides [rephrased] | 질문: 월드의 텍스트 번역 시 필수적으로 사용해야 하는 DataSet은 무엇인가요? 답변: LocaleDataSet입니다. 질문: LocaleDataSet에는 어떤 종류가 있나요? 답변: Default와 WebSync 두 종류가 있습니다. 질문: LocaleDataSet은 어디에서 생성할 수 있나요? 답변: Workspace - MyDesk - Create LocaleDataSet에서 생성할 수 있습니다. 질문: Default LocaleDataSet에 기본적으로 포함되어 있는 컬럼은 무엇인가요? 답변: Key, Source, [original] | # 학습 과정 소개 월드의 텍스트 번역 시 필수적으로 사용해야 하는 LocaleDataSet에 대해 알아봅시다. ##### 참고 가이드 [로컬라이징의 이해](docs/?postId=951) [포맷에 맞게 로컬라이징하기](docs/?postId=968) [자동 번역](docs/?postId=1072) # LocaleDataSet 소개 LocaleDataSet은 번역을 위한 전용 DataSet입니다. LocaleDataSet은 **Default, WebSync** 두 종류가 있습니다. LocaleDataSet은 **Workspa [chunk_id] | Guides:1120:0
[task] | diverse_qa [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | 질문: `TargetUserSync` 동기화 방식에서 서버가 PlayerEntity A의 메서드를 호출했을 때, 해당 값이 어떤 클라이언트에 동기화되나요? 답변: PlayerEntity A의 조작 제어권이 있는 Client A에만 동기화됩니다. 질문: `TargetUserSync`로 설정된 프로퍼티의 값이 변경되었을 때, 조작 제어권이 없는 다른 클라이언트(예: Client B)에서는 어떻게 처리되나요? 답변: 변경이 일어나지 않으며, `[None]` 동기화 방식과 동일하게 처리됩니다. 질문: 아래 코드에서 `meso` 프로퍼티 [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
[task] | wikipedia [title] | LocaleDataSet [category] | Guides [rephrased] | # 로컬라이징: LocaleDataSet 월드(MapleStory Worlds) 환경에서 텍스트 번역을 수행하기 위해 필수적으로 사용하는 전용 데이터셋(DataSet)은 **LocaleDataSet**입니다. 이 데이터셋은 텍스트의 원문과 번역본을 구조화하여 관리하는 역할을 수행하며, 사용 목적과 작업 방식에 따라 **Default**와 **WebSync** 두 가지 유형으로 구분됩니다. ## 데이터셋 생성 및 유형별 특징 LocaleDataSet은 메이커(Maker) 환경의 **Workspace - MyDesk - Creat [original] | # 학습 과정 소개 월드의 텍스트 번역 시 필수적으로 사용해야 하는 LocaleDataSet에 대해 알아봅시다. ##### 참고 가이드 [로컬라이징의 이해](docs/?postId=951) [포맷에 맞게 로컬라이징하기](docs/?postId=968) [자동 번역](docs/?postId=1072) # LocaleDataSet 소개 LocaleDataSet은 번역을 위한 전용 DataSet입니다. LocaleDataSet은 **Default, WebSync** 두 종류가 있습니다. LocaleDataSet은 **Workspa [chunk_id] | Guides:1120:0
[task] | extract_knowledge [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | # TargetUserSync 프로퍼티 동기화 ## 개념 설명 `TargetUserSync`는 특정 플레이어의 조작 제어권(Ownership)을 가진 클라이언트에게만 프로퍼티 변경 사항을 동기화하는 동기화 모드입니다. 서버에서 해당 엔티티의 프로퍼티를 수정하더라도, 해당 엔티티의 조작 제어권이 없는 다른 클라이언트에게는 변경 내용이 전달되지 않습니다. 결과적으로 조작 제어권이 없는 클라이언트에서는 해당 프로퍼티 값이 초기 상태(또는 이전 상태)로 유지되며, `None` 모드와 유사한 비동기화 동작을 보입니다. ## API 사 [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
[task] | wikipedia [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | # UIInventoryItemSlot 수정 `UIInventoryItemSlot` 컴포넌트는 UI 인벤토리 화면에서 특정 슬롯에 아이템의 섬네일(아이콘)과 보유 개수를 표시하는 역할을 수행합니다. 이 가이드에서는 해당 컴포넌트의 내용을 수정하여 아이템 데이터를 올바르게 렌더링하도록 구성하고, 중간 확인 단계로 인벤토리에서 아이템을 클릭하면 삭제되는 동작을 구현하는 방법을 다룹니다. ## 컴포넌트 구성 및 프로퍼티 설정 먼저, 기본 제공되는 `UIItemSlot` 컴포넌트를 `UIInventoryItemSlot`으로 이름을 변 [original] | UIInventoryItemSlot 컴포넌트 내용을 변경해 UI 인벤토리에서 아이템 섬네일과 개수를 표시할 수 있도록 아래와 같이 작성합니다. 중간 확인을 위해 인벤토리에서 아이템을 누르면 삭제되도록 만들어봅시다. # UIInventoryItemSlot 수정 1. **UIItemSlot** 컴포넌트의 이름을 `UIInventoryItemSlot` 로 변경합니다. >**Tip.** > **ui - DefaultGroup - Inventory - InventoryPanel - Inventory_ScrollView [chunk_id] | Guides:1118:0
[task] | extract_knowledge [title] | 6. UIInventoryItemSlot 수정 [category] | Guides [rephrased] | # 인벤토리 슬롯 아이템 제거 로직 구현 ## 개념 설명 `UIInventoryItemSlot` 컴포넌트는 인벤토리 UI의 개별 슬롯을 나타내며, 사용자의 클릭 이벤트를 처리하여 해당 슬롯에 배치된 아이템을 제거할 수 있습니다. 이 과정에서 `_UserService`를 통해 로컬 플레이어의 `SimpleInventory`에 접근하고, 특정 인덱스의 아이템 스택(`ItemStack`) 정보를 조회한 후 `RemoveItemAt` 메서드를 호출하여 아이템 수량을 감소시킵니다. ## API 사용법 * **`_UserService. [original] | 지금까지 만든 인벤토리가 정상적으로 작동하는지 확인해봅시다. 임의의 데이터를 추가해 인벤토리의 슬롯을 눌러 지울 수 있는지 확인합니다. 정상적으로 작동하는 것을 확인했으면 확인용을 추가한 코드와 설정을 다시 변경합니다. 1. `UIInventoryItemSlot` 컴포넌트의 Event Handler에 `ButtonClickEvent` 내용을 수정합니다. ```lua [self] HandleButtonClickEvent (ButtonClickEvent event) { -- Parame [chunk_id] | Guides:1118:1
[task] | distill [title] | 특정 월드 인스턴스로 워프하기 [category] | Guides [rephrased] | # 월드 인스턴스 워프하기 `WorldInstanceService`로 인스턴스 정보를 조회하고, `TeleportService`로 플레이어를 특정 인스턴스로 이동시킵니다. ## 핵심 개념 ### WorldInstanceId 월드 인스턴스 생성 시 발급되는 고유 식별값입니다. 현재 접속한 인스턴스 Id를 확인하는 방법: 1. `_WorldInstanceService.WorldInstanceId` 프로퍼티 접근 2. `_WorldInstanceService:GetWorldInstanceInfoPagesAndWait()` 또는 ` [original] | # 학습 과정 소개 `WorldInstanceService`를 활용해 현재 월드 인스턴스Id와 생성된 다른 월드 인스턴스들의 상태를 알 수 있습니다. 또한 `TeleportService`를 활용해 플레이어를 특정 월드 인스턴스로 워프시킬 수 있습니다. ##### 참고 가이드 [월드 인스턴스](/docs/?postId=984) [월드 인스턴스 통신](d/ocs/?postId=999) [월드 워프하기](/docs/?postId=743) ##### 참고 APIReference [TeleportService](/apiReference? [chunk_id] | Guides:1122:0
[task] | diverse_qa [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | 질문: TargetUserSync는 어떤 종류의 프로퍼티 동기화 방식입니까? 답변: TargetUserSync는 Sync 프로퍼티 동기화를 좀 더 특정해 최적화하는 방식입니다. 질문: TargetUserSync는 어떤 엔티티의 컴포넌트 프로퍼티만을 대상으로 동기화합니까? 답변: TargetUserSync는 플레이어가 스스로 조작하는 PlayerEntity에 포함된 컴포넌트의 프로퍼티만을 대상으로 동기화합니다. 질문: TargetUserSync 프로퍼티의 값이 변경되었을 때, 서버는 누구에게만 값을 동기화합니까? 답변: 서버는 프 [original] | # 학습 과정 소개 프로퍼티 동기화 방식 중 하나인 TargetUserSync에 대해 알아봅니다. ##### 참고 가이드 * [프로퍼티](/docs/?postId=205) * [프로퍼티 동기화](/docs/?postId=208) * [서버와 클라이언트](/docs/?postId=207) # TargetUserSync 알아보기 TargetUserSync는 Sync 프로퍼티 동기화를 좀 더 특정해 최적화하는 방식입니다. TargetUserSync는 플레이어가 스스로 조작하는 PlayerEntity에 포함된 컴포넌트의 프로퍼티만을 [chunk_id] | Guides:1119:0
[task] | distill [title] | LocaleDataSet [category] | Guides [rephrased] | # LocaleDataSet `LocaleDataSet`은 게임 내 텍스트를 관리하는 데이터셋입니다. 모든 셀 데이터는 `string` 타입으로 저장됩니다. ## 1. 데이터 구조 * **고정 컬럼 (삭제 불가)** * `Key`: 고유 식별자. 중복 불가. * `Source`: 원본 언어/내용. * `Note`: 번역자에게 제공할 추가 정보. * **동적 컬럼**: 번역 대상 언어 코드 (예: en, ko 등). ## 2. 데이터 입력 및 연동 (Import/Export) 외부 데이터 [original] | ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/custom/1120/Doc_1120_2_ko.png "LocaleDataSet") | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합니다. 기본 고정 컬럼 셀은 삭제가 불가능합니다 <ul><li>**Key**: 식별자 키입니다. 중복된 Key를 사용할 수 없습니다.</li><li>**Source**: 원본 언어, 원본 내용</li><li>**Note**: 번역자에게 [chunk_id] | Guides:1120:1
[task] | knowledge_list [title] | 특정 월드 인스턴스로 워프하기 [category] | Guides [rephrased] | ```lua -- 이 블록은 문서에 포함된 핵심 사실만 추출하여 정리한 목록입니다. local keyFacts = { "WorldInstanceService는 현재 월드 인스턴스 Id와 생성된 다른 월드 인스턴스들의 상태를 조회하는 데 사용됩니다.", "TeleportService는 플레이어를 특정 월드 인스턴스로 워프시키는 데 사용됩니다.", "WorldInstanceId는 월드 인스턴스가 생성될 때 발급되는 고유한 값으로, 월드 인스턴스를 구분하기 위해 사용됩니다.", "WorldInstanceSer [original] | # 학습 과정 소개 `WorldInstanceService`를 활용해 현재 월드 인스턴스Id와 생성된 다른 월드 인스턴스들의 상태를 알 수 있습니다. 또한 `TeleportService`를 활용해 플레이어를 특정 월드 인스턴스로 워프시킬 수 있습니다. ##### 참고 가이드 [월드 인스턴스](/docs/?postId=984) [월드 인스턴스 통신](d/ocs/?postId=999) [월드 워프하기](/docs/?postId=743) ##### 참고 APIReference [TeleportService](/apiReference? [chunk_id] | Guides:1122:0
[task] | diverse_qa [title] | LocaleDataSet [category] | Guides [rephrased] | 질문: LocaleDataSet에서 "Key" 컬럼의 역할은 무엇이며, 어떤 제약이 있나요? 답변: Key는 식별자 키 역할을 하며, 중복된 Key를 사용할 수 없습니다. 질문: LocaleDataSet의 셀에 입력한 데이터 값은 어떤 데이터 타입으로 저장되나요? 답변: 입력한 데이터 값은 모두 스트링(string)으로 저장됩니다. 질문: "Default" 타입의 LocaleDataSet에서 "열 추가 버튼"을 눌렀을 때 어떤 기능이 활성화되나요? 답변: 번역할 언어를 선택해 언어 코드를 추가할 수 있는 기능이 활성화됩니다. [original] | ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/custom/1120/Doc_1120_2_ko.png "LocaleDataSet") | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합니다. 기본 고정 컬럼 셀은 삭제가 불가능합니다 <ul><li>**Key**: 식별자 키입니다. 중복된 Key를 사용할 수 없습니다.</li><li>**Source**: 원본 언어, 원본 내용</li><li>**Note**: 번역자에게 [chunk_id] | Guides:1120:1
[task] | distill [title] | 특정 월드 인스턴스로 워프하기 [category] | Guides [rephrased] | **TeleportService**의 `WarpUserToWorldInstanceAndWait()`와 `WorldUserToWorldInstanceAsync()`를 사용하여 유저를 다른 **WorldInstanceId**로 워프합니다. ### 핵심 요구사항 및 규칙 * **필수 정보**: 워프 대상 유저의 `UserId`, 목적지 `WorldInstanceId`. * **정보 조회**: 최신 `WorldInstanceInfo`는 `WorldInstanceService`의 `GetWorldInstanceInfoPagesAnd [original] | **TeleportService**의 `WarpUserToWorldInstanceAndWait()`, `WorldUserToWorldInstanceAsync()` 함수를 활용해 유저를 다른 월드 인스턴스로 워프시킬 수 있습니다. 플레이어를 워프시키기 위해선 워프시킬 유저의 **UserId**와 워프할 월드 인스턴스의 **WorldInstanceId**가 필요합니다. 플레이어가 워프를 시도하는 시점의 최신 월드 인스턴스들의 정보를 조회해 다른 월드 인스턴스로 이동할 수 있습니다. 이동 시 필요한 최신 WorldInstanceIn [chunk_id] | Guides:1122:1
[task] | knowledge_list [title] | 특정 월드 인스턴스로 워프하기 [category] | Guides [rephrased] | 1. `_WorldInstanceService:GetWorldInstanceInfoPagesAndWait()` 함수를 호출하면 월드 인스턴스 정보를 페이지 단위로 조회할 수 있으며, 반환값으로 `result`와 `pages` 객체를 받습니다. 2. `pages:GetCurrentPageDatas()` 메서드는 현재 페이지에 포함된 월드 인스턴스 데이터 목록을 반환하며, 각 데이터에는 `Id` 프로퍼티가 포함되어 있습니다. 3. `pages.IsLastPage` 프로퍼티는 현재 페이지가 마지막 페이지인지 여부를 나타내며, `true` [original] | `GetWorldInstanceInfoPagesAndWait()` 함수를 활용해 월드 인스턴스 정보를 페이지 단위로 조회하는 예제입니다. ```lua local result, pages = _WorldInstanceService:GetWorldInstanceInfoPagesAndWait() while true do --GetCurrentPageDatas()로 현재 페이지의 목록을 가져올 수 있습니다. local datas = pages:GetCurrentPageDatas() [chunk_id] | Guides:1122:2
[task] | knowledge_list [title] | LocaleDataSet [category] | Guides [rephrased] | 제공된 문서의 정보를 바탕으로 추출한 핵심 사실 목록입니다. * **LocaleDataSet 구조**: `Key`(중복 불가 식별자), `Source`(원본 언어/내용), `Note`(번역자용 추가 정보)로 구성된 고정 컬럼 셀이 기본으로 존재하며, 이 고정 컬럼은 삭제할 수 없습니다. * **데이터 저장 형식**: LocaleDataSet의 각 셀에 입력된 데이터 값은 모두 문자열(`string`) 타입으로 저장됩니다. * **행 및 열 추가 기능**: '행 추가 버튼'은 행 끝에 새로운 행을 추가하며, '열 추가 버 [original] | ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/custom/1120/Doc_1120_2_ko.png "LocaleDataSet") | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합니다. 기본 고정 컬럼 셀은 삭제가 불가능합니다 <ul><li>**Key**: 식별자 키입니다. 중복된 Key를 사용할 수 없습니다.</li><li>**Source**: 원본 언어, 원본 내용</li><li>**Note**: 번역자에게 [chunk_id] | Guides:1120:1
[task] | extract_knowledge [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | # TargetUserSync 프로퍼티 동기화 ## 1. 개념 설명 `TargetUserSync`는 `Sync` 프로퍼티 동기화를 특정 대상에게만 제한하여 최적화하는 방식입니다. 이 방식은 플레이어가 직접 조작하는 `PlayerEntity`에 포함된 컴포넌트의 프로퍼티에만 적용됩니다. 서버에서 프로퍼티 값이 변경되면, 해당 `PlayerEntity`를 조작할 수 있는 유저(즉, 해당 플레이어 본인)에게만 변경된 값이 동기화됩니다. 따라서 다른 유저의 정보를 실시간으로 참조하거나 처리할 필요가 없는 개인의 데이터(예: 개인 재화 [original] | # 학습 과정 소개 프로퍼티 동기화 방식 중 하나인 TargetUserSync에 대해 알아봅니다. ##### 참고 가이드 * [프로퍼티](/docs/?postId=205) * [프로퍼티 동기화](/docs/?postId=208) * [서버와 클라이언트](/docs/?postId=207) # TargetUserSync 알아보기 TargetUserSync는 Sync 프로퍼티 동기화를 좀 더 특정해 최적화하는 방식입니다. TargetUserSync는 플레이어가 스스로 조작하는 PlayerEntity에 포함된 컴포넌트의 프로퍼티만을 [chunk_id] | Guides:1119:0
[task] | wikipedia [title] | TargetUserSync와 프로퍼티 동기화 최적화 [category] | Guides [rephrased] | # TargetUserSync와 프로퍼티 동기화 최적화 본 가이드는 메이플스토리 월드(MapleStory Worlds) 스크립트 언어 mLua에서 제공하는 프로퍼티 동기화 방식 중 하나인 `TargetUserSync`의 동작 원리, 적용 범위, 그리고 `Sync` 방식과의 차이점을 설명합니다. `TargetUserSync`는 서버와 클라이언트 간 데이터 전달을 최소화하여 성능을 최적화하기 위한 메커니즘입니다. ## 개념 및 적용 범위 `TargetUserSync`는 일반적인 `Sync` 프로퍼티 동기화를 특정 대상으로 제한하여 [original] | # 학습 과정 소개 프로퍼티 동기화 방식 중 하나인 TargetUserSync에 대해 알아봅니다. ##### 참고 가이드 * [프로퍼티](/docs/?postId=205) * [프로퍼티 동기화](/docs/?postId=208) * [서버와 클라이언트](/docs/?postId=207) # TargetUserSync 알아보기 TargetUserSync는 Sync 프로퍼티 동기화를 좀 더 특정해 최적화하는 방식입니다. TargetUserSync는 플레이어가 스스로 조작하는 PlayerEntity에 포함된 컴포넌트의 프로퍼티만을 [chunk_id] | Guides:1119:0