← 목록

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

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

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 충돌 이벤트 발생 시 상대 엔티티 정보를如何利用할 수 있나요? [answer] | 충돌 이벤트 발생 시 상대 엔티티 정보는 이벤트 매개변수를 통해 직접 접근할 수 있습니다. 충돌이 감지된 `TriggerComponent`에 연결된 이벤트 핸들러에서 `event.TriggerBodyEntity` 속성을 사용하면 충돌한 상대 엔티티 객체를 가져올 수 있습니다. 이 상대 엔티티 객체를 활용하여 다음과 같은 작업을 수행할 수 있습니다. 1. **엔티티 이름 확인**: `TriggerBodyEntity.Name`을 비교하여 특정 엔티티와 충돌했는지 판단합니다. 2. **서비스 호출**: 가져온 상대 엔티티를 매개변수로 [followup] | OnEnterTriggerBody와 OnLeaveTriggerBody에서 각각 상대 엔티티의 이름이나 상태를 로그로 출력하는 간단한 mLua 스크립트 컴포넌트 코드를 작성해 주세요. [followup_answer] | 참고 문서에 따르면, 확장된 `TriggerComponent`에는 충돌 이벤트 발생 시 호출되는 `OnEnterTriggerBody`, `OnStayTriggerBody`, `OnLeaveTriggerBody` 함수를 오버라이딩할 수 있으며, 매개 변수로 들어오는 충돌 이벤트에는 상대 엔티티 정보가 포함되어 있습니다. 하지만 참고 문서에 제공된 실제 mLua 코드 예제(`HandleTriggerEnterEvent` 등)에서는 이벤트 핸들러의 매개변수 이름이 `TriggerEnterEvent`이고, 상대 엔티티 접근 필드가 `eve [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | 모델 ID를 모를 때 특정 엔티티를 통해 동일 모델의 다른 엔티티들을 찾는 가장 간단한 방법은 무엇인가요? [answer] | 모델 ID를 알지 못하는 상황에서 특정 엔티티를 참조하여 동일한 모델로부터 생성된 모든 엔티티를 찾는 가장 간단한 방법은 `_EntityService:GetSameModelEntities(entity)` 함수를 사용하는 것입니다. 이 함수는 매개변수로 전달한 엔티티의 원형 모델을 자동으로 파악하여, 해당 모델과 일치하는 모든 엔티티 목록을 반환합니다. 아래는 이 방법을 활용한 mLua 스크립트 예시입니다. ```lua Method: [server only] void FindSameModelEntitiesExample() { [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] | TagComponent를 통해 한 엔티티에 여러 태그를 설정할 때 GetEntitiesByTag는 어떻게 동작하나요? [answer] | `TagComponent`를 통해 한 엔티티에 여러 개의 태그를 설정한 경우, `GetEntitiesByTag`는 해당 엔티티에 설정된 태그 중 매개 변수로 전달한 태그 값과 일치하는 태그가 **하나라도 존재**하면 그 엔티티를 반환합니다. 즉, 특정 태그(예: "Monster")를 기준으로 탐색할 때, 엔티티에 "Monster" 태그가 포함되어 있든 다른 태그와 함께 "Monster" 태그가 함께 설정되어 있든, 해당 엔티티는 결과 리스트에 포함됩니다. 아래는 특정 태그를 가진 모든 엔티티를 가져오는 `GetEntitiesBy [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. 다음과 같이 수많은 엔티티가 배치된 상황에서 NPC와 같이 동일 모델로부터 생성된 모든 엔티티를 받고 싶을 때 유용하게 사용됩니다. 특정 엔티티에 접근하여 모델을 받은 뒤, 해당 모델로부터 생성된 모든 엔티티를 받을 수 있습니다. ```lua void GetEntitiesSpawnedByModelIdExample() { local modelId = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1").Mode

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | `_EntityService:Destroy`와 `entity:Destroy()` 호출 방식의 차이점을 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void DestroyComparisonExample() { -- _EntityService:Destroy 호출 방식 -- EntityService 인스턴스를 통해 특정 엔티티를 삭제하는 방식입니다. local entity1 = _EntityService:GetEntityByPath("/maps/map01/Monster1_1") _EntityService:Destroy(entity1) if isvalid(entity1) == false [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] | 엔티티를 삭제한 후 해당 엔티티 참조를 다시 사용할 때 발생하는 오류 원인은 무엇인가요? [answer] | 엔티티를 삭제한 후 해당 엔티티 참조를 다시 사용할 때 발생하는 오류의 원인은 **삭제된 엔티티는 더 이상 유효하지 않은 상태가 되기 때문**입니다. `EntityService`에는 엔티티를 삭제하는 `Destroy()` 함수와 함께, 엔티티가 현재 유효한 상태인지 체크하는 함수가 함께 제공됩니다. 이는 엔티티가 삭제된 후에도 스크립트 내에서 그 참조를 계속 가지고 있게 되면, 이미 존재하지 않는 객체에 접근하려는 시도가 일어나기 때문에 발생한다고 볼 수 있습니다. 따라서 엔티티를 삭제한 후에는 해당 참조를 더 이상 사용해서는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. 다음과 같이 수많은 엔티티가 배치된 상황에서 NPC와 같이 동일 모델로부터 생성된 모든 엔티티를 받고 싶을 때 유용하게 사용됩니다. 특정 엔티티에 접근하여 모델을 받은 뒤, 해당 모델로부터 생성된 모든 엔티티를 받을 수 있습니다. ```lua void GetEntitiesSpawnedByModelIdExample() { local modelId = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1").Mode

[task] | two_turn [pass] | ⏳ 미판정 [title] | Entity Event System [question] | Event Entity System에서 SunriseEvent를 두 개의 다른 컴포넌트(Hunter, Vampire)에 중계하는 설정 절차와 이벤트 핸들러 등록 방법은 어떻게 되나요? [answer] | Event Entity System을 사용하여 `SunriseEvent`를 `HunterComponent`와 `VampireComponent`에 중계하는 설정 절차와 이벤트 핸들러 등록 방법은 다음과 같습니다. ### 1. 이벤트 핸들러 등록 및 중계 엔티티 설정 두 컴포넌트 모두 `SunriseEvent`를 수신하도록 설정해야 합니다. 1. **HunterComponent**와 **VampireComponent** 스크립트를 각각 엽니다. 2. **Event Handler** 섹션에서 **[+]** 버튼을 클릭하여 **S [followup] | HunterComponent와 VampireComponent의 HandlerSunriseEvent 코드에서 이벤트 중계자(entity)를 map01로 설정하는 구문이 어떻게 작성되는지, 그리고 isSunrise 파라미터를 로컬 변수로 받아 self 프로퍼티에 저장하는 구체적인 코드 로직을 알려주세요. [followup_answer] | `HandlerSunriseEvent`에서 이벤트 중계자를 `map01`로 설정하는 구문은 이벤트 핸들러 블록의 첫 줄에 있는 **속성(Attribute)** 형태로 작성됩니다. 또한 `event` 객체에서 `isSunrise` 값을 로컬 변수로 받아와 `self` 프로퍼티에 대입하는 로직은 함수 본문 내에 구현됩니다. 구체적인 코드 구성은 다음과 같습니다. ### 1. 이벤트 중계자 설정 구문 이벤트 핸들러 함수 정의 직전에 `[entity: map01(/maps/map01)]` 속성을 붙여야 합니다. 이 속성이 해당 이벤트 [scores] | [judge_reason] | [source_doc] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 충돌 중일 때 프레임마다 액션이 반복적으로 실행되도록 하고 싶은데, 어떤 이벤트 핸들러를 사용해야 하나요? [answer] | 충돌 중일 때 프레임마다 액션이 반복적으로 실행되려면 **TriggerStayEvent** 핸들러를 사용해야 합니다. 이벤트 발생 시점별 특징은 다음과 같습니다. * **TriggerEnterEvent**: 엔티티가 처음 충돌할 때 1회만 발생합니다. * **TriggerStayEvent**: 엔티티가 충돌 상태에 있으면 프레임마다 반복적으로 발생합니다. * **TriggerLeaveEvent**: 엔티티가 충돌했다가 충돌이 끝날 때 1회만 발생합니다. 따라서 프레임마다 동작해야 하는 로직(예: 지속 피해, 이동 속도 [followup] | `TriggerStayEvent` 핸들러 내부에서 충돌한 상대 엔티티의 정보를 매개변수로부터 추출하여 체력을 감소시키는 `mLua` 스크립트 예제를 작성해 주세요. [followup_answer] | 충돌한 상대 엔티티의 정보를 추출하여 체력을 감소시키는 `mLua` 스크립트 예시는 다음과 같습니다. `TriggerStayEvent`는 충돌 상태가 유지되는 동안 프레임마다 호출되므로, 매 프레임마다 체력이 감소하도록 로직을 구성할 수 있습니다. ```lua Property: [Sync] number CurrentHp = 100 Method: [server only] void OnBeginPlay() { -- 초기 체력 설정 (필요 시 수정) self.CurrentHp = 100 } Event Handler: [scores] | [judge_reason] | [source_doc] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 충돌 이벤트가 발생했을 때 엔티티의 색상을 변경하거나 액션을 수행하는 스크립트 구조는 어떻게 되나요? [answer] | 충돌 이벤트가 발생했을 때 엔티티의 색상을 변경하거나 다른 액션을 수행하기 위해서는 **`TriggerComponent`** 또는 **`HitComponent`**가 포함된 엔티티에서 발생하는 충돌 관련 이벤트를 핸들러로 받아 처리하는 구조입니다. 참고 문서에 제공된 구체적인 충돌 이벤트 이름(예: `HandleCollisionEvent` 등)이나 색상 변경용 API(예: `SetColor`)는 명시되어 있지 않습니다. 따라서 아래 코드는 질문하신 "충돌 이벤트 발생 시 액션 수행"의 **구조적 틀**을 보여주며, 실제 충돌 이벤 [followup] | OnBeginPlay에서 TriggerComponent를 초기화하고, HandleTouchEvent 또는 충돌 이벤트 핸들러에서 self.Entity의 색상 변경 로직을 적용하는 mLua 코드 블록을 작성해 주세요. [followup_answer] | 제공된 참고 문서에는 `HandleTouchEvent`를 통해 색상 변경을 수행하거나, `TriggerComponent`의 충돌 이벤트를 수신하는 구체적인 이벤트 핸들러 이름 및 색상 변경 API가 명시되어 있지 않습니다. 문서에는 충돌 감지 시 "노란색으로 변화되는 예시"가 언급되어 있지만, 이를 구현하는 mLua API(예: `SetColor`, `Material` 조작 등)나 `TriggerComponent`의 충돌 이벤트 핸들러 시그니처(예: `HandleTriggerEnterEvent`)가 포함되지 않았습니다. 따라서 요 [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] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | GetSameModelEntities 메서드를 사용하여 특정 경로의 엔티티와 동일한 모델로 생성된 모든 엔티티의 이름을 로그에 출력하는 코드만 출력하고, 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void LogSameModelEntities() { -- 특정 경로에 있는 엔티티를 참조 대상으로 설정 local templateEntity = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1") -- 해당 엔티티의 모델과 동일한 모델로부터 생성된 모든 엔티티를 조회 local entities = _EntityService:GetSameModelEntities(templateEntity) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. 다음과 같이 수많은 엔티티가 배치된 상황에서 NPC와 같이 동일 모델로부터 생성된 모든 엔티티를 받고 싶을 때 유용하게 사용됩니다. 특정 엔티티에 접근하여 모델을 받은 뒤, 해당 모델로부터 생성된 모든 엔티티를 받을 수 있습니다. ```lua void GetEntitiesSpawnedByModelIdExample() { local modelId = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1").Mode

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | `TriggerComponent`의 기본 함수를 직접 수정하지 않고 충돌 처리 로직을 추가하려면 어떻게 해야 하나요? [answer] | `TriggerComponent`의 기본 함수는 직접 편집할 수 없습니다. 따라서 충돌 처리 로직을 추가하려면 **TriggerComponent를 확장한 컴포넌트**를 생성하고, 그 확장 컴포넌트에서 해당 함수를 오버라이드(Override)해야 합니다. 구체적인 절차는 다음과 같습니다. 1. **확장 컴포넌트 생성**: * `Workspace`에서 `TriggerComponent`를 검색하여 선택합니다. * 콘텍스트 메뉴에서 **Extend**를 선택합니다. * 이 과정이 완료되면 `MyDesk [followup] | `Workspace`에서 `TriggerComponent`를 확장하여 생성한 컴포넌트에서 충돌 함수를 오버라이드하는 과정과, 확장된 컴포넌트를 엔티티에 적용하는 방법을 단계별로 설명해 주세요. [followup_answer] | `TriggerComponent`를 확장하여 충돌 처리 로직을 추가하고 엔티티에 적용하는 과정은 다음과 같은 단계로 진행됩니다. ### 1. 확장 컴포넌트 생성 1. **Workspace**에서 `TriggerComponent`를 검색하여 선택합니다. 2. 선택한 `TriggerComponent`의 콘텍스트 메뉴에서 **Extend**를 선택합니다. 3. 이 과정을 통해 `MyDesk` 폴더에 `TriggerComponent`를 확장한 새 컴포넌트가 생성됩니다. ### 2. 충돌 함수 오버라이드 (로직 작성) 생성된 확장 [scores] | [judge_reason] | [source_doc] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충

[task] | single_turn [pass] | ⏳ 미판정 [title] | Entity Event System [question] | HunterComponent와 VampireComponent에 SunriseEvent 핸들러를 추가할 때 이벤트 중계자를 map01로 설정해야 하는 이유는 무엇인가요? [answer] | 이벤트 중계자를 `map01`로 설정해야 하는 이유는 **SunriseEvent**가 특정 엔티티(예: 플레이어나 몬스터)가 아니라 **맵 자체**에서 발생하고, 그 맵에 있는 모든 대상에게 전달되도록 하기 위해서입니다. 참고 문서의 절차에 따르면, `HunterComponent`와 `VampireComponent`가 `SunriseEvent`를 수신하려면 해당 이벤트의 중계자(Relayer)를 이벤트가 발생하는 위치인 `map01`으로 지정해야 합니다. 이렇게 설정하면 `map01` 맵에서 `SunriseEvent`가 발생했을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | `IsValid` 함수와 `isvalid` 함수의 사용 예시를 단계별 번호 목록으로 정리하세요. [answer] | `IsValid` 함수와 `isvalid` 함수는 엔티티가 삭제되었는지 확인하는 동일한 기능을 수행합니다. 제공된 문서에는 다음 두 가지 사용 예시가 있습니다. 1. **`_EntityService:IsValid` 사용 예시** `_EntityService:IsValid(entity)`를 호출하여 엔티티의 유효성을 검사합니다. ```lua void IsValidExample() { local entity = _EntityService:GetEntityByPath("/maps/map01/Monste [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] | 문서에 제시된 _EntityService와 _SpawnService 메서드 호출 예시를 3문장 이내로 요약하세요. [answer] | `_EntityService:GetEntityByPath`는 지정된 경로에 있는 엔티티를 가져오는 메서드입니다. `_SpawnService:SpawnByEntityTemplate`는 가져온 템플릿을 기반으로 새 엔티티를 생성합니다. 이 두 메서드는 `OnBeginPlay`에서 순차적으로 호출되어 몬스터를 스폰하는 데 사용됩니다. [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] | Entity Event System [question] | TimeManager 컴포넌트를 map01 에디터에 추가하는 과정과 OnUpdate 함수 내에서 5초 주기로 시간을 초기화하는 로직을 단계별 번호 목록으로 정리하세요. [answer] | TimeManager 컴포넌트를 map01 에디터에 추가하고 5초 주기 초기화 로직을 구현하는 과정은 다음과 같습니다. 1. **TimeManager 컴포넌트 생성 및 추가** * `Workspace - MyDesk`의 컨텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭하여 이름이 `TimeManager`인 새 컴포넌트를 만듭니다. * `Hierarchy - map01`의 컨텍스트 메뉴에서 **Add Component**를 클릭하여 방금 만든 `TimeManager` 컴포넌트를 추 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | GetEntitiesSpawnedByModelId, GetEntitiesSpawnedByModel, GetSameModelEntities 메서드 3가지의 차이점을 비교하는 표로 정리하세요. [answer] | `GetEntitiesSpawnedByModelId`, `GetEntitiesSpawnedByModel`, `GetSameModelEntities` 메서드 3가지의 차이점은 아래 표와 같습니다. | 구분 | 매개 변수 | 설명 | | :--- | :--- | :--- | | **GetEntitiesSpawnedByModelId** | `modelId` (모델 ID) | 특정 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. | | **GetEntitiesSpawnedByModel** | `model` (모델 객체) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 모델 ID와 일치하는 모델로부터 생성된 모든 엔티티를 반환합니다. 다음과 같이 수많은 엔티티가 배치된 상황에서 NPC와 같이 동일 모델로부터 생성된 모든 엔티티를 받고 싶을 때 유용하게 사용됩니다. 특정 엔티티에 접근하여 모델을 받은 뒤, 해당 모델로부터 생성된 모든 엔티티를 받을 수 있습니다. ```lua void GetEntitiesSpawnedByModelIdExample() { local modelId = _EntityService:GetEntityByPath("/maps/map02/npc-5396_1").Mode

[task] | code [pass] | ⏳ 미판정 [title] | Entity Event System [question] | `SunriseEvent`를 수신하여 `isSunrise`가 true일 경우 `self.Entity`의 HP를 회복하고, false일 경우 HP를 회복하지 않는 로직을 포함하는 `HunterComponent` 스크립트를 작성해줘. [answer] | 메이플스토리 월드의 Entity Event System을 활용하여 `SunriseEvent`를 수신하는 `HunterComponent` 스크립트입니다. 문서에 제시된 규칙에 따라, 이벤트 핸들러는 `Entity Event Handler` 블록을 사용하며 `[self]` 태그를 붙여 자기 자신의 엔티티에서 발생하는 이벤트를 처리하도록 구성했습니다. `isSunrise` 속성이 `true`일 때만 HP를 회복하는 로직을 포함했습니다. ```lua Property: [Sync] number Health = 100 [None] numb [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] | single_turn [pass] | ⏳ 미판정 [title] | Entity Event System [question] | TimeManager 컴포넌트를 Map 객체에 추가하는 대신 특정 Entity에 붙일 경우, HunterComponent에서 CurrentMap을 통해 접근하는 코드가 어떻게 수정되어야 하나요? [answer] | 제공된 문서에는 `TimeManager` 컴포넌트를 **Map 객체**(`self.Entity.CurrentMap.TimeManager`)에 추가하고 접근하는 방법만 명시되어 있습니다. `TimeManager`를 특정 Entity에 붙이고, `HunterComponent`에서 그 Entity를 찾아서 접근하는 구체적인 코드 예시나 API(예: 특정 Entity 이름으로 찾기, 경로로 찾기 등)에 대한 설명은 문서에 포함되어 있지 않습니다. 따라서 문서의 정보만으로는 해당 코드를 수정하는 방법을 정확히 제시할 수 없습니다. [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] | Entity Event System [question] | OnUpdate 함수 안에서 self._T.Time 변수를 초기화하는 과정이 매 프레임마다 nil 체크를 수행하는 것이 성능에 미치는 영향은 어떤가요? [answer] | 제시된 참고 문서에는 `self._T.Time` 변수의 nil 체크가 매 프레임 수행될 때의 성능 영향에 대한 기술적 분석이나 설명이 포함되어 있지 않습니다. 문서에서는 `OnUpdate` 함수 내에서 `self._T.Time == nil`일 경우 0으로 초기화하는 코드만 예시로 제시하고 있을 뿐, 이 로직이 게임 성능(프레임 시간, CPU 부하 등)에 어떤 영향을 미치며 최적화가 필요한지에 대한 정보는 없습니다. [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] | Entity Event System [question] | OnUpdate에서 self.Hp 값을 수정할 때 [Sync] 속성을 붙여야 하는 이유와, 이 속성이 없으면 클라이언트 화면에서 체력 변화가 보이는지에 대해 설명해 주세요. [answer] | mLua에서 프로퍼티에 `[Sync]` 속성을 부여하는 이유는 서버와 클라이언트 간의 상태 동기를 위해 필수적이기 때문입니다. 문서 예제에서 확인되듯, `OnUpdate`와 같은 메서드는 `[server only]`로 선언되어 서버에서만 실행됩니다. 즉, `self.Hp` 값의 증감 로직은 서버 메모리에서만 처리됩니다. 만약 `Hp` 프로퍼티에 `[Sync]` 속성이 없다면(기본적으로 `[None]` 상태라면), 서버에서 `self.Hp` 값이 변경되어도 이 변경 사항이 클라이언트로 전송되지 않습니다. 따라서 클라이언트 화면에서 [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] | Entity Event System [question] | VampireComponent에서 HP가 0보다 작아지는 것을 방지하기 위해 if self.Hp < 0 then self.Hp = 0 end 로직을 적용했는데, 이 값이 음수가 되는 경우를 방지하는 다른 방법은 없나요? [answer] | 문서에는 `math.max` 함수를 사용하여 값을 특정 하한선 이상으로 유지하는 예제가 있습니다. `HunterComponent` 또는 다른 예제에서 `self.Health = math.max(self.Health, 0.0)`처럼 사용하는 것을 참고할 수 있습니다. 따라서 `if self.Hp < 0 then self.Hp = 0 end` 대신 `math.max` 함수를 사용하여 한 줄로 처리할 수 있습니다. 수정된 `VampireComponent`의 `OnUpdate` 메서드는 다음과 같습니다: ```lua Property: [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | EntityCreateEvent 핸들러의 매개 변수와 필터링 로직을 설명하는 코드를 주석으로만 구성하여 출력하세요. [answer] | ```lua -- EntityCreateEvent 핸들러는 엔티티가 생성될 때 호출됩니다. -- 이벤트 객체는 매개변수로 전달되며, 생성된 엔티티 정보를 포함합니다. -- 아래 코드는 특정 이름의 엔티티가 생성되었을 때만 로그를 출력하는 필터링 로직입니다. Event Handler: [service: EntityService] HandleEntityCreateEvent (EntityCreateEvent event) { -- 이벤트에서 생성된 엔티티를 추출합니다. local Entity = event.Entity [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] | 엔티티를 탐색하는 EntityService [question] | HandleEntityDestroyEvent 이벤트 핸들러의 매개변수에서 삭제 대기 중인 엔티티 정보를 추출하는 코드만 출력하세요. [answer] | ```lua local Entity = event.Entity ``` [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] | Entity Event System [question] | 해가 뜨는 동안 헌터의 HP가 200을 넘지 않도록 제한하는 로직을 OnUpdate 내부에서 if self.Hp >= 200 then self.Hp = 200 end 형태로 작성한 이유는 무엇인가요? [answer] | 해가 뜨는 동안 헌터의 HP가 200을 넘지 않도록 제한하는 로직을 `if self.Hp >= 200 then self.Hp = 200 end` 형태로 작성한 이유는 **HP의 최대 상한선(200)을 초과하지 않도록 하기 위해서**입니다. 구체적인 동작 원리는 다음과 같습니다: 1. **연속적 증가 방지:** `OnUpdate`는 프레임마다 반복 호출되며, `self.Hp = self.Hp + delta` 구문을 통해 해가 떠 있는 시간(`delta` 누적)에 비례하여 HP가 계속 증가합니다. 2. **상한선 클램핑(Clam [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **HunterComponent**, **VampireComponent** 스크립트를 작성해 봅시다. 우선 두 컴포넌트 모두 **SunriseEvent**를 받도록 해야 합니다. 1. **HunterComponent**, **VampireComponent** 스크립트를 엽니다. **Event Handler**에서 **[+]** 버튼을 누르고, **SunriseEvent**를 추가합니다. 2. **SunriseEvent**의 중계 엔티티를 **map01**으로 설정해야 합니다. 다음과 같이 핸들러 상단의 이벤트 중계자를 **ma

[task] | code [pass] | ⏳ 미판정 [title] | Entity Event System [question] | HunterComponent 컴포넌트에 InputService 서비스의 KeyDownEvent 핸들러를 추가하여 Z 키 입력 시 CurrentMap 내의 TimeManager 컴포넌트를 찾아 SendEvent(true)를 호출하는 스크립트를 작성해줘 [answer] | HunterComponent에 Z 키 입력을 감지하여 CurrentMap의 TimeManager 컴포넌트에서 SendEvent(true)를 호출하는 스크립트는 다음과 같습니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { local key = event.key if key == KeyboardKey.Z then local timeManager = self.Entity.CurrentMap.Ti [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] | Entity Event System [question] | KeyDownEvent 핸들러에서 KeyboardKey.Z 키를 감지할 때, 다른 키와 동시에 눌려도 일출 이벤트가 정상적으로 발동되는지 확인하는 방법은 무엇인가요? [answer] | 제공된 문서에는 `KeyDownEvent` 핸들러에서 특정 키가 다른 키와 동시에 눌린 경우(키 조합, Key Combos)에 대한 처리 방법이나 `KeyDownEvent` 객체에 동시 입력 상태(예: `event.pressedKeys`, `event.modifiers` 등)를 확인하는 API가 포함되어 있지 않습니다. 문서에 따르면 `KeyDownEvent` 핸들러에서 접근할 수 있는 파라미터는 `event.key`뿐이며, 이 값이 `KeyboardKey.Z`와 일치하는지 여부만 확인하도록 안내하고 있습니다. 따라서 주어진 문 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy

[task] | code [pass] | ⏳ 미판정 [title] | Entity Event System [question] | `SunriseEvent`를 `Property: boolean isSunrise = false` 속성을 가진 이벤트 타입으로 선언하고, 해당 이벤트를 다른 엔티티로 전송하는 데 사용할 수 있는 기본 구조를 갖춘 `SunriseEvent` 스크립트를 작성해줘. [answer] | 참고 문서에 따르면, `SunriseEvent`는 엔티티를 통해 전송되는 이벤트 타입으로, `isSunrise` 프로퍼티를 포함해야 합니다. 이벤트 타입 스크립트는 `Property` 블록으로만 구성되며, 이 프로퍼티를 통해 해가 뜨고 지는 상태를 `true` 또는 `false`로 전달합니다. 요청하신 `SunriseEvent` 스크립트는 다음과 같습니다. ```lua Property: boolean isSunrise = false ``` **참고사항:** - 이 스크립트는 **이벤트 타입(Event Type)** 정의용이므로 [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] | instruction_following [pass] | ⏳ 미판정 [title] | 스크립트 디버그 [question] | 중단점 편집 관련 내용을 문서에 언급된 사실만 바탕으로 한 줄 이내로 요약하세요. [answer] | 중단점 편집에 대한 구체적인 내용은 문서에 언급되어 있지 않습니다. [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] | Entity Event System [question] | 컴포넌트가 엔티티를 중계자로 사용해 이벤트를 발생시킬 때, 센더와 리시버가 다른 엔티티를 가리키는 경우 처리 로직이 어떻게 동작하는지 설명해 주세요. [answer] | 메이플스토리 월드의 Entity Event System에서 컴포넌트는 엔티티를 중계자로 사용하여 이벤트를 주고받습니다. 기본적으로 이벤트는 자기 자신의 엔티티에 연결되어 처리되지만, 상황(예: 맵 엔티티와 월드 엔티티 간 통신)에 따라 **센더(Sender)**와 **리시버(Receiver)**가 서로 다른 엔티티를 가리키도록 설정할 수 있습니다. 이 경우의 동작 로직은 다음과 같이 설명할 수 있습니다. ### 1. 이벤트 발생 (센더 역할) 이벤트를 보내는 컴포넌트(센더)는 특정 엔티티를 통해 이벤트를 발생시킵니다. * 컴 [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] | single_turn [pass] | ⏳ 미판정 [title] | Entity Event System [question] | self.Entity:SendEvent 메서드의 실행 공간이 [server only]로 설정되어 있는데, 클라이언트에서 직접 호출하면 에러가 나는 건가요? [answer] | 제공된 참고 문서에는 `self.Entity:SendEvent` 메서드의 실행 공간 제한이나 클라이언트에서 호출 시 발생하는 에러에 대한 정보가 포함되어 있지 않습니다. 참고 문서에서 `SendEvent`가 사용된 예시(`TimeManager` 스크립트)를 살펴보면, `OnUpdate`는 `[server only]` 공간에서 실행되며, 여기서 `self:SendEvent(self.isSunrise)`를 호출합니다. 또한 `HunterComponent`의 `KeyDownEvent` 핸들러(클라이언트 공간에서 실행되는 입력 이벤트)에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 특정 시간마다 해가 뜨고 지는 로직을 만들어봅시다. 1. 해가 뜨고 지는 시간을 관리할 스크립트 컴포넌트가 필요합니다. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create Scrips - Create Component**를 클릭해 새 컴포넌트를 만듭니다. 이름으로 **TimeManager**를 입력합니다. 2. **TimeManager** 스크립트 컴포넌트를 엽니다. `OnUpdate` 함수를 추가하여 해가 뜨고 지는 것을 판단하도록 합니다. ```lua Property: [Sy

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티를 탐색하는 EntityService [question] | 문서 예제에서 5초 후 엔티티를 삭제하기 위해 _TimerService:SetTimerOnce 에 전달되는 콜백 함수의 동작 내용을 3문장 이내로 설명하세요. [answer] | 콜백 함수는 5초 후 실행되어 `_EntityService:Destroy` 메서드를 호출합니다. 이때 `OnBeginPlay`에서 스폰한 `spawnedEntity`를 인자로 전달하여 해당 엔티티를 삭제합니다. [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"라는 이름의 몬

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