[task] | distill [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # LiteInventory 스크립트 가이드 `DataStorageService`를 활용하여 경량 인벤토리를 구현하는 예제입니다. ## 1. 컴포넌트 설정 1. 새 스크립트 컴포넌트 **LiteInventory** 생성. 2. `DefaultPlayer`에 해당 컴포넌트 추가. 3. 아래 프로퍼티 추가: ```lua Property: [Sync] boolean IsInitialized = false ``` ## 2. 초기화 로직 (`OnBeginPlay`) 서버에서 실행되며, `UserItemDataSet` 행 수만큼 인벤토 [original] | 인벤토리의 동작을 제어할 인벤토리 스크립트를 작성합니다. 1. 새 스크립트 컴포넌트를 생성하고 이름을 **LiteInventory**로 설정합니다. 2. **Workspace - DefaultPlayer**의 콘텍스트 메뉴에서 **Add Component**를 클릭한 후 **LiteInventory** 컴포넌트를 추가합니다. 3. **LiteInventory** 스크립트를 열고 스크립트 에디터에서 프로퍼티를 추가합니다. ```lua Property: [Sync] boolean IsInitialize [chunk_id] | Guides:942:1
[task] | distill [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | ```lua Property: SyncTable<number> AllItemCounts ``` `LiteInventory`의 `OnBeginPlay()`에서 `OnInventoryInitialized()` 이벤트를 생성하고, `self._T.inventoryData`를 `initEvent.AllItemCounts`에 매핑합니다. 이후 `userDataStorage`를 저장하고, `SendInitializedEvent(initEvent)`를 호출한 뒤 `self.IsInitialized = true`로 설정합니다. ```lua l [original] | 6. **OnInventoryInitialized** 스크립트를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. 프로퍼티 타입으로 SyncTable\<v>를 선택하고, v를 **number**로 설정하면 됩니다. ```lua Property: SyncTable<number> AllItemCounts ``` 7. 다시 **LiteInventory** 스크립트로 돌아갑니다. 이제 인벤토리 UI에 로드된 데이터를 전달해야 합니다. 위에서 작성한 `OnBeginPlay()` 함수에 아래 내용을 추가합니다 [chunk_id] | Guides:942:2
[task] | knowledge_list [title] | 범용 리소스 모음 [category] | Guides [rephrased] | 제시된 원문은 메이플스토리 월드의 '메이커 사용 범용 리소스 모음'으로, 특정 효과음 및 아바타 리소스의 이름과 RUID(Resource Unique ID) 매핑 정보를 제공합니다. 원문에는 mLua 스크립트 코드, API 함수 명세(매개변수, 반환 타입), 또는 서버/클라이언트 실행 공간 제약 사항에 대한 기술적 정보가 포함되어 있지 않습니다. 따라서 요청하신 'API 이름·매개변수·반환 타입·동기화/서버·클라이언트 제약'에 해당하는 기술적 사실은 원문에 존재하지 않으므로, 해당 제약 조건을 명시할 수 없습니다. 원문에 명시된 [original] | | 항목 | 설명 | RUID | | --- | --- | --- | | @cols=1:@rows=2:점프 효과음 | 기본 점프 효과음 |d881a73a0700404a91bcf753474274c3 | | 귀여운 기본 점프 효과음 |dfca55f443464fd5801952efeb50d819 | | @cols=1:@rows=4:버튼 효과음 | 기본 버튼 효과음 | 7eda004ded944e459f1fbb16c7f0f3f4 | | 기본 버튼 효과음2 | cd0bd46d7f454640b82c9dfff0c6677b | | 버튼 클릭 [chunk_id] | Guides:936:1
[task] | distill [title] | 범용 리소스 모음 [category] | Guides [rephrased] | # 메이커 사용 범용 리소스 모음 메이플스토리 월드 원작 리소스는 **Preset List**, **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 접근 가능합니다. 원작 리소스의 방대함으로 인해 검색이 어려울 수 있으므로, 아래에 자주 사용되는 리소스의 RUID를 정리했습니다. ## 1. 스프라이트 ### 일반 | 항목 | RUID | | :--- | :--- | | 레벨 업 | `486a0ba11a6c474a81d13641876f8808` | | 동색 메소 | `a724200c454c4fcf878b0a3cdbb7 [original] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록 [chunk_id] | Guides:936:0
[task] | knowledge_list [title] | 범용 리소스 모음 [category] | Guides [rephrased] | 제시된 문서에는 스크립트 언어 `mLua`의 API(함수, 프로퍼티, 이벤트)에 대한 기술적 정의(매개변수, 반환 타입, 동기화/서버·클라이언트 제약)가 포함되어 있지 않습니다. 해당 문서는 크리에이터가 사용할 수 있는 **게임 에셋(스프라이트, 오디오)의 RUID(리소스 고유 식별자) 목록**을 제공하기 위한 가이드입니다. 따라서 요청하신 "API 이름·매개변수·반환 타입·동기화/서버·클라이언트 제약"에 대한 정보는 원문에 존재하지 않으므로, **존재하지 않는 사실을 지어내지 않는 원칙**에 따라 API 기술 사항 대신 문서에 [original] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록 [chunk_id] | Guides:936:0
[task] | wikipedia [title] | 캐릭터가 발사체로 몬스터 공격하기 [category] | Guides [rephrased] | # 원거리 발사체로 몬스터 처치하기: 캐릭터가 발사체로 몬스터 공격하기 본 문서는 메이플스토리 월드(MapleStory Worlds)의 응용 제작 가이드 중 '원거리 발사체로 몬스터 처치하기' 시리즈의 두 번째 편입니다. 전편인 '원거리 발사체 만들기'를 통해 발사체 모델을 생성하고 기본 동작을 구현한 상태에서, 이제 캐릭터가 공격 키를 입력할 때 발사체를 발사하여 몬스터를 타격하고 데미지를 입히는 로직을 구현하는 과정을 다룹니다. ## 공격 키 입력 시 발사체 발사 로직 구현 캐릭터가 공격 키를 누르면 발사체가 발사되도록 ` [original] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [원거리 발사체 만들기](/docs?postId=935) > **▶ 2편.** [**캐릭터가 발사체로 몬스터 공격하기**](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어보는 마지막 과정입니다. 이제 캐릭터가 발사체로 몬스터를 공격하도록 만들어봅시다. # 공격 키 누르면 발사체 날리기 1. **PlayerAttack** 스크립트를 열고 아래와 같이 프로퍼티를 추가합니다. ```lua Prop [chunk_id] | Guides:937:0
[task] | knowledge_list [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 제시된 문서(6~10단계)에 포함된 핵심 사실만 추출하여 정리한 목록입니다. * `OnInventoryInitialized` 스크립트에는 `SyncTable<number>` 타입의 프로퍼티 `AllItemCounts`를 추가하여, 동기화된 테이블 형태로 아이템 개수 데이터를 저장하도록 구성합니다. * `LiteInventory` 스크립트의 `OnBeginPlay()` 함수 내부에서는 `OnInventoryInitialized()`를 호출하여 생성된 `initEvent` 객체의 `AllItemCounts` 프로퍼티에 `sel [original] | 6. **OnInventoryInitialized** 스크립트를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. 프로퍼티 타입으로 SyncTable\<v>를 선택하고, v를 **number**로 설정하면 됩니다. ```lua Property: SyncTable<number> AllItemCounts ``` 7. 다시 **LiteInventory** 스크립트로 돌아갑니다. 이제 인벤토리 UI에 로드된 데이터를 전달해야 합니다. 위에서 작성한 `OnBeginPlay()` 함수에 아래 내용을 추가합니다 [chunk_id] | Guides:942:2
[task] | diverse_qa [title] | 범용 리소스 모음 [category] | Guides [rephrased] | 질문: 메이플스토리 월드 메이커에서 '기본 점프 효과음'의 RUID는 무엇인가요? 답변: 기본 점프 효과음의 RUID는 d881a73a0700404a91bcf753474274c3 입니다. 질문: '귀여운 기본 점프 효과음'의 RUID를 알려주세요. 답변: 귀여운 기본 점프 효과음의 RUID는 dfca55f443464fd5801952efeb50d819 입니다. 질문: 버튼 효과음 카테고리에 포함된 RUID 목록이 모두 맞는지 확인해주세요. 1. 7eda004ded944e459f1fbb16c7f0f3f4 2. cd0bd46d7f45 [original] | | 항목 | 설명 | RUID | | --- | --- | --- | | @cols=1:@rows=2:점프 효과음 | 기본 점프 효과음 |d881a73a0700404a91bcf753474274c3 | | 귀여운 기본 점프 효과음 |dfca55f443464fd5801952efeb50d819 | | @cols=1:@rows=4:버튼 효과음 | 기본 버튼 효과음 | 7eda004ded944e459f1fbb16c7f0f3f4 | | 기본 버튼 효과음2 | cd0bd46d7f454640b82c9dfff0c6677b | | 버튼 클릭 [chunk_id] | Guides:936:1
[task] | extract_knowledge [title] | 범용 리소스 모음 [category] | Guides [rephrased] | # 메이커 사용 범용 리소스 ## 개념 설명 메이플스토리 월드 메이커에서는 개발자가 직접 제작하지 않고 즉시 사용할 수 있는 기본 리소스가 제공됩니다. 이 리소스들은 특정 고유 식별자(RUID)를 통해 참조되며, 주로 게임 플레이에 필요한 효과음(SFX), 배경음악(BGM), 그리고 시각적 요소(아바타 스킨)로 구성됩니다. ## API 및 리소스 사용법 리소스는 각 항목에 할당된 **RUID** 값을 이용하여 프로젝트 내에서 참조합니다. 아래 표에 나와 있는 RUID는 해당 리소스를 식별하는 고유 ID입니다. ### 1. 효과 [original] | | 항목 | 설명 | RUID | | --- | --- | --- | | @cols=1:@rows=2:점프 효과음 | 기본 점프 효과음 |d881a73a0700404a91bcf753474274c3 | | 귀여운 기본 점프 효과음 |dfca55f443464fd5801952efeb50d819 | | @cols=1:@rows=4:버튼 효과음 | 기본 버튼 효과음 | 7eda004ded944e459f1fbb16c7f0f3f4 | | 기본 버튼 효과음2 | cd0bd46d7f454640b82c9dfff0c6677b | | 버튼 클릭 [chunk_id] | Guides:936:1
[task] | distill [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | ### 인벤토리 저장 및 아이템 변경 로직 **1. 주기적 저장 (300초)** `_DataStorageService` 호출 빈도가 높으면 서버 부하 및 DB 제약이 발생할 수 있으므로, 데이터 유실 위험과 부하를 고려해 적절한 주기(예: 300초)를 설정해야 합니다. ```lua local saveInventory = function() local dataConcatString = table.concat(self._T.inventoryData, ",") self._T.userDataStorage:SetAsync( [original] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self. [chunk_id] | Guides:942:3
[task] | extract_knowledge [title] | 원거리 발사체 만들기 [category] | Guides [rephrased] | # 원거리 발사체의 폭발 공격 구현 ## 1. 개념 설명 원거리 발사체가 목표물에 도달하거나 수명이 다할 때 폭발 이펙트를 재생하고, 해당 이펙트의 시각적 크기를 기반으로 실제 공격 판정 영역(Shape)을 계산하여 몬스터에게 피해를 주는 로직입니다. 이 프로세스는 다음과 같은 단계를 포함합니다: 1. **자원 로드**: 폭발 이펙트(`Sprite`)의 리소스를 비동기로 로드합니다. 2. **크기 및 위치 계산**: 첫 번째 프레임의 픽셀 크기, `PixelPerUnit(PPU)`, 피벗(Pivot) 위치를 이용해 월드 좌 [original] | 완성된 `Explode()` 함수 전체는 아래와 같습니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not isvalid(self.Firer) and n [chunk_id] | Guides:935:4
[task] | wikipedia [title] | 범용 리소스 모음 [category] | Guides [rephrased] | # 메이플스토리 월드 범용 리소스 모음 메이플스토리 월드(MapleStory Worlds)는 원작 게임의 방대한 양의 리소스를 제공하며, 크리에이터들은 이를 **Preset List**, **리소스 스토리지**, 그리고 **MSW 리소스 조회 페이지**를 통해 활용할 수 있습니다. 그러나 원작 리소스의 종류가 매우 다양하고 방대하여 특정 리소스를 찾기가 어려운 경우가 빈번합니다. 본 문서는 크리에이터들이 자주 사용하는 범용 리소스를 소개하여 이러한 문제를 해결하고자 합니다. 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 [original] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록 [chunk_id] | Guides:936:0
[task] | diverse_qa [title] | 범용 리소스 모음 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 크리에이터가 다양한 원작 리소스를 활용할 수 있는 곳은 어디인가요? 답변: 크리에이터는 Preset List, 리소스 스토리지, MSW 리소스 조회 페이지에서 다양한 리소스를 사용할 수 있습니다. 질문: 원작 리소스의 양이 방대하여 원하는 리소스를 찾기 어려운 문제를 해결하기 위해 메이플스토리 월드 팀은 어떤 노력을 기울이고 있나요? 답변: 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있으며, 소개되는 리소스가 앞으로 손쉽게 검색할 수 있도록 개선될 예정입니다. [original] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록 [chunk_id] | Guides:936:0
[task] | wikipedia [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | ## 인벤토리 데이터 저장 및 처리 인벤토리 데이터의 정기적 저장을 위해 300초를 기본 저장 주기로 설정합니다. 저장 주기를 더 짧게 설정하면 데이터 유실 위험은 감소하지만, `_DataStorageService` 호출 빈도가 높아져 서버 부하가 증가하거나 데이터베이스(DB) 저장에 제약이 발생할 수 있으므로 적정 주기를 선정해야 합니다. 아래 코드는 `table.concat` 함수를 사용하여 인벤토리 데이터를 문자열로 변환하고, `_TimerService:SetTimerRepeat`을 통해 지정된 간격으로 저장 함수를 반복 실 [original] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self. [chunk_id] | Guides:942:3
[task] | wikipedia [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | ### 6. `OnInventoryInitialized` 스크립트 프로퍼티 설정 `OnInventoryInitialized` 스크립트를 연 상태에서 프로퍼티를 추가합니다. 프로퍼티의 타입은 `SyncTable<v>`로 선택하고, 제네릭 타입 `v`는 `number`로 설정해야 합니다. 이를 통해 인벤토리 내 각 아이템의 개수를 동기화할 준비를 하게 됩니다. ```lua Property: SyncTable<number> AllItemCounts ``` ### 7. `LiteInventory` 스크립트의 `OnBeginPlay() [original] | 6. **OnInventoryInitialized** 스크립트를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. 프로퍼티 타입으로 SyncTable\<v>를 선택하고, v를 **number**로 설정하면 됩니다. ```lua Property: SyncTable<number> AllItemCounts ``` 7. 다시 **LiteInventory** 스크립트로 돌아갑니다. 이제 인벤토리 UI에 로드된 데이터를 전달해야 합니다. 위에서 작성한 `OnBeginPlay()` 함수에 아래 내용을 추가합니다 [chunk_id] | Guides:942:2
[task] | diverse_qa [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 질문: `OnInventoryInitialized` 스크립트에서 프로퍼티 `AllItemCounts`의 타입은 무엇이며, 제네릭 인자 `v`의 타입은 어떻게 설정해야 하나요? 답변: 프로퍼티 타입은 `SyncTable<number>`이며, 제네릭 인자 `v`의 타입은 `number`로 설정해야 합니다. 질문: `LiteInventory` 스크립트의 `OnBeginPlay()` 함수 내에서 `initEvent`에 인벤토리 데이터를 전달하기 위해 어떤 루프 구조를 사용하나요? 답변: `ipairs(self._T.inventoryDat [original] | 6. **OnInventoryInitialized** 스크립트를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. 프로퍼티 타입으로 SyncTable\<v>를 선택하고, v를 **number**로 설정하면 됩니다. ```lua Property: SyncTable<number> AllItemCounts ``` 7. 다시 **LiteInventory** 스크립트로 돌아갑니다. 이제 인벤토리 UI에 로드된 데이터를 전달해야 합니다. 위에서 작성한 `OnBeginPlay()` 함수에 아래 내용을 추가합니다 [chunk_id] | Guides:942:2
[task] | knowledge_list [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 제시된 문서 내용 기반 핵심 사실 목록입니다. 1. 인벤토리 데이터 정기 저장 주기는 예제에서 300초로 설정되었으며, 주기를 더 짧게 설정하면 데이터 유실 위험은 줄지만 `_DataStorageService` 호출 빈도 증가로 인한 부하 및 DB 저장 제약 문제가 발생할 수 있으므로 적정 주기를 설정해야 합니다. 2. 정기 저장 로직은 `saveInventory` 함수에서 `self._T.inventoryData` 테이블의 요소를 쉼표로 연결하여 문자열(`dataConcatString`)로 변환한 뒤, `self._T.userD [original] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self. [chunk_id] | Guides:942:3
[task] | wikipedia [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # LiteInventory 컴포넌트 작성 가이드 본 섹션은 메이플스토리 월드에서 인벤토리 동작을 제어하기 위한 `LiteInventory` 스크립트 컴포넌트를 생성하고 초기화 로직을 구현하는 과정을 설명합니다. 이 가이드는 `DataStorageService`를 활용하여 플레이어의 아이템 데이터를 서버에서 로드하고 클라이언트로 전달하는 가벼운 인벤토리 시스템의 구현 방식을 다룹니다. ## 1. 컴포넌트 생성 및 추가 새로운 스크립트 컴포넌트를 생성하고 이름을 `LiteInventory`로 설정합니다. 이후 에디터의 Works [original] | 인벤토리의 동작을 제어할 인벤토리 스크립트를 작성합니다. 1. 새 스크립트 컴포넌트를 생성하고 이름을 **LiteInventory**로 설정합니다. 2. **Workspace - DefaultPlayer**의 콘텍스트 메뉴에서 **Add Component**를 클릭한 후 **LiteInventory** 컴포넌트를 추가합니다. 3. **LiteInventory** 스크립트를 열고 스크립트 에디터에서 프로퍼티를 추가합니다. ```lua Property: [Sync] boolean IsInitialize [chunk_id] | Guides:942:1
[task] | extract_knowledge [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # 1. 경량 인벤토리(LiteInventory) 구현 본 절에서는 `DataStorageService`를 활용하여 플레이어별 아이템 데이터를 저장 및 로드하는 경량 인벤토리 스크립트 `LiteInventory`를 작성하는 방법을 다룹니다. ## 1.1 개념 및 구조 경량 인벤토리는 월드 내 특정 캐릭터가 보유한 아이템 정보를 해당 캐릭터의 클라이언트와 서버만 공유하는 수준의 데이터 관리 방식입니다. `ItemService` 대신 `DataStorageService`를 사용하여 데이터를 저장하고, 서버에서 데이터를 로드한 후 [original] | 인벤토리의 동작을 제어할 인벤토리 스크립트를 작성합니다. 1. 새 스크립트 컴포넌트를 생성하고 이름을 **LiteInventory**로 설정합니다. 2. **Workspace - DefaultPlayer**의 콘텍스트 메뉴에서 **Add Component**를 클릭한 후 **LiteInventory** 컴포넌트를 추가합니다. 3. **LiteInventory** 스크립트를 열고 스크립트 에디터에서 프로퍼티를 추가합니다. ```lua Property: [Sync] boolean IsInitialize [chunk_id] | Guides:942:1
[task] | distill [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | **1. 아이템 개수 수정 로직 (`ModifyItem`)** `[server only]` 영역에서 `ModifyItem(itemIndex, deltaAmount)` 메서드를 구현합니다. * **검증**: `itemIndex`가 `1`부터 `#self._T.inventoryData` 범위 내에 있는지 확인. * **계산**: 기존 수량(`prevAmount`) + 증감값(`deltaAmount`)을 계산. * **제약**: 결과가 `0` 미만이면 `0`으로 고정 및 `log_error` 기록. * **적용**: 검증된 [original] | ```lua [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local [chunk_id] | Guides:942:4
[task] | extract_knowledge [title] | 캐릭터가 발사체로 몬스터 공격하기 [category] | Guides [rephrased] | # 캐릭터가 발사체로 몬스터 공격하기 본 절에서는 캐릭터가 공격 키를 입력하면 발사체를 생성하여 몬스터를 타격하는 로직을 구현하는 방법을 다룹니다. 구현은 서버에서 발사체 생성과 피해 계산이 이루어지도록 구성되어 있습니다. ## 1. 개념 설명 캐릭터의 공격 동작은 `PlayerAttack` 컴포넌트를 통해 제어됩니다. 플레이어의 조작 입력(`LookDirectionX`)에 따라 발사체의 방향이 결정되며, `_SpawnService`를 사용하여 발사체 엔티티를 생성합니다. 생성된 발사체는 `Projectile` 컴포넌트를 통해 [original] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [원거리 발사체 만들기](/docs?postId=935) > **▶ 2편.** [**캐릭터가 발사체로 몬스터 공격하기**](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어보는 마지막 과정입니다. 이제 캐릭터가 발사체로 몬스터를 공격하도록 만들어봅시다. # 공격 키 누르면 발사체 날리기 1. **PlayerAttack** 스크립트를 열고 아래와 같이 프로퍼티를 추가합니다. ```lua Prop [chunk_id] | Guides:937:0
[task] | diverse_qa [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 질문: 인벤토리 스크립트 컴포넌트의 이름을 무엇으로 설정해야 하나요? 답변: 인벤토리 스크립트 컴포넌트의 이름은 **LiteInventory**로 설정해야 합니다. 질문: **LiteInventory** 컴포넌트를 플레이어에 추가하기 위해 어떤 경로로 접근해야 하나요? 답변: **Workspace - DefaultPlayer**의 콘텍스트 메뉴에서 **Add Component**를 클릭한 후 **LiteInventory** 컴포넌트를 추가합니다. 질문: 아래 코드는 어떤 프로퍼티를 정의하고 있으며, 동기화 설정은 어떻게 되어 있 [original] | 인벤토리의 동작을 제어할 인벤토리 스크립트를 작성합니다. 1. 새 스크립트 컴포넌트를 생성하고 이름을 **LiteInventory**로 설정합니다. 2. **Workspace - DefaultPlayer**의 콘텍스트 메뉴에서 **Add Component**를 클릭한 후 **LiteInventory** 컴포넌트를 추가합니다. 3. **LiteInventory** 스크립트를 열고 스크립트 에디터에서 프로퍼티를 추가합니다. ```lua Property: [Sync] boolean IsInitialize [chunk_id] | Guides:942:1
[task] | diverse_qa [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 질문: 문서에서 설정된 인벤토리 정보 저장 주기는 몇 초입니까? 답변: 문서에서는 저장 주기를 300초로 설정하였습니다. 질문: 저장 주기를 더 짧게 설정하면 어떤 위험이 줄어들지만, 어떤 문제가 발생할 수 있습니까? 답변: 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들지만, `_DataStorageService`를 불필요하게 자주 호출하여 부하가 발생할 수 있고 추후 DB 저장에 제약이 생길 수 있습니다. 질문: 아래 코드의 역할은 무엇이며, 어떤 서비스를 사용합니까? ```lua local data [original] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self. [chunk_id] | Guides:942:3
[task] | diverse_qa [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 질문: `ModifyItem` 함수에서 `itemIndex`가 `1`보다 작거나 `inventoryData`의 크기(`#self._T.inventoryData`)보다 클 때 어떤 처리가 이루어집니까? 답변: `log_error("itemIndex error")`를 출력하고 함수를 즉시 종료(return)합니다. 질문: `ModifyItem` 함수에서 계산된 `amountResult`가 0보다 작을 경우 어떻게 처리됩니까? 답변: `log_error("Item amount is less then zero")`를 출력하고, `amou [original] | ```lua [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local [chunk_id] | Guides:942:4
[task] | knowledge_list [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | ```lua [server only] void ModifyItem(number itemIndex, number deltaAmount) { if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end local prevAmount = self._T.inventoryData[itemIndex] local amountResult = prevAmount + [original] | ```lua [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local [chunk_id] | Guides:942:4
[task] | extract_knowledge [title] | 범용 리소스 모음 [category] | Guides [rephrased] | # 메이플스토리 월드 범용 리소스 활용 메이플스토리 월드(MSW)는 원작 게임의 스프라이트와 오디오 리소스를 제공합니다. 크리에이터는 **Preset List**, **리소스 스토리지**, 또는 **MSW 리소스 조회 페이지**를 통해 특정 리소스를 식별하는 고유 ID인 **RUID(Resource Unique ID)**를 확인하고 프로젝트에 적용할 수 있습니다. ## 개념 설명 * **RUID**: MSW에서 개별 리소스(스프라이트, 모델, 오디오 등)를 고유하게 식별하는 문자열 ID입니다. * **범용 리소스**: [original] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록 [chunk_id] | Guides:936:0
[task] | knowledge_list [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 제시된 문서의 내용을 바탕으로 추출한 핵심 사실 목록입니다. 1. `RemoveItem()` 함수는 `LiteInventory` 컴포넌트에 추가되며, 실행 공간은 `[server only]`로 설정되어야 합니다. 2. `RemoveItem()` 함수의 매개변수는 `number` 타입의 `itemIndex`이며, 반환 타입은 `void`입니다. 3. `RemoveItem()` 함수 내에서 `itemIndex`가 1 미만 또는 `self._T.inventoryData`의 길이보다 크면 `log_error("itemIndex error [original] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터가 게임에 새로 접속할 때마다 인벤토리를 비우도록 설정해 봅시다. 1. 아이템 삭제를 처리하기 위해 **LiteInventory**에 `RemoveItem()` 함수를 추가합니다. 실행 공간은 **server only**로 설정합니다. 매개 변수로 **number** 타입의 **itemIndex**를 추가합니다. 그리고 아래와 같이 작성합니다. ```lua [server only] void RemoveItem(number itemIndex) { [chunk_id] | Guides:942:5
[task] | distill [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터 접속 시 인벤토리를 초기화합니다. ## 1. LiteInventory에 `RemoveItem()` 추가 **LiteInventory** 컴포넌트에 **server only** 실행 공간의 `RemoveItem()` 메서드를 추가합니다. * **매개변수**: `itemIndex` (number) * **동작**: 1. `itemIndex`가 `1` 이상이고 `#self._T.inventoryData` 이하인지 검증. 2. 범위 위반 시 `log_error( [original] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터가 게임에 새로 접속할 때마다 인벤토리를 비우도록 설정해 봅시다. 1. 아이템 삭제를 처리하기 위해 **LiteInventory**에 `RemoveItem()` 함수를 추가합니다. 실행 공간은 **server only**로 설정합니다. 매개 변수로 **number** 타입의 **itemIndex**를 추가합니다. 그리고 아래와 같이 작성합니다. ```lua [server only] void RemoveItem(number itemIndex) { [chunk_id] | Guides:942:5
[task] | extract_knowledge [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | # 인벤토리 데이터 저장 및 수정 처리 ## 1. 개념 설명 인벤토리 데이터는 플레이 중 주기적으로 저장되고, 사용자가 게임을 종료할 때 최종 저장되어야 합니다. 또한 아이템 획득 또는 소모 시 아이템 개수(`deltaAmount`)가 변경되는 로직을 처리하는 함수가 필요합니다. ## 2. API 사용법 * **`_DataStorageService`**: 사용자 데이터 저장을 위해 `SetAsync` 또는 `SetAndWait` 메서드를 사용합니다. * `SetAsync`: 비동기 저장. 콜백 함수를 통해 저장 완 [original] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self. [chunk_id] | Guides:942:3
[task] | wikipedia [title] | 인벤토리 스크립트 작성하기 [category] | Guides [rephrased] | 메이플스토리 월드에서 인벤토리 스크립트를 작성할 때, 서버 측에서 아이템 수량을 수정하고 그 변경 사항을 클라이언트에 전달하는 과정은 `ModifyItem` 메서드와 커스텀 이벤트 타입을 통해 이루어집니다. 먼저, 서버에서 실행되는 `[server only]` 메서드인 `ModifyItem`은 아이템 인덱스와 변경될 수량(`deltaAmount`)을 인수로 받아 인벤토리 데이터를 갱신합니다. 이 메서드는 먼저 전달된 `itemIndex`가 1 이상이고 `self._T.inventoryData` 배열의 길이 이하인지 확인합니다. 범 [original] | ```lua [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local [chunk_id] | Guides:942:4