← 목록

mLua · Nemotron-CC 리프레이즈 (CPT)

총 8,200개 · 페이지 245/274
🔀 랜덤
불러오는 중…

[task] | extract_knowledge [title] | 001_Lobby [category] | Guides [rephrased] | # 01_StaticRoom 001_Lobby 컴포넌트 구조 ## 1. 개념 설명 `01_StaticRoom 001_Lobby`는 게임 시작 전 로비 화면을 담당하는 UI 컴포넌트입니다. 이 컴포넌트는 플레이어의 매칭 상태와 준비 인원을 실시간으로 시각화하고, 준비/취소 동작을 제어하는 UI 요소를 관리합니다. 주요 기능은 다음과 같습니다. * **매칭 상태 표시**: 현재 시스템이 매칭 대기 중인지, 준비 완료 상태인지, 또는 대기 중(Idle)인지에 따라 텍스트를 변경합니다. * **준비 인원 표시**: 현재 'Re [original] | | 동기화 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | None | Entity (/ui/001_LobbyGroup/ReadyState/TimeTxt) | readyStateTxtUI | 현재 플레이어의 매칭 상태를 표시하는 텍스트 UI | | None | Entity (/ui/001_LobbyGroup/ReadyState/ready_count) | readyCountTxtUI | 현재 준비 상태인 플레이어의 숫자를 표시하는 텍스트 UI | | None | Entity (/ui/001_Lobby [chunk_id] | Guides:1136:2

[task] | extract_knowledge [title] | 001_Lobby [category] | Guides [rephrased] | # LobbyMatchManager: 로비 매칭 관리 컴포넌트 ## 1. 개념 설명 `LobbyMatchManager`는 슈피겔만 게임 리메이크 프로젝트의 로비(`01_StaticRoom 001_Lobby`)에서 플레이어 매칭을 제어하는 스크립트 컴포넌트입니다. 이 컴포넌트는 플레이어가 로비에 진입한 후 준비 상태(`Ready`)로 전환될 때까지 대기하고, 설정된 최소 인원(`minPlayerNum`) 이상이 준비되면 카운트다운을 진행하여 인스턴스 룸을 생성하고 플레이어를 해당 룸으로 이동시킵니다. 주요 기능은 다음과 같습니다 [original] | # LobbyMatchManager #### Property | 동기화 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | None | number | matchInterval | 매칭 대기 시간을 설정해주는 변수입니다. | | None | number | minPlayerNum | 매칭에 필요한 최소 인원을 설정해주는 변수입니다. | | None | number | maxPlayerNum | 한 게임에 매칭되는 최대 인원을 설정해주는 변수입니다. | | None | SyncTable<string, [chunk_id] | Guides:1136:0

[task] | extract_knowledge [title] | 001_Lobby [category] | Guides [rephrased] | # 로비 UI 및 매칭 상태 관리 본 절에서는 슈피겔만 게임 리메이크 프로젝트의 `01_StaticRoom 001_Lobby` 맵에서 플레이어 준비 상태(Ready State)를 관리하는 이벤트 핸들러와, 로비 UI(`LobbyUI`) 컴포넌트의 구조 및 이벤트 처리 방식을 다룹니다. ## 1. 플레이어 준비 상태 관리 (Ready State) 플레이어의 접속, 이탈, 버튼 클릭에 따라 준비 상태를 `Idle`(대기), `Quit`(나감), `Ready`(준비 완료)로 변경하는 로직입니다. 모든 이벤트 핸들러는 `SetPlay [original] | | 실행제어 | 이벤트 중계자 | 이름 | 설명 | | --- | --- | --- | --- | | server only | UserService | UserEnterEvent | 플레이어가 게임에 접속하면 준비 상태를 "Idle", 대기 상태로 설정해줍니다.이 이벤트를 포함해서 아래 이벤트 핸들러들은 전부 `SetPlayerReadyState()` 함수를 호출해줍니다. | | server only | UserService | UserLeaveEvent | 플레이어가 게임에서 나가면 준비 상태를 "Quit", 나감 상태로 설정해줍 [chunk_id] | Guides:1136:1

[task] | wikipedia [title] | UI 만들기 [category] | Guides [rephrased] | # UI에서 아바타 애니메이션 재생하기 이 가이드는 `AvatarGUIRendererComponent`를 사용하여 UI 화면 내에서 아바타의 상태에 따라 적절한 애니메이션이 재생되도록 설정하는 방법을 설명합니다. 아바타, 무기 목록, 그리고 재생될 스킬 정보를 표시하는 UI를 구성하고, 이를 통해 아바타 애니메이션을 제어하는 과정을 다룹니다. ## 관련 가이드 및 API 본 제작 과정을 이해하는 데 도움이 되는 참고 자료와 API는 다음과 같습니다. * **가이드**: * [아바타 애니메이션 제어하기](/doc [original] | AvatarGUIRendererComponent를 활용해 UI에서 아바타의 상태에 맞는 애니메이션을 재생하도록 만들어봅시다. 아래의 가이드를 참고하면 제작에 도움이 됩니다. ##### 참고 가이드 * [아바타 애니메이션 제어하기](/docs/?postId=820) * [아바타를 UI에서 표현하기](/docs/?postId=953) * [기본 UI 컴포넌트](/docs/?postId=744) * [UI 에디터 활용과 제어](/docs/?postId=120) * [StateComponent](/apiReference?postId=363 [chunk_id] | Guides:1140:0

[task] | knowledge_list [title] | 004_Outro [category] | Guides [rephrased] | 제시된 문서에 포함된 핵심 사실만을 추출하여, 각 항목이 독립적으로 이해될 수 있도록 API 이름, 매개변수, 반환 타입, 동기화 및 실행 공간(서버/클라이언트) 제약을 명시하여 정리했습니다. **OutroManager 컴포넌트** 1. `OutroManager` 컴포넌트의 `playerOutroTime` 프로퍼티는 `[None]` 동기화 타입의 `SyncTable<string, number>` 타입으로, 키(key)에 플레이어 ID, 값(value)에 결과 확인 시간을 저장합니다. 2. `OutroManager` 컴포넌트의 [original] | # OutroManager #### Property | 동기화 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | None | SyncTable<string, number>| playerOutroTime | 플레이어 별 결과 확인 시간을 관리합니다. key는 플레이어Id, value는 결과 확인 시간 값입니다. | #### Function | 실행제어 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | server only | void | OutroTimerSet | [chunk_id] | Guides:1137:0

[task] | distill [title] | 장애물 만들기 [category] | Guides [rephrased] | # 장애물 및 충돌 구현 장애물 엔티티에 충돌체를 적용하여 모델을 생성하고, 플레이어와의 충돌을 처리하는 `ObstacleComponent` 스크립트를 구현합니다. ## 1. 장애물 엔티티 구성 1. **구조 생성**: `EmptyEntity`를 생성하고 이름을 `Model_Obstacle`로 변경. `TransformComponent` 추가. 2. **자식 엔티티**: `Top`, `Bottom` 엔티티를 생성하여 `Model_Obstacle`의 자식으로 배치. 3. **렌더링 구성**: `Top`, `Bottom`에 [original] | # 장애물 및 충돌 구현 장애물 엔티티를 만들어 충돌체를 추가해봅시다. 충돌체까지 구현한 엔티티는 모델로 만들어 추후 월드에 동적으로 불러옵니다. #### 장애물 엔티티 만들기 1. 새로운 EmptyEntity를 생성하고 이름을 **Model_Obstacle**로 변경합니다. 2. Model_Obstacle에 **TransformComponent**를 추가합니다. 2. 새로운 **Top, Bottom** 엔티티를 생성하고, **Model_Obstacle의 자식 엔티티**로 만듭니다. 부모-자식 관계로 만들어 더욱 관리가 용 [chunk_id] | Guides:1141:0

[task] | distill [title] | 장애물 만들기 [category] | Guides [rephrased] | **장애물 5개 일괄 스폰** `Model_Obstacle` 5개를 일정 간격으로 소환하기 위해 `GameLogic` 컴포넌트를 사용합니다. **1. 프로퍼티** 소환된 엔티티를 저장할 테이블을 선언합니다. ```lua Property: [None] table obstacles = {} ``` **2. 메서드** `OnBeginPlay`에서 `Init`을 호출하여 `_SpawnService`로 장애물을 생성합니다. ```lua Method: [client only] void OnBeginPlay() { self:In [original] | 게임이 실행될 때 만든 Model_Obstacle를 5개 소환하도록 만들어 봅시다. 1. 새로운 **GameLogic**을 생성합니다. 2. 새로운 table 타입의 **obstacles** 프로퍼티를 생성합니다. ```lua Property: [None] table obstacles = {} ``` 3. `OnBeginPlay()` 와 `Init()` 함수를 추가합니다. `SpawnService:SpawnByModelId()`를 활용해 장애물을 불러올 수 있도록 아래와 같이 작성합니다. [chunk_id] | Guides:1141:1

[task] | knowledge_list [title] | 장애물 만들기 [category] | Guides [rephrased] | * `GameLogic` 컴포넌트에 `[None]` 동기화 속성을 가진 `table` 타입의 `obstacles` 프로퍼티를 초기값 `{}`로 선언하여 장애물 엔티티를 저장합니다. * `[client only]` 실행 공간의 `void OnBeginPlay()` 메서드를 구현하여 게임 시작 시 `self:Init()` 메서드를 호출합니다. * `[client only]` 실행 공간의 `void Init()` 메서드 내에서 `_SpawnService:SpawnByModelId()` API를 호출하여 `Model_Obstac [original] | 게임이 실행될 때 만든 Model_Obstacle를 5개 소환하도록 만들어 봅시다. 1. 새로운 **GameLogic**을 생성합니다. 2. 새로운 table 타입의 **obstacles** 프로퍼티를 생성합니다. ```lua Property: [None] table obstacles = {} ``` 3. `OnBeginPlay()` 와 `Init()` 함수를 추가합니다. `SpawnService:SpawnByModelId()`를 활용해 장애물을 불러올 수 있도록 아래와 같이 작성합니다. [chunk_id] | Guides:1141:1

[task] | diverse_qa [title] | UI 만들기 [category] | Guides [rephrased] | 질문: 문서에서 안내하는 튜토리얼의 최종 목표는 무엇인가요? 답변: 신에 배치된 엔티티와 충돌하면 애니메이션 재생 UI가 나타날 수 있게 만드는 것입니다. 질문: 충돌 대상 엔티티의 이름을 무엇으로 변경해야 하나요? 답변: display로 변경해야 합니다. 질문: 충돌 감지를 위해 엔티티에 추가해야 하는 컴포넌트의 이름은 무엇인가요? 답변: TriggerComponent입니다. 질문: UI를 표시하기 위해 엔티티에 추가하는 새로운 컴포넌트의 이름은 무엇인가요? 답변: DisplayComponent입니다. 질문: UI 엔티티를 [original] | 신에 배치된 엔티티와 충돌하면, 애니메이션 재생 UI가 나타날 수 있게 만들어봅시다. 1. 플레이어와 충돌할 수 있는 엔티티를 골라 배치합니다. 이름을 **display**로 변경합니다. * RUID: 5338cb745c644b2d83bf16127b52b292 2. **TriggerComponent**를 추가하고, Collider를 엔티티 크기에 맞게 조정합니다. 3. 새로운 **DisplayComponent**를 생성하고, **display** 엔티티에 추가합니다. 4. 새로운 **Sh [chunk_id] | Guides:1140:1

[task] | knowledge_list [title] | 장애물 만들기 [category] | Guides [rephrased] | 주어진 문서 내용에 기반하여 핵심 사실을 추출한 목록입니다. 1. 장애물 구현을 위해 `EmptyEntity`를 생성하고 이름을 `Model_Obstacle`로 설정하며, 이 엔티티에 `TransformComponent`를 추가해야 합니다. 2. `Model_Obstacle`의 자식 엔티티로 `Top`과 `Bottom` 엔티티를 생성하고, 각각에 `TransformComponent`와 `SpriteRendererComponent`를 추가합니다. 3. `Top`과 `Bottom` 엔티티의 `SpriteRendererCompon [original] | # 장애물 및 충돌 구현 장애물 엔티티를 만들어 충돌체를 추가해봅시다. 충돌체까지 구현한 엔티티는 모델로 만들어 추후 월드에 동적으로 불러옵니다. #### 장애물 엔티티 만들기 1. 새로운 EmptyEntity를 생성하고 이름을 **Model_Obstacle**로 변경합니다. 2. Model_Obstacle에 **TransformComponent**를 추가합니다. 2. 새로운 **Top, Bottom** 엔티티를 생성하고, **Model_Obstacle의 자식 엔티티**로 만듭니다. 부모-자식 관계로 만들어 더욱 관리가 용 [chunk_id] | Guides:1141:0

[task] | wikipedia [title] | 장애물 만들기 [category] | Guides [rephrased] | # 플래피 피쉬 리메이크: 장애물 스폰 로직 구현 본 섹션에서는 게임 실행 시 `Model_Obstacle` 객체를 일정한 간격으로 5개 소환하는 `GameLogic` 컴포넌트 구성 과정을 설명합니다. ## 구현 절차 장애물 스폰 로직을 적용하기 위해 다음 단계를 수행합니다. 첫째, 새로운 **GameLogic** 컴포넌트를 생성합니다. 둘째, 소환된 장애물 엔티티를 관리하기 위한 `obstacles` 프로퍼티를 정의합니다. 이 프로퍼티는 `table` 타입이며, 동기화되지 않는 `[None]` 속성을 가집니다. ```l [original] | 게임이 실행될 때 만든 Model_Obstacle를 5개 소환하도록 만들어 봅시다. 1. 새로운 **GameLogic**을 생성합니다. 2. 새로운 table 타입의 **obstacles** 프로퍼티를 생성합니다. ```lua Property: [None] table obstacles = {} ``` 3. `OnBeginPlay()` 와 `Init()` 함수를 추가합니다. `SpawnService:SpawnByModelId()`를 활용해 장애물을 불러올 수 있도록 아래와 같이 작성합니다. [chunk_id] | Guides:1141:1

[task] | distill [title] | 장애물 만들기 [category] | Guides [rephrased] | **플래피 피쉬 리메이크: 무작위 장애물 생성** `UtilLogic` API를 활용해 `Model_Obstacle`의 위치를 무작위화합니다. 모델의 고정 배치 대신 코드로 범위를 지정합니다. **1. ObstacleComponent: Init()** `[client only]` 실행 공간에서 인덱스를 받아 위/아래 장애물(`top`, `bottom`)의 Y축 위치를 설정합니다. ```lua [client only] void Init(integer index) { local offset = _UtilLogic:Rando [original] | Model_Obstacle이 들쭉날쭉 생성되도록 만들어봅시다. 모델을 직접 Scene에 배치해 만드는 것이 아닌, UtilLogic의 `RandomIntegerRange()` 함수를 활용해 생성되는 범위를 무작위로 지정하도록 만듭니다. 1. **ObstacleComponent**의 `Init()`함수에 아래 내용을 이어 작성합니다. ```lua [client only] void Init(integer index) { local offset = _UtilLogic:RandomDouble() [chunk_id] | Guides:1141:3

[task] | extract_knowledge [title] | 004_Outro [category] | Guides [rephrased] | # OutroManager 및 관련 UI 컴포넌트 ## 개념 설명 `OutroManager`는 게임 종료(아웃트로) 단계에서 플레이어의 결과 확인 시간을 관리하고, 시간이 경과하거나 플레이어가 버튼을 누르면 로비로 이동시키는 서버 측 로직을 담당합니다. `OutroUI`는 클라이언트에서 결과 화면의 타이머, 승패 표시, 보상(랭크 포인트, 재화), 플레이어 정보(아바타, 닉네임) 등을 시각적으로 표시하는 역할을 합니다. `InGameInfo`는 인트로부터 아웃트로까지 게임 전체의 상태(팀 배정, 인원 수, 승자, 로딩 체크 등)를 [original] | # OutroManager #### Property | 동기화 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | None | SyncTable<string, number>| playerOutroTime | 플레이어 별 결과 확인 시간을 관리합니다. key는 플레이어Id, value는 결과 확인 시간 값입니다. | #### Function | 실행제어 | 타입 | 이름 | 설명 | | --- | --- | --- | --- | | server only | void | OutroTimerSet | [chunk_id] | Guides:1137:0

[task] | wikipedia [title] | 장애물 만들기 [category] | Guides [rephrased] | # 장애물 및 충돌 구현 장애물 시스템은 충돌 판정을 지원하는 엔티티를 생성하고 이를 모델로 변환하여 월드에 동적으로 배치하는 과정으로 구성됩니다. 구현 단계는 장애물 엔티티 구조 생성, 충돌 판정 설정, 플레이어 충돌 처리 및 스크립팅, 그리고 모델 변환으로 나뉩니다. ## 장애물 엔티티 구조 생성 장애물 엔티티를 구성하려면 먼저 새로운 `EmptyEntity`를 생성하고 이름을 `Model_Obstacle`로 지정합니다. 이후 이 엔티티에 `TransformComponent`를 추가하여 기본 변환 기능을 부여합니다. `M [original] | # 장애물 및 충돌 구현 장애물 엔티티를 만들어 충돌체를 추가해봅시다. 충돌체까지 구현한 엔티티는 모델로 만들어 추후 월드에 동적으로 불러옵니다. #### 장애물 엔티티 만들기 1. 새로운 EmptyEntity를 생성하고 이름을 **Model_Obstacle**로 변경합니다. 2. Model_Obstacle에 **TransformComponent**를 추가합니다. 2. 새로운 **Top, Bottom** 엔티티를 생성하고, **Model_Obstacle의 자식 엔티티**로 만듭니다. 부모-자식 관계로 만들어 더욱 관리가 용 [chunk_id] | Guides:1141:0

[task] | extract_knowledge [title] | UI 만들기 [category] | Guides [rephrased] | # UI에서 아바타 애니메이션 재생하기 본 절에서는 `AvatarGUIRendererComponent`를 활용하여 UI 위젯 내에 아바타를 표현하고, 해당 아바타의 상태에 따라 애니메이션을 재생하는 방법을 다룹니다. ## 1. 개념 설명 mLua 환경에서 UI 안에 아바타를 직접 렌더링하고 제어하기 위해 다음 컴포넌트들의 조합이 필요합니다. * **UI 구조**: `UIGroup`, `UISprite`, `UIEmpty` 등 기본 UI 컴포넌트를 통해 레이아웃을 구성합니다. * **아바타 렌더링**: `AvatarGU [original] | AvatarGUIRendererComponent를 활용해 UI에서 아바타의 상태에 맞는 애니메이션을 재생하도록 만들어봅시다. 아래의 가이드를 참고하면 제작에 도움이 됩니다. ##### 참고 가이드 * [아바타 애니메이션 제어하기](/docs/?postId=820) * [아바타를 UI에서 표현하기](/docs/?postId=953) * [기본 UI 컴포넌트](/docs/?postId=744) * [UI 에디터 활용과 제어](/docs/?postId=120) * [StateComponent](/apiReference?postId=363 [chunk_id] | Guides:1140:0

[task] | diverse_qa [title] | 장애물 만들기 [category] | Guides [rephrased] | 질문: GameLogic 컴포넌트에 장애물 정보를 저장하기 위해 생성해야 하는 프로퍼티의 이름과 타입은 무엇인가요? 답변: 이름이 obstacles인 table 타입의 프로퍼티를 생성해야 합니다. 질문: 장애물을 소환하는 로직이 포함된 Init() 함수의 실행 공간(Execution Space)은 무엇인가요? 답변: Init() 함수는 [client only] 실행 공간에서 동작합니다. 질문: OnBeginPlay() 이벤트 핸들러는 어떤 함수를 호출하나요? 답변: OnBeginPlay() 함수는 self:Init()을 호출합니 [original] | 게임이 실행될 때 만든 Model_Obstacle를 5개 소환하도록 만들어 봅시다. 1. 새로운 **GameLogic**을 생성합니다. 2. 새로운 table 타입의 **obstacles** 프로퍼티를 생성합니다. ```lua Property: [None] table obstacles = {} ``` 3. `OnBeginPlay()` 와 `Init()` 함수를 추가합니다. `SpawnService:SpawnByModelId()`를 활용해 장애물을 불러올 수 있도록 아래와 같이 작성합니다. [chunk_id] | Guides:1141:1

[task] | diverse_qa [title] | 장애물 만들기 [category] | Guides [rephrased] | 질문: 장애물 엔티티를 만들 때 생성한 EmptyEntity의 이름을 무엇으로 변경해야 하나요? 답변: 이름을 **Model_Obstacle**로 변경해야 합니다. 질문: Top과 Bottom 엔티티를 Model_Obstacle의 자식 엔티티로 만드는 이유는 무엇인가요? 답변: 부모-자식 관계로 만들어 더욱 관리가 용이하기 때문입니다. 질문: Top과 Bottom 엔티티에 추가해야 하는 컴포넌트는 무엇인가요? 답변: **TransformComponent**와 **SpriteRendererComponent**를 추가해야 합니다. [original] | # 장애물 및 충돌 구현 장애물 엔티티를 만들어 충돌체를 추가해봅시다. 충돌체까지 구현한 엔티티는 모델로 만들어 추후 월드에 동적으로 불러옵니다. #### 장애물 엔티티 만들기 1. 새로운 EmptyEntity를 생성하고 이름을 **Model_Obstacle**로 변경합니다. 2. Model_Obstacle에 **TransformComponent**를 추가합니다. 2. 새로운 **Top, Bottom** 엔티티를 생성하고, **Model_Obstacle의 자식 엔티티**로 만듭니다. 부모-자식 관계로 만들어 더욱 관리가 용 [chunk_id] | Guides:1141:0

[task] | knowledge_list [title] | 장애물 만들기 [category] | Guides [rephrased] | 1. `Model_Obstacle`은 Scene에 직접 배치하는 방식이 아니라, `UtilLogic` 서비스의 `RandomIntegerRange()` 함수를 활용하여 생성 범위를 무작위로 지정하는 방식으로 생성됩니다. 2. `ObstacleComponent` 컴포넌트의 `Init()` 메서드는 `[client only]` 실행 공간 제약 하에 `integer` 타입의 `index` 매개변수를 수신하여 동작합니다. 3. `ObstacleComponent`의 `Init()` 함수 내에서 `offset` 변수는 `_UtilLogic:R [original] | Model_Obstacle이 들쭉날쭉 생성되도록 만들어봅시다. 모델을 직접 Scene에 배치해 만드는 것이 아닌, UtilLogic의 `RandomIntegerRange()` 함수를 활용해 생성되는 범위를 무작위로 지정하도록 만듭니다. 1. **ObstacleComponent**의 `Init()`함수에 아래 내용을 이어 작성합니다. ```lua [client only] void Init(integer index) { local offset = _UtilLogic:RandomDouble() [chunk_id] | Guides:1141:3

[task] | wikipedia [title] | UI 만들기 [category] | Guides [rephrased] | # UI에서 아바타 애니메이션 재생하기 (UI 만들기) 이 가이드는 신(Scene)에 배치된 엔티티와 플레이어가 충돌할 때 특정 UI를 표시하도록 설정하는 방법을 설명한다. 이를 통해 플레이어는 특정 영역에 진입하면 아바타 애니메이션 미리보기 UI를 확인하고, 영역을 벗어나면 UI가 자동으로 사라지는 상호작용을 경험할 수 있다. ## 구현 절차 ### 1. 충돌 대상 엔티티 배치 및 이름 변경 먼저, 플레이어와 충돌 감지가 가능한 엔티티를 선택하여 신(Scene)에 배치한다. 해당 엔티티의 이름을 **display**로 변경해 [original] | 신에 배치된 엔티티와 충돌하면, 애니메이션 재생 UI가 나타날 수 있게 만들어봅시다. 1. 플레이어와 충돌할 수 있는 엔티티를 골라 배치합니다. 이름을 **display**로 변경합니다. * RUID: 5338cb745c644b2d83bf16127b52b292 2. **TriggerComponent**를 추가하고, Collider를 엔티티 크기에 맞게 조정합니다. 3. 새로운 **DisplayComponent**를 생성하고, **display** 엔티티에 추가합니다. 4. 새로운 **Sh [chunk_id] | Guides:1140:1

[task] | wikipedia [title] | 장애물 만들기 [category] | Guides [rephrased] | # 플래피 피쉬 리메이크: 장애물 만들기 본 가이드는 메이플스토리 월드(MapleStory Worlds)의 mLua 스크립트 언어를 사용하여 장애물(`Model_Obstacle`)이 들쭉날쭉한 위치와 간격으로 생성되도록 설정하는 방법을 설명합니다. 장애물을 씬(Scene)에 직접 배치하는 방식 대신, `UtilLogic` 서비스의 `RandomIntegerRange()` 함수를 활용하여 생성 범위를 무작위로 지정하는 로직을 구현합니다. ## 1. ObstacleComponent 초기화 로직 구현 `ObstacleComponen [original] | Model_Obstacle이 들쭉날쭉 생성되도록 만들어봅시다. 모델을 직접 Scene에 배치해 만드는 것이 아닌, UtilLogic의 `RandomIntegerRange()` 함수를 활용해 생성되는 범위를 무작위로 지정하도록 만듭니다. 1. **ObstacleComponent**의 `Init()`함수에 아래 내용을 이어 작성합니다. ```lua [client only] void Init(integer index) { local offset = _UtilLogic:RandomDouble() [chunk_id] | Guides:1141:3

[task] | distill [title] | 장애물 만들기 [category] | Guides [rephrased] | ## 플래피 피쉬 리메이크: 장애물 재활용 (Object Pooling) 성능 부하 방지를 위해 장애물 엔티티를 소수(5개)만 생성하고 재사용하는 방식을 사용합니다. ### 1. GameLogic 프로퍼티 추가 장애물 간격과 초기 위치, 현재 재활용 인덱스를 관리합니다. ```lua Property: [None] number intervalX = 4.5 [None] integer startPosX = 5 [None] integer index = 1 ``` ### 2. GameLogic: Init() 함수 초기 실행 시 5개의 [original] | 게임에 필요한 장애물을 모두 배치하거나, 한 번에 불러오는 방식은 성능에 부하를 줄 수 있습니다. 일정 개수의 엔티티를 만들어 다시 사용하는 것이 성능 향상에 도움이 됩니다. 5개의 장애물을 재활용해봅시다. 5개의 엔티티를 불러온 뒤, 가장 먼저 생성된 장애물을 맨 뒤로 가져와 생성할 수 있도록 합니다. 1. **GameLogic**에 새로운 **intervalX, startPosX, index** 프로퍼티를 생성합니다. ```lua Property: [None] number intervalX = 4 [chunk_id] | Guides:1141:2

[task] | knowledge_list [title] | 장애물 만들기 [category] | Guides [rephrased] | 제공된 문서 내용 기반으로 핵심 사실을 추출하여 정리한 목록은 다음과 같습니다. 1. 장애물 성능 최적화를 위해 5개의 엔티티를 생성하고 재사용하는 재활용 방식을 적용하며, 가장 먼저 생성된 장애물을 맨 뒤로 이동시켜 계속 생성하는 것처럼 보이게 합니다. 2. `GameLogic` 컴포넌트에 `[None]` 동기화 속성을 가진 `number` 타입의 `intervalX` 프로퍼티를 4.5로 초기값을 설정하여 생성합니다. 3. `GameLogic` 컴포넌트에 `[None]` 동기화 속성을 가진 `integer` 타입의 `startP [original] | 게임에 필요한 장애물을 모두 배치하거나, 한 번에 불러오는 방식은 성능에 부하를 줄 수 있습니다. 일정 개수의 엔티티를 만들어 다시 사용하는 것이 성능 향상에 도움이 됩니다. 5개의 장애물을 재활용해봅시다. 5개의 엔티티를 불러온 뒤, 가장 먼저 생성된 장애물을 맨 뒤로 가져와 생성할 수 있도록 합니다. 1. **GameLogic**에 새로운 **intervalX, startPosX, index** 프로퍼티를 생성합니다. ```lua Property: [None] number intervalX = 4 [chunk_id] | Guides:1141:2

[task] | distill [title] | 시작, 종료 구현하기 [category] | Guides [rephrased] | # 죽음 판정 **GameLogic**의 초기화 로직을 수정하여 풀링된 장애물을 순환 처리하도록 구성합니다. 1. **`OnBeginPlay()`**: 스폰 후 인덱스를 다음 순번으로 초기화합니다. ```lua [client only] void OnBeginPlay() { for i = 1, 5 do local entity = _SpawnService:SpawnByModelId(_EntryService:GetModelIdByName("Model_Obstacle"), " [original] | # 죽음 판정 1. **GameLogic**의 `OnBeginPlay()` 함수를 수정합니다. 풀링된 장애물 중 마지막 인덱스의 다음 인덱스로 초기화할 수 있도록 아래와 같이 코드를 변경합니다. ```lua [client only] void OnBeginPlay() { for i = 1, 5 do local entity = _SpawnService:SpawnByModelId(_EntryService:GetModelIdByName("Model_Obstacle"), "obs [chunk_id] | Guides:1142:0

[task] | diverse_qa [title] | 장애물 만들기 [category] | Guides [rephrased] | 질문: 게임에 필요한 장애물을 모두 배치하거나 한 번에 불러오는 방식이 성능에 미치는 영향은 무엇인가요? 답변: 게임에 필요한 장애물을 모두 배치하거나 한 번에 불러오는 방식은 성능에 부하를 줄 수 있습니다. 질문: 성능 향상을 위해 장애물 엔티티를 어떻게 관리해야 하는가요? 답변: 일정 개수의 엔티티를 만들어 다시 사용하는 것이 성능 향상에 도움이 됩니다. 질문: 본 가이드에서 재활용하기로 한 장애물의 개수는 몇 개인가요? 답변: 5개의 장애물을 재활용합니다. 질문: `GameLogic` 컴포넌트에 추가해야 할 프로퍼티의 이 [original] | 게임에 필요한 장애물을 모두 배치하거나, 한 번에 불러오는 방식은 성능에 부하를 줄 수 있습니다. 일정 개수의 엔티티를 만들어 다시 사용하는 것이 성능 향상에 도움이 됩니다. 5개의 장애물을 재활용해봅시다. 5개의 엔티티를 불러온 뒤, 가장 먼저 생성된 장애물을 맨 뒤로 가져와 생성할 수 있도록 합니다. 1. **GameLogic**에 새로운 **intervalX, startPosX, index** 프로퍼티를 생성합니다. ```lua Property: [None] number intervalX = 4 [chunk_id] | Guides:1141:2

[task] | diverse_qa [title] | 시작, 종료 구현하기 [category] | Guides [rephrased] | 질문: `GameLogic`의 `OnBeginPlay()` 함수에서 장애물 생성 후 `self.index`는 어떻게 초기화되나요? 답변: `self.index`는 생성된 장애물 목록(`self.obstacles`)의 길이(`#self.obstacles`)에 1을 더한 값으로 초기화됩니다. 질문: `OnBeginPlay()` 함수에서 장애물 엔티티의 위치는 어떤 수식으로 계산되나요? 답변: 장애물 엔티티의 위치는 `Vector3(i * self.intervalX + self.startPosX, 0, 0)` 수식으로 계산됩니다. 여기 [original] | # 죽음 판정 1. **GameLogic**의 `OnBeginPlay()` 함수를 수정합니다. 풀링된 장애물 중 마지막 인덱스의 다음 인덱스로 초기화할 수 있도록 아래와 같이 코드를 변경합니다. ```lua [client only] void OnBeginPlay() { for i = 1, 5 do local entity = _SpawnService:SpawnByModelId(_EntryService:GetModelIdByName("Model_Obstacle"), "obs [chunk_id] | Guides:1142:0

[task] | distill [title] | 시작, 종료 구현하기 [category] | Guides [rephrased] | # 시작·종료 구현 (FishPlayerComponent) **1. 프로퍼티 추가** `started` 상태 플래그를 선언합니다. ```lua [None] boolean started = false ``` **2. `OnUpdate` 수정** `isDead`가 `false`이고 `started`가 `true`일 때만 이동 로직(`Move`)을 실행합니다. 위치 체크(`CheckPosY`)는 항상 실행됩니다. ```lua if not self.isDead and self.started then self:Move(del [original] | 1. **FishPlayerComponent**에 새로운 **started** 프로퍼티를 생성합니다. ```lua [None] boolean started = false ``` 2. `OnUpdate` 함수 내용을 수정합니다. ```lua if not self.isDead and self.started then self:Move(delta) end self:CheckPosY() ``` 3. `Floating()` 함수 첫 줄에 아래 내용을 작성합 [chunk_id] | Guides:1142:2

[task] | knowledge_list [title] | 시작, 종료 구현하기 [category] | Guides [rephrased] | * `FishPlayerComponent`에 `[None]` 동기화 속성으로 `boolean` 타입의 `started` 프로퍼티를 생성하며, 초기값은 `false`로 설정합니다. * `OnUpdate` 함수 내부에서 `self.isDead`가 `false`이고 `self.started`가 `true`인 조건을 만족할 때만 `self:Move(delta)` 메서드를 호출하도록 제어합니다. * `OnUpdate` 함수 내부에서 위 이동 조건과 무관하게 `self:CheckPosY()` 메서드가 항상 실행되도록 배치합니다. * [original] | 1. **FishPlayerComponent**에 새로운 **started** 프로퍼티를 생성합니다. ```lua [None] boolean started = false ``` 2. `OnUpdate` 함수 내용을 수정합니다. ```lua if not self.isDead and self.started then self:Move(delta) end self:CheckPosY() ``` 3. `Floating()` 함수 첫 줄에 아래 내용을 작성합 [chunk_id] | Guides:1142:2

[task] | extract_knowledge [title] | 장애물 만들기 [category] | Guides [rephrased] | # 플래피 피쉬 리메이크: 무작위 장애물 생성 ## 개념 설명 이 절에서는 `Model_Obstacle` 엔티티의 위치를 고정된 값으로 설정하는 대신, 런타임에 무작위 값을 부여하여 들쭉날쭉한 패턴으로 생성하는 방법을 다룹니다. `UtilLogic` 서비스의 `RandomIntegerRange()`와 `RandomDouble()` 함수를 활용하여 상단(`top`)과 하단(`bottom`) 장애물 컴포넌트의 Y 좌표를 계산합니다. 이 방식은 모델이 씬(Scene)에 정적으로 배치되는 것을 방지하고, 매 스폰마다 변화하는 난이도와 레 [original] | Model_Obstacle이 들쭉날쭉 생성되도록 만들어봅시다. 모델을 직접 Scene에 배치해 만드는 것이 아닌, UtilLogic의 `RandomIntegerRange()` 함수를 활용해 생성되는 범위를 무작위로 지정하도록 만듭니다. 1. **ObstacleComponent**의 `Init()`함수에 아래 내용을 이어 작성합니다. ```lua [client only] void Init(integer index) { local offset = _UtilLogic:RandomDouble() [chunk_id] | Guides:1141:3

[task] | distill [title] | 시작, 종료 구현하기 [category] | Guides [rephrased] | ## 플래피 피쉬 리메이크: 시작/종료 및 충돌 로직 ### 1. 모델 및 컴포넌트 구성 1. Scene에 `Model_Obstacle` 배치 후 Hierarchy에서 **Create Model From Entity**로 모델화 (원본 삭제 권장). 2. `TouchAndDieComponent` 생성하여 Top, Bottom 엔티티에 추가. ### 2. FishPlayerComponent 구현 **1) 상태 프로퍼티** ```lua Property: [None] boolean isDead = false ``` **2) Die [original] | 1. Scene에 **Model_Obstacle**을 배치합니다. 2. 새로운 **TouchAndDieComponent**를 생성하고, Top, Bottom 엔티티에 추가합니다. 3. Hierarchy에서 Model_Obstacle의 콘텍스트 메뉴를 **Create Model From Entity**를 눌러 모델화 합니다. > **Tip.** > 기존의 Model_Obstacle을 지운 뒤에 모델화를 권장합니다. 4. FishPlayerComponent에서 새로운 **isDead** 프로퍼티를 생성합니다. [chunk_id] | Guides:1142:1

[task] | extract_knowledge [title] | 장애물 만들기 [category] | Guides [rephrased] | # 장애물 엔티티 구성 및 충돌 판정 구현 ## 1. 개념 설명 메이플스토리 월드에서 장애물은 시각적 요소(Sprite)와 물리적 상호작용(충돌)을 담당하는 엔티티 구조로 구성됩니다. 효율적인 관리를 위해 장애물의 상단(Top)과 하단(Bottom) 부분은 개별 엔티티로 생성하여 상위 엔티티의 자식으로 배치합니다. 각 자식 엔티티에는 스프라이트 렌더링을 위한 `SpriteRendererComponent`와 충돌 판정을 위한 `TriggerComponent`가 필요합니다. 플레이어와 장애물 간의 충돌을 감지하기 위해서는 양쪽 모 [original] | # 장애물 및 충돌 구현 장애물 엔티티를 만들어 충돌체를 추가해봅시다. 충돌체까지 구현한 엔티티는 모델로 만들어 추후 월드에 동적으로 불러옵니다. #### 장애물 엔티티 만들기 1. 새로운 EmptyEntity를 생성하고 이름을 **Model_Obstacle**로 변경합니다. 2. Model_Obstacle에 **TransformComponent**를 추가합니다. 2. 새로운 **Top, Bottom** 엔티티를 생성하고, **Model_Obstacle의 자식 엔티티**로 만듭니다. 부모-자식 관계로 만들어 더욱 관리가 용 [chunk_id] | Guides:1141:0

← → 방향키로 페이지 이동 · 숫자 입력 후 Enter로 점프