[task] | diverse_qa [title] | AvatarAction Editor [category] | Guides [rephrased] | 질문: AvatarAction JSON 파일에서 `Data` 필드는 어떤 데이터 구조를 가지는가? 답변: `Data` 필드는 AvatarAction 이름을 Key로 갖는 Dictionary입니다. 질문: `Frames` 필드의 역할은 무엇인가? 답변: `Frames` 필드는 프레임 데이터 목록입니다. 질문: 프레임 객체 내 `defined_actionname` 필드가 의미하는 바는 무엇인가? 답변: `defined_actionname`은 정의된 액션 이름입니다. 질문: `framedelay` 필드의 단위는 무엇이며 무엇을 나타 [original] | AvatarAction JSON 파일의 구조는 아래와 같습니다. ```lua { "Data": { "NewAvatarAction": { "Frames": [ { "defined_actionname": "stand1", "frameindex": 0, "framedelay": 0.156, "move_x": 0, "move_y": -1, "rotation": 0, "flip": [chunk_id] | Guides:1402:3
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerControllerComponent 제작 가이드 `PlayerControllerComponent` 대신 월드 특성에 맞는 조작 방식을 구현하기 위해 `CustomPlayerControllerComponent`를 직접 제작하는 방법입니다. ## 1. 기존 컴포넌트 비활성화 (UseCustomScript) `DefaultPlayer`의 기본 `PlayerControllerComponent`를 비활성화하고 커스텀 컴포넌트를 활성화하려면 다음을 수행합니다. 1. `DefaultPlayer`에 제작한 `Custo [original] | PlayerControllerComponent 대신, 크리에이터의 월드 특성에 맞는 조작과 입력 방식을 가진 커스텀 컨트롤러를 직접 만들 수 있습니다. 이 가이드에서는 CustomPlayerControllerComponent를 만드는 예시를 하나 소개합니다. 예시 외에 크리에이터의 의도에 따라 다른 움직임을 구현할 수도 있습니다. ##### 참고 가이드 - [플레이어 설정과 제어](/docs/?postId=547) - [캐릭터 초기 속성 편집](/docs/?postId=48) ### UseCustomScript 사용 Playe [chunk_id] | Guides:1403:0
[task] | diverse_qa [title] | AvatarAction Editor [category] | Guides [rephrased] | 질문: AvatarAction Editor에서 제작한 애니메이션의 변경 사항을 실제 게임에 반영하려면 어떤 조작을 해야 하나요? 답변: 제작한 애니메이션은 반드시 **변경 내용 저장** 버튼을 눌러야 변경 사항이 반영됩니다. 질문: AvatarAction Editor의 '미리보기' 창에서 확인한 PlayType 값이 저장되나요? 답변: 아니요, 미리보기에서 확인하는 PlayType 값은 저장되지 않습니다. 질문: 프레임 편집창에서 애니메이션은 어떤 순서로 재생되며, 재생 방식은 무엇에 의해 결정되나요? 답변: 프레임 편집창의 프 [original] | 새로운 AvatarAction를 생성하고 나만의 애니메이션을 만들 수 있습니다. 제작한 애니메이션은 반드시 **변경 내용 저장**버튼을 눌러야 변경 사항이 반영됩니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1784886390520e79ed180f8ac4c86bf631d0f46bc4403.png "2") | 번호| 이름 | 설명 | | --- | --- | --- | || AvatarAction 목록 | 메이플스토리 월드에서 제공하는 기본 AvatarAction 프 [chunk_id] | Guides:1402:1
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | ```lua [client only] void CacheComponents() { local entity = self.Entity self.StateComponent = entity.StateComponent self.MovementComponent = entity.MovementComponent self.PlayerControllerComponent = entity.PlayerControllerComponent self.RigidbodyComponent = entity.RigidbodyCompo [original] | [client only] void CacheComponents() { local entity = self.Entity self.StateComponent = entity.StateComponent self.MovementComponent = entity.MovementComponent self.PlayerControllerComponent = entity.PlayerControllerComponent self.RigidbodyComponent = entity.RigidbodyCompone [chunk_id] | Guides:1403:3
[task] | wikipedia [title] | AvatarAction Editor [category] | Guides [rephrased] | # 아바타 액션 에디터 (AvatarAction Editor) 아바타 액션 에디터는 메이플스토리 월드에서 캐릭터의 움직임을 정의하고 관리하는 도구입니다. 이 문서에서는 BodyAction을 AvatarStateAnimationComponent에 등록하여 사용하는 방법, PlayRate의 개념, 그리고 BodyAction 및 AvatarAction 데이터의 JSON 구조에 대해 설명합니다. ## BodyAction 등록 및 사용 제작한 BodyAction은 `AvatarStateAnimationComponent` 컴포넌트의 `S [original] | 제작한 BodyAction은 AvatarStateAnimationComponent의 StateToAvatarBodyActionSheet의 **Key**에 등록해 사용해야 합니다. 기본적으로 AvatarStateAnimationComponent에는 메이플스토리 원작과 동일한 움직임을 구현한 Key들이 지정되어 있습니다. 만약 이 기존 Key에서 AvatarBodyAction을 제작한 BodyAction으로 연결할 경우 크리에이터의 예상과 다르게 동작할 수 있습니다. 기본 State와 연결된 BodyAction에 맞는 PlayRate [chunk_id] | Guides:1402:2
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제공된 문서의 내용을 바탕으로 핵심 사실을 추출하여 정리한 목록입니다. 1. `PlayerControllerComponent`를 사용하지 않고 크리에이터의 월드 특성에 맞는 조작 및 입력 방식을 가진 커스텀 컨트롤러를 직접 제작할 수 있습니다. 2. 커스텀 컨트롤러를 사용하려면 `DefaultPlayer`에 제작한 커스텀 컴포넌트를 추가한 후, 기본 `PlayerControllerComponent`의 `UseCustomScript` 프로퍼티를 `true`로 설정해야 합니다. 3. `UseCustomScript` 프로퍼티가 활성화되 [original] | PlayerControllerComponent 대신, 크리에이터의 월드 특성에 맞는 조작과 입력 방식을 가진 커스텀 컨트롤러를 직접 만들 수 있습니다. 이 가이드에서는 CustomPlayerControllerComponent를 만드는 예시를 하나 소개합니다. 예시 외에 크리에이터의 의도에 따라 다른 움직임을 구현할 수도 있습니다. ##### 참고 가이드 - [플레이어 설정과 제어](/docs/?postId=547) - [캐릭터 초기 속성 편집](/docs/?postId=48) ### UseCustomScript 사용 Playe [chunk_id] | Guides:1403:0
[task] | extract_knowledge [title] | AvatarAction Editor [category] | Guides [rephrased] | # AvatarAction JSON 파일 구조 ## 개념 설명 AvatarAction은 아바타의 애니메이션 동작을 정의하는 데이터 파일입니다. 이 파일은 JSON 형식으로 작성되며, 최상위 `Data` 객체 내부에 액션 이름을 키로 하는 딕셔너리 구조를 가집니다. 각 액션은 `Frames` 배열을 포함하며, 이 배열에는 프레임 단위의 시각적 상태 정보와 선택적으로 실행될 이벤트 데이터가 정의됩니다. ## API 사용법 (필드 정의) AvatarAction JSON 파일의 필드와 그 의미는 다음과 같습니다. | 필드 | 설명 | [original] | AvatarAction JSON 파일의 구조는 아래와 같습니다. ```lua { "Data": { "NewAvatarAction": { "Frames": [ { "defined_actionname": "stand1", "frameindex": 0, "framedelay": 0.156, "move_x": 0, "move_y": -1, "rotation": 0, "flip": [chunk_id] | Guides:1402:3
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: PlayerControllerComponent 대신 커스텀 컨트롤러를 직접 만들 때, DefaultPlayer의 기존 PlayerControllerComponent를 비활성화하고 커스텀 컴포넌트를 동작시키기 위해 활성화해야 하는 프로퍼티의 이름은 무엇인가요? 답변: UseCustomScript 프로퍼티를 활성화해야 합니다. 질문: UseCustomScript 프로퍼티를 true로 변경하면 어떤 결과가 발생하나요? 답변: DefaultPlayer에 추가된 PlayerControllerComponent가 비활성화되고, 제작한 [original] | PlayerControllerComponent 대신, 크리에이터의 월드 특성에 맞는 조작과 입력 방식을 가진 커스텀 컨트롤러를 직접 만들 수 있습니다. 이 가이드에서는 CustomPlayerControllerComponent를 만드는 예시를 하나 소개합니다. 예시 외에 크리에이터의 의도에 따라 다른 움직임을 구현할 수도 있습니다. ##### 참고 가이드 - [플레이어 설정과 제어](/docs/?postId=547) - [캐릭터 초기 속성 편집](/docs/?postId=48) ### UseCustomScript 사용 Playe [chunk_id] | Guides:1403:0
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: 문서에 제시된 PlayerController 컴포넌트의 `IsValid` 속성은 어떤 타입이며 기본값은 무엇인가요? 답변: `IsValid` 속성은 `boolean` 타입이며 기본값은 `false`입니다. 질문: `ActionKeys`, `ActionConditions`, `HoldActions` 속성은 모두 어떤 데이터 타입으로 정의되어 있나요? 답변: `ActionKeys`, `ActionConditions`, `HoldActions` 속성은 모두 `table` 타입으로 정의되어 있습니다. 질문: 플레이어의 수평 및 [original] | 필요한 Property를 아래와 같이 작성합니다. ```lua Property: [None] boolean IsValid = false [None] table ActionKeys = {} [None] table ActionConditions = {} [None] table HoldActions = {} [None] table InteractionKeys = {} [None] table InputKeys = {} [None] table PressedKeys = {} [None] number HorizontalInput = 0 [No [chunk_id] | Guides:1403:1
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제공된 문서 원문에 포함된 핵심 사실은 다음과 같습니다. 1. `CacheComponents` 메서드는 `[client only]` 실행 공간 제약이 적용되며, 반환 타입은 `void`입니다. 2. `CacheComponents` 메서드 내부에서 `self.Entity`를 참조하여 `entity` 변수에 할당합니다. 3. `CacheComponents` 메서드에서는 `entity.StateComponent`를 `self.StateComponent`에 할당하여 캐시합니다. 4. `CacheComponents` 메서드에서는 `enti [original] | [client only] void CacheComponents() { local entity = self.Entity self.StateComponent = entity.StateComponent self.MovementComponent = entity.MovementComponent self.PlayerControllerComponent = entity.PlayerControllerComponent self.RigidbodyComponent = entity.RigidbodyCompone [chunk_id] | Guides:1403:3
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 게임 로직 커스텀 PlayerController 만들기 본 가이드는 메이플스토리 월드(mLua) 환경에서 게임 로직 및 시스템 구현을 위해 커스텀 `PlayerController` 컴포넌트를 생성하는 방법을 설명합니다. 커스텀 플레이어 컨트롤러를 구성하기 위해서는 입력 상태, 동작 조건, 그리고 다양한 게임 오브젝트 컴포넌트 참조를 관리하기 위한 속성(Property)을 정의해야 합니다. 아래 코드 블록에 명시된 대로 필요한 속성을 작성합니다. 이 속성들은 모두 `[None]` 동기화 상태로 선언되며, 각각의 역할은 다음과 [original] | 필요한 Property를 아래와 같이 작성합니다. ```lua Property: [None] boolean IsValid = false [None] table ActionKeys = {} [None] table ActionConditions = {} [None] table HoldActions = {} [None] table InteractionKeys = {} [None] table InputKeys = {} [None] table PressedKeys = {} [None] number HorizontalInput = 0 [No [chunk_id] | Guides:1403:1
[task] | extract_knowledge [title] | AvatarAction Editor [category] | Guides [rephrased] | # AvatarAction Editor: BodyAction 등록 및 PlayRate 설정 ## 개념 설명 `AvatarStateAnimationComponent`는 아바타의 상태(State)에 따라 특정 `BodyAction`을 실행하도록 제어하는 컴포넌트입니다. 이 컴포넌트에는 `StateToAvatarBodyActionSheet`라는 데이터 구조가 존재하며, 여기서 상태 이름(Key)과 연결할 `BodyAction`을 매핑합니다. 메이플스토리 원작과 동일한 기본 움직임이 이미 기본 Key에 지정되어 있습니다. 각 기본 S [original] | 제작한 BodyAction은 AvatarStateAnimationComponent의 StateToAvatarBodyActionSheet의 **Key**에 등록해 사용해야 합니다. 기본적으로 AvatarStateAnimationComponent에는 메이플스토리 원작과 동일한 움직임을 구현한 Key들이 지정되어 있습니다. 만약 이 기존 Key에서 AvatarBodyAction을 제작한 BodyAction으로 연결할 경우 크리에이터의 예상과 다르게 동작할 수 있습니다. 기본 State와 연결된 BodyAction에 맞는 PlayRate [chunk_id] | Guides:1402:2
[task] | extract_knowledge [title] | Lazy Map [category] | Guides [rephrased] | # Lazy Map (레이지 맵) ## 1. 개념 설명 Lazy Map은 스크립트의 프로퍼티(Property) 또는 이벤트 핸들러(Event Handler)를 통해 맵 엔티티가 참조될 때만 동적으로 생성되는 맵 메커니즘입니다. 이는 월드 초기화 시 전체 맵을 로드하는 시간을 줄이고, 메모리 사용량을 최적화하기 위한 기법입니다. Lazy Map의 생성 시점은 다음과 같이 두 가지 경우로 나뉩니다. * **월드 초기화 시점:** 정적 맵(Static Map)에 위치한 스크립트가 Lazy Map의 엔티티를 프로퍼티나 이벤트로 [original] | 스크립트의 프로퍼티 또는 이벤트로 참조할 때 동적으로 맵이 생성됩니다. **월드 초기화 시점**: 정적 맵에서 LazyMap의 엔티티를 프로퍼티나 이벤트로 직접 참조하는 스크립트가 있다면, 해당 LazyMap은 서버 초기화 시점에 함께 로드됩니다. **월드 플레이 중**: 월드 플레이 중 LazyMap이 생성될 때 그 안의 참조 대상인 다른 LazyMap도 함께 생성됩니다. 예를 들어 LazyMap1이 생성될 때 LazyMap1에 LazyMap2를 참조하는 프로퍼티나 이벤트를 가진 스크립트가 있다면 LazyMap2도 LazyMa [chunk_id] | Guides:1401:1
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController 만들기 메이플스토리 월드(MapleStory Worlds)에서는 기본 제공되는 `PlayerControllerComponent`를 대체하여, 크리에이터의 월드 특성에 맞춘 조작과 입력 방식을 가진 커스텀 컨트롤러를 직접 개발할 수 있습니다. 이 가이드는 `CustomPlayerControllerComponent`를 구현하는 구체적인 예시를 제시하며, 이 예시를 기반으로 크리에이터의 의도에 따라 다양한 움직임 로직을 변형하여 적용할 수 있습니다. ## 참고 가이드 * [플레이어 설정과 [original] | PlayerControllerComponent 대신, 크리에이터의 월드 특성에 맞는 조작과 입력 방식을 가진 커스텀 컨트롤러를 직접 만들 수 있습니다. 이 가이드에서는 CustomPlayerControllerComponent를 만드는 예시를 하나 소개합니다. 예시 외에 크리에이터의 의도에 따라 다른 움직임을 구현할 수도 있습니다. ##### 참고 가이드 - [플레이어 설정과 제어](/docs/?postId=547) - [캐릭터 초기 속성 편집](/docs/?postId=48) ### UseCustomScript 사용 Playe [chunk_id] | Guides:1403:0
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | **커스텀 PlayerController 초기화** `UseCustomScript`가 `false`이면 초기화를 중단합니다. `LocalPlayer`인 경우에만 키 매핑, Hold 액션 설정, 이벤트 핸들러 등록, 컴포넌트 캐싱을 수행합니다. `StateComponent`의 `HitEventHandler`는 모든 경우 재정의합니다. * **`OnBeginPlay()`**: 초기화 진입점. * **`InitKeys()`**: 액션/상호작용 키 기본 매핑. * **`InitHoldActions()`**: 유지(Hold)되 [original] | 컴포넌트를 초기화할 수 있도록 아래 5가지 메소드를 추가하고, 아래와 같이 작성합니다. `UseCustomScript`가 `false`이면 초기화하지 않으며, LocalPlayer인 경우에만 키 매핑, Hold 액션 설정, 이벤트 핸들러 등록, 컴포넌트 캐싱을 수행합니다. - `OnBeginPlay()`: 컴포넌트 초기화의 진입점으로 키, 핸들러, 컴포넌트를 설정하고 StateComponent의 HitEventHandler를 재정의합니다. - `InitKeys()`: 액션 키와 상호작용 키의 기본 매핑을 등록합니다. - `Init [chunk_id] | Guides:1403:2
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | **게임 로직 커스텀 PlayerController 만들기** 이 가이드는 메이플스토리 월드(mLua) 환경에서 플레이어를 제어하는 커스텀 `PlayerController` 컴포넌트를 제작할 때 필요한 기본 구조와 컴포넌트 캐싱 방법을 설명합니다. mLua 스크립트에서 다른 컴포넌트에 접근할 때는 `GetComponent` 메서드를 사용하지 않고, 엔티티 객체(`Entity`)에 직접 프로퍼티로 접근하는 방식을 사용합니다. 따라서 런타임 성능을 최적화하기 위해, 자주 참조되는 핵심 컴포넌트들은 스크립트 실행 초기 단계에서 로컬 [original] | [client only] void CacheComponents() { local entity = self.Entity self.StateComponent = entity.StateComponent self.MovementComponent = entity.MovementComponent self.PlayerControllerComponent = entity.PlayerControllerComponent self.RigidbodyComponent = entity.RigidbodyCompone [chunk_id] | Guides:1403:3
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제공된 원문에는 `Property` 블록의 정의만 포함되어 있으며, "초기화 메소드" 섹션의 실제 코드나 설명 텍스트는 누락되어 있습니다. 따라서 원문에 명시된 정보(Property 정의)만을 바탕으로 핵심 사실을 정리합니다. ```lua Property: [None] boolean IsValid = false [None] table ActionKeys = {} [None] table ActionConditions = {} [None] table HoldActions = {} [None] table InteractionKeys = [original] | 필요한 Property를 아래와 같이 작성합니다. ```lua Property: [None] boolean IsValid = false [None] table ActionKeys = {} [None] table ActionConditions = {} [None] table HoldActions = {} [None] table InteractionKeys = {} [None] table InputKeys = {} [None] table PressedKeys = {} [None] number HorizontalInput = 0 [No [chunk_id] | Guides:1403:1
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController 만들기 커스텀 PlayerController 컴포넌트를 초기화하기 위해서는 `OnBeginPlay`, `InitKeys`, `InitHoldActions`, `InitEventHandlers`, `CacheComponents`라는 다섯 가지 메서드를 정의해야 합니다. 이 컴포넌트는 `UseCustomScript` 프로퍼티의 값에 따라 동작을 결정하며, 해당 값이 `false`인 경우 초기화 과정을 건너뜁니다. 초기화가 진행되더라도 로컬 플레이어(`LocalPlayer`)인 경우에만 키 매핑 [original] | 컴포넌트를 초기화할 수 있도록 아래 5가지 메소드를 추가하고, 아래와 같이 작성합니다. `UseCustomScript`가 `false`이면 초기화하지 않으며, LocalPlayer인 경우에만 키 매핑, Hold 액션 설정, 이벤트 핸들러 등록, 컴포넌트 캐싱을 수행합니다. - `OnBeginPlay()`: 컴포넌트 초기화의 진입점으로 키, 핸들러, 컴포넌트를 설정하고 StateComponent의 HitEventHandler를 재정의합니다. - `InitKeys()`: 액션 키와 상호작용 키의 기본 매핑을 등록합니다. - `Init [chunk_id] | Guides:1403:2
[task] | extract_knowledge [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # PlayerController 커스텀: 컴포넌트 캐싱 ## 개념 설명 메이플스토리 월드에서 플레이어의 이동 및 조작 로직을 커스텀하기 위해 `PlayerController` 관련 컴포넌트를 직접 제어해야 할 경우가 있습니다. 이 과정에서 매 프레임마다 엔티티의 컴포넌트를 다시 참조하는 것은 비효율적일 수 있으므로, 초기화 시점에 필요한 컴포넌트 참조를 로컬 변수에 저장(캐싱)하는 것이 일반적입니다. ## API 사용법 `CacheComponents` 메서드를 통해 `self.Entity`에서 특정 컴포넌트를 추출하여 `sel [original] | [client only] void CacheComponents() { local entity = self.Entity self.StateComponent = entity.StateComponent self.MovementComponent = entity.MovementComponent self.PlayerControllerComponent = entity.PlayerControllerComponent self.RigidbodyComponent = entity.RigidbodyCompone [chunk_id] | Guides:1403:3
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | #### 핸들러 메소드 기존 `HitEventHandler`를 제거하고, `HitEvent` 발생 시 `StateComponent` 상태를 `"HIT"`로 변경하는 커스텀 핸들러를 등록합니다. ```lua Method: [client only] void InitStateComponentEventHandler() { local stateComponent = self.Entity.StateComponent if stateComponent == nil then return end s [original] | #### 핸들러 메소드 HitEvent 발생 시 StateComponent의 상태를 "HIT"로 변경할 수 있도록 기존 HitEventHandler를 제거하고 커스텀 핸들러를 등록합니다. ```lua Method: [client only] void InitStateComponentEventHandler() { local stateComponent = self.Entity.StateComponent if stateComponent == nil then return end stat [chunk_id] | Guides:1403:4
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: `OnBeginPlay()` 메소드가 컴포넌트 초기화를 수행하지 않고 즉시 종료되는 조건은 무엇인가요? 답변: `entity.PlayerControllerComponent.UseCustomScript`의 값이 `false`인 경우입니다. 질문: `OnBeginPlay()`에서 `self.IsValid`가 `true`로 설정되고 키 매핑 및 이벤트 핸들러 등록이 수행되는 대상은 누구인가요? 답변: 현재 엔티티(`entity`)가 `_UserService.LocalPlayer`와 동일한 경우, 즉 로컬 플레이어일 때만 수행됩니 [original] | 컴포넌트를 초기화할 수 있도록 아래 5가지 메소드를 추가하고, 아래와 같이 작성합니다. `UseCustomScript`가 `false`이면 초기화하지 않으며, LocalPlayer인 경우에만 키 매핑, Hold 액션 설정, 이벤트 핸들러 등록, 컴포넌트 캐싱을 수행합니다. - `OnBeginPlay()`: 컴포넌트 초기화의 진입점으로 키, 핸들러, 컴포넌트를 설정하고 StateComponent의 HitEventHandler를 재정의합니다. - `InitKeys()`: 액션 키와 상호작용 키의 기본 매핑을 등록합니다. - `Init [chunk_id] | Guides:1403:2
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: `InitStateComponentEventHandler` 메서드에서 기존 HitEventHandler를 제거하기 위해 호출하는 메서드는 무엇인가요? 답변: `stateComponent:DisconnectHitEvent()` 메서드를 호출하여 기존 핸들러를 제거합니다. 질문: `InitStateComponentEventHandler` 메서드에서 HitEvent가 발생했을 때 StateComponent의 상태를 무엇으로 변경하나요? 답변: "HIT" 상태로 변경합니다. 질문: `OnMapEnter` 메서드에서 `entere [original] | #### 핸들러 메소드 HitEvent 발생 시 StateComponent의 상태를 "HIT"로 변경할 수 있도록 기존 HitEventHandler를 제거하고 커스텀 핸들러를 등록합니다. ```lua Method: [client only] void InitStateComponentEventHandler() { local stateComponent = self.Entity.StateComponent if stateComponent == nil then return end stat [chunk_id] | Guides:1403:4
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제시된 문서에 포함된 핵심 사실들을 바탕으로, API 이름, 매개변수, 반환 타입, 실행 공간(동기화/서버·클라이언트 제약)을 명시하여 정리한 목록입니다. 1. `InitStateComponentEventHandler` 메서드는 `[client only]` 실행 공간에서 동작하며, `self.Entity.StateComponent`가 존재하는 경우 `DisconnectHitEvent`를 호출하여 기존 `HitEvent` 핸들러를 제거한 후, `self.Entity:ConnectEvent(HitEvent, function)`을 통해 [original] | #### 핸들러 메소드 HitEvent 발생 시 StateComponent의 상태를 "HIT"로 변경할 수 있도록 기존 HitEventHandler를 제거하고 커스텀 핸들러를 등록합니다. ```lua Method: [client only] void InitStateComponentEventHandler() { local stateComponent = self.Entity.StateComponent if stateComponent == nil then return end stat [chunk_id] | Guides:1403:4
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: 제공된 코드 블록의 실행 공간은 무엇인가요? 답변: 제공된 코드 블록은 [client only] 실행 공간에서 동작합니다. 질문: `CacheComponents` 메서드는 어떤 목적으로 사용되나요? 답변: `CacheComponents` 메서드는 현재 엔티티의 여러 컴포넌트(StateComponent, MovementComponent 등)를 로컬 변수에 저장하여 이후 접근 시 성능을 최적화하거나 참조를 유지하기 위해 사용됩니다. 질문: `CacheComponents` 함수 내에서 `entity` 변수는 어떻게 할당되나요? [original] | [client only] void CacheComponents() { local entity = self.Entity self.StateComponent = entity.StateComponent self.MovementComponent = entity.MovementComponent self.PlayerControllerComponent = entity.PlayerControllerComponent self.RigidbodyComponent = entity.RigidbodyCompone [chunk_id] | Guides:1403:3
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | #### InteractionKey 관리 `PlayerControllerComponent` 대신 커스텀 컴포넌트를 사용할 경우, **InteractionComponent**의 `KeyCode`를 직접 관리해야 합니다. 아래 메소드로 등록 및 제거를 처리합니다. - `SetInteractionKey(any key)`: 키 등록 - `RemoveInteractionKey(any key)`: 키 제거 ```lua [client only] void SetInteractionKey(any key) { if not self.IsV [original] | #### InteractionKey 관리 메소드 PlayerControllerComponent 대신 새로운 커스텀 컴포넌트를 사용하게 되면, **InteractionComponent**의 `KeyCode`를 직접 컴포넌트에 등록해야 합니다. 아래 2가지 메소드로 상호작용 키를 관리할 수 있도록 작성합니다. - `SetInteractionKey()`: 상호작용 키를 등록합니다. - `RemoveInteractionKey()`: 등록된 상호작용 키를 제거합니다. ```lua [client only] void SetInteract [chunk_id] | Guides:1403:7
[task] | extract_knowledge [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerControllerComponent 구현 ## 1. 개념 설명 `PlayerControllerComponent`는 메이플스토리 월드에서 기본으로 제공되는 플레이어 조작 컴포넌트입니다. 월드의 특성에 맞는 특수한 조작 방식이나 입력 방식을 구현해야 할 경우, 이 기본 컴포넌트를 대체하여 직접 커스텀 컴포넌트를 개발할 수 있습니다. 커스텀 컨트롤러를 적용하려면 `DefaultPlayer` 엔티티에 존재하는 기본 `PlayerControllerComponent`의 `UseCustomScript` 프로퍼티를 활성화 [original] | PlayerControllerComponent 대신, 크리에이터의 월드 특성에 맞는 조작과 입력 방식을 가진 커스텀 컨트롤러를 직접 만들 수 있습니다. 이 가이드에서는 CustomPlayerControllerComponent를 만드는 예시를 하나 소개합니다. 예시 외에 크리에이터의 의도에 따라 다른 움직임을 구현할 수도 있습니다. ##### 참고 가이드 - [플레이어 설정과 제어](/docs/?postId=547) - [캐릭터 초기 속성 편집](/docs/?postId=48) ### UseCustomScript 사용 Playe [chunk_id] | Guides:1403:0
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | ### PlayerController 액션 조건 및 입력 관리 (Client) 클라이언트 사이드에서 액션 실행 조건 판정 및 키 입력 상태를 관리하는 메서드입니다. **Property/State:** * `self.ActionConditions`: `table<string, table<function>>` - 액션 이름별 조건 함수 리스트 * `self.HoldActions`: `table<string, any>` - 현재 홀딩 중인 액션 상태 * `self.PressedKeys`: `table<string, bool [original] | [client only] void RemoveAllConditions(string actionName) { self.ActionConditions[actionName] = nil } [client only] boolean PassByCondition(string actionName) { local funcList = self.ActionConditions[actionName] if funcList == nil then return true end for i = 1, #fu [chunk_id] | Guides:1403:6
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | ### InteractionKey 관리 메소드 PlayerControllerComponent를 사용하지 않고 새로운 커스텀 컴포넌트를 구현할 경우, InteractionComponent의 KeyCode 값을 해당 커스텀 컴포넌트에 직접 등록해야 합니다. 상호작용 키를 관리하기 위해 SetInteractionKey()와 RemoveInteractionKey()라는 두 가지 메소드를 작성합니다. SetInteractionKey() 메소드는 특정 키를 상호작용 키로 등록하는 역할을 하며, RemoveInteractionKey() 메소드 [original] | #### InteractionKey 관리 메소드 PlayerControllerComponent 대신 새로운 커스텀 컴포넌트를 사용하게 되면, **InteractionComponent**의 `KeyCode`를 직접 컴포넌트에 등록해야 합니다. 아래 2가지 메소드로 상호작용 키를 관리할 수 있도록 작성합니다. - `SetInteractionKey()`: 상호작용 키를 등록합니다. - `RemoveInteractionKey()`: 등록된 상호작용 키를 제거합니다. ```lua [client only] void SetInteract [chunk_id] | Guides:1403:7
[task] | extract_knowledge [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController 구성 ## 개념 설명 메이플스토리 월드에서 기본 제공되는 `PlayerControllerComponent` 대신 직접 입력 처리 및 움직임 로직을 구현하기 위해 커스텀 컴포넌트를 생성합니다. 이 컴포넌트는 키보드 입력을 감지하고, 이를 바탕으로 캐릭터의 이동 상태(`HorizontalInput`, `VerticalInput`)를 결정하며, 다른 시스템 컴포넌트(`MovementComponent`, `MapComponent` 등)와 상호작용하여 플레이어를 제어합니다. ## API 사용법 [original] | 필요한 Property를 아래와 같이 작성합니다. ```lua Property: [None] boolean IsValid = false [None] table ActionKeys = {} [None] table ActionConditions = {} [None] table HoldActions = {} [None] table InteractionKeys = {} [None] table InputKeys = {} [None] table PressedKeys = {} [None] number HorizontalInput = 0 [No [chunk_id] | Guides:1403:1
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | ```lua RemoveAllConditions(string actionName) 메서드는 [client only] 실행 공간에서 동작하며, 매개변수 actionName(형식 string)을 받아 self.ActionConditions[actionName] 값을 nil로 설정하여 해당 액션의 조건 함수 목록을 삭제하는 역할을 수행하고 반환 타입은 void입니다. PassByCondition(string actionName) 메서드는 [client only] 실행 공간에서 동작하며, 매개변수 actionName(형식 string)을 [original] | [client only] void RemoveAllConditions(string actionName) { self.ActionConditions[actionName] = nil } [client only] boolean PassByCondition(string actionName) { local funcList = self.ActionConditions[actionName] if funcList == nil then return true end for i = 1, #fu [chunk_id] | Guides:1403:6