[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제시된 문서 내용만을 기반으로 핵심 사실을 추출하여 정리한 목록입니다. 1. `PlayerControllerComponent` 대신 커스텀 컴포넌트를 사용하는 경우, `InteractionComponent`의 `KeyCode`를 직접 해당 커스텀 컴포넌트에 등록해야 합니다. 2. `SetInteractionKey(any key)` 메소드는 `[client only]` 실행 공간에서 동작하며, 매개변수 `key`의 타입은 `any`이고 반환 타입은 `void`입니다. 3. `SetInteractionKey` 메소드 내에서는 `sel [original] | #### InteractionKey 관리 메소드 PlayerControllerComponent 대신 새로운 커스텀 컴포넌트를 사용하게 되면, **InteractionComponent**의 `KeyCode`를 직접 컴포넌트에 등록해야 합니다. 아래 2가지 메소드로 상호작용 키를 관리할 수 있도록 작성합니다. - `SetInteractionKey()`: 상호작용 키를 등록합니다. - `RemoveInteractionKey()`: 등록된 상호작용 키를 제거합니다. ```lua [client only] void SetInteract [chunk_id] | Guides:1403:7
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제공된 문서에 포함된 정보만 바탕으로 핵심 사실을 정리합니다. 1. `GetActionName` 메서드는 `[client only]` 실행 공간에서 동작하며, 매개변수 `any key`를 받아 해당 키에 매핑된 액션 이름을 `string` 타입으로 반환하고, 매핑이 없으면 빈 문자열(`""`)을 반환합니다. 2. `SetActionKey` 메서드는 `[client only]` 실행 공간에서 동작하며, 매개변수 `any key`와 `string actionName`을 받아 `self.ActionKeys[key]`에 액션 이름을 매핑 [original] | 기존 컴포넌트와 동일한 인터페이스의 Action, Condition을 관리할 수 있는 메소드를 만들어봅시다. - `GetActionName()`: 키에 매핑된 액션 이름을 반환합니다. - `SetActionKey()`: 키에 액션 이름을 매핑합니다. - `RemoveActionKey()`: 특정 키의 매핑을 제거합니다. - `RemoveAllActionKeyByActionName()`: 특정 액션에 매핑된 모든 키를 제거합니다. - `AddCondition()`: 액션 실행 조건 함수를 추가합니다. - `RemoveAllCondi [chunk_id] | Guides:1403:5
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 게임 로직 커스텀 PlayerController 만들기 본 섹션은 `PlayerController` 컴포넌트에서 이벤트 핸들러 등록 및 맵 이동 시 컨트롤 차단 로직을 구현하는 방법에 대해 설명합니다. ## 핸들러 메소드 `HitEvent` 발생 시 `StateComponent`의 상태를 "HIT"로 변경하기 위해, 기존에 등록된 `HitEventHandler`를 제거하고 커스텀 핸들러를 등록하는 로직을 구현합니다. 아래 코드에서 `InitStateComponentEventHandler` 메소드는 클라이언트에서만 실행되며, [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] | 질문: PlayerControllerComponent 대신 커스텀 컴포넌트를 사용할 때 InteractionComponent의 KeyCode를 어떻게 처리해야 하는가? 답변: InteractionComponent의 KeyCode를 직접 새로운 커스텀 컴포넌트에 등록해야 합니다. 질문: 상호작용 키를 등록하는 데 사용되는 메소드의 이름은 무엇인가요? 답변: SetInteractionKey() 질문: 등록된 상호작용 키를 제거하는 데 사용되는 메소드의 이름은 무엇인가요? 답변: RemoveInteractionKey() 질문: Se [original] | #### InteractionKey 관리 메소드 PlayerControllerComponent 대신 새로운 커스텀 컴포넌트를 사용하게 되면, **InteractionComponent**의 `KeyCode`를 직접 컴포넌트에 등록해야 합니다. 아래 2가지 메소드로 상호작용 키를 관리할 수 있도록 작성합니다. - `SetInteractionKey()`: 상호작용 키를 등록합니다. - `RemoveInteractionKey()`: 등록된 상호작용 키를 제거합니다. ```lua [client only] void SetInteract [chunk_id] | Guides:1403:7
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: `RemoveAllConditions` 함수는 어떤 실행 공간에서 작동하며, 어떤 역할을 하나요? 답변: `RemoveAllConditions` 함수는 `[client only]` 실행 공간에서 작동하며, 인자로 전달된 `actionName`에 해당하는 조건 목록을 `self.ActionConditions` 테이블에서 삭제(nil로 설정)하여 해당 액션의 모든 조건을 제거합니다. 질문: `PassByCondition` 함수가 `self.ActionConditions[actionName]` 값이 `nil`인 경우 어떤 값을 [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] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | ```lua OnBeginPlay() 메서드는 [client only] 실행 공간에서 동작하며, self.Entity.PlayerControllerComponent.UseCustomScript가 false인 경우 초기화를 중단하고, _UserService.LocalPlayer인 경우에만 self.IsValid를 true로 설정한 뒤 InitKeys(), InitHoldActions(), InitEventHandlers(), CacheComponents() 메서드를 순차 호출하고, 마지막으로 InitStateComponentEvent [original] | 컴포넌트를 초기화할 수 있도록 아래 5가지 메소드를 추가하고, 아래와 같이 작성합니다. `UseCustomScript`가 `false`이면 초기화하지 않으며, LocalPlayer인 경우에만 키 매핑, Hold 액션 설정, 이벤트 핸들러 등록, 컴포넌트 캐싱을 수행합니다. - `OnBeginPlay()`: 컴포넌트 초기화의 진입점으로 키, 핸들러, 컴포넌트를 설정하고 StateComponent의 HitEventHandler를 재정의합니다. - `InitKeys()`: 액션 키와 상호작용 키의 기본 매핑을 등록합니다. - `Init [chunk_id] | Guides:1403:2
[task] | extract_knowledge [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # InteractionKey 관리 메소드 ## 개념 설명 `PlayerControllerComponent` 대신 커스텀 컴포넌트를 사용할 경우, `InteractionComponent`의 `KeyCode`를 직접 컴포넌트에 등록하여 관리해야 합니다. 이 과정에서 상호작용 키의 추가와 삭제를 제어하기 위해 `SetInteractionKey()`와 `RemoveInteractionKey()` 메소드가 필요합니다. - `SetInteractionKey()`: 특정 키를 상호작용 키 목록에 등록합니다. - `RemoveInteract [original] | #### InteractionKey 관리 메소드 PlayerControllerComponent 대신 새로운 커스텀 컴포넌트를 사용하게 되면, **InteractionComponent**의 `KeyCode`를 직접 컴포넌트에 등록해야 합니다. 아래 2가지 메소드로 상호작용 키를 관리할 수 있도록 작성합니다. - `SetInteractionKey()`: 상호작용 키를 등록합니다. - `RemoveInteractionKey()`: 등록된 상호작용 키를 제거합니다. ```lua [client only] void SetInteract [chunk_id] | Guides:1403:7
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController의 입력 및 조건 관리 이 섹션은 메이플스토리 월드의 mLua 스크립트에서 커스텀 `PlayerController` 컴포넌트를 구현할 때, 플레이어의 입력 상태와 액션 실행 조건을 관리하기 위한 클라이언트 전용(`[client only]`) 메서드들을 설명합니다. 이 메서드들은 액션이 실행될 수 있는 사전 조건을 검증하고, 키 입력의 누름/해제 상태를 추적하는 데 사용됩니다. ## 액션 조건 관리 `RemoveAllConditions` 메서드는 특정 액션 이름(`actionName`)에 [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] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController: Action/Condition 관리 기존 컴포넌트와 동일한 인터페이스의 Action, Condition을 관리하는 메소드를 구현합니다. 모든 메소드는 `[client only]` 실행 공간에 배치됩니다. ## API 시그니처 및 동작 규칙 | 메소드 | 시그니처 | 동작 규칙 | | :--- | :--- | :--- | | `GetActionName` | `string GetActionName(any key)` | `self.ActionKeys[key]`에서 액션 이름을 반환. 없으면 [original] | 기존 컴포넌트와 동일한 인터페이스의 Action, Condition을 관리할 수 있는 메소드를 만들어봅시다. - `GetActionName()`: 키에 매핑된 액션 이름을 반환합니다. - `SetActionKey()`: 키에 액션 이름을 매핑합니다. - `RemoveActionKey()`: 특정 키의 매핑을 제거합니다. - `RemoveAllActionKeyByActionName()`: 특정 액션에 매핑된 모든 키를 제거합니다. - `AddCondition()`: 액션 실행 조건 함수를 추가합니다. - `RemoveAllCondi [chunk_id] | Guides:1403:5
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | **커스텀 PlayerController 만들기** 메이플스토리 월드 스크립트 언어(mLua)에서 커스텀 PlayerController 컴포넌트를 구현할 때는, 기존 컴포넌트와 동일한 인터페이스를 제공하기 위해 Action 및 Condition을 관리하는 메서드들을 정의해야 합니다. 이 메서드들은 클라이언트 환경에서 실행되며, 키 입력과 액션 간의 매핑을 처리하고, 액션 실행 조건을 검증하는 역할을 수행합니다. Action 매핑 관리 메서드는 다음과 같이 동작합니다. `GetActionName()` 메서드는 인자로 전달된 키에 [original] | 기존 컴포넌트와 동일한 인터페이스의 Action, Condition을 관리할 수 있는 메소드를 만들어봅시다. - `GetActionName()`: 키에 매핑된 액션 이름을 반환합니다. - `SetActionKey()`: 키에 액션 이름을 매핑합니다. - `RemoveActionKey()`: 특정 키의 매핑을 제거합니다. - `RemoveAllActionKeyByActionName()`: 특정 액션에 매핑된 모든 키를 제거합니다. - `AddCondition()`: 액션 실행 조건 함수를 추가합니다. - `RemoveAllCondi [chunk_id] | Guides:1403:5
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | **OnUpdate()** 매 프레임마다 호출되는 클라이언트 전용 메소드입니다. `IsUpdateBlocked`가 `true`일 경우 실행을 중단하고, 정상 시 플레이어 컨트롤 및 상태 전환을 갱신합니다. ```lua Method: [client only] void OnUpdate(number delta) { if not self.IsValid then return end if self.PlayerControllerComponent.IsUpdateBlocked then r [original] | #### OnUpdate() 매 프레임마다 호출되는 메소드입니다. `IsUpdateBlocked`가 `true`이면 실행되지 않도록 합니다. 플레이어 컨트롤과 상태 전환을 업데이트합니다. ```lua Method: [client only] void OnUpdate(number delta) { if not self.IsValid then return end if self.PlayerControllerComponent.IsUpdateBlocked then return [chunk_id] | Guides:1403:11
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: `GetActionName()` 메서드의 주요 역할은 무엇인가요? 답변: `GetActionName()` 메서드는 주어진 키에 매핑된 액션 이름을 반환하는 역할을 합니다. 질문: `SetActionKey()` 메서드가 `self.IsValid`가 false인 경우 어떤 동작을 하는지 서술형으로 설명하세요. 답변: `SetActionKey()` 메서드는 `self.IsValid`가 false인 경우 함수를 즉시 종료하고 아무 동작도 수행하지 않습니다. 질문: `RemoveActionKey()` 메서드에서 키의 매핑을 제거한 [original] | 기존 컴포넌트와 동일한 인터페이스의 Action, Condition을 관리할 수 있는 메소드를 만들어봅시다. - `GetActionName()`: 키에 매핑된 액션 이름을 반환합니다. - `SetActionKey()`: 키에 액션 이름을 매핑합니다. - `RemoveActionKey()`: 특정 키의 매핑을 제거합니다. - `RemoveAllActionKeyByActionName()`: 특정 액션에 매핑된 모든 키를 제거합니다. - `AddCondition()`: 액션 실행 조건 함수를 추가합니다. - `RemoveAllCondi [chunk_id] | Guides:1403:5
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | `OnUpdate()`는 매 프레임마다 호출되는 메서드입니다. 이 메서드는 `IsUpdateBlocked` 프로퍼티가 `true`인 경우 실행을 중단하도록 설계되어 있으며, 주로 플레이어 컨트롤 및 상태 전환의 업데이트 처리를 담당합니다. 아래에 제시된 코드 예제는 `IsValid` 플래그가 `false`이거나 `PlayerControllerComponent`의 `IsUpdateBlocked`가 `true`인 경우 즉시 반환하여后续 로직을 실행하지 않는 방식을 보여줍니다. 정상적인 상태에서는 `delta` 값을 인자로 전달받아 `s [original] | #### OnUpdate() 매 프레임마다 호출되는 메소드입니다. `IsUpdateBlocked`가 `true`이면 실행되지 않도록 합니다. 플레이어 컨트롤과 상태 전환을 업데이트합니다. ```lua Method: [client only] void OnUpdate(number delta) { if not self.IsValid then return end if self.PlayerControllerComponent.IsUpdateBlocked then return [chunk_id] | Guides:1403:11
[task] | extract_knowledge [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController 조건 및 입력 처리 ## 개념 설명 커스텀 PlayerController에서는 액션 실행 전의 조건 판별과 현재 입력 상태를 관리하는 로직이 필요합니다. 이를 위해 액션별 조건 함수 목록을 저장하는 테이블(`ActionConditions`)과 현재 눌려 있는 키 상태를 추적하는 테이블(`PressedKeys`)을 사용합니다. 또한, 특정 액션이 현재 홀드(Hold) 상태에 있는지 여부를 확인하기 위한 별도의 관리 로직(`HoldActions`)이 포함되어 있습니다. 이 시스템은 클라이언트 [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] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: `SendActionEventToServer` 메서드는 어떤 실행 공간에서 동작합니까? 답변: `SendActionEventToServer` 메서드는 `[server]` 실행 공간에서 동작합니다. 질문: `OnKeyUp` 이벤트 핸들러는 어떤 실행 공간에서 정의됩니까? 답변: `OnKeyUp` 이벤트 핸들러는 `[client only]` 실행 공간에서 정의됩니다. 질문: `OnKeyUp` 함수 내부에서 `self:CanControl()`이 거짓인 경우 어떤 동작이 수행됩니까? 답변: `self:CanControl()`이 [original] | = self.Entity actionEvent.ActionName = actionName self.Entity:SendEvent(actionEvent) self:SendActionEventToServer(actionEvent) end } [server] void SendActionEventToServer(CustomPlayerActionEvent evt) { self.Entity:SendEvent(evt) } [client only] void OnKeyUp [chunk_id] | Guides:1403:9
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제시된 문서 조각에는 `PlayerController` 컴포넌트의 일부 메서드 본문만 포함되어 있으며, 프로퍼티 정의나 전체적인 시스템 구조가 누락되어 있습니다. 따라서 원문에 명시된 코드 블록 내에서 확인할 수 있는 사실들만 추출하여 정리합니다. 1. `SendActionEventToServer` 메서드는 `[server]` 실행 공간에서 동작하며, 매개변수로 `CustomPlayerActionEvent` 타입의 `evt`를 받아 `self.Entity:SendEvent(evt)`를 호출하여 서버에 이벤트를 전달한다. 2. `O [original] | = self.Entity actionEvent.ActionName = actionName self.Entity:SendEvent(actionEvent) self:SendActionEventToServer(actionEvent) end } [server] void SendActionEventToServer(CustomPlayerActionEvent evt) { self.Entity:SendEvent(evt) } [client only] void OnKeyUp [chunk_id] | Guides:1403:9
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | ```lua [client only] void SendActionEvent(CustomPlayerActionEvent actionEvent, string actionName) { actionEvent.ActionName = actionName self.Entity:SendEvent(actionEvent) self:SendActionEventToServer(actionEvent) } [server] void SendActionEventToServer(CustomPlayerActionEvent evt) { [original] | = self.Entity actionEvent.ActionName = actionName self.Entity:SendEvent(actionEvent) self:SendActionEventToServer(actionEvent) end } [server] void SendActionEventToServer(CustomPlayerActionEvent evt) { self.Entity:SendEvent(evt) } [client only] void OnKeyUp [chunk_id] | Guides:1403:9
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제시된 원문에 포함된 정보만을 바탕으로 핵심 사실을 정리한 목록입니다. 1. `OnUpdate()` 메서드는 매 프레임마다 호출되며, 매개변수로는 `number` 타입의 `delta`를 받습니다. 2. `OnUpdate()` 메서드는 `[client only]` 실행 공간 제약이 적용되어 클라이언트에서만 실행됩니다. 3. `OnUpdate()` 메서드의 반환 타입은 `void`입니다. 4. `OnUpdate()` 함수 내에서 `self.IsValid`가 `false`인 경우 즉시 반환(return)하여 실행을 중단합니다. 5. ` [original] | #### OnUpdate() 매 프레임마다 호출되는 메소드입니다. `IsUpdateBlocked`가 `true`이면 실행되지 않도록 합니다. 플레이어 컨트롤과 상태 전환을 업데이트합니다. ```lua Method: [client only] void OnUpdate(number delta) { if not self.IsValid then return end if self.PlayerControllerComponent.IsUpdateBlocked then return [chunk_id] | Guides:1403:11
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제시된 원문에서 확인할 수 있는 핵심 사실은 다음과 같습니다. 1. 커스텀 PlayerController의 키 입력 핸들러 메소드들은 `InitEventHandlers()` 함수 내에서 `InputService`의 키 입력 이벤트에 연결되어야 합니다. 2. `OnKeyDown` 메소드는 `[client only]` 실행 공간으로 선언되며, 매개변수로 `KeyDownEvent` 타입의 `evt`를 받아 키를 누르는 순간의 액션 실행과 입력 상태 갱신을 담당합니다. 3. `OnKeyDown` 메소드 내부에서는 `self:CanC [original] | `InitEventHandlers()`에서 `InputService`의 키 입력 이벤트에 연결된 핸들러 메소드를 아래와 같이 작성합니다. - `OnKeyDown()`: 키를 누르는 순간의 입력을 처리하여 액션을 실행하고 입력 상태를 갱신합니다. - `SendActionEventToServer()`: 커스텀 액션 이벤트를 서버로 전송합니다. - `OnKeyUp()`: 키에서 손을 떼는 순간의 입력을 처리하여 관련 상태를 해제합니다. - `OnKeyHold()`: 키를 누르고 있는 동안의 입력 상태를 갱신합니다. - `BlockInp [chunk_id] | Guides:1403:8
[task] | extract_knowledge [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # OnUpdate 메소드와 플레이어 컨트롤 업데이트 ## 개념 설명 `OnUpdate`는 매 프레임마다 호출되는 메서드입니다. 이 메서드를 통해 플레이어의 입력 제어 로직과 상태 전환(지상 이동, 낙하 등)을 업데이트합니다. ## API 사용법 * **실행 공간**: `[client only]` (클라이언트에서만 실행됨) * **시그니처**: `void OnUpdate(number delta)` * **핵심 동작**: 1. `self.IsValid`가 `false`인 경우 즉시 종료. 2. `sel [original] | #### OnUpdate() 매 프레임마다 호출되는 메소드입니다. `IsUpdateBlocked`가 `true`이면 실행되지 않도록 합니다. 플레이어 컨트롤과 상태 전환을 업데이트합니다. ```lua Method: [client only] void OnUpdate(number delta) { if not self.IsValid then return end if self.PlayerControllerComponent.IsUpdateBlocked then return [chunk_id] | Guides:1403:11
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController 입력 처리 `InitEventHandlers()`에서 `InputService`의 키 입력 이벤트에 연결하여 아래 메서드를 구현합니다. ### 메서드 정의 * **`OnKeyDown(KeyDownEvent evt)`**: 키 누름 순간 액션 실행 및 입력 상태 갱신. * **`OnKeyUp(KeyUpEvent evt)`**: 키 해제 순간 관련 상태 해제. * **`OnKeyHold(KeyHoldEvent evt)`**: 키 유지 중 입력 상태 갱신. * **`SendAct [original] | `InitEventHandlers()`에서 `InputService`의 키 입력 이벤트에 연결된 핸들러 메소드를 아래와 같이 작성합니다. - `OnKeyDown()`: 키를 누르는 순간의 입력을 처리하여 액션을 실행하고 입력 상태를 갱신합니다. - `SendActionEventToServer()`: 커스텀 액션 이벤트를 서버로 전송합니다. - `OnKeyUp()`: 키에서 손을 떼는 순간의 입력을 처리하여 관련 상태를 해제합니다. - `OnKeyHold()`: 키를 누르고 있는 동안의 입력 상태를 갱신합니다. - `BlockInp [chunk_id] | Guides:1403:8
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제시된 문서 내용(코드 블록 및 주석)에 기반하여 핵심 사실을 추출한 목록입니다. 1. `OnKeyHold` 메서드는 `[client only]` 실행 공간에서 동작하며, `KeyHoldEvent` 타입의 `evt` 인자를 받아 키 홀드 이벤트를 처리합니다. 2. `OnKeyHold` 메서드 내에서는 `self:CanControl()`가 거짓이거나 `self.EnableInHierarchy`가 거짓일 경우 즉시 반환하여 입력 처리를 중단합니다. 3. `OnKeyHold` 메서드에서는 `evt.key` 값에 해당하는 액션 이름(`a [original] | [client only] void OnKeyHold(KeyHoldEvent evt) { -- Handle key hold events: update hold action state (for keys pressed without keyDown) if not self:CanControl() then return end if not self.EnableInHierarchy then return end local key = evt.key loc [chunk_id] | Guides:1403:10
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: `OnUpdate()` 메소드는 언제 호출되나요? 답변: `OnUpdate()` 메소드는 매 프레임마다 호출됩니다. 질문: `IsUpdateBlocked`가 `true`일 때 `OnUpdate()` 내의 로직은 어떻게 처리되나요? 답변: `IsUpdateBlocked`가 `true`이면 메소드 실행이 중단되어 플레이어 컨트롤과 상태 전환 업데이트가 수행되지 않습니다. 질문: 아래 코드는 어떤 실행 공간에서 동작하나요? ```lua Method: [client only] void OnUpdate(number delta) { [original] | #### OnUpdate() 매 프레임마다 호출되는 메소드입니다. `IsUpdateBlocked`가 `true`이면 실행되지 않도록 합니다. 플레이어 컨트롤과 상태 전환을 업데이트합니다. ```lua Method: [client only] void OnUpdate(number delta) { if not self.IsValid then return end if self.PlayerControllerComponent.IsUpdateBlocked then return [chunk_id] | Guides:1403:11
[task] | extract_knowledge [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # PlayerController: 상태 관리 및 맵 이동 중 컨트롤 차단 본 절에서는 `PlayerController` 컴포넌트에서 Hit 이벤트 처리를 커스터마이징하는 방법과, 맵 이동 과정에서 플레이어의 조작을 차단하기 위한 로직을 다룹니다. ## 1. 개념 설명 기본적으로 `StateComponent`는 `HitEvent`가 발생했을 때 내부적으로 상태 변경을 처리합니다. 하지만 개발자가 특정 조건에서 상태 변경을 제어하거나, 맵 이동(Map Transition) 중 플레이어의 입력 및 움직임이 유실되거나 오류를 일으키 [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] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 제공된 원문은 `PlayerController` 컴포넌트의 일부 메서드 구현 코드만 포함하고 있으며, 해당 메서드들의 정의 문(시그니처)이나 전체적인 동작 원리를 설명하는 텍스트가 빠져 있습니다. 따라서 원문에 포함된 기술적 사실(코드 로직, API 호출, 조건 분기)만을 기반으로 해당 코드가 수행하는 기능을 객관적으로 서술합니다. 원문에는 `SendActionEventToServer` 메서드의 본문과 `OnKeyUp` 이벤트 핸들러의 본문이 포함되어 있습니다. `SendActionEventToServer`는 `[server]` [original] | = self.Entity actionEvent.ActionName = actionName self.Entity:SendEvent(actionEvent) self:SendActionEventToServer(actionEvent) end } [server] void SendActionEventToServer(CustomPlayerActionEvent evt) { self.Entity:SendEvent(evt) } [client only] void OnKeyUp [chunk_id] | Guides:1403:9
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 게임 로직 커스텀 PlayerController 만들기 `UpdateControl()`은 입력 키 기반의 플레이어 컨트롤 업데이트 핵심 메소드로, 이동 방향 계산, 앉기/점프 액션, 캐릭터 방향 업데이트, 사다리 등반 처리를 수행합니다. ```lua Method: [client only] void UpdateControl(number delta) { if not self:CanControl() then self:ResetControl() return end local [original] | `UpdateControl()`은 입력된 키를 기반으로 플레이어 컨트롤을 업데이트하는 핵심 메소드입니다. 이동 방향 계산, 앉기/점프 액션 처리, 캐릭터 방향 업데이트, 사다리 등반 처리를 수행합니다. ```lua Method: [client only] void UpdateControl(number delta) { -- Main control update: handles movement, actions, and state transitions if not self:CanControl() then sel [chunk_id] | Guides:1403:12
[task] | diverse_qa [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | 질문: `InitEventHandlers()` 메서드에서 `InputService`의 키 입력 이벤트에 연결되는 주요 핸들러 메소드들의 이름은 무엇인가요? 답변: 주요 핸들러 메소드는 `OnKeyDown()`, `SendActionEventToServer()`, `OnKeyUp()`, `OnKeyHold()`, `BlockInputKey()`입니다. 질문: `OnKeyDown()` 메서드의 주된 역할은 무엇인가요? 답변: 키를 누르는 순간의 입력을 처리하여 액션을 실행하고 입력 상태를 갱신하는 역할을 합니다. 질문: `SendA [original] | `InitEventHandlers()`에서 `InputService`의 키 입력 이벤트에 연결된 핸들러 메소드를 아래와 같이 작성합니다. - `OnKeyDown()`: 키를 누르는 순간의 입력을 처리하여 액션을 실행하고 입력 상태를 갱신합니다. - `SendActionEventToServer()`: 커스텀 액션 이벤트를 서버로 전송합니다. - `OnKeyUp()`: 키에서 손을 떼는 순간의 입력을 처리하여 관련 상태를 해제합니다. - `OnKeyHold()`: 키를 누르고 있는 동안의 입력 상태를 갱신합니다. - `BlockInp [chunk_id] | Guides:1403:8
[task] | wikipedia [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | # 커스텀 PlayerController의 입력 처리 로직 커스텀 PlayerController를 구현할 때는 `InitEventHandlers()` 함수 내에서 `InputService`의 키 입력 이벤트에 연결된 핸들러 메소드를 정의해야 합니다. 이 과정에서 키를 누르는 순간(`OnKeyDown()`), 키에서 손을 떼는 순간(`OnKeyUp()`), 키를 누르고 있는 동안(`OnKeyHold()`), 그리고 특정 키의 입력을 차단하는(`BlockInputKey()`) 상황에 각각 대응하는 로직을 처리합니다. 또한, 클라이언트 [original] | `InitEventHandlers()`에서 `InputService`의 키 입력 이벤트에 연결된 핸들러 메소드를 아래와 같이 작성합니다. - `OnKeyDown()`: 키를 누르는 순간의 입력을 처리하여 액션을 실행하고 입력 상태를 갱신합니다. - `SendActionEventToServer()`: 커스텀 액션 이벤트를 서버로 전송합니다. - `OnKeyUp()`: 키에서 손을 떼는 순간의 입력을 처리하여 관련 상태를 해제합니다. - `OnKeyHold()`: 키를 누르고 있는 동안의 입력 상태를 갱신합니다. - `BlockInp [chunk_id] | Guides:1403:8
[task] | distill [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | ### PlayerController: 키 홀드 처리 및 입력 차단 `OnKeyHold`와 `BlockInputKey`는 **클라이언트 전용**으로 실행되며, `KeyHoldEvent` 수신 시 액션 상태를 갱신하거나 특정 키의 입력을 차단합니다. #### 1. `OnKeyHold(KeyHoldEvent evt)` 키가 눌려 있는 상태(홀드) 이벤트 처리 로직입니다. * **전제 조건**: `self:CanControl()`이 `true`이고 `self.EnableInHierarchy`가 `true`일 때만 처리합니다. * [original] | [client only] void OnKeyHold(KeyHoldEvent evt) { -- Handle key hold events: update hold action state (for keys pressed without keyDown) if not self:CanControl() then return end if not self.EnableInHierarchy then return end local key = evt.key loc [chunk_id] | Guides:1403:10
[task] | knowledge_list [title] | 커스텀 PlayerController 만들기 [category] | Guides [rephrased] | ```lua -- 제공된 문서 기반 핵심 사실 목록 1. UpdateControl() 메서드는 [client only] 실행 공간에서 동작하며, 매개변수 number delta를 받아 반환 타입은 void입니다. 2. UpdateControl() 메서드는 self:CanControl()이 false인 경우 self:ResetControl()을 호출하고 즉시 반환하여 컨트롤 처리를 중단합니다. 3. 이동 방향 계산은 currentStateName이 "ATTACK"이 아닐 때에만 수행되며, 이때 self:SetInputAxis()가 [original] | `UpdateControl()`은 입력된 키를 기반으로 플레이어 컨트롤을 업데이트하는 핵심 메소드입니다. 이동 방향 계산, 앉기/점프 액션 처리, 캐릭터 방향 업데이트, 사다리 등반 처리를 수행합니다. ```lua Method: [client only] void UpdateControl(number delta) { -- Main control update: handles movement, actions, and state transitions if not self:CanControl() then sel [chunk_id] | Guides:1403:12