[task] | diverse_qa [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | 질문: 상태 전이(Transition)는 무엇을 의미합니까? 답변: 어떤 상태에서 다음 상태로 변하는 것을 상태 전이(Transition)라 합니다. 질문: 상태 전이 이벤트는 어떤 정보를 포함합니까? 답변: 이벤트는 상태 전이가 발생하기 이전의 상태와 현재 상태(바뀐 상태)의 정보를 갖고 있습니다. 질문: StateComponent의 상태가 전이될 때 발생하는 이벤트는 무엇입니까? 답변: StateChangeEvent가 함께 발생합니다. 질문: StateComponent가 DEAD 상태에 진입할 때 발생하는 이벤트는 무엇입니 [original] | 어떤 상태에서 다음 상태로 변하는 것을 상태 전이(Transition)라 합니다. 상태 전이가 발생할 때 다양한 이벤트가 발생하고, 이를 활용해 특정 엔티티가 상태 전이를 감지할 수 있습니다. 이벤트는 상태 전이가 발생하기 이전의 상태와 현재 상태(바뀐 상태)의 정보를 갖고 있습니다. 아래와 같은 상황에서 이벤트가 발생합니다. * StateComponent의 상태가 전이되면, [StateChangeEvent](/apiReference/Events/StateChangeEvent)가 함께 발생합니다. * StateComponent가 [chunk_id] | Guides:686:1
[task] | distill [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | `SpriteAnimPlayerEndFrameEvent`는 `SpriteRendererComponent` 또는 `ClimbableSpriteRendererComponent`에서 클라이언트 공간으로 전송되는 이벤트입니다. **이벤트 파라미터** * `FrameIndex` (number): 현재 프레임 인덱스 * `ReversePlaying` (boolean): 역방향 재생 여부 * `TotalFrameCount` (number): 총 프레임 수 * `AnimPlayer` (any): 애니메이션 플레이어 객체 **동작 [original] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------ [chunk_id] | Guides:686:5
[task] | extract_knowledge [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | # 게임 로직 엔티티의 상태 제어 ## 개념 설명 엔티티의 상태 전이(Transition)는 특정 상태에서 다음 상태로 변하는 과정입니다. 상태 전이가 발생하면 다음과 같은 이벤트가 발생하며, 이를 통해 다른 엔티티가 상태 변화를 감지할 수 있습니다. 이벤트에는 전이 이전의 상태와 현재(변경된) 상태의 정보가 포함됩니다. * `StateComponent`의 상태 전이 시: `StateChangeEvent` 발생 * `StateComponent`가 `DEAD` 상태 진입 시: `DeadEvent` 발생 * `Defau [original] | 어떤 상태에서 다음 상태로 변하는 것을 상태 전이(Transition)라 합니다. 상태 전이가 발생할 때 다양한 이벤트가 발생하고, 이를 활용해 특정 엔티티가 상태 전이를 감지할 수 있습니다. 이벤트는 상태 전이가 발생하기 이전의 상태와 현재 상태(바뀐 상태)의 정보를 갖고 있습니다. 아래와 같은 상황에서 이벤트가 발생합니다. * StateComponent의 상태가 전이되면, [StateChangeEvent](/apiReference/Events/StateChangeEvent)가 함께 발생합니다. * StateComponent가 [chunk_id] | Guides:686:1
[task] | wikipedia [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | # 게임 로직 엔티티의 상태 제어하기 게임 로직에서 엔티티의 상태가 한 상태에서 다른 상태로 변화하는 과정을 **상태 전이(Transition)**라고 정의합니다. 상태 전이가 발생하는 시점에는 다양한 이벤트가 트리거되며, 이를 통해 특정 엔티티가 상태 변화를 감지하고 이에 대한 반응을 처리할 수 있습니다. 이러한 이벤트는 상태 전이가 일어나기 직전의 이전 상태와 전이 후의 현재 상태(변경된 상태)에 대한 정보를 포함하고 있습니다. 구체적으로 다음과 같은 상황에서는 관련 이벤트가 발생합니다. 첫째, `StateComponent [original] | 어떤 상태에서 다음 상태로 변하는 것을 상태 전이(Transition)라 합니다. 상태 전이가 발생할 때 다양한 이벤트가 발생하고, 이를 활용해 특정 엔티티가 상태 전이를 감지할 수 있습니다. 이벤트는 상태 전이가 발생하기 이전의 상태와 현재 상태(바뀐 상태)의 정보를 갖고 있습니다. 아래와 같은 상황에서 이벤트가 발생합니다. * StateComponent의 상태가 전이되면, [StateChangeEvent](/apiReference/Events/StateChangeEvent)가 함께 발생합니다. * StateComponent가 [chunk_id] | Guides:686:1
[task] | distill [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | # 게임 로직 엔티티의 상태 제어하기 IDLE, DEAD 및 커스텀 상태(BROKEN)를 활용해 엔티티의 상태 전이와 시각적 변경(스프라이트/애니메이션)을 구현합니다. 상태 전이 흐름: `IDLE` → `BROKEN` → `DEAD` → `IDLE` > **Tip.** 기본 템플릿(`DefaultPlayer`)에 `PlayerHit`, `PlayerAttack` 컴포넌트가 포함되어 있는지 확인하세요. ### 리소스 RUID * **IDLE**: `b871399ae18d41c4b76c2ae79feefa7d` * **BROKEN* [original] | 플레이어의 공격에 상태가 변하는 나무 상자를 만들어봅시다. 기본 상태인 IDLE, DEAD와 크리에이터가 만든 새로운 BROKEN 상태를 함께 활용합니다. 상태마다의 특정 애니메이션, 스프라이트를 추가해 상태 변화를 직관적으로 확인할 수 있습니다. 이 예시는 IDLE → BROKEN → DEAD → IDLE로 상태 전이하며, 상태마다 다른 스프라이트, 애니메이션을 연결해 재생하게 됩니다. >**Tip.** >만들기 - 새로 만들기 - **기본** 템플릿을 사용해 플레이어의 기본 공격, 피격을 구성합니다. 해당 템플릿의 D [chunk_id] | Guides:686:3
[task] | wikipedia [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | # 게임 로직 엔티티의 상태 제어 메이플스토리 월드(MapleStory Worlds)의 mLua 스크립트에서는 `StateComponent`와 `StateType`을 활용하여 게임 로직 엔티티의 상태 관리를 수행합니다. 이 구조를 통해 엔티티가 특정 조건을 만족했을 때 한 상태에서 다른 상태로 전이되도록 논리를 구성할 수 있습니다. ## StateType 생성 및 상태 정의 새로운 상태를 정의하려면 에디터의 **MyDesk - Create Scripts - Create StateType** 메뉴를 통해 `StateType`을 [original] | **MyDesk - Create Scripts - Create StateType**을 눌러 새로운 StateType을 생성하고, 상태를 정의합니다. `OnConditionCheck()`를 활용해 상태 전이 조건을 만들 수 있습니다. 아래와 같이 **MoveDown** StateType을 만들고 아래의 예시 코드처럼 활용할 수 있습니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) } [chunk_id] | Guides:686:2
[task] | extract_knowledge [title] | 뒤통수가 개방된 모자 [category] | Guides [rephrased] | # 뒤통수가 개방된 모자(Avatar_Cap_A) 및 이펙트 파일 구조 본 절에서는 뒤통수가 개방된 모자(`Avatar_Cap_A`)와 이펙트가 포함된 파일(`Avatar_Cap_Ani.psd`)의 레이어 구성 및 애니메이션 규칙을 설명합니다. 이 정보는 아바타 아이템 제작 시 그래픽 리소스를 올바르게 배치하기 위한 기준입니다. ## 1. 개념 설명 뒤통수가 개방된 모자는 일반 모자와 달리 뒷부분이 열려 있어 헤어와의 겹침 처리가 중요합니다. 또한, 이펙트가 포함된 모자의 경우 아바타 시트의 애니메이션 프레임 규칙에 따라 레이 [original] | * **case1.front**: 모자의 앞모습을 그릴 레이어와 앞모습의 일반 헤어와 눌린 헤어 샘플이 포함되어 있습니다. * **edithere:cap_cap_34**: 모자의 앞모습을 그릴 수 있는 레이어입니다. * **edithere:cap_frontBackCap_92**: 헤어 뒤에 오는 모자의 앞모습을 그릴 수 있는 레이어입니다. * **case2.back**: 모자의 뒷모습을 그릴 레이어와 뒷모습의 일반 헤어와 눌린 헤어 샘플이 포함되어 있습니다. * **edithere:cap_backCap_92** [chunk_id] | Guides:684:1
[task] | wikipedia [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | **게임 로직 엔티티의 상태 제어하기** 메이플스토리 월드의 게임 로직 엔티티에서 상태 제어를 수행할 때, 스크립트 컴포넌트를 통해 특정 이벤트에 반응하여 엔티티의 속성을 변경할 수 있습니다. 아래에 제시된 예제는 `SpriteAnimPlayerEndFrameEvent`를 처리하는 이벤트 핸들러를 포함하고 있습니다. 이 핸들러는 클라이언트 공간(`[self]`)에서 실행되며, 애니메이션 재생이 끝나는 프레임에 도달했을 때 트리거됩니다. 이벤트 발생 소스(Sender)는 `ClimbableSpriteRendererComponent [original] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------ [chunk_id] | Guides:686:5
[task] | knowledge_list [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | 제시된 문서 내용을 바탕으로 추출한 핵심 사실 목록은 다음과 같습니다. 1. `OnConditionCheck(string nextStateName)` 메서드는 `nextStateName` 문자열 매개변수를 수신하며, 상태 전이 조건을 판단하기 위해 `self.exitFlag`의 부울 값(`boolean`)을 반환합니다. 2. `OnExit()` 메서드는 실행 시 `self.ParentComponent.Entity.SpriteRendererComponent.SpriteRUID`를 "b871399ae18d41c4b76c2ae79fee [original] | ```lua boolean OnConditionCheck(string nextStateName) { return self.exitFlag } void OnExit() { self.ParentComponent.Entity.SpriteRendererComponent.SpriteRUID = "b871399ae18d41c4b76c2ae79feefa7d" --IDLE RUID _TimerService:ClearTimer(self.timerId) } [chunk_id] | Guides:686:4
[task] | knowledge_list [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | 1. `HandleSpriteAnimPlayerEndFrameEvent` 이벤트 핸들러는 `[self]` 공간에서 실행되며, `SpriteAnimPlayerEndFrameEvent` 타입의 이벤트 객체를 매개변수로 받습니다. 2. 이 이벤트는 클라이언트 공간에서 `ClimbableSpriteRendererComponent` 또는 `SpriteRendererComponent`에 의해 발생(Send)됩니다. 3. `SpriteAnimPlayerEndFrameEvent` 객체는 `FrameIndex`, `ReversePlaying`, ` [original] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------ [chunk_id] | Guides:686:5
[task] | diverse_qa [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | 질문: 이 문서의 예시에서 나무 상자가 가지는 상태 전이 순서는 어떻게 되나요? 답변: IDLE → BROKEN → DEAD → IDLE 순서로 상태가 전이합니다. 질문: 이 예시에서 사용할 애니메이션과 스프라이트의 RUID 목록을 모두 나열하시오. 답변: IDLE: b871399ae18d41c4b76c2ae79feefa7d, BROKEN: 76815f621e354f57b5adb5b9faaf9eb3, 사과: 014e7c98ad374cf49e7bf7ea72844241 입니다. 질문: Model_Box 모델에 추가해야 하는 컴포넌트 [original] | 플레이어의 공격에 상태가 변하는 나무 상자를 만들어봅시다. 기본 상태인 IDLE, DEAD와 크리에이터가 만든 새로운 BROKEN 상태를 함께 활용합니다. 상태마다의 특정 애니메이션, 스프라이트를 추가해 상태 변화를 직관적으로 확인할 수 있습니다. 이 예시는 IDLE → BROKEN → DEAD → IDLE로 상태 전이하며, 상태마다 다른 스프라이트, 애니메이션을 연결해 재생하게 됩니다. >**Tip.** >만들기 - 새로 만들기 - **기본** 템플릿을 사용해 플레이어의 기본 공격, 피격을 구성합니다. 해당 템플릿의 D [chunk_id] | Guides:686:3
[task] | wikipedia [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | # 게임 로직 엔티티의 상태 제어하기 이 가이드에서는 플레이어의 공격에 따라 상태가 변하는 나무 상자를 제작하는 과정을 설명합니다. 이 예시에서는 기본 상태인 `IDLE`과 `DEAD` 외에 크리에이터가 직접 정의한 `BROKEN` 상태를 활용하여 상태 전이를 구현합니다. 각 상태에는 특정 애니메이션과 스프라이트가 연결되어 있어, 상태 변화를 시각적으로 직관적으로 확인할 수 있습니다. 상태 전이 순서는 `IDLE` → `BROKEN` → `DEAD` → `IDLE`로 진행되며, 상태별로 다른 스프라이트와 애니메이션이 재생됩니다. [original] | 플레이어의 공격에 상태가 변하는 나무 상자를 만들어봅시다. 기본 상태인 IDLE, DEAD와 크리에이터가 만든 새로운 BROKEN 상태를 함께 활용합니다. 상태마다의 특정 애니메이션, 스프라이트를 추가해 상태 변화를 직관적으로 확인할 수 있습니다. 이 예시는 IDLE → BROKEN → DEAD → IDLE로 상태 전이하며, 상태마다 다른 스프라이트, 애니메이션을 연결해 재생하게 됩니다. >**Tip.** >만들기 - 새로 만들기 - **기본** 템플릿을 사용해 플레이어의 기본 공격, 피격을 구성합니다. 해당 템플릿의 D [chunk_id] | Guides:686:3
[task] | knowledge_list [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | 제공된 원문 문서의 내용만 바탕으로 핵심 사실을 추출하여 정리한 목록입니다. 1. 이 예시는 `IDLE`, `DEAD` 기본 상태와 크리에이터가 만든 `BROKEN` 커스텀 상태를 활용하여 `IDLE` → `BROKEN` → `DEAD` → `IDLE` 순서로 상태 전이를 수행합니다. 2. 플레이어의 기본 공격 및 피격 구성을 위해 '만들기 - 새로 만들기 - 기본' 템플릿을 사용하며, 해당 템플릿의 `DefaultPlayer`에 `PlayerHit` 및 `PlayerAttack` 컴포넌트가 존재하는지 확인해야 합니다. 3. [original] | 플레이어의 공격에 상태가 변하는 나무 상자를 만들어봅시다. 기본 상태인 IDLE, DEAD와 크리에이터가 만든 새로운 BROKEN 상태를 함께 활용합니다. 상태마다의 특정 애니메이션, 스프라이트를 추가해 상태 변화를 직관적으로 확인할 수 있습니다. 이 예시는 IDLE → BROKEN → DEAD → IDLE로 상태 전이하며, 상태마다 다른 스프라이트, 애니메이션을 연결해 재생하게 됩니다. >**Tip.** >만들기 - 새로 만들기 - **기본** 템플릿을 사용해 플레이어의 기본 공격, 피격을 구성합니다. 해당 템플릿의 D [chunk_id] | Guides:686:3
[task] | diverse_qa [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | 질문: `OnConditionCheck` 함수에서 상태 전이 조건으로 어떤 값을 반환합니까? 답변: `OnConditionCheck` 함수는 `self.exitFlag`의 값을 반환합니다. 질문: `OnExit` 함수에서 SpriteRendererComponent의 SpriteRUID가 어떤 값으로 설정됩니까? 답변: `OnExit` 함수에서는 SpriteRendererComponent의 SpriteRUID가 "b871399ae18d41c4b76c2ae79feefa7d"로 설정됩니다. 질문: `OnExit` 함수에서 타이머를 처 [original] | ```lua boolean OnConditionCheck(string nextStateName) { return self.exitFlag } void OnExit() { self.ParentComponent.Entity.SpriteRendererComponent.SpriteRUID = "b871399ae18d41c4b76c2ae79feefa7d" --IDLE RUID _TimerService:ClearTimer(self.timerId) } [chunk_id] | Guides:686:4
[task] | knowledge_list [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | - 월드 좌표는 Hierarchy - world - map 공간에서 맵의 특정 위치를 나타내며, 맵에 배치된 엔티티의 `TransformComponent.WorldPosition` 속성 값으로 확인됩니다. - 월드 좌계의 원점은 맵의 중앙에 위치합니다. - Screen 좌표는 기기의 디스플레이 해상도 픽셀 수와 동일한 범위를 가지며, 좌표계의 원점은 화면의 좌측 하단입니다. - Screen 좌표의 최댓값은 기기의 해상도에 따라 달라지며, Screen 좌표의 값은 `ScreenTouchEvent`, `ScreenTouchHoldEve [original] | # 학습 과정 소개 메이플스토리 월드의 월드 공간과 스크린 공간이 존재합니다. 각 공간에서는 서로 다른 좌표계를 사용합니다. 두 공간에서 사용하는 좌표계에 대해 알아봅시다. # 월드 공간 월드 공간이란 Hierarchy - world - map의 공간을 의미합니다. ## 월드 좌표 월드 좌표는 맵에서의 특정 위치 값입니다. 맵에 배치된 엔티티의`TransformComponent.WorldPosition` 값이 월드 좌표입니다. 월드 좌표의 원점은 맵의 중앙입니다. 예를 들어 아래 이미지와 같이 **분수 Entity**는 월 [chunk_id] | Guides:688:0
[task] | diverse_qa [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | 질문: `HandleSpriteAnimPlayerEndFrameEvent` 이벤트 핸들러의 실행 공간(Space)은 어디인가요? 답변: 해당 이벤트 핸들러는 `[self]` 태그가 붙어 있으며, 문서 상단의 Sender 정보에 따르면 Client 공간에서 실행됩니다. 질문: `HandleSpriteAnimPlayerEndFrameEvent` 이벤트에서 사용할 수 있는 파라미터는 무엇인가요? 답변: `event.FrameIndex`, `event.ReversePlaying`, `event.TotalFrameCount`, `event [original] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------ [chunk_id] | Guides:686:5
[task] | extract_knowledge [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | # 스프라이트 애니메이션 프레임 종료 이벤트 처리 ## 개념 설명 `SpriteAnimPlayerEndFrameEvent`는 클라이언트 공간에서 스프라이트 렌더러 컴포넌트(`SpriteRendererComponent` 또는 `ClimbableSpriteRendererComponent`)가 애니메이션의 특정 프레임 재생을 마쳤을 때 발생하는 네이티브 이벤트입니다. 이 이벤트를 통해 애니메이션 재생 상태에 따라 엔티티의 시각적 속성(예: 색상, 투명도)을 제어할 수 있습니다. ## API 사용법 이 이벤트 핸들러는 `[self]` [original] | ```lua [self] HandleSpriteAnimPlayerEndFrameEvent(SpriteAnimPlayerEndFrameEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: ClimbableSpriteRendererComponent -- Space: Client ------------------------------------------------ [chunk_id] | Guides:686:5
[task] | distill [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | # 월드 좌표와 스크린 좌표 ## 화면 비율 규칙 * **PC**: 창 크기 변경 시에도 화면 비율은 항상 **16:9**로 유지됩니다. 해상도(예: 1920x1080, 3840x2160)가 달라져도 보이는 영역은 동일하게 유지되며, 전체 화면일 경우 모니터 비율에 따라 가로 영역만 확대/축소됩니다. * **Mobile**: 화면은 가로 모드로 고정됩니다. 보이는 영역은 **16:9**를 기준으로, 세로 영역은 동일하게 유지하고 가로 영역은 기기 해상도 비율에 따라 조정됩니다. * **세로가 긴 비율 (예: iP [original] | PC를 사용하는 메이플스토리 월드 유저는 창 크기를 변경할 수 있습니다. 그러나 창 크기를 변경해도 창의 화면 비율은 16:9로 유지됩니다. 비율이 유지되므로 화면의 보이는 영역이 비율에 비례해 확대/축소됩니다. 단, 창이 전체 화면인 경우 모니터의 화면 비율에 따라 가로 영역이 더 많이 보이거나 더 적게 보이게 됩니다. 예를 들어 창 크기가 1920x1080일 때와 3840x2160일 때 모두 화면은 동일하게 보입니다. | 1920x1080| 3840x2160 | | ---| --- | | ![[object Object]](h [chunk_id] | Guides:688:1
[task] | distill [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | # 월드 좌표와 스크린 좌표 메이플스토리 월드의 공간은 **월드 공간**과 **스크린 공간**으로 구분되며, 각각 다른 좌표계를 사용합니다. ## 1. 월드 좌표 (World Coordinates) * **정의**: `Hierarchy > world > map` 내의 위치. * **원점**: 맵의 중앙. * **접근**: 엔티티의 `TransformComponent.WorldPosition` (Vector3). * **예시**: 분수 Entity의 WorldPosition이 `(23.91, -3.37, 999.95 [original] | # 학습 과정 소개 메이플스토리 월드의 월드 공간과 스크린 공간이 존재합니다. 각 공간에서는 서로 다른 좌표계를 사용합니다. 두 공간에서 사용하는 좌표계에 대해 알아봅시다. # 월드 공간 월드 공간이란 Hierarchy - world - map의 공간을 의미합니다. ## 월드 좌표 월드 좌표는 맵에서의 특정 위치 값입니다. 맵에 배치된 엔티티의`TransformComponent.WorldPosition` 값이 월드 좌표입니다. 월드 좌표의 원점은 맵의 중앙입니다. 예를 들어 아래 이미지와 같이 **분수 Entity**는 월 [chunk_id] | Guides:688:0
[task] | wikipedia [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | 게임 로직 엔티티의 상태 제어는 `StateComponent`와 관련된 이벤트 핸들러 및 메서드를 통해 구현됩니다. 이 가이드는 상자 아이템의 상태 전이와 시각적 표현을 제어하는 과정을 단계별로 설명합니다. 먼저, 상태 전이 조건과 종료 시 동작을 정의하는 메서드를 작성합니다. `OnConditionCheck` 메서드는 특정 상태로의 전이 조건을 확인하며, 인자로 다음 상태 이름(`nextStateName`)을 받아서 내부 플래그(`self.exitFlag`)를 기반으로 전이 가능 여부를 반환합니다. 또한 `OnExit` 메서드는 [original] | ```lua boolean OnConditionCheck(string nextStateName) { return self.exitFlag } void OnExit() { self.ParentComponent.Entity.SpriteRendererComponent.SpriteRUID = "b871399ae18d41c4b76c2ae79feefa7d" --IDLE RUID _TimerService:ClearTimer(self.timerId) } [chunk_id] | Guides:686:4
[task] | extract_knowledge [title] | 엔티티의 상태 제어하기 [category] | Guides [rephrased] | # 게임 로직 엔티티의 상태 제어 mLua에서는 엔티티의 행동을 상태(State) 기반으로 제어하기 위해 `StateType`과 `StateComponent`를 사용합니다. 이 메커니즘을 통해 특정 조건이 충족되었을 때 엔티티가 하나의 상태에서 다른 상태로 전환되는 로직을 구현할 수 있습니다. ## 1. 개념 설명 상태 제어 시스템은 다음과 같은 요소들로 구성됩니다. * **StateType**: 상태의 동작과 전이 조건을 정의하는 스크립트 컴포넌트입니다. `MyDesk`에서 **Create Scripts - Create [original] | **MyDesk - Create Scripts - Create StateType**을 눌러 새로운 StateType을 생성하고, 상태를 정의합니다. `OnConditionCheck()`를 활용해 상태 전이 조건을 만들 수 있습니다. 아래와 같이 **MoveDown** StateType을 만들고 아래의 예시 코드처럼 활용할 수 있습니다. ```lua Method: void OnUpdate() { self.ParentComponent.Entity.TransformComponent:Translate(0, -0.01) } [chunk_id] | Guides:686:2
[task] | distill [title] | 아틀라스 활용하기 [category] | Guides [rephrased] | # 스프라이트/애니메이션 아틀라스 활용하기 ## 개념 및 제한 사항 **아틀라스**는 단일 이미지에 다수의 스프라이트가 포함된 이미지입니다. **아틀라스 언패커**를 통해 이를 개별 스프라이트로 자른 후, Resource Storage에 저장하거나 TileDataSet으로 즉시 변환해 렉트타일로 사용할 수 있습니다. * **최대 아틀라스 크기**: 2048 x 2048px * **최대 자르기 조각 수**: 256개 ## 아틀라스 언패커 구성 요소 | 구분 | 설명 | | :--- | :--- | | **파일 선택** [original] | # 학습 과정 소개 아틀라스를 필요한 규격으로 잘라 다양하게 활용할 수 있습니다. 아틀라스 언패커의 구성과 사용 방법을 알아봅시다. # 아틀라스 언패커 소개 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 아틀라스의 이미지를 잘라 렉트타일로 사용하는 등 다양하게 활용할 수 있습니다. 아틀라스 언패커는 아틀라스를 크리에이터가 개별의 스프라이트로 자르고 편집해 저장할 수 있습니다. 자른 스프라이트 중 필요한 것만 선택해 Resource Storage에 저장한 뒤 사용하거나, 바로 TileData [chunk_id] | Guides:687:0
[task] | knowledge_list [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | 제시된 문서 내용만 기반으로 핵심 사실을 추출하여 목록으로 정리하였습니다. 1. PC 환경에서 창 크기를 변경해도 화면 비율은 항상 16:9로 유지되며, 창이 전체 화면일 경우 모니터의 화면 비율에 따라 가로 영역의 가시 범위가 변동된다. 2. PC에서 1920x1080 해상도와 3840x2160 해상도 모두 동일한 화면 영역이 보이도록 캔버스가 처리된다. 3. Mobile 기기에 접속할 경우 화면 방향은 가로로 고정되며, 보이는 영역은 16:9 비율을 기준으로 세로 영역은 동일하게 유지되고 가로 영역은 기기의 해상도 비율에 따라 [original] | PC를 사용하는 메이플스토리 월드 유저는 창 크기를 변경할 수 있습니다. 그러나 창 크기를 변경해도 창의 화면 비율은 16:9로 유지됩니다. 비율이 유지되므로 화면의 보이는 영역이 비율에 비례해 확대/축소됩니다. 단, 창이 전체 화면인 경우 모니터의 화면 비율에 따라 가로 영역이 더 많이 보이거나 더 적게 보이게 됩니다. 예를 들어 창 크기가 1920x1080일 때와 3840x2160일 때 모두 화면은 동일하게 보입니다. | 1920x1080| 3840x2160 | | ---| --- | | ![[object Object]](h [chunk_id] | Guides:688:1
[task] | knowledge_list [title] | 아틀라스 활용하기 [category] | Guides [rephrased] | 제시된 문서에 기반하여 아틀라스 언패커의 구성, 제약 사항 및 사용 절차를 핵심 사실로 정리한 목록입니다. 1. 아틀라스는 한 장의 이미지에 여러 개의 스프라이트가 함께 포함된 이미지를 의미하며, 이를 개별 스프라이트로 잘라 렉트타일 등으로 다양하게 활용할 수 있습니다. 2. 아틀라스 언패커는 크리에이터가 아틀라스를 개별 스프라이트로 자르고 편집하여 Resource Storage에 저장하거나, 바로 TileDataSet으로 넣어 렉트타일로 사용할 수 있도록 하는 도구입니다. 3. 아틀라스 언패커에서 처리할 수 있는 단일 아틀라스의 [original] | # 학습 과정 소개 아틀라스를 필요한 규격으로 잘라 다양하게 활용할 수 있습니다. 아틀라스 언패커의 구성과 사용 방법을 알아봅시다. # 아틀라스 언패커 소개 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 아틀라스의 이미지를 잘라 렉트타일로 사용하는 등 다양하게 활용할 수 있습니다. 아틀라스 언패커는 아틀라스를 크리에이터가 개별의 스프라이트로 자르고 편집해 저장할 수 있습니다. 자른 스프라이트 중 필요한 것만 선택해 Resource Storage에 저장한 뒤 사용하거나, 바로 TileData [chunk_id] | Guides:687:0
[task] | distill [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | # 월드 좌표와 스크린 좌표: Anchor UI 요소의 위치는 `Anchor` 기준점으로부터의 오프셋(`PosX`, `PosY`) 또는 여백(`Left`, `Right`, `Top`, `Bottom`) 값으로 결정됩니다. ## Anchor 유형 및 동작 규칙 | 유형 | 동작 규칙 | | :--- | :--- | | **고정 위치** (9가지) | 지정된 기준점(상단/중앙/하단 × 왼쪽/중앙/오른쪽)으로부터 `PosX`, `PosY` 만큼 떨어진 위치에 UI가 고정됩니다. | | **가로 확장** (3가지) | 상단/정중앙/하 [original] | | Anchor | 설명 | | --- | --- | | | 상단 왼쪽 끝을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 상단 중앙을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 상단 오른쪽 끝을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 중앙 왼쪽 끝을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 정중앙을 기준으로 PosX, PosY 만큼 떨어진 곳에 UI가 위치합니다. | | | 중 [chunk_id] | Guides:688:2
[task] | diverse_qa [title] | 아틀라스 활용하기 [category] | Guides [rephrased] | 질문: 아틀라스란 무엇인가요? 답변: 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 질문: 아틀라스 언패커에서 자를 수 있는 단일 아틀라스의 최대 크기는 얼마인가요? 답변: 최대 크기는 2048*2048px입니다. 질문: 아틀라스 언패커로 최대 몇 개의 조각으로 자를 수 있나요? 답변: 최대 256 조각으로 자를 수 있습니다. 질문: 아틀라스 언패커를 실행하기 위해 어떤 메뉴 경로를 선택해야 하나요? 답변: Window - Atlas Unpacker를 선택해 아틀라스 언패커 창을 엽니다. [original] | # 학습 과정 소개 아틀라스를 필요한 규격으로 잘라 다양하게 활용할 수 있습니다. 아틀라스 언패커의 구성과 사용 방법을 알아봅시다. # 아틀라스 언패커 소개 아틀라스란 한 장의 이미지에 여러 개의 스프라이트가 함께 있는 이미지를 의미합니다. 아틀라스의 이미지를 잘라 렉트타일로 사용하는 등 다양하게 활용할 수 있습니다. 아틀라스 언패커는 아틀라스를 크리에이터가 개별의 스프라이트로 자르고 편집해 저장할 수 있습니다. 자른 스프라이트 중 필요한 것만 선택해 Resource Storage에 저장한 뒤 사용하거나, 바로 TileData [chunk_id] | Guides:687:0
[task] | diverse_qa [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | 질문: 메이플스토리 월드에서 월드 공간은 Hierarchy 구조의 어떤 부분을 의미합니까? 답변: 월드 공간은 Hierarchy - world - map의 공간을 의미합니다. 질문: 맵에 배치된 엔티티의 월드 좌표는 어떤 컴포넌트의 어떤 값으로 확인합니까? 답변: 맵에 배치된 엔티티의 `TransformComponent.WorldPosition` 값이 월드 좌표입니다. 질문: 월드 좌표의 원점은 맵의 어디를 기준으로 삼습니까? 답변: 월드 좌표의 원점은 맵의 중앙입니다. 질문: 스크린 공간에서 사용되는 좌표는 크게 두 가지로 [original] | # 학습 과정 소개 메이플스토리 월드의 월드 공간과 스크린 공간이 존재합니다. 각 공간에서는 서로 다른 좌표계를 사용합니다. 두 공간에서 사용하는 좌표계에 대해 알아봅시다. # 월드 공간 월드 공간이란 Hierarchy - world - map의 공간을 의미합니다. ## 월드 좌표 월드 좌표는 맵에서의 특정 위치 값입니다. 맵에 배치된 엔티티의`TransformComponent.WorldPosition` 값이 월드 좌표입니다. 월드 좌표의 원점은 맵의 중앙입니다. 예를 들어 아래 이미지와 같이 **분수 Entity**는 월 [chunk_id] | Guides:688:0
[task] | diverse_qa [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | 질문: PC 환경에서 메이플스토리 월드 창 크기를 변경할 때 화면 비율은 어떻게 유지되나요? 답변: PC 유저는 창 크기를 변경할 수 있으나, 창의 화면 비율은 항상 16:9로 유지됩니다. 질문: 창 크기가 1920x1080인 경우와 3840x2160인 경우 화면 표시 영역은 어떻게 다른가요? 답변: 두 해상도 모두 16:9 비율을 유지하므로 화면은 동일하게 보입니다. 질문: Mobile 기기에서 월드에 입장했을 때 화면 방향은 어떻게 변경되나요? 답변: Mobile 기기에서 월드에 입장했을 때 화면은 가로로 변경됩니다. 질문 [original] | PC를 사용하는 메이플스토리 월드 유저는 창 크기를 변경할 수 있습니다. 그러나 창 크기를 변경해도 창의 화면 비율은 16:9로 유지됩니다. 비율이 유지되므로 화면의 보이는 영역이 비율에 비례해 확대/축소됩니다. 단, 창이 전체 화면인 경우 모니터의 화면 비율에 따라 가로 영역이 더 많이 보이거나 더 적게 보이게 됩니다. 예를 들어 창 크기가 1920x1080일 때와 3840x2160일 때 모두 화면은 동일하게 보입니다. | 1920x1080| 3840x2160 | | ---| --- | | ![[object Object]](h [chunk_id] | Guides:688:1
[task] | distill [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | # 월드 좌표와 스크린 좌표 ## 핵심 개념 기기별 해상도 및 Safe Area 차이로 인해 **UI 좌표**를 직접 지정하면 UI가 잘리거나 위치가 어긋날 수 있습니다. 이를 방지하기 위해 고정 좌표 대신 **Anchor**를 활용한 상대적 배치 방식을 사용해야 합니다. ## Anchor 활용 `UITransformComponent`의 **Anchor**는 원점으로부터 `PosX`, `PosY` 값만큼 떨어진 곳에 UI를 배치합니다. * **동작 예시**: Anchor Point가 '좌상단 끝'으로 설정된 채팅 UI는 모든 [original] | 기기마다 해상도와 Safe Area가 다르므로 UI 좌표로 UI 위치를 결정할 경우 기기에 따라 UI의 일부가 잘려 보이거나, 보이지 않을 수 있습니다. 모든 기기의 Safe Area를 확인해 UI 위치를 일일이 지정하는 것은 효율적인 제작 방식이 아니므로 UI의 특정 지점을 기준으로 얼마나 떨어져 있을 것인지와 같은 다른 기준으로 UI를 배치해야 합니다. UI 좌표에 맞추어 UI를 배치했을 발생하는 문제를 살펴봅시다. UI는 **스크린 해상도**의 변화에 따라 위치가 달라지게 됩니다. 크리에이터가 버튼 하나를 Anchor를 정 [chunk_id] | Guides:688:3
[task] | knowledge_list [title] | 월드 좌표와 스크린 좌표 [category] | Guides [rephrased] | * 기기마다 해상도와 Safe Area가 다르므로, UI 좌표 기준으로 UI 위치를 직접 지정하면 UI 요소가 잘리거나 보이지 않을 수 있으며, 이를 방지하기 위해 특정 지점 기준 상대 거리 배치 방식을 사용해야 합니다. * `UITransformComponent`의 **Anchor** 프로퍼티는 원점으로부터 `PosX`, `PosY` 값만큼 떨어진 위치에 UI를 배치하도록 설정하며, 이는 다양한 스크린 해상도 비율 차이를 보완하여 일관된 UI 레이아웃을 유지하기 위해 사용됩니다. * 메이플스토리 월드 기본 채팅 UI는 [original] | 기기마다 해상도와 Safe Area가 다르므로 UI 좌표로 UI 위치를 결정할 경우 기기에 따라 UI의 일부가 잘려 보이거나, 보이지 않을 수 있습니다. 모든 기기의 Safe Area를 확인해 UI 위치를 일일이 지정하는 것은 효율적인 제작 방식이 아니므로 UI의 특정 지점을 기준으로 얼마나 떨어져 있을 것인지와 같은 다른 기준으로 UI를 배치해야 합니다. UI 좌표에 맞추어 UI를 배치했을 발생하는 문제를 살펴봅시다. UI는 **스크린 해상도**의 변화에 따라 위치가 달라지게 됩니다. 크리에이터가 버튼 하나를 Anchor를 정 [chunk_id] | Guides:688:3