[task] | distill [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | # PlayerControllerComponent 입력(Input)을 감지하여 액션(Action)을 실행하고, 특정 조건(Condition)에 따라 동작을 제어하는 컴포넌트입니다. ### 핵심 동작 흐름 1. **입력 감지**: `PlayerControllerComponent`가 유저 입력을 감지합니다. 2. **상태 변경 및 액션 처리**: 맞는 State로 변경하고 Action을 처리합니다. 3. **이벤트 발생**: `StateComponent`가 State 변경을 처리하며 `StateChangeEvent`를 발생시킵니다. [original] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는 [chunk_id] | Guides:547:1
[task] | distill [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | # 플레이어 설정과 제어 ## 맵 이동 (MoveToMapPosition) `PlayerComponent:MoveToMapPosition(mapName, position)`은 플레이어만 이동시킵니다. `TeleportService:TeleportToEntityPath()`는 모든 Entity 대상입니다. * **설정**: `MyDesk`에 `PlayerManagement` 생성 후 `DefaultPlayer`에 추가. * **논리**: `TimerService`로 지연 후 `_UserService.UserEntities` [original] | `MoveToMapPosition()`를 이용해 플레이어를 특정 위치로 이동시킬 수 있습니다. 이 기능을 활용해 여러 맵으로 모든 유저를 한 번에 옮겨 새로운 맵에서 새로운 게임을 할 수 있게 합니다. 1. **MyDesk**에 새로운 PlayerManagement 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. `TimerService`를 이용해 10초를 셀 수 있게 만들고, 10초 뒤 이동할 map의 이름과 그 맵의 위치를 입력합니다. 맵의 이름은 Hierarchy의 이름과 동일해야 합니다. >** [chunk_id] | Guides:547:2
[task] | knowledge_list [title] | 카드 짝 맞추기 [category] | Guides [rephrased] | 제시된 원문에는 mLua 스크립트 API, 매개변수, 반환 타입, 동기화/서버·클라이언트 제약에 대한 기술적 정보가 포함되어 있지 않습니다. 따라서 요청하신 "API 이름·매개변수·반환 타입·동기화/서버·클라이언트 제약 명시" 조건을 충족할 수 있는 항목을 추출할 수 없습니다. 원문에 포함된 사실(게임 규칙 및 사전 준비 단계)만 정리하면 다음과 같습니다. 1. 본 가이드는 UI 에디터 활용 방법과 간단한 규칙을 가진 카드 짝 맞추기 게임 제작을 위해 총 8단계로 진행됩니다. 2. 게임은 정해진 시간 동안 진행되며, 한 판에 3 [original] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다. [chunk_id] | Guides:550:0
[task] | extract_knowledge [title] | MovementComponent를 활용한 엔티티의 이동 제어 [category] | Guides [rephrased] | # MovementComponent를 활용한 점프 제어 ## 1. 개념 설명 `MovementComponent`의 **Jump** 함수와 **DownJump** 함수는 엔티티의 수직 방향 이동을 제어하는 데 사용됩니다. * **Jump**: 엔티티에 설정된 `JumpForce` 값만큼의 힘으로 점프를 수행합니다. * **DownJump**: 엔티티가 서 있는 풋홀드(Foothold) 아래에 다른 풋홀드가 존재하는 경우, 해당 아래 풋홀드로 엔티티를 이동시킵니다. 두 함수 모두 엔티티에 **RigidbodyCompone [original] | MovementComponent의 **Jump** 함수는 엔티티를 JumpForce에 입력한 힘만큼 점프시킵니다. boolean 타입으로 점프에 성공한 경우 true를 리턴합니다. 엔티티에 RigidbodyComponent가 함께 있어야 작동하며, RigidbodyComponent가 없으면 false를 리턴합니다. 동기화를 위해 일반적으로 server 공간에서 호출하는 것이 좋지만, 플레이어 엔티티의 경우에는 client에서 호출해야 합니다. ```lua [server only] void OnUpdate(number delta) { [chunk_id] | Guides:546:1
[task] | wikipedia [title] | 카드 짝 맞추기 [category] | Guides [rephrased] | # 카드 짝 맞추기 (메이플스토리 월드) **카드 짝 맞추기**는 메이플스토리 월드(MapleStory Worlds)에서 UI 에디터의 활용 방법을 익히기 위해 설계된 응용 프로그램 개발 가이드이다. 이 가이드는 간단한 규칙을 기반으로 게임을 제작하는 과정을 단계별로 제시하며, 총 8단계로 구성된다. 개발자는 가이드 진행 중 자신의 취향에 맞게 사용자 인터페이스(UI)를 수정하여 시각적으로 차별화할 수 있다. ## 게임 규칙 이 가이드를 통해 제작하는 게임은 다음과 같은 기본 규칙을 적용한다. * 게임은 정해진 시간 내에 [original] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다. [chunk_id] | Guides:550:0
[task] | diverse_qa [title] | 카드 짝 맞추기 [category] | Guides [rephrased] | 질문: 이번 가이드에서 만들 카드 짝 맞추기 게임의 기본 규칙 중 한 판에 펼쳐지는 카드의 수는 얼마인가요? 답변: 한 판에 30개의 카드가 펼쳐집니다. 질문: 카드의 짝을 맞출 때마다 점수는 어떻게 증가하나요? 답변: 짝을 맞출 때마다 10점씩 증가합니다. 질문: 게임이 종료되는 조건은 무엇인가요? 답변: 0초가 되면 게임 UI가 종료됩니다. 질문: 게임을 다시 시작하려면 어떤 버튼을 눌러야 하나요? 답변: 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 질문: 이 가이드는 총 몇 단계로 진행되나요? 답변: 가이 [original] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다. [chunk_id] | Guides:550:0
[task] | knowledge_list [title] | Effective MSW 1 [category] | Guides [rephrased] | 제공된 문서 내용만 바탕으로 핵심 사실을 추출하여 정리한 목록입니다. 1. `isvalid()` 함수는 메이플스토리 월드에서 엔티티나 컴포넌트가 현재 유효한 상태인지 검사할 때 사용하며, 단순 `nil` 체크(`~= nil`)보다 안전합니다. 2. 엔티티 삭제 과정은 '삭제 요청 → 삭제 처리 대기 → 삭제 중 → 삭제 완료 → nil'의 단계를 거치기 때문에, `nil`이 아닌 상태여도 아직 삭제 처리 중일 수 있습니다. 3. `isvalid()` 함수는 실제 동작하는 일련의 행위가 어떤 상태인지 모두 체크하여 알 수 없는 동작 [original] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민 [chunk_id] | Guides:559:0
[task] | distill [title] | Effective MSW 1 [category] | Guides [rephrased] | # MSW 최적화 가이드: 유효성 검사 및 Wait 함수 ## 1. `isvalid()` 사용 엔티티나 컴포넌트의 유효성을 검사할 때 `nil` 체크 대신 `isvalid()`를 사용해야 합니다. * **이유**: 엔티티 삭제는 즉시 `nil`이 되지 않으며, `삭제 요청 → 처리 대기 → 삭제 중 → 완료 → nil`의 단계를 거칩니다. `nil` 체크만으로는 삭제 처리 중 상태의 객체에 접근하여 에러나 비정상 동작을 유발할 수 있습니다. * **동작**: `isvalid()`는 객체의 실제 상태(유효성)를 보장합니다. [original] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민 [chunk_id] | Guides:559:0
[task] | wikipedia [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | # 게임 로직: 플레이어 설정과 제어 메이플스토리 월드의 스크립트 환경에서는 `PlayerSetting` 컴포넌트를 통해 플레이어의 기본 조작 및 속성에 대한 조건을 부여하거나 입력 키 매핑을 변경할 수 있습니다. 이 기능은 게임의 플레이 방식을 수정하여 특정 조건 하에서 기본 동작(예: 공격, 점프)을 제한하거나, 기존에 정의된 키 바인딩을 제거하고 새로운 키를 할당하는 데 사용됩니다. ## 조건부 플레이어 행동 제어 `AddCondition()` 함수를 사용하면 플레이어의 특정 액션이 실행되기 전에 만족해야 하는 조건을 정 [original] | 플레이어의 기본 속성에 발동할 수 있게 하는 조건을 추가할 수 있습니다. `AddCondition()` 함수를 사용해 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 1. **MyDesk**에 PlayerSetting 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. Jump 액션이 실행되는 조건을 작성합니다. 10 이상은 Jump가 실 [chunk_id] | Guides:547:3
[task] | extract_knowledge [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | # PlayerControllerComponent: 플레이어 입력 처리 및 상태 제어 `PlayerControllerComponent`는 플레이어의 입력을 감지하여 정의된 액션(Action)을 실행하고, 특정 조건(Condition)에 따라 액션 실행 여부를 제어하는 컴포넌트입니다. 이 컴포넌트는 입력 처리, 상태 변경, 이벤트 발생 과정을 통해 캐릭터의 동작과 애니메이션 연동을 담당합니다. ## 1. 동작 원리 및 아키텍처 `PlayerControllerComponent` 단독으로 애니메이션을 재생하지 않으며, 다른 컴포넌트 [original] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는 [chunk_id] | Guides:547:1
[task] | wikipedia [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | # 플레이어 설정과 제어 메이플스토리 월드(mLua)에서는 `PlayerComponent`와 관련 서비스를 활용하여 플레이어의 이동, 리스폰 위치 지정, 그리고 특정 조건에 따른 액션 제어를 수행할 수 있습니다. ## 맵 위치로 플레이어 이동 `MoveToMapPosition()` 메서드를 사용하면 플레이어를 지정한 맵의 특정 좌표로 이동시킬 수 있습니다. 이를 통해 모든 유저를 한 번에 다른 맵으로 전송하여 새로운 게임 세션을 시작하는 등의 게임 로직을 구현할 수 있습니다. 구현 절차는 다음과 같습니다. 1. **MyDes [original] | `MoveToMapPosition()`를 이용해 플레이어를 특정 위치로 이동시킬 수 있습니다. 이 기능을 활용해 여러 맵으로 모든 유저를 한 번에 옮겨 새로운 맵에서 새로운 게임을 할 수 있게 합니다. 1. **MyDesk**에 새로운 PlayerManagement 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. `TimerService`를 이용해 10초를 셀 수 있게 만들고, 10초 뒤 이동할 map의 이름과 그 맵의 위치를 입력합니다. 맵의 이름은 Hierarchy의 이름과 동일해야 합니다. >** [chunk_id] | Guides:547:2
[task] | extract_knowledge [title] | 카드 짝 맞추기 [category] | Guides [rephrased] | # 카드 짝 맞추기 게임 설계 및 UI 에디터 활용 ## 1. 개념 설명 본 절에서는 메이플스토리 월드의 UI 에디터를 활용하여 간단한 카드 짝 맞추기 게임을 제작하는 과정을 다룹니다. 이 게임은 다음과 같은 규칙을 기반으로 동작합니다. * **진행 시간**: 정해진 시간이 지나면 게임이 종료됩니다. * **카드 구성**: 한 판에 총 30개의 카드가 펼쳐집니다. * **점수 체계**: 카드의 짝을 맞출 때마다 10점씩 증가합니다. * **종료 조건**: 카운트다운이 0초가 되면 게임 UI가 종료됩니다. * [original] | 카드 짝 맞추기 응용 가이드를 따라 해보며 UI 에디터를 활용 방법을 익혀봅시다. 간단한 규칙을 정해 게임을 만들어봅시다. 이번에 만들어 볼 게임의 기본 규칙은 다음과 같습니다. * 정해진 시간동안 게임 진행합니다. * 한 판에 30개의 카드가 펼쳐집니다. * 짝을 맞출 때마다 10점씩 증가합니다. * 0초가 되면 게임 UI가 종료됩니다. * 게임 시작하기 버튼을 누르면 다시 게임을 할 수 있습니다. 가이드는 총 8단계로 진행됩니다. 월드를 제작하는 동안 크리에이터의 취향에 맞게 UI를 수정해 색다르게 꾸밀 수도 있습니다. [chunk_id] | Guides:550:0
[task] | diverse_qa [title] | Effective MSW 1 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 월드 제작 초기부터 구조를 고민해야 하는 이유는 무엇인가요? 답변: 월드의 규모가 작거나 초창기에는 발견하기 어려운 문제가, 규모가 커지고 완성도가 높아질수록 동작이 원활하지 않거나 효율이 떨어지는 원인이 될 수 있기 때문입니다. 질문: 루아에서 `nil` 체크는 주로 어떤 상황에서 사용되나요? 답변: 해당 대상이 있는지 없는지 확인할 때 사용하며, 주로 루아의 테이블이나 메이플스토리 월드의 엔티티, 컴포넌트에서 사용합니다. 질문: 엔티티의 삭제 과정에서 `nil` 체크만으로는 문제가 생길 수 있는 [original] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민 [chunk_id] | Guides:559:0
[task] | knowledge_list [title] | Effective MSW 1 [category] | Guides [rephrased] | ```lua -- wait() 함수는 지정된 시간만큼 현재 실행 흐름을 일시적으로 중단(대기)시키는 함수입니다. -- 예시: _UIToast:ShowMessage("Show Message") 실행 후 wait(1)을 호출하면 1초 동안 대기를 한 뒤 _UIToast:ShowMessage("Show Delay Message")가 실행됩니다. -- wait() 호출 이후에 참조하는 엔티티(Entity)나 컴포넌트(Component) 객체의 유효성은 보장되지 않습니다. -- 예시: wait(3) 호출 전후로 targetEntity와 t [original] | `wait()`는 보통 아래 예시 코드처럼 간단하게 사용합니다. ```lua _UIToast:ShowMessage("Show Message") wait(1) _UIToast:ShowMessage("Show Delay Message") ``` 하지만 `wait()`를 사용할 때는 주의해야 합니다. `wait()`는 말 그대로 행동을 '기다리고' 있기 때문에 여기저기에 마구 사용한다면 전체적인 흐름을 파악하기 어려워집니다. 또한, '대기'를 하므로 이후 작업이 진행되지 않는 문제도 있습니다. 아래 예시를 통해 '대기' 때문에 [chunk_id] | Guides:559:1
[task] | diverse_qa [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | 질문: PlayerControllerComponent의 주요 역할은 무엇인가요? 답변: PlayerControllerComponent는 입력에 따라 액션을 수행하고, 특정 조건을 처리하는 컴포넌트입니다. 질문: 사다리에 매달려 있을 때 공격 키를 눌렀는데 공격 애니메이션이 재생되지 않도록 하려면 어떻게 해야 하나요? 답변: 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'는 조건을 추가해야 합니다. 질문: 기본 Player 모델에서 PlayerControllerComponent와 StateC [original] | **PlayerControllerComponent**는 입력에 따라 액션을 수행하고, 특정 조건을 처리합니다.예를 들어, 공격 키를 눌렀을 때 특정 애니메이션을 재생하는 액션을 연결하면 공격 키가 입력되었을 때마다 작동합니다. 그러나 사다리에 매달려 있을 때는 사다리에 매달린 애니메이션이 재생되는 중이므로 공격 애니메이션은 재생되지 않게 해야 오르는 동작이 어색하지 않습니다. 그러므로 사다리에 플레이어가 매달려 있을 때, '공격 키를 눌러도 공격 액션이 재생되지 않는다'란 조건을 추가할 수 있습니다. 기본 Player 모델에는 [chunk_id] | Guides:547:1
[task] | distill [title] | Effective MSW 1 [category] | Guides [rephrased] | `OnUpdate()`에서 `wait()`를 사용하면 프레임당 실행이 중단되지 않고, 다음 프레임에서 `OnUpdate()`가 처음부터 재실행되며 `wait()` 조건이 충족될 때까지 반복 대기합니다. 이로 인해 Update 객체가 누적되어 성능 저하와 디버깅 난이도가 상승하므로, `OnUpdate()` 내부에서 `wait()` 사용은 피해야 합니다. ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` **실제 동작:** `TEST` 출력 후 1초 대기 중, 다음 프레임마다 [original] | 그럼 `OnUpdate()`에서 사용할 경우를 살펴보겠습니다. `OnUpdate()` 문에서 아래 코드는 어떻게 동작할까요? ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` * 기대 동작: TEST - 1초 대기 - TEST2 - TEST1 - 1초 대기 - TEST2 * 실제 동작: **TEST - TEST - TEST - .... (첫 번째 TEST가 찍힌 시점부터 1초가 지났을 때 ) - TEST2** `OnUpdate()`는 논리적인 측면에서 수행이 끝날 당시 [chunk_id] | Guides:559:3
[task] | diverse_qa [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | 질문: 플레이어의 기본 속성에 발동 조건을 추가하기 위해 사용할 수 있는 함수는 무엇인가요? 답변: `AddCondition()` 함수를 사용하여 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 질문: `AddCondition()` 함수를 사용하여 어떤 효과를 줄 수 있나요? 답변: 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 질문: 아래 코드의 `OnBeginPlay` 함수에서 `playerContr [original] | 플레이어의 기본 속성에 발동할 수 있게 하는 조건을 추가할 수 있습니다. `AddCondition()` 함수를 사용해 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 1. **MyDesk**에 PlayerSetting 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. Jump 액션이 실행되는 조건을 작성합니다. 10 이상은 Jump가 실 [chunk_id] | Guides:547:3
[task] | distill [title] | Effective MSW 1 [category] | Guides [rephrased] | # `wait()` 사용 시 주의사항 및 대안 `wait()`는 코드의 흐름을 일시 정지시킵니다. 과도한 사용은 코드 가독성을 저하시키고, 다음과 같은 문제를 유발합니다. ## 1. 대기 후 참조 객체의 유효성 미보장 `wait()` 동안 엔티티나 컴포넌트가 삭제될 수 있어, 대기 후 해당 객체를 참조하면 오류가 발생할 수 있습니다. ```lua local targetEntity = _EntityService:GetEntity("a22396e1-6365-42d4-9cef-5924c223f7fa") targetEntity.Tes [original] | `wait()`는 보통 아래 예시 코드처럼 간단하게 사용합니다. ```lua _UIToast:ShowMessage("Show Message") wait(1) _UIToast:ShowMessage("Show Delay Message") ``` 하지만 `wait()`를 사용할 때는 주의해야 합니다. `wait()`는 말 그대로 행동을 '기다리고' 있기 때문에 여기저기에 마구 사용한다면 전체적인 흐름을 파악하기 어려워집니다. 또한, '대기'를 하므로 이후 작업이 진행되지 않는 문제도 있습니다. 아래 예시를 통해 '대기' 때문에 [chunk_id] | Guides:559:1
[task] | distill [title] | Effective MSW 1 [category] | Guides [rephrased] | # wait vs TimerService `wait`는 현재 코드를 **직렬**로 일시 정지하고, `TimerService`는 별도 작업을 **병렬**로 예약합니다. * **wait**: 동기적 블로킹. 호출 지점 이후의 코드만 대기 후 실행. * **TimerService**: 비동기 스케줄링. 예약된 함수만 실행되며, 메인 로직은 즉시 진행. ```lua -- 직렬: A 실행 -> 1초 대기 -> B 실행 -> C 실행 log("Do A") wait(1) log("Do B") log("Do C") -- 병렬: C, [original] | `wait`는 대기한 뒤에 직접 어떤 행동을 수행하는 것이고, `TimerService`는 해당 행동을 수행하는 별도의 일을 만드는 것입니다. `wait`는 직렬, `TimerService`는 병렬 형태로 동작합니다. 따라서 `wait`의 사용 코드는 다음과 같이 표현할 수 있습니다 ```lua local targetEntity = _EntityService:GetEntity("a22396e1-6365-42d4-9cef-5924c223f7fa") targetEntity.TestComponent:ShowMessage() func [chunk_id] | Guides:559:2
[task] | diverse_qa [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | 질문: `MoveToMapPosition()` 메서드의 주요 용도는 무엇인가요? 답변: `MoveToMapPosition()`은 플레이어를 특정 위치로 이동시키는 데 사용되며, 이를 통해 모든 유저를 한 번에 다른 맵으로 옮겨 새로운 게임을 진행할 수 있게 합니다. 질문: 여러 유저를 다른 맵으로 이동시키기 위해 MyDesk에 추가해야 하는 컴포넌트의 이름은 무엇인가요? 답변: PlayerManagement 컴포넌트입니다. 질문: `TimerService`를 이용하여 10초 후 유저를 이동시키려면 어떤 함수를 호출해야 하나요? [original] | `MoveToMapPosition()`를 이용해 플레이어를 특정 위치로 이동시킬 수 있습니다. 이 기능을 활용해 여러 맵으로 모든 유저를 한 번에 옮겨 새로운 맵에서 새로운 게임을 할 수 있게 합니다. 1. **MyDesk**에 새로운 PlayerManagement 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. `TimerService`를 이용해 10초를 셀 수 있게 만들고, 10초 뒤 이동할 map의 이름과 그 맵의 위치를 입력합니다. 맵의 이름은 Hierarchy의 이름과 동일해야 합니다. >** [chunk_id] | Guides:547:2
[task] | diverse_qa [title] | Effective MSW 1 [category] | Guides [rephrased] | 질문: `wait()` 함수의 기본적인 사용 예시는 어떻게 되나요? 답변: `_UIToast:ShowMessage("Show Message")`를 호출한 후 `wait(1)`로 1초를 대기하고, 다시 `_UIToast:ShowMessage("Show Delay Message")`를 호출하는 방식으로 사용됩니다. 질문: `wait()`을 과도하게 사용할 경우 발생하는 두 가지 주요 문제는 무엇인가요? 답변: 전체적인 코드 흐름을 파악하기 어려워질 수 있고, '대기' 상태 때문에 이후 작업이 진행되지 않는 문제가 발생합니다. 질문: [original] | `wait()`는 보통 아래 예시 코드처럼 간단하게 사용합니다. ```lua _UIToast:ShowMessage("Show Message") wait(1) _UIToast:ShowMessage("Show Delay Message") ``` 하지만 `wait()`를 사용할 때는 주의해야 합니다. `wait()`는 말 그대로 행동을 '기다리고' 있기 때문에 여기저기에 마구 사용한다면 전체적인 흐름을 파악하기 어려워집니다. 또한, '대기'를 하므로 이후 작업이 진행되지 않는 문제도 있습니다. 아래 예시를 통해 '대기' 때문에 [chunk_id] | Guides:559:1
[task] | wikipedia [title] | Effective MSW 1 [category] | Guides [rephrased] | # 학습 과정 소개 메이플스토리 월드는 코딩의 접근성을 높이기 위해 다양한 편의 기능을 제공합니다. 그중에서도 실행 제어를 간편하게 설정할 수 있는 기능이 대표적입니다. 하지만 이러한 간단한 설정들이 서로 얽히면서 시스템의 복잡도가 증가할 수 있으며, 설정 오류가 발생하면 의도한 기능이 정상적으로 실행되지 않거나 월드의 응답 속도가 현저히 저하되는 문제가 발생할 수 있습니다. 이러한 잠재적 문제는 월드 규모가 작거나 제작 초기 단계에서는 쉽게 파악하기 어렵습니다. 그러나 월드가 확장되고 완성도가 높아질수록 이러한 비효율적 구조가 [original] | # 학습 과정 소개 메이플스토리 월드는 쉬운 코딩을 위해 다양한 편의 기능을 지원하고 있습니다. 대표적으로 간편한 실행 제어 설정 기능이 있습니다. 그러나 간단한 설정이 얽히며 복잡해질 수 있고, 잘못 설정하면 원하는 기능이 제대로 실행되지 않을 수도 있습니다. 때로는 월드가 매우 느려질 수도 있습니다. 이런 문제는 월드의 규모가 작거나 월드 제작 초창기에는 발견하기 어렵습니다. 하지만 월드의 규모가 커지고 완성도가 높아질수록 문제가 될 수 있습니다. 그러므로 제작 초기부터 모든 동작이 원활하고 효율적으로 진행되도록 구조를 고민 [chunk_id] | Guides:559:0
[task] | wikipedia [title] | Effective MSW 1 [category] | Guides [rephrased] | `wait()` 함수는 일반적으로 코드를 순차적으로 실행하는 데 사용됩니다. 아래 예시처럼 특정 동작 후 정해진 시간만큼 기다린 뒤 다음 동작을 수행할 때 적용할 수 있습니다. ```lua _UIToast:ShowMessage("Show Message") wait(1) _UIToast:ShowMessage("Show Delay Message") ``` 그러나 `wait()` 함수의 남용은 피해야 합니다. 이 함수는 현재 실행 흐름을 차단하고 지정된 시간만큼 '대기' 상태로 유지하기 때문에, 코드가 복잡해지면 전체적인 흐름을 파악 [original] | `wait()`는 보통 아래 예시 코드처럼 간단하게 사용합니다. ```lua _UIToast:ShowMessage("Show Message") wait(1) _UIToast:ShowMessage("Show Delay Message") ``` 하지만 `wait()`를 사용할 때는 주의해야 합니다. `wait()`는 말 그대로 행동을 '기다리고' 있기 때문에 여기저기에 마구 사용한다면 전체적인 흐름을 파악하기 어려워집니다. 또한, '대기'를 하므로 이후 작업이 진행되지 않는 문제도 있습니다. 아래 예시를 통해 '대기' 때문에 [chunk_id] | Guides:559:1
[task] | knowledge_list [title] | Effective MSW 1 [category] | Guides [rephrased] | 1. `OnUpdate()` 함수 내에서 `wait(1)` 호출 시, 첫 번째 로그 출력(`log("TEST")`) 이후 1초가 경과한 시점부터 두 번째 로그(`log("TEST2")`)가 출력되며, 이는 `wait()`가 현재 실행을 멈추게 하지만 `OnUpdate()`의 논리적 종료와 다음 프레임 생성 사이에서 발생하는 비정상적인 동작 패턴입니다. 2. `OnUpdate()`는 논리적으로 수행이 끝날 당시 해당 구간의 실행을 종료하고, 다음 프레임에서는 처음부터 새로운 `OnUpdate()` 인스턴스를 생성하여 실행하는 라이프사 [original] | 그럼 `OnUpdate()`에서 사용할 경우를 살펴보겠습니다. `OnUpdate()` 문에서 아래 코드는 어떻게 동작할까요? ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` * 기대 동작: TEST - 1초 대기 - TEST2 - TEST1 - 1초 대기 - TEST2 * 실제 동작: **TEST - TEST - TEST - .... (첫 번째 TEST가 찍힌 시점부터 1초가 지났을 때 ) - TEST2** `OnUpdate()`는 논리적인 측면에서 수행이 끝날 당시 [chunk_id] | Guides:559:3
[task] | diverse_qa [title] | Effective MSW 1 [category] | Guides [rephrased] | 질문: `wait` 함수와 `TimerService`의 근본적인 동작 방식 차이는 무엇인가요? 답변: `wait`는 대기한 뒤에 직접 행동을 수행하는 직렬 처리 방식인 반면, `TimerService`는 해당 행동을 수행하는 별도의 일을 만들어 병렬 형태로 동작합니다. 질문: `wait`를 사용하여 3초 후 메시지를 출력하는 코드를 작성할 때, `_TimerService:SetTimerOnce`를 사용하는 대신 `wait`를 직접 함수 본문에 넣는 방식의 특징은 무엇인가요? 답변: `wait`를 사용하면 코드가 직렬로 실행되므로, [original] | `wait`는 대기한 뒤에 직접 어떤 행동을 수행하는 것이고, `TimerService`는 해당 행동을 수행하는 별도의 일을 만드는 것입니다. `wait`는 직렬, `TimerService`는 병렬 형태로 동작합니다. 따라서 `wait`의 사용 코드는 다음과 같이 표현할 수 있습니다 ```lua local targetEntity = _EntityService:GetEntity("a22396e1-6365-42d4-9cef-5924c223f7fa") targetEntity.TestComponent:ShowMessage() func [chunk_id] | Guides:559:2
[task] | extract_knowledge [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | # 플레이어 설정 및 제어 API ## 개념 설명 메이플스토리 월드 스크립트(mLua)에서 플레이어의 위치 이동, 리스폰 제어, 그리고 특정 조건 기반 액션 제한을 수행하기 위한 주요 메서드와 이벤트 처리기를 제공합니다. 1. **`PlayerComponent:MoveToMapPosition()`**: 특정 맵의 좌표로 플레이어를 즉시 이동시킵니다. 모든 유저를 한 번에 다른 맵으로 이동시켜 새 게임을 시작하는 용도로 사용됩니다. 2. **`PlayerComponent.RespawnPosition`**: 플레이어가 사망한 [original] | `MoveToMapPosition()`를 이용해 플레이어를 특정 위치로 이동시킬 수 있습니다. 이 기능을 활용해 여러 맵으로 모든 유저를 한 번에 옮겨 새로운 맵에서 새로운 게임을 할 수 있게 합니다. 1. **MyDesk**에 새로운 PlayerManagement 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. `TimerService`를 이용해 10초를 셀 수 있게 만들고, 10초 뒤 이동할 map의 이름과 그 맵의 위치를 입력합니다. 맵의 이름은 Hierarchy의 이름과 동일해야 합니다. >** [chunk_id] | Guides:547:2
[task] | diverse_qa [title] | Effective MSW 1 [category] | Guides [rephrased] | 질문: `OnUpdate()` 함수 내부에서 `log("TEST")`를 호출한 후 `wait(1)`을 실행하고 다시 `log("TEST2")`를 호출하는 코드의 실제 동작은 무엇인가요? 답변: 첫 번째 `log("TEST")`가 출력된 시점부터 1초가 지날 때까지 `TEST`가 반복 출력되고, 그 이후에 `TEST2`가 출력됩니다. 질문: `OnUpdate()`에서 `wait()`를 사용할 때 기대했던 동작과 실제 동작의 차이는 무엇인가요? 답변: 기대 동작은 'TEST' 출력 후 1초 대기, 'TEST2' 출력, 다음 프레임에서 [original] | 그럼 `OnUpdate()`에서 사용할 경우를 살펴보겠습니다. `OnUpdate()` 문에서 아래 코드는 어떻게 동작할까요? ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` * 기대 동작: TEST - 1초 대기 - TEST2 - TEST1 - 1초 대기 - TEST2 * 실제 동작: **TEST - TEST - TEST - .... (첫 번째 TEST가 찍힌 시점부터 1초가 지났을 때 ) - TEST2** `OnUpdate()`는 논리적인 측면에서 수행이 끝날 당시 [chunk_id] | Guides:559:3
[task] | extract_knowledge [title] | 플레이어 설정과 제어 [category] | Guides [rephrased] | # 플레이어 설정과 제어 (Player Setting & Control) 본 절에서는 `PlayerSetting` 컴포넌트를 활용하여 플레이어의 기본 행동(점프, 공격 등)에 조건을 부여하거나 조작 키를 재배정하는 방법을 다룹니다. ## 1. 개념 설명 `PlayerSetting` 컴포넌트는 플레이어 엔티티에 추가하여 입력 처리와 행동 발동 로직을 제어하는 역할을 합니다. 주요 기능은 다음과 같습니다. 1. **행동 조건 제약 (`AddCondition`)**: * 특정 액션(예: Jump, Attack)이 실행 [original] | 플레이어의 기본 속성에 발동할 수 있게 하는 조건을 추가할 수 있습니다. `AddCondition()` 함수를 사용해 플레이어의 행동을 제약하기 위한 조건을 추가할 수 있습니다. 기본적으로 사용 가능한 공격, 점프 등을 일시적으로 특정 조건을 만족할 때 기능 발동을 제한하거나, 추가 발동 조건을 추가해 색다른 재미를 선사할 수 있습니다. 1. **MyDesk**에 PlayerSetting 컴포넌트를 생성하고, DefaultPlayer에 추가합니다. 2. Jump 액션이 실행되는 조건을 작성합니다. 10 이상은 Jump가 실 [chunk_id] | Guides:547:3
[task] | wikipedia [title] | Effective MSW 1 [category] | Guides [rephrased] | `OnUpdate()` 이벤트 핸들러 내부에서 `wait()` 함수를 사용할 경우, 개발자가 의도한 순차적 실행 흐름과 실제 동작 사이에 심각한 불일치가 발생합니다. 이는 mLua의 업데이트 루프 처리 방식과 대기 메커니즘의 상호작용으로 인해 발생하는 현상입니다. 아래 코드는 `OnUpdate()` 내에서 `wait()`를 사용했을 때의 동작 방식을 보여주는 예시입니다. ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` 개발자가 기대하는 정상적인 동작은 "TEST" 로그 [original] | 그럼 `OnUpdate()`에서 사용할 경우를 살펴보겠습니다. `OnUpdate()` 문에서 아래 코드는 어떻게 동작할까요? ```lua log("TEST") -- No.1 wait(1) log("TEST2") -- No.2 ``` * 기대 동작: TEST - 1초 대기 - TEST2 - TEST1 - 1초 대기 - TEST2 * 실제 동작: **TEST - TEST - TEST - .... (첫 번째 TEST가 찍힌 시점부터 1초가 지났을 때 ) - TEST2** `OnUpdate()`는 논리적인 측면에서 수행이 끝날 당시 [chunk_id] | Guides:559:3
[task] | knowledge_list [title] | Effective MSW 1 [category] | Guides [rephrased] | 1. 실행 공간이 `[Client]`로 설정된 함수는 기본적으로 모든 클라이언트에서 실행되며, 서버가 특정 클라이언트에만 실행을 제한하기 위해서는 추가적인 로직이나 기능이 필요합니다. 2. 서버에서 클라이언트로 함수를 호출할 때, 해당 함수의 마지막 매개 변수로 `string` 타입의 `UserId`를 전달하면, 서버는 명시적으로 지정한 `UserId`에 해당하는 클라이언트에만 해당 함수를 전송합니다. 3. 실행 공간이 `[Client]`인 함수의 마지막 매개 변수로 `UserId`를 지정하는 기능은, 요청(Request)을 보낸 [original] | 어떤 함수의 실행 제어 옵션이 **Client**로 설정되어 있다면 해당 함수는 모든 클라이언트에서 실행됩니다. 하지만 서버에서는 모든 클라이언트가 아니라 특정 클라이언트에만 함수를 실행하고 싶은 상황이 생길 수 있습니다. 특정 클라이언트가 서버에 어떤 요청(Request)을 보내고 서버가 로직을 처리한 이후, 해당 클라이언트에 응답(Response) 하는 상황이 그것입니다. 예를 들어 봅시다. 1. A 클라이언트에서 아이템 구매 버튼을 누른다면 : (Request) 2. 서버에서는 A가 가진 돈을 차감하고 아이템 개수를 늘린 다 [chunk_id] | Guides:559:4