← 목록

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

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

[task] | code [pass] | ⏳ 미판정 [title] | 함수 [question] | OnUpdate(number delta) 내에서 매개 변수 delta가 0.5초 이상 누적되면 사용자 지정 메서드 Attack()을 호출하도록 타이머 로직을 구현하는 스크립트를 작성해줘 [answer] | 사용자 질문의 요구사항에 따라, `OnUpdate`에서 매개변수 `delta`를 누적하여 0.5초 이상 되면 사용자 지정 메서드 `Attack()`을 호출하는 mLua 스크립트를 작성합니다. 1. **Property**: 누적 시간을 저장할 프로퍼티 `AccTime`을 선언합니다. 서버에서 로직을 수행하므로 `[server only]` 컨텍스트에서 사용되므로 `[None]` 또는 `[Sync]` 중 하나를 선택할 수 있으나, 클라이언트 동기화가 필요 없으므로 `[None]` 또는 기본값을 사용합니다. 예제 코드들을 참고하면 `[ [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | HitComponent가 다른 엔티티와 충돌할 때 _EntityService:GetEntityByPath를 이용해 목표 엔티티를 찾고 그 엔티티의 HealthComponent 값을 10 감소시키는 스크립트를 작성해줘 [answer] | 제시된 참고 문서에는 `HitComponent`의 충돌 이벤트 핸들러(예: `HandleHitEvent`)나 `HealthComponent` API에 대한 정보가 포함되어 있지 않습니다. 따라서 `HitComponent`가 다른 엔티티와 충돌하는 순간을 감지하는 구체적인 이벤트 명과 `HealthComponent`의 프로퍼티/메서드 명을 지어낼 수 없습니다. 문서에 있는 정보만으로는 요청하신 스크립트를 작성할 수 없습니다. [followup] | [followup_answer] | [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] | 엔티티의 충돌 [question] | 충돌 이벤트 발생 시 상대 엔티티 정보를 어떻게 매개 변수로 받아올 수 있나요? [answer] | 충돌 이벤트가 발생하면 해당 이벤트 객체를 매개 변수로 받아와서, `event.TriggerBodyEntity` 속성을 통해 충돌한 상대 엔티티 정보를 조회할 수 있습니다. TriggerComponent의 충돌 관련 이벤트 핸들러(`HandleTriggerEnterEvent`, `HandleTriggerStayEvent`, `HandleTriggerLeaveEvent`)는 `TriggerEnterEvent` 타입의 이벤트를 전달받습니다. 이 이벤트 객체에는 `TriggerBodyEntity` 필드가 포함되어 있어, 충돌 대상이 된 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | single_turn [pass] | ⏳ 미판정 [title] | 함수 [question] | _EntityService:GetEntityByPath("/maps/map01")처럼 서비스를 통해 엔티티를 가져온 후 해당 엔티티의 특정 컴포넌트 메소드를 실행하는 전체 흐름이 궁금합니다. [answer] | 서비스를 통해 엔티티를 가져와 해당 엔티티에 붙은 특정 컴포넌트의 메소드를 실행하는 흐름은 다음과 같습니다. 1. **엔티티 참조**: `_EntityService:GetEntityByPath("경로")`를 호출하여 대상 엔티티 객체를 변수에 저장합니다. 2. **컴포넌트 접근**: 엔티티 객체를 통해 특정 컴포넌트 프로퍼티를 직접 참조합니다. (예: `엔티티객체.컴포넌트명`) 3. **메소드 호출**: 참조한 컴포넌트 객체에 콜론(`:`)을 붙여 메소드를 호출합니다. (예: `컴포넌트객체:메소드명(매개변수)`) 아래 예시 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerStayEvent 핸들러를 사용하여 충돌 상태가 유지되는 동안 프레임마다 상대 엔티티의 위치를 로그에 출력하는 스크립트를 작성해줘 [answer] | `TriggerStayEvent` 핸들러를 사용하여 충돌 상태가 유지되는 동안(매 프레임) 상대 엔티티의 위치를 로그에 출력하는 스크립트 컴포넌트입니다. 참고 문서에 따르면, `TriggerStayEvent`는 "엔티티가 충돌 중이면, 프레임마다 발생합니다." 이벤트 매개변수 `event`에는 `TriggerBodyEntity` 속성을 통해 충돌한 상대 엔티티 정보가 제공됩니다. ```lua Event Handler: [self] HandleTriggerStayEvent (TriggerStayEvent event) { - [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 충돌체 편집을 활성화했는데 초록색으로 안 바뀌고 포인트를 잡아당기려 해도 반응이 없는데, 원인이 무엇일까요? [answer] | 충돌체 편집이 활성화되었음에도 초록색으로 변경되지 않거나 포인트 조작이 안 되는 경우, 해당 엔티티에 충돌을 생성하는 컴포넌트가 제대로 부착되어 있지 않거나 충돌체 형태가 지원되지 않는 상태일 가능성이 큽니다. 문서에 따르면 충돌체는 **TriggerComponent**나 **HitComponent**를 엔티티에 추가해야만 자동 생성됩니다. 만약 이 두 컴포넌트 중 하나라도 없다면 편집할 대상이 존재하지 않으므로 초록색 하이라이트가 나타나지 않고 조작도 불가능합니다. 또한, 충돌체 형태(**ColliderType**)가 **Bo [followup] | [followup_answer] | [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] | code [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | `self.Entity.CurrentMap` 을 기준으로 하위 엔티티를 재귀적으로 검색하여 "ComponentA" 타입의 컴포넌트를 찾은 뒤, 찾은 컴포넌트가 null 이 아닌 경우 로그에 출력하는 스크립트를 작성해줘. [answer] | `self.Entity.CurrentMap`을 기준으로 하위 엔티티를 재귀적으로 검색하여 "ComponentA" 타입의 컴포넌트를 찾고, 해당 컴포넌트가 존재할 경우 로그에 출력하는 스크립트는 다음과 같습니다. ```lua Method: void FindAndLogComponentA() { local map01Entity = self.Entity.CurrentMap local componentA = map01Entity:GetFirstChildComponentByTypeName("ComponentA", true) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | > **Component Entity:GetFirstChildComponentByTypeName(string typename, bool recursive)** > 하위 엔티티들을 순회하면서 하위 엔티티에 typename과 일치하는 컴포넌트가 있으면, 해당 컴포넌트를 반환합니다. > * **매개 변수** > > | Parameter | Type | Description | > | --- | --- | --- | > | typename | string | 찾고자 하는 컴포넌트의 이름을 입력합니다. | >

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Entity Event System [question] | SunriseEvent 핸들러의 중계 엔티티 설정 방법과 이유를 3문장 이내로 설명하세요. [answer] | Event Handler 블록에서 핸들러 상단의 이벤트 중계자를 이벤트가 발생하는 엔티티(예: 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] | Entity Event System [question] | HunterComponent와 VampireComponent에서 Hp 프로퍼티의 초기값을 설정하는 단계를 단계별 번호 목록으로 나열하세요. [answer] | HunterComponent와 VampireComponent의 Hp 프로퍼티 초기값을 설정하는 단계는 다음과 같습니다. 1. 뱀파이어 엔티티와 헌터 엔티티의 프로퍼티 에디터에서 Hp 값을 각각 100으로 설정합니다. [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] | self:메소드명()과 컴포넌트:메소드명() 호출 방식이 각각 언제 사용되어야 하는지 차이가 궁금합니다. [answer] | mLua에서 메소드 호출 방식은 **어떤 객체의 메소드를 호출하는지**에 따라 `self:`와 `컴포넌트 객체:`를 구분하여 사용합니다. ### 1. `self:메소드명(매개 변수)` 사용 시 **현재 스크립트가 적용된 컴포넌트 내부의 다른 메소드를 호출**할 때 사용합니다. `self`는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체 자신을 가리킵니다. * **예시:** 같은 컴포넌트 안에 정의된 `OnBeginPlay()`에서 `MethodPractice()`를 호출하는 경우. ```lua void OnBegin [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | `self.Entity.CurrentMap` 에서 하위 엔티티를 순회하며 "ComponentD" 를 찾되, 두 번째 매개변수를 명시적으로 false 로 설정하여 자식 엔티티까지만 검색하는 스크립트를 작성해줘. [answer] | `self.Entity.CurrentMap`에서 시작하여 하위 엔티티를 순회하고, 두 번째 매개변수를 `false`로 명시적으로 설정하여 자식 엔티티까지만 "ComponentD"를 검색하는 스크립트는 다음과 같습니다. ```lua Method: void FindComponentD() { local mapEntity = self.Entity.CurrentMap local componentD = mapEntity:GetFirstChildComponentByTypeName("ComponentD", false) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | > **Component Entity:GetFirstChildComponentByTypeName(string typename, bool recursive)** > 하위 엔티티들을 순회하면서 하위 엔티티에 typename과 일치하는 컴포넌트가 있으면, 해당 컴포넌트를 반환합니다. > * **매개 변수** > > | Parameter | Type | Description | > | --- | --- | --- | > | typename | string | 찾고자 하는 컴포넌트의 이름을 입력합니다. | >

[task] | single_turn [pass] | ⏳ 미판정 [title] | 함수 [question] | 기본 이벤트 메소드와 사용자 지정 메소드의 가장 큰 차이점이 무엇이며, 왜 사용자 지정 메소드는 시스템에 의해 자동으로 호출되지 않는가요? [answer] | 기본 이벤트 메소드와 사용자 지정 메소드의 가장 큰 차이점은 **호출 시점의 결정 주체**와 **호출 제한**입니다. 1. **기본 이벤트 메소드**: * **호출 시점**: 게임 시작, 플레이 중, 게임 종료 등 특정 시스템 이벤트가 발생했을 때 호출됩니다. * **특징**: 시스템 내부에서 자동으로 호출되며, 함수 이름, 리턴 타입, 매개 변수는 고정되어 변경할 수 없습니다. * **역할**: 게임상 모든 액션의 진입점(입구) 역할을 합니다. * **제한**: 다른 사용자 지정 함수 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerComponent를 확장하여 OnTriggerEnter 함수를 오버라이드하고 충돌 시 상대 엔티티의 이름을 알리는 스크립트를 작성해줘 [answer] | TriggerComponent를 확장하여 `HandleTriggerEnterEvent` 함수를 오버라이드하고, 충돌이 발생했을 때 상대 엔티티의 이름을 로그에 출력하는 스크립트는 다음과 같습니다. 먼저 에디터에서 `TriggerComponent`를 선택하여 `Extend`를 통해 확장 컴포넌트를 생성한 후, 아래 코드를 해당 확장 컴포넌트의 스크립트에 적용해야 합니다. ```lua Event Handler: [self] HandleTriggerEnterEvent (TriggerEnterEvent event) { -- Pa [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충

[task] | single_turn [pass] | ⏳ 미판정 [title] | 함수 [question] | table.insert나 Vector2.Distance 같은 함수는 왜 콜론(:)이 아닌 점(.)으로 호출해야 하는지 이유가 무엇인가요? [answer] | mLua에서 `table.insert`나 `Vector2.Distance` 같은 함수를 점(`.`)으로 호출해야 하는 이유는, 해당 함수들이 **Static 메소드** 또는 **루아 표준 라이브러리 함수**이기 때문입니다. 메소드 호출 방식은 대상이 어떤 성격을 띠고 있느냐에 따라 다음과 같이 구분됩니다. **1. 인스턴스 메소드 (콜론 `:` 사용)** 특정 컴포넌트, 엔티티, 또는 서비스 객체의 상태를 변경하거나 접근할 때 사용합니다. * **동일 컴포넌트 내 메소드:** `self:메소드명()` * **다른 컴포넌트 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 확장된 TriggerComponent를 생성하고 함수를 오버라이드하는 과정만 코드 블록과 주석으로 [answer] | 확장된 TriggerComponent를 생성하고 함수를 오버라이드하는 과정은 다음과 같습니다. 1. **Workspace**에서 `TriggerComponent`를 검색하여 선택합니다. 2. 콘텍스트 메뉴에서 **Extend**를 선택하면 `MyDesk` 폴더에 `TriggerComponent`의 확장 컴포넌트가 생성됩니다. 3. 생성된 확장 컴포넌트를 열고, 원본 `TriggerComponent`에 포함된 충돌 이벤트 함수(예: `HandleTriggerEnterEvent`)를 찾아 편집하거나 오버라이드합니다. 아래는 ` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | `self.Entity.CurrentMap` 의 하위 엔티티들 중 직접 자식만 검색(recursive=false) 하여 "ComponentB" 컴포넌트를 찾고, 찾지 못했을 경우 "컴포넌트 없음" 이라는 로그를 출력하는 스크립트를 작성해줘. [answer] | `self.Entity.CurrentMap` 엔티티를 기준으로 `GetFirstChildComponentByTypeName` 메서드를 사용하여 직접 자식 엔티티들(recursive=false)에서 "ComponentB" 컴포넌트를 검색합니다. 해당 메서드는 매개변수로 컴포넌트 이름과 재귀 검색 여부를 받으며, 재귀 검색을 하지 않으려면 두 번째 인자를 `false`로 명시하거나 생략할 수 있습니다. 컴포넌트를 찾지 못해 `nil`이 반환되는 경우를 확인하여 요구하신 로그 메시지를 출력하도록 작성했습니다. ```lua Method: [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | > **Component Entity:GetFirstChildComponentByTypeName(string typename, bool recursive)** > 하위 엔티티들을 순회하면서 하위 엔티티에 typename과 일치하는 컴포넌트가 있으면, 해당 컴포넌트를 반환합니다. > * **매개 변수** > > | Parameter | Type | Description | > | --- | --- | --- | > | typename | string | 찾고자 하는 컴포넌트의 이름을 입력합니다. | >

[task] | code [pass] | ⏳ 미판정 [title] | 함수 [question] | table.insert와 string.len을 사용하여 테이블에 6을 추가하고 "Method Practice"의 길이를 구한 뒤 두 값을 log()로 출력하는 스크립트를 작성해줘. [answer] | 요청하신 기능은 `table.insert`와 `string.len`을 사용하여 테이블에 값을 추가하고 문자열 길이를 계산한 후, 결과 값을 `log()` 함수로 출력하는 것입니다. mLua 스크립트 형식에 맞춰 작성한 코드는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { local tmpTable = {1, 2, 3, 4, 5} table.insert(tmpTable, 6) local len = string.len("Method Pract [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerComponent의 충돌 이벤트를 수신받아 해당 엔티티의 TransformComponent.Scale을 0.5배로 축소하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `TriggerComponent`의 구체적인 충돌 이벤트 이름(예: `HandleTriggerEnterEvent` 등)이나 해당 이벤트 핸들러에 대한 API 설명이 포함되어 있지 않습니다. 문서에는 충돌 이벤트 시스템에 대한 외부 링크(`[Event System]`, `[Entity Event System]`)만 언급되어 있을 뿐, mLua에서 `TriggerComponent`가 발생시키는 특정 이벤트 핸들러의 정확한 시그니처를 확인할 수 없습니다. 따라서 문서에 없는 API를 지어내지 않기 위해, 요청하신 [followup] | [followup_answer] | [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] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerComponent의 OnStayTriggerBody를 오버라이딩하여 충돌 상태가 유지되는 동안 매 프레임마다 상대 엔티티의 이름과 현재 위치를 로그로 출력하는 스크립트를 작성해줘. [answer] | TriggerComponent의 `OnStayTriggerBody` 함수는 두 엔티티가 겹쳐 있는 동안 프레임마다 호출됩니다. 이 함수를 오버라이딩하여 충돌 상대 엔티티의 이름과 위치를 로그로 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server] void OnStayTriggerBody(TriggerStayEvent event) { local otherEntity = event.TriggerBodyEntity if otherEntity then log(otherEnt [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerComponent의 ColliderType이 Circle일 때만 충돌 이벤트를 처리하여 _SpawnService:SpawnByModelId를 통해 반지름(CircleRadius) 위치의 좌표에 파티클 엔티티를 생성하는 스크립트를 작성해줘 [answer] | 제공된 문서에는 `TriggerComponent`의 충돌 이벤트(예: Enter, Exit 등)를 직접 수신하는 Event Handler의 구체적인 서비스 이름이나 이벤트 타입(예: `HandleTriggerEnterEvent` 등)이 명시되어 있지 않습니다. 또한 `TriggerComponent`의 `CircleRadius` 프로퍼티가 직접적으로 접근 가능하다는 명시적 코드 예시도 없습니다. 문서에는 충돌체가 자동 생성된다는 내용과 `ColliderType`이 Circle일 때 `CircleRadius`로 크기를 설정한다는 설명 [followup] | [followup_answer] | [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] | 엔티티의 충돌 [question] | TriggerComponent와 HitComponent를 모두 엔티티에 붙여주면 각각 충돌 범위와 피격 범위가 어떻게 다르게 적용되는지 알고 싶어요. [answer] | TriggerComponent와 HitComponent는 모두 엔티티에 충돌체를 자동으로 생성해 주지만, 각각의 용도와 적용 방식이 명확히 구분됩니다. **1. TriggerComponent (충돌 범위)** * **역할:** '충돌 범위'를 설정할 때 사용됩니다. * **적용 방식:** 다른 엔티티의 충돌 영역이 이 TriggerComponent가 가진 충돌 영역과 교차하는지 감지하는 데 사용됩니다. 즉, "어떤 범위에 다른 객체가 들어오면 이벤트가 발생한다"는 식의 트리거(감지) 용도로 동작합니다. * **특징:** [followup] | [followup_answer] | [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] | two_turn [pass] | ⏳ 미판정 [title] | 함수 [question] | mLua 스크립트에서 함수의 리턴 타입은 기본적으로 void로 설정되어 있는데, 특정 값을 반환해야 하는 경우 리턴 타입을 어떻게 변경하고 실제 코드에서 어떻게 사용해야 하나요? [answer] | mLua 스크립트에서 함수의 리턴 타입은 기본적으로 `void`로 설정되어 있습니다. 특정 값을 반환해야 하는 경우, 스크립트 에디터에서 해당 함수의 리턴 타입 텍스트를 클릭하여 선택 가능한 타입 목록 중 원하는 타입(예: `number`, `string`, `boolean`, `Vector3` 등)을 선택하면 됩니다. 리턴 타입을 설정한 후 실제 코드에서 값을 반환하려면, 함수 구현부 마지막에 `return` 키워드를 사용하여 값을 반환해야 합니다. 아래는 리턴 타입을 `number`로 설정하고 값을 반환하는 사용자 지정 메소 [followup] | 리턴 타입이 number인 함수를 정의하고, OnUpdate 함수에서 그 함수의 반환 값을 받아서 로그에 출력하는 전체 코드 예제를 작성해 주세요. [followup_answer] | mLua 스크립트에서 `number` 타입을 반환하는 사용자 지정 메소드를 정의하고, `OnUpdate`에서 그 값을 받아 로그에 출력하는 전체 코드 예시는 다음과 같습니다. ```lua Property: [None] number Speed = 10 Method: [server only] number GetSpeed() { return self.Speed } [server only] void OnUpdate(number delta) { local currentSpeed = self:GetSpeed() lo [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Entity Event System [question] | HunterComponent와 VampireComponent의 SunriseEvent 처리 로직 차이점을 비교하여 표로 정리하세요. [answer] | HunterComponent와 VampireComponent는 동일한 `SunriseEvent`를 수신하지만, 해가 뜬 상태(`isSunrise == true`)일 때 HP를 처리하는 방향이 정반대입니다. 두 컴포넌트의 로직 차이점은 다음과 같습니다. | 구분 | HunterComponent | VampireComponent | | :--- | :--- | :--- | | **해 뜨기 전 상태** | `isSunrise`가 `false`일 때 HP 변동 없음 | `isSunrise`가 `false`일 때 HP 변동 없음 | | * [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] | 엔티티와 컴포넌트 참조 [question] | `OnBeginPlay()` 생명주기 메서드에서 `self.Entity.CurrentMap` 을 통해 하위 엔티티를 재귀적으로 탐색하여 "ComponentC" 를 찾은 후, 찾은 컴포넌트를 로컬 변수에 저장해두는 스크립트를 작성해줘. [answer] | `OnBeginPlay()`에서 `self.Entity.CurrentMap`을 기준으로 하위 엔티티를 재귀적으로 탐색하여 "ComponentC" 컴포넌트를 찾는 코드는 다음과 같습니다. `GetFirstChildComponentByTypeName` 메서드의 두 번째 인자 `recursive`에 `true`를 전달하면 하위에 하위 엔티티까지 포함하여 탐색됩니다. ```lua Property: [None] Entity FoundEntity = nil Method: [server only] void OnBeginPlay() { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | > **Component Entity:GetFirstChildComponentByTypeName(string typename, bool recursive)** > 하위 엔티티들을 순회하면서 하위 엔티티에 typename과 일치하는 컴포넌트가 있으면, 해당 컴포넌트를 반환합니다. > * **매개 변수** > > | Parameter | Type | Description | > | --- | --- | --- | > | typename | string | 찾고자 하는 컴포넌트의 이름을 입력합니다. | >

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerComponent의 OnEnterTriggerBody를 오버라이딩하여 특정 이름의 엔티티가 트리거 영역에 진입하면 로그를 출력하는 스크립트를 작성해줘. [answer] | TriggerComponent의 `OnEnterTriggerBody` 함수는 엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. 특정 이름의 엔티티가 트리거 영역에 진입했을 때 로그를 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnEnterTriggerBody (TriggerBodyEvent event) { local TriggerBodyEntity = event.TriggerBodyEntity -- 특정 이름의 엔티티가 진입했는지 확인 if [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | two_turn [pass] | ⏳ 미판정 [title] | 함수 [question] | 함수에 매개 변수를 추가할 때 타입과 이름을 설정할 수 있는데, 호출할 때 값을 전달하지 않으면 nil로 넘어온다고 합니다. 이 nil 값을 안전하게 처리하는 방법을 알려주세요. [answer] | 메이플스토리 월드의 mLua 스크립트에서 함수 매개 변수에 값이 전달되지 않으면 `nil`로 넘어옵니다. 이를 안전하게 처리하기 위해서는 함수 본문 시작 부분에 매개 변수가 `nil`인지 확인하는 조건문(`if`)을 작성하고, `nil`인 경우 함수를 즉시 종료(`return`)하는 방식을 사용해야 합니다. 다음은 매개 변수가 `nil`인 경우를 처리하는 예시 코드입니다. ```lua Property: [None] string TargetName = "" Method: [server only] void OnBeginPlay() [followup] | 매개 변수가 string 타입인 함수를 정의하고, 호출 시 값이 nil인 경우와 아닌 경우를 구분하여 각각 다른 동작을 수행하는 Lua 5.3 코드 예제를 보여주세요. [followup_answer] | 매개 변수가 `string` 타입인 사용자 지정 함수를 정의하고, 호출 시 `nil` 여부에 따라 다른 동작을 수행하는 mLua 코드 예시입니다. mLua에서는 사용자 지정 메소드는 기본 이벤트 메소드(예: `OnBeginPlay`)에서 호출해야 하므로, `OnBeginPlay` 안에서 값을 전달하지 않는 경우(`nil`)와 값을 전달하는 경우를 각각 호출하여 동작을 구분합니다. ```lua Property: [None] string ResultMessage = "" Method: [server only] void OnBegi [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 상위 엔티티의 TransformComponent.Rotation이 변경되어 자식 엔티티의 충돌체가 다른 객체와 교차하면 log() 함수로 충돌 발생 사실을 출력하는 스크립트를 작성해줘 [answer] | 제공된 문서에는 상위 엔티티의 `TransformComponent.Rotation`이 변경되었을 때 자식 엔티티의 충돌체가 어떻게 반응하는지 설명하고 있으며, 충돌 감지를 위해 `TriggerComponent`나 `HitComponent`를 사용해야 한다고 명시합니다. 또한, 이벤트 핸들러를 통해 특정 조건에서 액션을 수행할 수 있는 구조(예: `HandleKeyHoldEvent`)를 보여줍니다. 하지만, **충돌이 실제로 발생했음을 감지하고 이를 `log()` 함수로 출력하기 위한 구체적인 충돌 이벤트 이름(예: `HandleT [followup] | [followup_answer] | [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] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | OnStayTriggerBody 함수가 호출되는 구체적인 조건이 어떻게 되나요? [answer] | `OnStayTriggerBody` 함수는 두 엔티티 간 충돌이 발생한 이후, 해당 두 엔티티가 물리적으로 겹쳐 있는 동안 **매 프레임마다** 호출됩니다. 즉, `OnEnterTriggerBody`가 충돌이 처음 시작될 때 1회만 실행되는 반면, `OnStayTriggerBody`는 충돌 상태가 유지되는 모든 프레임에서 반복적으로 실행되는 것이 구체적인 호출 조건입니다. [followup] | 두 엔티티가 겹쳐있는 동안 프레임마다 호출되는 OnStayTriggerBody 내부에서 특정 로직(예: 체력 감소)을 실행할 때 중복 호출을 방지하거나 타이머를 활용하는 최적화 방법을 알려주세요. [followup_answer] | 제공된 참고 문서에는 `OnStayTriggerBody` 함수의 호출 시점(겹쳐있는 동안 프레임마다 호출)과 매개 변수 정보만 포함되어 있으며, **중복 호출 방지 로직이나 타이머를 활용한 최적화 방법에 대한 구체적인 내용은 없습니다.** 따라서 문서에 근거하여 최적화 방법을 설명드리기 어렵습니다. 다만, 문서에 명시된 기본 동작 원리만 확인해 드리면: * `OnStayTriggerBody`는 두 엔티티가 겹쳐 있는 동안 **매 프레임마다** 호출되므로, 이 함수 내부에서 직접 체력 감소 로직을 실행할 경우 프레임 레이트(F [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerLeaveEvent 핸들러를 사용하여 충돌이 끝났을 때 자기가 포함된 엔티티를 삭제하는 스크립트를 작성해줘 [answer] | 충돌이 끝났을 때(`TriggerLeaveEvent`) 해당 엔티티를 삭제하려면, `TriggerComponent`가 있는 엔티티에 스크립트 컴포넌트를 추가하고 `HandleTriggerLeaveEvent` 이벤트 핸들러를 구현해야 합니다. 참고 문서에 명시된 API와 예제 코드를 확인한 결과, 엔티티를 삭제하는 구체적인 메서드(예: `Destroy`, `Remove` 등)에 대한 설명이나 코드 예제는 제공된 문서에 포함되어 있지 않습니다. 따라서 `TriggerLeaveEvent` 핸들러의 구조와 매개변수 사용 방법은 안내해 드 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 충돌 이벤트 핸들러의 센더를 self와 entity로 설정할 때 각각 어떤 엔티티의 충돌을 감지하는지 차이를 설명해 주실 수 있나요? [answer] | 충돌 이벤트 핸들러의 센더(Sender) 설정에 따라 감지하는 충돌 대상의 범위가 달라집니다. **1. 센더를 `self`로 설정할 때** 해당 스크립트 컴포넌트(리액터)가 붙어 있는 **자기 자신(현재 엔티티)**의 충돌 이벤트를 받습니다. 즉, A 엔티티에 스크립트가 붙어 있고 센더를 `self`로 설정했다면, A 엔티티가 다른 물체와 부딪히는 순간에만 이벤트가 발생합니다. **2. 센더를 `entity`로 설정할 때** 지정한 **다른 특정 엔티티**의 충돌 이벤트를 받습니다. A 엔티티에 스크립트가 붙어 있지만, 센더를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 충돌 이벤트 이후 액션은 **Entity Event System**을 활용하거나, **확장된 TriggerComponent** 활용합니다. 월드에 **TriggerComponent**를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. **TriggerComponent**를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충

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