← 목록

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

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

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | 엔티티에서 컴포넌트를 참조하는 기본 방식과 예시 코드가 궁금합니다. [answer] | 엔티티에서 컴포넌트를 참조하는 기본 방식은 **`엔티티.컴포넌트명`** 형태를 사용하는 것입니다. 컴포넌트는 엔티티를 작동시키는 구성품이므로 반드시 엔티티를 통해 접근해야 합니다. 네이티브 컴포넌트와 스크립트 컴포넌트 모두 동일한 방식으로 접근할 수 있으며, 스크립트 컴포넌트는 생성 시 지정한 이름 그대로 사용합니다. ### 1. 네이티브 컴포넌트 참조 예시 아래 코드는 내 플레이어 엔티티의 `RigidbodyComponent`에 접근하는 예시입니다. ```lua [client only] void OnBeginPlay() { [followup] | 스크립트 컴포넌트 이름이 일치하지 않거나 nil로 반환되는 경우를 방지하기 위한 방어적 코딩 예시를 보여주세요. [followup_answer] | 참고 문서에 제시된 방어적 코딩 패턴은 컴포넌트 참조 후 `nil` 여부를 확인하고, 해당 값이 없으면 `return`을 통해 함수 실행을 중단하는 것입니다. 네이티브 컴포넌트(`RigidbodyComponent`)와 스크립트 컴포넌트(`CharacterStatus`) 각각에 대한 방어적 코딩 예시는 다음과 같습니다. ### 1. 네이티브 컴포넌트 참조 시 방어적 코딩 `RigidbodyComponent`가 `nil`인 경우 로그를 출력하고 함수를 종료합니다. ```lua [client only] void OnBeginPlay [scores] | [judge_reason] | [source_doc] | 컴포넌트는 엔티티를 작동시키는 구성품입니다. 그러므로 반드시 엔티티를 통해 컴포넌트로 접근해야 합니다. 일반적으로 **Entity.컴포넌트 명** 형태로 컴포넌트에 접근할 수 있습니다. 네이티브 컴포넌트는 스크립트 에디터에서 컴포넌트 명이 자동 완성됩니다. 다음은 내 플레이어 엔티티의 **RigidbodyComponent**에 접근하는 예시 코드입니다. ```lua [client only] void OnBeginPlay() { local myPlayerEntity = _UserService.LocalPlayer

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | 클라이언트 공간에서 _UserService.LocalPlayer 프로퍼티를 사용할 때 반환되는 값은 무엇이며, 서버 공간에서 동일한 프로퍼티를 접근하면 어떤 결과가 발생하나요? [answer] | 클라이언트 공간에서 `_UserService.LocalPlayer` 프로퍼티를 사용하면 현재 스크립트가 실행되고 있는 클라이언트에 접속한 **내 플레이어 엔티티(Entity)** 가 반환됩니다. 반면, 서버 공간에서 동일한 프로퍼티를 접근하면 **"내 플레이어"라는 개념 자체가 서버에 존재하지 않으므로 `nil` 을 반환합니다.** 이 동작 방식을 보여주는 코드 예시는 다음과 같습니다. ```lua Method: [client only] void OnBeginPlay() { local myPlayerEntity = _U [followup] | [client Only]와 [server Only] 실행 공간에서 _UserService.LocalPlayer를 참조할 때의 차이를 코드로 비교하여 보여주고, 서버에서 nil을 반환하는 이유를 설명해 주세요. [followup_answer] | `[client only]`와 `[server only]` 실행 공간에서 `_UserService.LocalPlayer`를 참조할 때의 차이와 nil 반환 이유는 다음과 같습니다. ### 1. 코드 비교 ```lua Method: [client only] void CheckLocalPlayer() { -- 클라이언트 공간에서는 접속한 내 플레이어 엔티티를 반환 local myPlayerEntity = _UserService.LocalPlayer log("Client: " .. myPlayerEntity.Na [scores] | [judge_reason] | [source_doc] | 게임에 접속해 있는 모든 플레이어 엔티티를 딕셔너리 형태로 받아오는 읽기 전용 프로퍼티입니다. * Key: string UserId * Value: Entity PlayerEntity key 값인 UserId는 유저가 메이플스토리 월드에 가입 시 생성한 Id로 UserId와 플레이어 엔티티의 이름을 동일하게 사용하고 있습니다. ```lua void PrintUserEntitiesName() { log(_UserService:GetUserCount()) local playerEntitiesDic = _UserServi

[task] | single_turn [pass] | ⏳ 미판정 [title] | 함수 [question] | mLua 스크립트에서 함수의 리턴 타입을 반드시 설정해야 하는 이유는 무엇이며, 기본 루아 문법과 어떤 점이 다른가요? [answer] | mLua 스크립트에서 함수의 리턴 타입을 반드시 설정해야 하는 이유는 스크립트 내부적인 값 전달을 위해서입니다. 이는 기본적인 Lua 문법과 조금 다른 점이며, 모든 함수에는 리턴 타입이 필수적으로 지정되어야 합니다. 기본적으로 함수의 리턴 타입은 `void`로 설정되어 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | OnLeaveTriggerBody 함수가 호출되는 시점은 정확히 언제인가요? [answer] | `OnLeaveTriggerBody` 함수는 엔티티 간 충돌이 종료될 때 1회 호출됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | 내 플레이어 엔티티의 특정 컴포넌트를 변수에 저장하여 참조하는 올바른 코딩 패턴은 무엇인가요? [answer] | 내 플레이어 엔티티의 특정 컴포넌트를 변수에 저장하여 참조하는 올바른 코딩 패턴은 `_UserService.LocalPlayer`를 통해 플레이어 엔티티를 가져온 후, 해당 엔티티 객체 뒤에 컴포넌트 이름을 붙여 접근하는 것입니다. 컴포넌트 접근 시 `GetComponent` 같은 메서드를 사용하지 않고 `Entity.컴포넌트명` 형태로 직접 참조하며, 참조된 컴포넌트가 존재하지 않는 경우(`nil`)를 반드시 검사해야 합니다. ### 네이티브 컴포넌트 참조 예시 `RigidbodyComponent`와 같은 네이티브 컴포넌트를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 컴포넌트는 엔티티를 작동시키는 구성품입니다. 그러므로 반드시 엔티티를 통해 컴포넌트로 접근해야 합니다. 일반적으로 **Entity.컴포넌트 명** 형태로 컴포넌트에 접근할 수 있습니다. 네이티브 컴포넌트는 스크립트 에디터에서 컴포넌트 명이 자동 완성됩니다. 다음은 내 플레이어 엔티티의 **RigidbodyComponent**에 접근하는 예시 코드입니다. ```lua [client only] void OnBeginPlay() { local myPlayerEntity = _UserService.LocalPlayer

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | 스크립트에서 self.Entity.Name을 로그로 출력했는데 엔티티 이름 대신 다른 값이 나오거나 에러가 나는 원인은 무엇일까요? [answer] | `self.Entity.Name`을 로그로 출력했을 때 의도한 엔티티 이름이 나오지 않거나 에러가 발생하는 주된 원인은 **스크립트가 부착된 엔티티의 구조를 오해하고 있기 때문**입니다. 제공된 문서에 근거한 구체적인 원인과 해결 방법은 다음과 같습니다. ### 1. 스크립트가 부착된 엔티티와 참조하려는 엔티티가 다를 때 `self.Entity`는 **현재 스크립트가 부착되어 있는 컴포넌트를 포함하는 엔티티 자체**를 가리킵니다. * **원인**: 스크립트가 `Entity C`에 붙어 있는데, 개발자가 `Entity A`(부모 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티와 컴포넌트 구조를 간략하게 이해하고, 스크립트를 통해 엔티티와 컴포넌트에 접근하는 방법을 알아봅니다. # 엔티티와 컴포넌트 구조 먼저 엔티티와 컴포넌트의 구조를 알아보겠습니다. 기본적으로 엔티티는 각기 다른 컴포넌트들로 구성되어 있고, 각각의 엔티티는 상위, 하위 관계로 연결되어 있습니다. 이 연결 구조를 이용하면 특정 컴포넌트에서 다른 엔티티나 컴포넌트로 접근할 수 있습니다. 아래 이미지는 엔티티 간의 상-하위 구조와 각 엔티티를 구성하는 컴포넌트를 도식화한 것입니다. 이후 이 구조를 바탕으로 설명

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | _UserService:GetUserEntityByUserID() 함수를 사용하여 특정 유저를 조회할 때 매개 변수로 전달해야 하는 값과 반환 값은 어떻게 되나요? [answer] | `_UserService:GetUserEntityByUserID()` 함수를 사용할 때의 매개 변수와 반환 값은 다음과 같습니다. **매개 변수** * **UserId (string)**: 찾고자 하는 플레이어 엔티티의 UserId를 입력합니다. 이 UserId는 유저가 메이플스토리 월드에 가입 시 생성된 Id이며, 현재는 플레이어 엔티티의 이름과 동일한 값으로 사용됩니다. **반환 값** * 매개 변수로 넘겨진 UserId와 동일한 플레이어 엔티티가 존재하면 해당 **플레이어 엔티티(Entity)** 를 반환합니다. * [followup] | HandleUserEnterEventType 이벤트 핸들러에서 event.UserId를 매개 변수로 전달하여 엔티티를 조회하는 코드 예시를 작성해 주세요. [followup_answer] | 참고 문서에 제시된 `HandleUserEnterEventType` 이벤트 핸들러에서 `event.UserId`를 매개 변수로 전달하여 엔티티를 조회하는 코드 예시는 다음과 같습니다. ```lua Event Handler: [service: UserService] HandleUserEnterEventType(UserEnterEventType event) { -- Parameters local UserId = event.UserId -------------------------------------------- [scores] | [judge_reason] | [source_doc] | 게임에 접속해 있는 모든 플레이어 엔티티를 딕셔너리 형태로 받아오는 읽기 전용 프로퍼티입니다. * Key: string UserId * Value: Entity PlayerEntity key 값인 UserId는 유저가 메이플스토리 월드에 가입 시 생성한 Id로 UserId와 플레이어 엔티티의 이름을 동일하게 사용하고 있습니다. ```lua void PrintUserEntitiesName() { log(_UserService:GetUserCount()) local playerEntitiesDic = _UserServi

[task] | code [pass] | ⏳ 미판정 [title] | 함수 [question] | 사용자 지정 메서드 MoveToTarget(Vector3 targetPos)를 정의하고, OnBeginPlay()에서 이 메서드를 호출하여 특정 좌표로 이동하는 로직을 구현하는 스크립트를 작성해줘 [answer] | 요청하신 `MoveToTarget(Vector3 targetPos)` 메서드와 `OnBeginPlay()` 호출 로직을 포함하는 스크립트는 다음과 같습니다. 참고로 제공된 문서에는 엔티티의 위치를 변경하는 구체적인 API(예: `TransformComponent.Position` 직접 할당 또는 이동 관련 메서드)가 명시되어 있지 않습니다. 따라서 아래 예시에서는 `self.Entity.TransformComponent.Position` 프로퍼티를 통해 위치를 직접 변경하는 가장 기본적인 방식을 사용하고 있습니다. ```lua [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | 해당 메서드를 사용했을 때 여러 엔티티에 해당 컴포넌트가 존재하는 경우 어떤 컴포넌트가 반환되는지 설명해 주세요. [answer] | `Entity:GetFirstChildComponentByTypeName(string typename, bool recursive)` 메서드는 이름에서 알 수 있듯이 **첫 번째(First)** 일치하는 컴포넌트를 반환합니다. 여러 엔티티에 해당 컴포넌트가 존재하는 경우, 반환되는 컴포넌트는 다음과 같은 규칙을 따릅니다. 1. **순회 순서**: 엔티티는 **하위 엔티티 순서**대로 순회됩니다. (참고 문서 예시에서는 "EntityA에서부터 EntityD로 순회"한다고 명시되어 있습니다.) 2. **첫 번째 발견**: 순회 [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] | 엔티티의 충돌 [question] | TransformComponent의 Scale과 Rotation이 충돌체에 미치는 영향과 상위 엔티티의 영향을 받는 계층 구조 원리를 단계별 번호 목록으로 작성하세요. [answer] | TransformComponent의 Scale과 Rotation이 충돌체에 미치는 영향과 상위 엔티티의 영향을 받는 계층 구조 원리는 다음과 같습니다. 1. **Scale 값의 영향**: 엔티티의 `TransformComponent`에서 `Scale` 값이 변경되면, 해당 엔티티에 포함된 충돌체(Collider)의 크기도 `Scale` 값만큼 비례하여 커지거나 줄어듭니다. 2. **Rotation 값의 영향**: 엔티티의 `TransformComponent`에서 `Rotation` 값이 변경되면, 해당 엔티티에 포함된 충돌체( [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] | 메소드 호출 시 self가 의미하는 바가 무엇이며, 왜 동일한 컴포넌트 내에서는 self를 앞에 붙여야 하는지 설명해 주세요. [answer] | `self`는 현재 작동 중인 메소드를 포함하고 있는 **컴포넌트 객체** 자체를 의미합니다. 동일한 컴포넌트 내에서 다른 메소드를 호출할 때 `self`를 앞에 붙여야 하는 이유는, 해당 메소드가 속한 컴포넌트 객체를 명시적으로 지정해야 하기 때문입니다. mLua에서는 메소드 호출 시 `객체:메소드명(매개 변수)` 형식을 따르며, 같은 컴포넌트 내부의 메소드를 호출하려면 그 컴포넌트 객체(`self`)를 호출 주체로 사용해야 합니다. 예를 들어, `OnBeginPlay` 메소드 내부에서 같은 컴포넌트의 `MethodPracti [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | 자신이 작성한 스크립트에서 특정 이름의 컴포넌트를 찾을 때 하위 엔티티의 순서가 결과에 영향을 주는지 궁금합니다. [answer] | 네, 하위 엔티티의 순서가 결과에 직접적인 영향을 줍니다. `Entity:GetFirstChildComponentByTypeName(string typename, bool recursive)` 메서드는 하위 엔티티를 순회하면서 **조건을 만족하는 첫 번째** 컴포넌트를 찾아 반환합니다. 따라서 순회 순서(예: EntityA -> EntityB -> EntityC...)에 따라, 여러 엔티티가 동일한 이름의 컴포넌트를 가지고 있을 경우 어떤 엔티티의 컴포넌트가 반환되는지가 결정됩니다. **예시 시나리오:** 만약 `map01` 하 [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] | 기타 스크립트 컴포넌트와 달리 TriggerComponent에서만 오버라이딩 가능한 함수들이 무엇인가요? [answer] | 기타 스크립트 컴포넌트와 달리 확장된 **TriggerComponent**에서만 오버라이딩할 수 있는 함수는 총 3가지입니다. 1. **OnEnterTriggerBody**: 엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. 2. **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐있는 동안 프레임마다 호출됩니다. 3. **OnLeaveTriggerBody**: 엔티티 간 충돌이 종료될 때 1회 호출됩니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되며, 매개 변수로 충돌 이벤트가 전달되어 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | Polygon 타입의 충돌체를 사용할 때 PolygonPoint를 추가해야 하는 최소 개수나 형태 제한이 있는지 궁금합니다. [answer] | 제공된 참고 문서에는 **PolygonPoint**를 추가해야 하는 **최소 개수**나 **특정 형태 제한**(예: 꼭짓점 순서, 자기 교차 금지 등)에 대한 내용이 명시되어 있지 않습니다. 문서에는 Polygon 충돌체에 대해 다음과만 설명하고 있습니다: > "충돌체를 다각형으로 설정합니다. PolygonPoint를 필요한만큼 추가해 크리에이터가 원하는 충돌체 모양을 만들 수 있습니다." 따라서 정확한 최소 개수나 형태 제약 사항은 해당 문서만으로는 확인이 어렵습니다. [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] | OnBeginPlay()에서 self:Initialize()를 호출하여 로컬 변수에 "Start"를 대입하고 log()로 출력하는 스크립트를 작성해줘. [answer] | OnBeginPlay()에서 self:Initialize()를 호출하여 로컬 변수에 "Start"를 대입하고 log()로 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { self:Initialize() } [server only] void Initialize() { local message = "Start" log(message) } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 충돌이 종료되는 순간 1회만 실행되도록 하려면 어떤 함수를 정의해야 하나요? [answer] | 충돌이 종료되는 순간 1회만 실행되도록 하려면 `OnLeaveTriggerBody` 함수를 정의해야 합니다. 이 함수는 두 엔티티의 충돌이 끝나고 분리될 때 정확히 한 번 호출됩니다. 참고로 충돌 이벤트가 발생할 때 호출되는 오버라이딩 가능한 함수는 총 세 가지이며, 각각의 역할은 다음과 같습니다. * `OnEnterTriggerBody`: 충돌이 처음 발생했을 때 1회 호출 * `OnStayTriggerBody`: 충돌이 발생한 뒤, 두 엔티티가 겹쳐 있는 동안 프레임마다 호출 * `OnLeaveTriggerBody [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | TriggerComponent의 OnEnterTriggerBody와 OnStayTriggerBody가 각각 언제 호출되는지 차이점이 있나요? [answer] | TriggerComponent의 `OnEnterTriggerBody`와 `OnStayTriggerBody`는 호출 시점이 명확히 다릅니다. 1. **OnEnterTriggerBody** * 두 엔티티 간의 충돌이 **처음 발생했을 때 1회**만 호출됩니다. * 즉, 트리거 영역에 다른 엔티티가 처음 진입하는 순간에만 실행됩니다. 2. **OnStayTriggerBody** * 충돌이 발생한 뒤, 두 엔티티가 **겹쳐있는 동안 프레임마다** 호출됩니다. * 즉, 트리거 영역 안에 다른 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 다른 스크립트 컴포넌트와는 달리, 확장된 **TriggerComponent**에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. 오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다. * **OnEnterTriggerBody** :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다. * **OnStayTriggerBody**: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐

[task] | single_turn [pass] | ⏳ 미판정 [title] | 함수 [question] | 스크립트 에디터에서 기본 이벤트 함수를 추가하고 싶을 때 Function 버튼 옆의 [+] 목록에서 어떤 항목을 선택해야 하며, 사용자 지정 함수는 어떻게 추가하나요? [answer] | 스크립트 에디터에서 `Function` 버튼 옆의 `[+]` 버튼을 누르면 함수 목록이 표시됩니다. 여기서 기본 이벤트 함수와 사용자 지정 함수를 추가하는 방법은 다음과 같습니다. **기본 이벤트 함수 추가** * `[+]` 버튼으로 연 함수 목록에서 **`New`** 항목 **외의 다른 항목**을 선택하면 기본 이벤트 함수가 추가됩니다. * 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때 시스템 내부에서 자동으로 호출되며, 함수 이름과 리턴 타입, 매개 변수는 설정할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 충돌 [question] | 상위 엔티티의 Scale을 2배로 키웠을 때, 자식 엔티티에 붙은 충돌체 크기도 2배로 커지는 건가요? [answer] | 네, 맞습니다. 모든 엔티티는 계층 구조로 구성되므로, 확장된(자식) 엔티티의 `TransformComponent`는 항상 상위(부모) 엔티티의 `TransformComponent`에 영향을 받습니다. 따라서 상위 엔티티의 `Scale` 값을 변경하면, 그 엔티티에 포함된 충돌체(`TriggerComponent` 또는 `HitComponent` 등)의 크기도 상위 엔티티의 `Scale` 값에 따라 함께 변경됩니다. 상위 엔티티의 Scale이 2배가 되면, 자식 엔티티에 붙은 충돌체의 크기도 2배로 커집니다. [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] | OnEndPlay()에서 스크립트 종료 시 특정 메시지와 함께 log(...) 함수를 호출하여 디버깅 정보를 출력하는 스크립트를 작성해줘 [answer] | `OnEndPlay()`는 게임 종료 시점에 시스템이 자동으로 호출하는 기본 이벤트 메소드입니다. 이 함수 내부에서 `log(...)`를 호출하면 콘솔에 디버깅 메시지를 출력할 수 있습니다. 요청하신 내용을 반영한 스크립트 컴포넌트 예시는 다음과 같습니다. ```lua Property: [None] number DebugMessage = 0 Method: [server only] void OnEndPlay() { log("Script terminated. Debug info: "..tostring(self.DebugMe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | code [pass] | ⏳ 미판정 [title] | 함수 [question] | OnUpdate(number delta)에서 매개 변수 delta를 활용해 스크립트 컴포넌트의 self.Entity.TransformComponent.Position을 매 프레임마다 X축 방향으로 이동시키는 스크립트를 작성해줘 [answer] | `OnUpdate` 메서드의 `delta` 매개 변수는 이전 프레임에서 현재 프레임까지 경과한 시간(초)을 나타냅니다. 따라서 위치를 매 프레임마다 일정 속도로 이동시키려면, 이동할 거리를 `속도 * delta`로 계산하여 현재 좌표에 더해야 합니다. 요청하신 대로 X축 방향으로 이동시키는 스크립트는 다음과 같습니다. ```lua Property: [None] number MoveSpeed = 5 Method: [server only] void OnUpdate(number delta) { -- 현재 위치 가져오기 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Entity Event System [question] | SunriseEvent 스크립트에서 해의 상태를 확인하기 위해 선언해야 하는 Property의 이름과 기본값을 코드 블록으로만 출력하세요. [answer] | ```lua Property: boolean isSunrise = false ``` [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] | 함수 [question] | 다른 엔티티에 있는 컴포넌트의 메소드를 호출하려면 어떤 식으로 객체를 참조해야 하나요? [answer] | 다른 엔티티에 있는 컴포넌트의 메소드를 호출하려면 먼저 해당 컴포넌트가 속한 엔티티 객체를 가져와야 합니다. 이후 엔티티 객체를 통해 특정 컴포넌트 이름을 직접 참조하고, 그 컴포넌트 객체를 사용하여 메소드를 호출합니다. 구체적인 호출 형식은 다음과 같습니다: 1. **엔티티 참조**: `_EntityService:GetEntityByPath("경로")`를 사용하여 대상 엔티티를 가져옵니다. 2. **컴포넌트 참조**: 가져온 엔티티 객체 뒤에 컴포넌트 이름을 붙여 참조합니다 (예: `엔티티.컴포넌트명`). 3. **메소드 호출* [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | instruction_following [pass] | ⏳ 미판정 [title] | Entity Event System [question] | Entity Event System에서 컴포넌트가 이벤트를 주고받을 때 중계자로 사용되는 대상은 무엇인지 1문장으로 답변하세요. [answer] | 컴포넌트는 엔티티를 중계자로 사용하여 이벤트를 등록하고 발생시킵니다. [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] | Entity Event System [question] | 예제에서 사용된 뱀파이어와 헌터 NPC의 모델 ID를 구분 없이 나열한 형태로 1줄에 정리하세요. [answer] | npc-3842, npc-4064 [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] | 엔티티의 충돌 [question] | 충돌 이벤트가 발생했을 때 특정 액션을 실행하려면 어떤 이벤트 핸들러를 등록해야 하나요? [answer] | 충돌 이벤트가 발생했을 때 액션을 실행하려면 **TriggerComponent** 또는 **HitComponent**의 충돌 이벤트 핸들러를 등록해야 합니다. 참고 문서에는 충돌 이벤트의 구체적인 핸들러 이름(예: `HandleTriggerEnterEvent`, `HandleHitEnterEvent` 등)이 명시되어 있지 않습니다. 문서에서는 충돌 감지를 위해 엔티티에 `TriggerComponent`나 `HitComponent`를 추가해야 한다고 설명하며, 충돌 이벤트 이후 액션을 추가하는 방법을 다루고 있으나, 해당 이벤트 핸 [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] | Vector2.Distance(Vector2(0,0), Vector2(10,10))를 계산하여 결과 값을 log()로 출력하는 스크립트를 작성해줘. [answer] | `Vector2.Distance`는 두 좌표 사이의 거리를 계산하는 Static 메소드입니다. Static 메소드는 콜론(`:`)이 아닌 마침표(`.`)를 사용하여 호출해야 합니다. 요청하신 코드는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { local positionA = Vector2(0, 0) local positionB = Vector2(10, 10) local distance = Vector2.Distance(positionA, posi [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | single_turn [pass] | ⏳ 미판정 [title] | 함수 [question] | 스크립트 에디터에서 새 함수를 만들 때 기본 이름이 Function1으로 생성되는데, 이 이름을 변경하는 구체적인 방법과 함께 리턴 타입을 void에서 다른 타입으로 바꾸는 순서는 어떻게 되나요? [answer] | 스크립트 에디터에서 새 함수를 만들 때 기본 이름이 `Function1`으로 생성되며, 이 이름을 변경하고 리턴 타입을 수정하는 구체적인 방법은 다음과 같습니다. ### 1. 함수 이름 변경 방법 1. 스크립트 에디터에서 생성된 함수 이름(`Function1`)을 클릭합니다. 2. 클릭하면 텍스트 입력 모드가 활성화됩니다. 3. 원하는 이름으로 텍스트를 수정하여 이름을 변경합니다. ### 2. 리턴 타입 변경 순서 메이플스토리 월드의 함수는 내부적인 값 전달을 위해 리턴 타입 설정이 필수적이며, 기본값은 `void`입니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 함수에 대한 간략한 소개와 함께 함수의 선언과 정의, 호출에 대해 알아봅니다. # 메소드 소개 **컴포넌트**는 기본적으로 **프로퍼티**와 **메소드**로 구성됩니다. 그중 함수는 객체지향 프로그래밍에서 사용되는 용어로, 특정 액션을 수행하기 위한 코드들의 집합체라 할 수 있습니다. 메이플스토리 월드의 함수는 함수의 호출 주체가 누구냐에 따라 **기본 이벤트 메소드**와 **사용자 지정 메소드**로 나눌 수 있습니다. 기본 이벤트 함수는 게임 시작, 플레이 중, 게임 종료 시 등 특정 이벤트가 발생했을 때

[task] | code [pass] | ⏳ 미판정 [title] | 함수 [question] | _EntityService:GetEntityByPath("/maps/map01")로 엔티티를 가져온 후 해당 엔티티의 TestComponent를 참조하여 componentInstance:MethodCallTest("Hello")를 호출하는 스크립트를 작성해줘. [answer] | 요청하신 동작을 수행하는 스크립트는 다음과 같습니다. `_EntityService:GetEntityByPath`로 엔티티를 가져온 후, 엔티티 객체에서 `TestComponent` 프로퍼티를 통해 컴포넌트 인스턴스를 참조하고, 해당 인스턴스의 `MethodCallTest` 메소드를 콜론(`:`)으로 호출합니다. ```lua Method: [server only] void OnBeginPlay() { local mapEntity = _EntityService:GetEntityByPath("/maps/map01") lo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메소드 내부에서는 다른 메소드를 호출해서 다른 함수의 기능을 작동시킬 수 있습니다. 기본적으로 메소드는 **컴포넌트 객체(또는 서비스):메소드명(매개 변수)** 형식으로 호출합니다. #### 동일한 컴포넌트 내 메소드 호출 시 동일 컴포넌트의 메소드를 호출할 때는 다음과 같이 **self:메소드명(매개 변수)** 형식으로 호출합니다. (**self**는 현재 작동 중인 메소드를 포함하고 있는 컴포넌트 객체를 의미합니다.) ```lua --개념 이해를 돕기 위한 코드로, 컴포넌트에 적용 시 정상적으로 동작하지 않을 수 있습니다.

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티와 컴포넌트 참조 [question] | _EntityService:GetEntityByPath("/maps/map01/player") 로 플레이어 엔티티를 참조하여, OnUpdate() 함수에서 매 프레임마다 해당 엔티티의 TransformComponent.Position 을 업데이트하고 log() 로 출력하는 스크립트를 작성해줘 [answer] | 요청하신 `_EntityService:GetEntityByPath()`와 `TransformComponent.Position`을 사용한 스크립트입니다. 참고로 `OnUpdate()`에서 매 프레임마다 엔티티의 위치를 **수동으로 변경(Update)** 하려면 `Position` 프로퍼티에 새로운 `Vector3` 값을 할당해야 합니다. 단순히 참조만 하면 위치가 바뀌지 않습니다. 아래 예시에서는 매 프레임마다 X 좌표를 1씩 증가시켜 위치를 업데이트하는 로직을 포함했습니다. (원하는 방식으로 수정하여 사용하세요.) ```lua [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 찾으려는 엔티티 경로(Path)를 매개 변수로 넘겨주면, 해당 경로의 엔티티를 반환하는 함수입니다. 가장 보편적으로 사용되는 함수입니다. * **매개 변수** | Parameter | Type | Description | | --- | --- | --- | | worldPath | string | 얻고자 하는 엔티티 경로를 넣어줍니다. 경로는 /maps/부터 시작해서 하위 엔티티들을 입력합니다. 예를 들어 다음과 같은 계층 구조에서 "object_1"의 경로는 다음과 같습니다. "/maps/map01

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