← 목록

mLua · Nemotron SDG 질문-응답 (SFT)

총 21,567개 · 페이지 385/719
🔀 랜덤
불러오는 중…

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 충돌 이벤트 발생 후 액션을 처리하는 두 가지 방식(이벤트 시스템과 확장 컴포넌트)의 구조적 차이점을 설명해 주세요. [answer] | 충돌 이벤트 발생 후 액션을 처리하는 두 가지 방식은 컴포넌트 구성과 함수 수정 방법에서 구조적 차이가 있습니다. **1. Entity Event System 활용 방식** * **구성 요건:** 엔티티에 `TriggerComponent`와 `스크립트 컴포넌트`(리액터)를 모두 추가해야 합니다. * **작동 원리:** 스크립트 컴포넌트 내에 `Event Handler` 블록을 생성하여 충돌 이벤트를 수신합니다. `TriggerComponent`에서 충돌이 감지되면, 설정된 핸들러 함수가 호출됩니다. * **핸들러 종류: [followup] | `TriggerEnterEvent` 핸들러를 설정할 때 센더를 `self`로 지정해야 하는 경우와 `entity`로 지정해야 하는 경우의 구체적인 차이와 코드 구성 예시를 보여주세요. [followup_answer] | `TriggerEnterEvent` 핸들러에서 센더(Sender) 설정은 **어떤 엔티티의 충돌 이벤트를 수신할 것인지를 결정**하는 부분입니다. ### 1. 센더 설정의 구체적 차이 | 구분 | 센더 설정 | 의미 및 적용 사례 | | :--- | :--- | :--- | | **자기 자신 수신** | `self` | **해당 스크립트 컴포넌트가 붙어 있는 엔티티 자체**의 `TriggerComponent`에서 충돌이 발생했을 때 이벤트를 받습니다.<br><br>예: 플레이어 캐릭터에 스크립트가 붙어 있고, 플레이어가 몬스터와 [scores] | [judge_reason] | [source_doc] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충

[task] | two_turn [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | 스크립트 디버그에서 중단점을 설정하고 해제하는 기본 방법은 무엇인가요? [answer] | 스크립트 에디터에서 중단점을 설정하고 해제하는 기본 방법은 다음과 같습니다. **중단점 설정** 원하는 코드 라인을 선택한 후 **F9** 키를 누르면 해당 라인 좌측에 중단점이 설정됩니다. **중단점 해제** 이미 중단점이 설정된 코드 라인을 선택한 후 **다시 F9** 키를 누르면 중단점이 해제됩니다. 중단점이 해제되면 디버그 모드로 실행할 때 해당 지점에서 게임이 멈추지 않습니다. [followup] | 조건부 중단점과 코드 계속 실행 중단점의 아이콘 차이와 각각의 설정 조건이 무엇인지 자세히 알려주세요. [followup_answer] | 중단점 아이콘과 설정 조건은 다음과 같이 구분됩니다. **1. 조건부 중단점** * **아이콘 특징**: `breakpoint2` 아이콘으로, 기본 중단점과 달리 조건식이 입력된 상태를 나타냅니다. * **설정 조건**: BreakPoints에서 **조건식**을 입력한 상태입니다. **2. 코드 계속 실행 중단점** * **아이콘 특징**: `breakpoint3` 아이콘으로, BreakPoints에서 **코드 계속 실행**이 설정된 상태를 나타냅니다. * **설정 조건**: BreakPoints에서 **코드 계속 [scores] | [judge_reason] | [source_doc] | ## 학습 과정 소개 디버그 기능을 통해 스크립트를 디버깅하는 방법에 대해 알아봅니다. ## 중단점(Breakpoints) 스크립트 디버깅의 시작은 중단점 설정에서 시작됩니다. 이상이 발생하거나, 오작동의 원인으로 의심되는 코드 라인에 중단점을 설정 또는 해제하는 방법을 알아봅니다. ### 중단점 아이콘 중단점 설정 상태에 따라 아이콘이 다르게 나타납니다. |아이콘 | 이름 | 설명| ---|---|--- | ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/17691

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | F9 키를 활용한 중단점 설정과 해제 과정을 단계별 번호 목록으로 3단계 이내로 작성하세요. [answer] | 1. 스크립트 에디터에서 디버깅을 원하는 코드 라인을 선택합니다. 2. **F9** 키를 눌러 해당 라인에 중단점을 설정합니다. 3. 중단점을 해제하려면 이미 설정된 코드 라인을 선택한 후 **F9** 키를 다시 누릅니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 학습 과정 소개 디버그 기능을 통해 스크립트를 디버깅하는 방법에 대해 알아봅니다. ## 중단점(Breakpoints) 스크립트 디버깅의 시작은 중단점 설정에서 시작됩니다. 이상이 발생하거나, 오작동의 원인으로 의심되는 코드 라인에 중단점을 설정 또는 해제하는 방법을 알아봅니다. ### 중단점 아이콘 중단점 설정 상태에 따라 아이콘이 다르게 나타납니다. |아이콘 | 이름 | 설명| ---|---|--- | ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/17691

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerComponent와 HitComponent를 활용해 충돌 감지를 구현할 때, ColliderType에 따른 설정 차이와 TransformComponent의 영향에 대해 알려주세요. [answer] | ## ColliderType 설정 차이 `TriggerComponent`와 `HitComponent`는 모두 충돌체를 생성하며, 충돌체의 형태는 `ColliderType` 프로퍼티로 결정됩니다. `ColliderType`은 **Box**, **Circle**, **Polygon** 세 가지 값을 가집니다. 각 형태에 따라 설정해야 하는 프로퍼티가 다릅니다. | ColliderType | 설명 | 주요 설정 프로퍼티 | | :--- | :--- | :--- | | **Box** | 사각형 형태의 충돌체 | `BoxSize`: X( [followup] | Polygon 형태를 사용할 때 PolygonPoint를 어떻게 추가하고, 상위 엔티티의 Scale 변경이 하위 충돌체에 미치는 구체적인 코드 예시를 보여주세요. [followup_answer] | ## PolygonPoint 추가 방법 참고 문서에 따르면, `ColliderType`을 **Polygon**으로 설정할 경우 **PolygonPoint** 프로퍼티를 필요한 만큼 추가하여 크리에이터가 원하는 충돌체 모양을 만들 수 있습니다. 문서에는 `PolygonPoint`를 추가하는 구체적인 코드 문법(예: `PolygonPoint = { ... }` 또는 `AddPolygonPoint()` 등)이 명시되어 있지 않습니다. 따라서 mLua 코드에서 `PolygonPoint`를 직접 초기화하거나 수정하는 방법을 확인할 수 없 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 충돌 이벤트와 충돌 처리 방법에 대해 알아봅시다. ##### 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176) # 충돌 **충돌**이란 충돌체를 포함하는 엔티티'의 충돌 영역이 서로 교차하는 것을 말합니다. 엔티티에 [TriggerComponent](/apiReference/Components/Trigge

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | GetEntitiesSpawnedByModelId와 GetSameModelEntities의 차이점이 무엇인가요? [answer] | `GetEntitiesSpawnedByModelId`와 `GetSameModelEntities`는 모두 특정 모델로부터 생성된 모든 엔티티를 조회하는 기능이지만, **입력 매개변수의 형태**가 다릅니다. 1. **`GetEntitiesSpawnedByModelId(modelId)`** * **입력:** 모델 ID (number 또는 string 등 모델 고유 식별자) * **동작:** 전달된 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. * **사용 시나리오:** 이미 모델 I [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. 다음과 같이 수많은 엔티티가 배치된 상황에서 NPC와 같이 동일 모델로부터 생성된 모든 엔티티를 받고 싶을 때 유용하게 사용됩니다. 특정 엔티티에 접근하여 모델을 받은 뒤, 해당 모델로부터 생성된 모든 엔티티를 받을 수 있습니다. ```lua void GetEntitiesSpawnedByModelIdExample() { local modelId = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1").Mode

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | EntityService:Destroy와 엔티티 객체의 Destroy 함수를 모두 사용했는데, 어떤 방식이 더 권장되는지 알고 싶어요. [answer] | 제공된 문서에는 두 방식 중 어느 것이 더 권장되는지에 대한 명시적인 지시나 비교 설명이 없습니다. 문서에서는 `_EntityService:Destroy(entity)`와 `entity:Destroy()` 모두 동일한 기능(엔티티 삭제)을 수행할 수 있다고만 기술되어 있으며, 특정 방식을 선호하도록 권장하는 내용은 포함되어 있지 않습니다. 따라서 두 방식 모두 유효하며, 개발자가 상황에 맞게 선택하여 사용할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 매개 변수로 전달한 엔티티를 삭제합니다. ```lua void DestroyExample() { local entity = _EntityService:GetEntityByPath("/maps/map01/Monster1_1") _EntityService:Destroy(entity) if isvalid(entity) == false then log("Entity is destroyed") end } ``` 꼭 `EntityService:Destroy`를 사용하지 않고도, 엔티티의 `

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | spawnedMonster 엔티티의 생성과 이벤트 처리 흐름을 단계별 번호 목록으로 정리하세요. [answer] | 제공된 참고 문서에 근거하여 `spawnedMonster` 엔티티의 생성과 이벤트 처리 흐름은 다음과 같이 정리할 수 있습니다. 1. **몬스터 템플릿 조회**: 서버 측 `OnBeginPlay` 생명주기 메서드에서 `_EntityService:GetEntityByPath("/maps/map01/monster-1")`을 호출하여 특정 경로에 있는 몬스터 엔티티 템플릿을 변수(`monsterTemplate`)에 저장합니다. 2. **엔티티 스폰**: `_SpawnService:SpawnByEntityTemplate` 메서드를 호 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 생성될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 생성된 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬스터 엔티티 스폰

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | 중단점 아이콘 종류와 각각의 설명을 5행 표로 정리해서 출력하세요. [answer] | | 아이콘 | 이름 | 설명 | |---|---|---| | 기본 중단점 | 기본 중단점 | 다른 설정이 없는 기본 상태의 중단점입니다. | | 조건부 중단점 | 조건부 중단점 | BreakPoints에서 조건식을 입력한 상태의 중단점입니다. | | 코드 계속 실행 중단점 | 코드 계속 실행 중단점 | BreakPoints에서 **코드 계속 실행**을 설정한 상태의 중단점입니다. | | 중단점 비활성화 | 중단점 비활성화 | 비활성화된 중단점입니다. | | 코드 계속 실행 중단점 비활성화 | 코드 계속 실행 중단점 비활성화 | 조건 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ## 학습 과정 소개 디버그 기능을 통해 스크립트를 디버깅하는 방법에 대해 알아봅니다. ## 중단점(Breakpoints) 스크립트 디버깅의 시작은 중단점 설정에서 시작됩니다. 이상이 발생하거나, 오작동의 원인으로 의심되는 코드 라인에 중단점을 설정 또는 해제하는 방법을 알아봅니다. ### 중단점 아이콘 중단점 설정 상태에 따라 아이콘이 다르게 나타납니다. |아이콘 | 이름 | 설명| ---|---|--- | ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/17691

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | Hit Count에 % 연산자를 사용하면 어떤 식으로 동작하나요? [answer] | Hit Count에 `%` 연산자를 사용하면, 해당 숫자의 배수만큼 적중될 때마다 실행을 멈춥니다. 예를 들어 Hit Count에 `% 5`를 설정하면, 중단점이 5번째, 10번째, 15번째 등 5의 배수인 횟수로 적중될 때만 실행이 중단됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 디버그를 시작했거나 종료한 이후 등 언제든 중단점을 편집할 수 있습니다. 디버그 실행 상태와 관계 없이 편집된 내용은 유지됩니다. 중단점은 마우스 오른쪽 버튼을 클릭해 **BreakPoint Settings** 창을 열고 편집할 수 있습니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/177319929868794f98eef19be40fb98fbc36f88291b3a.png "BreakingPoint Settings") | 번호 | 이름 | 설명 | | --- | ---

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | _spawnService로 생성한 총알 엔티티들이 모두 같은 이름을 가질 때, 이들을 한 번에 배열로 받아와서 처리하려면 어떤 EntityService 함수를 호출해야 하나요? [answer] | 같은 이름(월드 경로)을 가진 총알 엔티티를 한 번에 배열로 받아오려면 `GetEntitiesByPath()` 함수를 사용해야 합니다. `GetEntityByPath()`는 경로를 찾는 경우에도 단일 엔티티만 반환하지만, `GetEntitiesByPath()`는 매개변수로 전달한 월드 경로와 일치하는 **모든** 엔티티를 배열로 반환합니다. 따라서 `_SpawnService` 등으로 생성되어 같은 경로(예: `/maps/map01/Bullet`)를 가진 총알들을 모두 수집할 때 적합합니다. 사용 예시는 다음과 같습니다. ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정 엔티티를 탐색하여 받아오거나, 혹은 관련 있는 여러 엔티티를 한 번에 받아야 하는 상황이 자주 발생합니다. 이럴 때 [**EntityService**](/apiReference/Services/EntityService)를 활용할 수 있습니다. **EntityService**는 엔티티 탐색, 삭제, 유효성 체크 등의 기능을 제공하고 있습니다. 이번 과정에서는 **EntityService**에서 제공하는 기능의 사용법을 하나씩 알아보도록 하겠습니다. **테스트 환경** **common

[task] | single_turn [pass] | ⏳ 미판정 [title] | Entity Event System [question] | SunriseEvent의 파라미터에서 event.isSunrise 값을 가져와 self.isSunrise에 저장하는 과정이 왜 필요한가요? [answer] | `SunriseEvent` 핸들러에서 `event.isSunrise` 값을 가져와 `self.isSunrise`에 저장하는 과정은 **일회성 이벤트 데이터를 컴포넌트의 영속적 상태(프로퍼티)로 변환**하기 위해 필요합니다. 구체적인 이유는 다음과 같습니다. 1. **이벤트의 일시적 특성**: `SunriseEvent`가 발생하는 시점에 한 번만 실행됩니다. `event.isSunrise`는 그 순간의 상태(해가 떴는지 여부)를 나타내는 파라미터일 뿐, 이벤트 핸들러 함수가 종료되면 해당 객체는 더 이상 접근할 수 없습니다. 2 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | 중단점 활성화 여부를 해제해도 중단점 위치는 유지되나요? [answer] | 네, 활성화 여부(Enabled)를 해제해도 중단점 위치는 유지됩니다. 활성화 여부를 체크 박스 해제 방식으로 비활성화하면, 해당 중단점은 실제로 동작하지 않게 되지만 중단점 자체는 삭제되지 않고 유지됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 디버그를 시작했거나 종료한 이후 등 언제든 중단점을 편집할 수 있습니다. 디버그 실행 상태와 관계 없이 편집된 내용은 유지됩니다. 중단점은 마우스 오른쪽 버튼을 클릭해 **BreakPoint Settings** 창을 열고 편집할 수 있습니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/177319929868794f98eef19be40fb98fbc36f88291b3a.png "BreakingPoint Settings") | 번호 | 이름 | 설명 | | --- | ---

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | 같은 경로에 엔티티가 여러 개 존재할 때 GetEntityByPath가 반환하는 엔티티를 예측할 수 없다면, 특정 엔티티 하나만 정확히 가져오기 위해 어떤 함수를 사용해야 하나요? [answer] | 같은 월드 경로에 엔티티가 여러 개 존재하는 경우, `GetEntityByPath`는 가장 먼저 찾은 엔티티를 반환하므로 특정 엔티티를 보장할 수 없습니다. 이 상황에서 특정 엔티티 하나만 정확히 가져오기 위해서는 엔티티 ID를 매개변수로 전달하는 **`GetEntity`** 함수를 사용해야 합니다. 엔티티 ID는 Hierarchy의 해당 엔티티 콘텍스트 메뉴에서 **Copy Entity ID**로 가져오거나, 스크립트에서 `entity.Id`를 통해 받아올 수 있습니다. ```lua Method: [server only] vo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정 엔티티를 탐색하여 받아오거나, 혹은 관련 있는 여러 엔티티를 한 번에 받아야 하는 상황이 자주 발생합니다. 이럴 때 [**EntityService**](/apiReference/Services/EntityService)를 활용할 수 있습니다. **EntityService**는 엔티티 탐색, 삭제, 유효성 체크 등의 기능을 제공하고 있습니다. 이번 과정에서는 **EntityService**에서 제공하는 기능의 사용법을 하나씩 알아보도록 하겠습니다. **테스트 환경** **common

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | BreakPoint Settings에서 Condition과 Hit Count를 동시에 설정하면 어떤 순서로 평가되나요? [answer] | Condition과 Hit Count를 동시에 설정한 경우, **Condition을 먼저 평가**합니다. 구체적인 동작 순서는 다음과 같습니다. 1. 먼저 Condition 조건식이 `true`인지 확인합니다. 2. Condition이 `true`일 때만 Hit Count(적중 횟수)가 증가합니다. 3. 증가한 Hit Count가 지정된 조건(연산자 포함)을 만족해야 최종적으로 중단점(멈춤) 또는 로그 출력이 동작합니다. 즉, Condition이 `false`인 경우 Hit Count는 증가하지 않으며, 중단점이나 로그 출력도 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 디버그를 시작했거나 종료한 이후 등 언제든 중단점을 편집할 수 있습니다. 디버그 실행 상태와 관계 없이 편집된 내용은 유지됩니다. 중단점은 마우스 오른쪽 버튼을 클릭해 **BreakPoint Settings** 창을 열고 편집할 수 있습니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/177319929868794f98eef19be40fb98fbc36f88291b3a.png "BreakingPoint Settings") | 번호 | 이름 | 설명 | | --- | ---

[task] | code [pass] | ⏳ 미판정 [title] | Entity Event System [question] | TimeManager 컴포넌트의 SendEvent 메서드를 호출하여 isSunrise 값을 true로 설정해 해가 뜨는 이벤트를 서버에서 클라이언트로 즉시 전달하는 코드를 작성해줘 [answer] | TimeManager 컴포넌트에서 `SendEvent` 메서드를 직접 호출하면 `isSunrise` 상태를 즉시 변경하고, 해당 상태를 담은 `SunriseEvent`를 `self.Entity:SendEvent(event)`를 통해 서버에서 클라이언트로 전송합니다. 참고 문서에 제시된 로직을 기반으로 한 `TimeManager` 컴포넌트 스크립트는 다음과 같습니다. ```lua Property: [Sync] boolean isSunrise = false Method: [server only] void OnUpdate(num [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy

[task] | single_turn [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | 코드 계속 실행 옵션을 켜면 로그 메시지와 함께 사용할 수 있나요? [answer] | 네, 가능합니다. **코드 계속 실행** 옵션은 반드시 **로그 메시지(Log Message)** 를 함께 설정했을 때만 활성화할 수 있습니다. 이 옵션을 켜면 중단점에 도달하더라도 월드 실행이 멈추지 않고 계속 진행되며, 설정한 로그 메시지만 출력됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 디버그를 시작했거나 종료한 이후 등 언제든 중단점을 편집할 수 있습니다. 디버그 실행 상태와 관계 없이 편집된 내용은 유지됩니다. 중단점은 마우스 오른쪽 버튼을 클릭해 **BreakPoint Settings** 창을 열고 편집할 수 있습니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/177319929868794f98eef19be40fb98fbc36f88291b3a.png "BreakingPoint Settings") | 번호 | 이름 | 설명 | | --- | ---

[task] | code [pass] | ⏳ 미판정 [title] | Entity Event System [question] | `SunriseEvent`를 수신하여 `isSunrise`가 true일 경우 `self.Entity`의 HP를 감소시키고, false일 경우 HP를 회복하는 로직을 포함하는 `VampireComponent` 스크립트를 작성해줘. [answer] | 참고 문서에 명시된 `SunriseEvent`의 프로퍼티(`isSunrise`)와 HP를 관리하는 예제 패턴(`Health`, `InitialHealth`, `HitEvent` 처리 로직)를 기반으로 `VampireComponent` 스크립트를 작성합니다. 문서에 따르면 `SunriseEvent`는 `boolean isSunrise` 프로퍼티를 가지며, 이를 수신하는 핸들러를 등록하여 이벤트를 처리합니다. 뱀파이어의 경우 `isSunrise`가 `true`일 때 HP가 감소하고, `false`일 때 HP가 회복되도록 구현합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 Entity Event System을 사용해 이벤트를 제어할 수 있습니다. 이번 시간에는 Entity Event System을 이용해 "뱀파이어 vs 헌터"의 게임 요소 중 하나를 만들어봅시다. 다음 가이드를 먼저 학습하면 이번 과정을 이해하는 데 많은 도움이 됩니다. [Event System](https://mod-developers.nexon.com/docs?postId=73) # Entity Event System 이벤트를 받고 보내려면 먼저 Entity Event System을

[task] | code [pass] | ⏳ 미판정 [title] | Entity Event System [question] | TimeManager 컴포넌트의 [Sync] 속성인 isSunrise가 변경될 때마다 로그에 현재 상태를 출력하고 5초 주기로 시간을 초기화하여 해의 출몰 주기를 관리하는 OnUpdate 로직을 작성해줘 [answer] | 사용자가 요청한 `TimeManager` 컴포넌트의 `OnUpdate` 로직은 5초 주기로 시간을 초기화하고, `isSunrise` 상태를 번갈아 바꾸며, 상태가 변경될 때마다 로그를 출력해야 합니다. 참고 문서의 `TimeManager` 예제를 바탕으로, 요청 사항(로그 출력 포함)을 충족하도록 메서드를 구성했습니다. `SendEvent` 메서드는 이벤트 전송을 담당하므로 `OnUpdate` 내에서 상태 변경 후 직접 호출하거나, 상태 변경과 로그 출력을 `OnUpdate`에 직접 구현하는 방식으로 작성할 수 있습니다. 문서의 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | 엔티티가 삭제된 시점을 정확히 감지하기 위해 EntityCreateEvent와 유사하게 EntityService의 삭제 이벤트 핸들러를 어떻게 설정해야 하나요? [answer] | 참고 문서에는 엔티티 삭제 시 발생하는 `EntityService` 이벤트 핸들러의 이름이나 파라미터 구조에 대한 정보가 포함되어 있지 않습니다. 문서에는 엔티티 생성 시 발생하는 `EntityCreateEvent`와 그 핸들러 설정 방법만 기술되어 있을 뿐, 삭제 이벤트 핸들러에 대한 내용은 없습니다. 따라서 문서 근거만으로 삭제 이벤트 핸들러를 설정하는 코드를 작성할 수 없습니다. 대신, 문서에 명시된 엔티티 삭제 감지 방법은 `Destroy` 호출 후 `IsValid` 함수 또는 `isvalid` 함수를 통해 직접 상태 변 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 매개 변수로 전달한 엔티티를 삭제합니다. ```lua void DestroyExample() { local entity = _EntityService:GetEntityByPath("/maps/map01/Monster1_1") _EntityService:Destroy(entity) if isvalid(entity) == false then log("Entity is destroyed") end } ``` 꼭 `EntityService:Destroy`를 사용하지 않고도, 엔티티의 `

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | GetEntityByPath로 엔티티를 가져왔는데, 해당 엔티티가 실제로 존재하지 않으면 어떤 오류나 동작이 발생하나요? [answer] | `_EntityService:GetEntityByPath`로 존재하지 않는 경로의 엔티티를 조회할 경우, 반환값이 `nil`이 됩니다. 이때 별도의 에러 로그가 출력되거나 스크립트가 중단되는 동작은 참고 문서에 명시되어 있지 않습니다. 따라서 `nil`을 반환받은 후 해당 엔티티를 직접 호출하거나 조작하면 문제가 발생할 수 있으므로, 사용 전 `nil` 체크 또는 `isvalid` 함수를 통해 유효성을 확인하는 것이 안전합니다. ```lua local entity = _EntityService:GetEntityByPath("/m [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 매개 변수로 전달한 엔티티를 삭제합니다. ```lua void DestroyExample() { local entity = _EntityService:GetEntityByPath("/maps/map01/Monster1_1") _EntityService:Destroy(entity) if isvalid(entity) == false then log("Entity is destroyed") end } ``` 꼭 `EntityService:Destroy`를 사용하지 않고도, 엔티티의 `

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | EntityCreateEvent 와 EntityDestroyEvent 핸들러에서 특정 이름의 엔티티만 필터링하는 조건문 구조를 2단계 번호 목록으로 정리하세요. [answer] | `EntityCreateEvent`와 `EntityDestroyEvent` 핸들러에서 특정 이름의 엔티티만 필터링하는 조건문 구조는 다음과 같습니다. 1. 이벤트 핸들러 내부에서 `event.Entity`를 통해 이벤트에 포함된 엔티티 객체를 로컬 변수로 선언합니다. ```lua local Entity = event.Entity ``` 2. `if` 문을 사용하여 해당 엔티티의 `Name` 프로퍼티가 특정 문자열과 일치하지 않는지(`~=`) 확인합니다. 일치하지 않으면 `return`을 통해 함수를 즉시 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 삭제될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 삭제 대기 중인 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | EntityService의 이벤트 핸들러를 등록할 때 [service: EntityService] 태그를 붙여야 하는 이유와, 생략했을 때 발생하는 오류 유형은 무엇인가요? [answer] | 제시된 참고 문서에는 `EntityService`의 이벤트 핸들러를 등록할 때 `[service: EntityService]` 태그를 붙여야 하는 구체적인 이유나, 태그를 생략했을 때 발생하는 오류 유형에 대한 설명이 포함되어 있지 않습니다. 문서에는 이벤트 핸들러가 `[service: EntityService]` 태그와 함께 정의되는 코드 형식만 제시되어 있을 뿐, 태그의 필요성이나 생략 시 발생 가능한 오류에 대한 기술적 근거는 찾을 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 생성될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 생성된 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬스터 엔티티 스폰

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | _SpawnService:SpawnByEntityTemplate 함수를 호출할 때 네 번째 인자부터 네 개가 true로 설정되어 있는데 각각 어떤 의미를 가지나요? [answer] | 제공된 참고 문서에는 `_SpawnService:SpawnByEntityTemplate` 함수의 네 번째 인자부터 네 개의 `true` 값이 각각 어떤 의미를 가지는지에 대한 설명이 포함되어 있지 않습니다. 문서에는 해당 함수가 다음과 같이 호출되는 예제만 제시되어 있을 뿐, 각 인자의 정의나 의미에 대한 정보는 없습니다. ```lua _SpawnService:SpawnByEntityTemplate(monsterTemplate, "spawnedMonster", Vector3(0,0,0), true, true, true, true [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 생성될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 생성된 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬스터 엔티티 스폰

[task] | code [pass] | ⏳ 미판정 [title] | Entity Event System [question] | TimeManager 컴포넌트를 사용해 10초마다 isSunrise 상태를 번갈아 변경하고 SendEvent 메서드를 통해 SunriseEvent를 전송하도록 OnUpdate 함수를 작성해줘 [answer] | TimeManager 스크립트 컴포넌트의 `OnUpdate` 함수는 매 프레임마다 호출되며, 전달된 `delta` 값을 누적하여 10초가 지날 때마다 `isSunrise` 상태를 반전시키고 `SendEvent` 메서드를 호출하여 이벤트를 전송합니다. 요청하신 로직을 적용한 **TimeManager** 스크립트 컴포넌트 전체 코드는 다음과 같습니다. ```lua Property: [Sync] boolean isSunrise = false Method: [server only] void OnUpdate(number delta) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | isvalid 함수와 EntityService:IsValid 함수는 어떤 차이가 있는지, 왜 nil 체크 대신 이 함수들을 사용해야 하는지 궁금해요. [answer] | `isvalid` 함수와 `_EntityService:IsValid` 함수는 기능적으로 동일하며, 특정 엔티티가 현재 삭제되었는지를 확인하는 데 사용됩니다. 두 함수 중 하나를 선택해 사용해도 동일한 결과를 얻을 수 있습니다. nil 체크(예: `if entity == nil`) 대신 이 함수들을 사용해야 하는 이유는 다음과 같습니다. 1. **안정성**: 엔티티가 실제로 존재했다가 나중에 삭제된 경우, nil로 확인하는 방식은 다소 불안정할 수 있습니다. `IsValid` 또는 `isvalid` 함수는 엔티티의 상태(존재/삭 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 매개 변수로 전달한 엔티티를 삭제합니다. ```lua void DestroyExample() { local entity = _EntityService:GetEntityByPath("/maps/map01/Monster1_1") _EntityService:Destroy(entity) if isvalid(entity) == false then log("Entity is destroyed") end } ``` 꼭 `EntityService:Destroy`를 사용하지 않고도, 엔티티의 `

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | GetEntityByPath 메서드의 경로 인자로 "/maps/map01/monster-1"을 사용했는데, 엔티티가 실제로 다른 맵에 있을 경우 어떤 값을 반환하며 이를 어떻게 처리해야 하나요? [answer] | 제공된 참고 문서에는 `_EntityService:GetEntityByPath` 메서드가 존재하고, `/maps/map01/monster-1`과 같은 경로를 인자로 받아 엔티티를 가져오는 사용 예시는 포함되어 있습니다. 하지만, **요청한 경로에 엔티티가 실제로 존재하지 않을 경우(다른 맵에 있을 경우 등) 해당 메서드가 어떤 값(nil, 오류 등)을 반환하는지, 그리고 이를 어떻게 처리(예: nil 체크)해야 하는지에 대한 정보는 제공된 문서에 명시되어 있지 않습니다.** 따라서 문서의 근거만으로 잘못된 경로 입력 시의 반환값 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 생성될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 생성된 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬스터 엔티티 스폰

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | EntityCreateEvent 핸들러에서 생성된 엔티티의 이름을 확인하기 위해 어떤 속성을 참조해야 하나요? [answer] | `EntityCreateEvent` 핸들러에서 생성된 엔티티의 이름을 확인하려면 이벤트 객체의 `Entity` 프로퍼티를 통해 엔티티를 가져온 후, 해당 엔티티의 `Name` 프로퍼티를 참조해야 합니다. 아래 코드에서 확인하듯, `event.Entity`로 엔티티를 얻은 뒤 `Entity.Name`을 사용하면 됩니다. ```lua Event Handler: [service: EntityService] HandleEntityCreateEvent (EntityCreateEvent event) { -- Parameters [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 생성될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 생성된 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬스터 엔티티 스폰

[task] | two_turn [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | 중단점의 Condition과 Hit Count 설정 시 평가 우선순위와 동작 원리가 궁금합니다. [answer] | 중단점의 `Condition`(조건식)과 `Hit Count`(적중 횟수)를 함께 설정할 경우, 평가 우선순위와 동작 원리는 다음과 같습니다. 1. **평가 우선순위**: 먼저 `Condition`이 평가됩니다. 2. **동작 원리**: * `Condition`이 `true`로 판정될 때만 `Hit Count`의 카운트가 증가합니다. * `Condition`이 `false`인 경우 `Hit Count`는 증가하지 않습니다. * `Hit Count`에 지정된 조건(예: 5번째 적중 시 멈춤)을 만 [followup] | Condition이 false인 상태에서 Hit Count가 증가하지 않는지, 그리고 `Condition`과 `Hit Count`가 함께 설정되었을 때 최종 중단점 또는 로그 출력이 동작하기 위한 구체적인 조건 조합을 알려주세요. [followup_answer] | 네, `Condition`이 `false`인 상태에서는 `Hit Count`가 증가하지 않습니다. `Condition`과 `Hit Count`가 함께 설정되었을 때 최종적으로 중단점 또는 로그 출력이 동작하기 위한 구체적인 조건 조합은 다음과 같습니다. 1. **Condition 평가**: 먼저 `Condition`이 평가되며, 반드시 `true`로 판정되어야 합니다. 2. **Hit Count 증가**: `Condition`이 `true`인 경우에만 `Hit Count` 카운트가 1 증가합니다. (`Condition`이 ` [scores] | [judge_reason] | [source_doc] | 디버그를 시작했거나 종료한 이후 등 언제든 중단점을 편집할 수 있습니다. 디버그 실행 상태와 관계 없이 편집된 내용은 유지됩니다. 중단점은 마우스 오른쪽 버튼을 클릭해 **BreakPoint Settings** 창을 열고 편집할 수 있습니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/177319929868794f98eef19be40fb98fbc36f88291b3a.png "BreakingPoint Settings") | 번호 | 이름 | 설명 | | --- | ---

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | OnBeginPlay에서 엔티티를 스폰한 직후 HandleEntityCreateEvent가 바로 실행되지 않고 지연되는 것처럼 느껴지는 원인은 무엇일까요? [answer] | 제시된 참고 문서에는 `HandleEntityCreateEvent`의 실행 시점(즉시 실행 여부, 프레임 지연 등)에 대한 기술이나 원인에 대한 정보가 포함되어 있지 않습니다. 문서에는 엔티티가 생성될 때 발생하는 이벤트이며, `Entity Event Handler`에서 핸들러를 추가할 수 있고, 매개변수로 생성된 엔티티 정보를 받을 수 있다는 사실과, `OnBeginPlay`에서 `_SpawnService:SpawnByEntityTemplate`을 호출하여 엔티티를 스폰한 후 해당 이벤트 핸들러에서 특정 이름의 엔티티를 필터링하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 생성될 때 발생하는 이벤트입니다. **Entity Event Handler**에서 핸들러를 추가할 수 있습니다. 이벤트 핸들러의 매개 변수로 이벤트가 전송되며, 이벤트에는 생성된 엔티티가 정보가 포함되어 있습니다. ```lua Method: [server only] void OnBeginPlay() { local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") -- "spawnedMonster"라는 이름의 몬스터 엔티티 스폰

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | _EntityService:GetEntityByPath()를 사용하여 "/maps/map01/npc-320_1" 경로에 있는 엔티티를 탐색하고, 해당 엔티티의 Name 속성을 log()로 출력하는 스크립트를 작성해줘 [answer] | ```lua Method: [server only] void OnBeginPlay() { local entity = _EntityService:GetEntityByPath("/maps/map01/npc-320_1") if entity then log(entity.Name) end } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 월드를 제작하다 보면 특정 엔티티를 탐색하여 받아오거나, 혹은 관련 있는 여러 엔티티를 한 번에 받아야 하는 상황이 자주 발생합니다. 이럴 때 [**EntityService**](/apiReference/Services/EntityService)를 활용할 수 있습니다. **EntityService**는 엔티티 탐색, 삭제, 유효성 체크 등의 기능을 제공하고 있습니다. 이번 과정에서는 **EntityService**에서 제공하는 기능의 사용법을 하나씩 알아보도록 하겠습니다. **테스트 환경** **common

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