← 목록

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

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

[task] | two_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | 터치를 종료했을 때 1회만 발생하는 ScreenTouchReleaseEvent를 활용해 터치 종료 지점을 기준으로 스폰(Spawn)이나 이동 명령을 내리는 로직은 어떻게 구성하나요? [answer] | `ScreenTouchReleaseEvent`는 사용자가 화면 터치를 종료한 시점에 딱 한 번만 발생하는 이벤트입니다. 이 이벤트를 통해 터치를 뗀 지점의 좌표(`TouchPoint`)를 받을 수 있으며, 이를 기준으로 스폰이나 이동 명령을 내리는 로직을 구성할 수 있습니다. 참고 문서에 제공된 예시 코드를 보면, `ScreenTouchReleaseEvent` 핸들러는 **클라이언트(Client)** 공간에서 실행됩니다. 따라서 터치를 종료한 지점의 좌표를 얻은 뒤, 서버에서 처리해야 하는 스폰(`_SpawnService`)이나 [followup] | HandleScreenTouchReleaseEvent에서 event.TouchPoint 좌표를 인자로 전달받아 해당 위치에 _SpawnService:SpawnByModelId를 호출하는 서버-클라이언트 통신이 필요한 경우의 예외 상황과 처리 코드를 제시해 주세요. [followup_answer] | 제공된 참고 문서를 바탕으로 `HandleScreenTouchReleaseEvent`에서 `event.TouchPoint`를 이용해 `_SpawnService:SpawnByModelId`를 호출할 때의 예외 상황과 처리 코드를 분석해 드리겠습니다. ### 핵심 제약 및 예외 상황 1. **실행 공간 불일치 (Client vs Server)** * `HandleScreenTouchReleaseEvent`는 `[service: InputService]` 이벤트 핸들러로, 문서의 `Native Event Sender In [scores] | [judge_reason] | [source_doc] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even

[task] | two_turn [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 모델 확장 시 기반 모델과 확장 모델 간의 관계가 복사 기능과 어떻게 다른지, 특히 기반 모델의 변경이 확장 모델에 어떻게 전파되는지 알려주세요. [answer] | 모델 확장(Extend)과 복사(Copy)의 가장 큰 차이는 두 모델 간의 **관계 유지 여부**입니다. ### 1. 복사와 확장의 차이 * **복사:** 원본 모델과 복사된 모델은 독립적으로 존재합니다. 복사된 모델의 속성을 수정해도 원본에는 영향을 주지 않으며, 원본을 수정해도 복사본에는 반영되지 않습니다. * **확장:** 기반 모델(원본)과 확장 모델 간의 관계가 유지됩니다. 이는 단순한 복제가 아닌, 기반 모델을 '상속'하는 구조입니다. ### 2. 기반 모델 변경 시 확장 모델에 전파되는 방식 기반 모델의 변경 [followup] | 기반 모델에 컴포넌트를 추가하거나 삭제했을 때 확장 모델에 즉시 반영되는지, 그리고 확장 모델에서 물려받은 컴포넌트를 삭제할 수 없는 제한 사항에 대해 구체적인 예시를 들어 설명해 주세요. [followup_answer] | 기반 모델의 컴포넌트 추가 또는 삭제는 확장 모델에 **즉시 반영**됩니다. 또한, 확장 모델에서는 기반 모델로부터 물려받은 컴포넌트를 직접 삭제할 수 없는 제한이 있습니다. 구체적인 예시는 다음과 같습니다. ### 1. 기반 모델 변경 시 확장 모델에 즉시 반영되는 과정 **Model A**(기반 모델)와 **A1**(확장 모델)을 가정해 보겠습니다. * **초기 상태:** `Model A`에 **컴포넌트 A, B**가 있는 상태에서 `A1`을 확장했습니다. * **컴포넌트 추가:** `Model A`에 **컴포넌트 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | isvalid()와 _EntityService:IsValid() 두 가지 방법으로 동일한 엔티티의 유효성을 검사하고, 두 결과 값이 일치하는지 로그로 비교하는 스크립트를 작성해줘 [answer] | `isvalid()` 글로벌 함수와 `_EntityService:IsValid()` 서비스 메서드는 동일한 기능을 수행하므로, 동일한 엔티티에 대해 두 가지 방법으로 유효성을 검사하면 항상 같은 결과가 반환됩니다. 요청하신 두 가지 방법의 결과를 비교하여 로그로 출력하는 스크립트는 다음과 같습니다. ```lua Property: [None] Entity TargetEntity = nil Method: [server only] void OnBeginPlay() { -- 테스트용 엔티티를 스폰하거나 기존 엔티티를 참조합니다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | Parameter | Description | | :--: | ----------- | | entity | 유효성 체크 대상이 되는 엔티티를 넣어줍니다. | #### 반환 값 * 매개 변수로 넘겨진 엔티티가 존재하면 **true**를 반환합니다. * 엔티티가 nil이거나 삭제 대기 중, 또는 삭제된 엔티티라면 **false**를 반환합니다. #### 사용 예시 위 `Destroy` 함수 예제에 이어서 엔티티 삭제 전후로 `isvalid` 함수가 어떤 값을 반환하는지 확인하고 실제 사용법을 살펴봅니다. 1. **Spawn

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | isvalid 함수가 엔티티의 상태를 어떻게 판별하는지 기본 원리를 알려주세요. [answer] | `isvalid` 함수는 엔티티의 유효성을 판별하기 위해 엔티티의 존재 상태와 삭제 진행 상황을 확인합니다. 구체적인 판별 원리는 다음과 같습니다. 1. **존재 확인**: 매개변수로 전달된 엔티티 객체가 실제로 존재하는지 확인합니다. 2. **삭제 상태 확인**: 엔티티가 `nil` 값인지, 삭제 대기 중(pending deletion) 상태인지, 혹은 이미 삭제된 상태인지를 검사합니다. 이 판별 결과에 따라 함수는 다음과 같은 값을 반환합니다. * **`true` 반환**: 엔티티가 존재하고, 삭제 대기 중이거나 [followup] | isvalid가 true를 반환하는 구체적인 조건과, nil이거나 삭제 대기 중일 때 false를 반환하는 예외 상황을 코드 예시와 함께 설명해 주세요. [followup_answer] | `isvalid` 함수는 엔티티의 상태에 따라 `true` 또는 `false`를 반환하며, 구체적인 조건과 예외 상황은 다음과 같습니다. ### 1. true 반환 조건 매개변수로 전달된 엔티티가 **실제로 존재하고**, `nil`이 아니며, **삭제 대기 중이거나 삭제된 상태가 아닐 때** `true`를 반환합니다. 즉, 현재 사용 가능한 유효한 엔티티 상태임을 의미합니다. ### 2. false 반환 조건 (예외 상황) 다음 세 가지 경우 중 하나에 해당하면 `false`를 반환합니다. 1. **nil 상태**: 엔티티 [scores] | [judge_reason] | [source_doc] | | Parameter | Description | | :--: | ----------- | | entity | 유효성 체크 대상이 되는 엔티티를 넣어줍니다. | #### 반환 값 * 매개 변수로 넘겨진 엔티티가 존재하면 **true**를 반환합니다. * 엔티티가 nil이거나 삭제 대기 중, 또는 삭제된 엔티티라면 **false**를 반환합니다. #### 사용 예시 위 `Destroy` 함수 예제에 이어서 엔티티 삭제 전후로 `isvalid` 함수가 어떤 값을 반환하는지 확인하고 실제 사용법을 살펴봅니다. 1. **Spawn

[task] | code [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | Resource Storage에서 외부 리소스 파일을 추가할 때 자동으로 부여되는 RUID 값과, 폴더별 분류 관리 시 동일한 RUID가 여러 폴더에 속할 수 없다는 제약 조건을 검증하여 중복 추가 시 에러를 발생시키는 리소스 매니저 스크립트를 작성해줘 [answer] | **요청에 포함된 전제 오류 수정 및 안내** 제시해주신 참고 문서([Guides] 기본 제작 가이드 > 시작하기 > 메이커 사용 리소스 찾기)와 mLua API 문서에는 **Resource Storage의 UI(내부 리소스, 폴더 구조)를 직접 조작하거나, 리소스 파일 업로드/폴더 이동 로직을 스크립트로 제어하는 API가 존재하지 않습니다.** 1. **RUID 자동 부여 검증 불가**: RUID는 메이플스토리 월드 에디터(Maker)의 Resource Storage UI에서 리소스를 추가할 때 시스템이 자동으로 생성하여 부 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 방대한 리소스 속에서 크리에이터에게 필요한 리소스만 골라 활용할 수 있습니다. 또한 크리에이터가 제작한 리소스를 추가해 제작에 활용할 수도 있습니다. # 리소스 스토리지 소개 메이플스토리 월드에서는 많은 리소스를 **Preset List**로 제공하지만, 모든 리소스가 **Preset List**에 있는 것은 아닙니다. 보다 방대한 데이터에서 원하는 리소스를 검색할 때는 **Resource Storage**를 활용해 봅시다. **Resource Storage**의 기본 위치는 **Scene** 탭 옆입니다

[task] | single_turn [pass] | ⏳ 미판정 [title] | Hierarchy [question] | Hierarchy에서 부모 엔티티의 TransformComponent를 수정하면 자식 엔티티 위치가 따라오는데, 자식을 직접 움직여도 부모 위치가 변경되지 않는 이유는 무엇인가요? [answer] | Hierarchy의 부모-자식 구조는 **단방향 영향 관계**를 가지기 때문입니다. 즉, 부모 엔티티의 상태가 자식 엔티티에 영향을 주지만, 자식 엔티티의 상태 변화가 부모 엔티티에 역으로 전달되지 않습니다. 구체적으로 설명하면 다음과 같습니다: 1. **부모 → 자식 (영향 있음):** 부모 엔티티의 `TransformComponent`(위치, 회전, 스케일 등)를 변경하면, 그 부모에 속한 모든 자식 엔티티는 자동으로 해당 변경 사항을 상속받아 함께 이동하거나 회전합니다. 이는 부모가 '큰 범위'를 정의하고 자식들이 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **Hierarchy** 탭을 이용해 제작 현황을 확인하고, 제작 능률을 높일 수 있습니다. # Hierarchy 소개 **Hierarchy** 탭은 제작 중인 게임 현황을 **계층 구조(부모-자식)**로 볼 수 있는 패널입니다. 복잡하게 구성한 맵에서 원하는 엔티티를 빠르게 찾을 때 사용하거나, 체계적으로 엔티티를 관리할 때 사용합니다. 가장 상위인 **World** 계층 아래에 **common**, **maps**, **ui** 엔트리가 있으며 **maps**와 **ui** 엔트리는 각자 기본 하위 엔트

[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | Scene에 배치된 엔티티로부터 확장 모델을 생성하려면 어떤 메뉴 항목을 클릭해야 하나요? [answer] | Scene에 배치된 엔티티로부터 확장 모델을 생성하려면, 해당 엔티티의 콘텍스트 메뉴에서 **Create Extended Model From Entity** 항목을 클릭하면 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | isvalid() 또는 _EntityService:IsValid()를 사용하여 스폰된 엔티티가 nil이거나 삭제 대기 중인지 확인하여 OnUpdate에서 반복 오류를 방지하는 스크립트를 작성해줘 [answer] | `isvalid()` 또는 `_EntityService:IsValid()`는 엔티티가 `nil`이거나 삭제 대기 중, 삭제된 상태인지 확인하는 유효성 체크 함수입니다. 해당 엔티티가 실제로 존재하고 유효한 상태라면 `true`를 반환하고, 그렇지 않은 경우 `false`를 반환합니다. `OnUpdate`에서 스폰된 엔티티에 대해 반복적으로 메서드를 호출하거나 조작할 때, 엔티티가 이미 삭제되었거나 존재하지 않아 발생하는 오류를 방지하기 위해 매 프레임마다 이 유효성 체크를 수행하는 것이 좋습니다. 아래는 스폰된 엔티티(`Spaw [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | Parameter | Description | | :--: | ----------- | | entity | 유효성 체크 대상이 되는 엔티티를 넣어줍니다. | #### 반환 값 * 매개 변수로 넘겨진 엔티티가 존재하면 **true**를 반환합니다. * 엔티티가 nil이거나 삭제 대기 중, 또는 삭제된 엔티티라면 **false**를 반환합니다. #### 사용 예시 위 `Destroy` 함수 예제에 이어서 엔티티 삭제 전후로 `isvalid` 함수가 어떤 값을 반환하는지 확인하고 실제 사용법을 살펴봅니다. 1. **Spawn

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | OnUpdate에서 self._T.time 변수를 초기화하고 delta를 누적하여 3초 이상 경과 시 SpawnedEntity가 유효하면 _EntityService:Destroy로 삭제하되, 엔티티가 이미 삭제된 경우(isvalid가 false)에는 즉시 return 하는 로직을 포함하는 스크립트를 작성해줘 [answer] | 요청하신 로직을 포함하는 mLua 스크립트 컴포넌트입니다. `SpawnedEntity` 프로퍼티를 정의하고, `OnUpdate`에서 `isvalid` 체크 후 시간을 누적하여 3초가 지나면 `_EntityService:Destroy`로 엔티티를 삭제합니다. ```lua Property: [none] any SpawnedEntity = nil Method: [server only] void OnUpdate(number delta) { -- 엔티티가 유효하지 않으면(삭제 대기 중이거나 이미 삭제됨) 즉시 종료 if i [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **SpawnService**의 스폰 기능을 통해 엔티티를 생성하고, 생성된 후 3초 후에 제거되도록 합니다. 예제는 위 엔티티 생성에서 사용한 **SpawnManager** 스크립트 컴포넌트를 활용합니다. 1. 프로퍼티를 추가하고, 타입과 이름을 다음과 같이 설정합니다. ```lua Property: [none] any SpawnedEntity = nil ``` 2. `SpawnByModelId` 함수를 다음과 같이 수정합니다. ```lua void SpawnByMode

[task] | two_turn [pass] | ⏳ 미판정 [title] | Hierarchy [question] | Hierarchy에서 엔티티의 경로를 복사하는 'Copy Entity Path' 메뉴가 활성화되지 않는 엔트리 유형이 있나요? [answer] | 제공된 문서에 따르면, Hierarchy의 상위 엔트리 중 `World` 엔트리에는 'Copy Entity Path' 메뉴가 목록에 포함되어 있지 않습니다. 반면, `common`, `maps`, `map01`, `ui` 엔트리에는 모두 'Copy Entity Path' 메뉴가 활성화되어 있습니다. 따라서 **World** 엔트리에서 'Copy Entity Path' 메뉴를 사용할 수 없습니다. [followup] | ui 엔트리에서 'Add Component' 메뉴가 없는 이유는 무엇이며, 컴포넌트를 추가하려면 어떤 다른 접근이 필요하나요? [followup_answer] | 제공된 문서에는 `ui` 엔트리의 콘텍스트 메뉴 목록에 'Add Component'와 'Add New Component' 메뉴가 포함되어 있지 않습니다. 문서에는 각 엔트리 유형별로 활성화되는 메뉴 목록만 나열되어 있을 뿐, 특정 메뉴가 왜 활성화되지 않는지에 대한 이유나, 해당 메뉴가 없는 경우 컴포넌트를 추가하기 위한 대안적 접근 방식에 대한 설명은 포함되어 있지 않습니다. [scores] | [judge_reason] | [source_doc] | 검색 창은 탭 타이틀 바로 아래에 위치합니다. 검색 기준에 따라 다른 결괏값이 나오기에 필요에 따라 선택해 검색합니다.검색 기준은 **Name**과 **Component** 두 가지이며, 다음과 같이 사용합니다. * **Name** : **Workspace**의 전 영역에서 검색한 이름과 맞는 값을 찾을 때 사용합니다. * **Component** : 엔티티 중 검색어에 해당하는 컴포넌트가 포함된 값을 찾을 때 사용합니다. | Name "chat" 검색 | Component "chat" 검색 | | -------------- |

[task] | code [pass] | ⏳ 미판정 [title] | Hierarchy [question] | 주어진 문서에는 Hierarchy 뷰의 검색 기능(Name, Component)과 각 엔트리(World, common, maps, map01, ui)의 콘텍스트 메뉴(엔티티 생성, 프로퍼티 편집, 경로/ID 복사, 컴포넌트 추가 등)에 대한 정보만 포함되어 있으며, 실제 mLua 스크립트 작성에 필요한 API(서비스 호출, 이벤트 처리, 물리 계산 등)나 코드 예제가 전혀 포함되어 있지 않습니다. 따라서 문서에 명시된 정보만으로 해결할 수 있는 mLua 코딩 과제를 생성하는 것은 불가능합니다. [answer] | 제시된 참고 문서에는 메이플스토리 월드 메이커의 **Hierarchy 뷰**와 관련된 UI 사용법(검색 기능, 각 엔트리별 콘텍스트 메뉴)에 대한 정보만 포함되어 있습니다. 문서에 mLua 스크립트 작성에 필요한 API(서비스 호출, 이벤트 처리, 물리 계산 등)나 코드 예제가 포함되어 있지 않으므로, **문서에 명시된 정보만으로 해결할 수 있는 mLua 코딩 과제를 생성하는 것은 불가능합니다.** 참고로, 문서에 포함된 Hierarchy 뷰 관련 정보는 다음과 같습니다. ### 1. Hierarchy 검색 기능 검색 창은 탭 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색 창은 탭 타이틀 바로 아래에 위치합니다. 검색 기준에 따라 다른 결괏값이 나오기에 필요에 따라 선택해 검색합니다.검색 기준은 **Name**과 **Component** 두 가지이며, 다음과 같이 사용합니다. * **Name** : **Workspace**의 전 영역에서 검색한 이름과 맞는 값을 찾을 때 사용합니다. * **Component** : 엔티티 중 검색어에 해당하는 컴포넌트가 포함된 값을 찾을 때 사용합니다. | Name "chat" 검색 | Component "chat" 검색 | | -------------- |

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | SpawnService와 EntityService를 사용해 지정된 경로에 몬스터를 스폰한 후 3초가 지나면 _EntityService:Destroy로 삭제하는 스크립트를 작성해줘 [answer] | SpawnService를 사용하여 지정된 경로에 몬스터를 스폰하고, 생성된 엔티티가 유효한지 확인한 후 3초가 지나면 `_EntityService:Destroy`로 삭제하는 스크립트는 다음과 같습니다. ```lua Property: [none] any SpawnedEntity = nil Method: [server only] void OnBeginPlay() { local id = "maplestorymonster$0108737afb9548309c03795430b20c05" local name = "SpawnedE [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **SpawnService**의 스폰 기능을 통해 엔티티를 생성하고, 생성된 후 3초 후에 제거되도록 합니다. 예제는 위 엔티티 생성에서 사용한 **SpawnManager** 스크립트 컴포넌트를 활용합니다. 1. 프로퍼티를 추가하고, 타입과 이름을 다음과 같이 설정합니다. ```lua Property: [none] any SpawnedEntity = nil ``` 2. `SpawnByModelId` 함수를 다음과 같이 수정합니다. ```lua void SpawnByMode

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | isvalid 함수를 활용해 스폰된 엔티티가 nil이거나 삭제 대기 상태인지 확인하여 유효할 때만 OnUpdate에서 타이머를 증가시키고 3초가 되면 Entity:Destroy를 호출하는 스크립트를 작성해줘 [answer] | `isvalid` 함수는 엔티티가 `nil`이거나 삭제 대기 중인지, 이미 삭제되었는지 확인하는 데 사용됩니다. 질문하신 요구사항(유효할 때만 타이머 증가, 3초 후 `Entity:Destroy` 호출)을 만족하는 스크립트는 다음과 같습니다. ```lua Property: [None] any SpawnedEntity = nil Method: [server only] void OnBeginPlay() { local id = "maplestorymonster$0108737afb9548309c03795430b20c05" [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **SpawnService**의 스폰 기능을 통해 엔티티를 생성하고, 생성된 후 3초 후에 제거되도록 합니다. 예제는 위 엔티티 생성에서 사용한 **SpawnManager** 스크립트 컴포넌트를 활용합니다. 1. 프로퍼티를 추가하고, 타입과 이름을 다음과 같이 설정합니다. ```lua Property: [none] any SpawnedEntity = nil ``` 2. `SpawnByModelId` 함수를 다음과 같이 수정합니다. ```lua void SpawnByMode

[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 확장 모델에서 물려받은 컴포넌트를 삭제하려고 하면 왜 실패하며, 올바르게 삭제하려면 어디에서 조작해야 하나요? [answer] | 확장 모델에서 물려받은 컴포넌트를 직접 삭제하지 못하는 이유는, 확장 모델과 기반 모델 간의 관계가 유지되기 때문입니다. 확장 모델은 기반 모델로부터 컴포넌트를 물려받으며, 이는 기반 모델의 변경 사항이 확장 모델에도 자동으로 적용되는 것을 방지하기 위한 편집 제한입니다. 따라서 물려받은 컴포넌트를 삭제하려면 확장 모델이 아닌 **기반 모델**에서 해당 컴포넌트를 삭제해야 합니다. 기반 모델에서 컴포넌트를 삭제하면, 그 기반 모델에서 확장된 모든 모델에서도 해당 컴포넌트가 함께 삭제됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존

[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 모델 간의 계층 구조와 기반 모델을 한눈에 확인하고 싶은데, 프로퍼티 에디터의 어떤 탭을 이용하면 되나요? [answer] | 프로퍼티 에디터의 **Model Extension Info** 탭을 이용하면 됩니다. 이 탭에서는 선택한 모델의 모든 기반 모델(위 계층)과 바로 아래 단계의 확장 모델(아래 계층)을 계층 구조로 확인할 수 있습니다. 또한, 이 계층 구조에 표시된 모델의 콘텍스트 메뉴에서 **Find Model**을 클릭하면 Workspace에서 해당 모델이 선택되어 한눈에 파악하기 편리합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | SpawnManager 컴포넌트에서 SpawnByModelId 호출 후 반환된 엔티티의 유효성을 isvalid로 즉시 검사하여 실패 시 log("Spawn Failed")를 출력하고 성공 시 3초 후 _EntityService:Destroy로 제거하는 스크립트를 작성해줘 [answer] | SpawnService의 `SpawnByModelId`로 엔티티를 생성하고, `isvalid`로 생성 성공 여부를 즉시 확인합니다. 생성이 성공하면 `OnUpdate`에서 시간을 누적하여 3초가 지난 시점에 `_EntityService:Destroy`를 호출해 엔티티를 삭제합니다. ```lua Property: [None] any SpawnedEntity = nil number TimeSinceSpawn = 0 Method: [server only] void OnBeginPlay() { self.SpawnedEntity [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **SpawnService**의 스폰 기능을 통해 엔티티를 생성하고, 생성된 후 3초 후에 제거되도록 합니다. 예제는 위 엔티티 생성에서 사용한 **SpawnManager** 스크립트 컴포넌트를 활용합니다. 1. 프로퍼티를 추가하고, 타입과 이름을 다음과 같이 설정합니다. ```lua Property: [none] any SpawnedEntity = nil ``` 2. `SpawnByModelId` 함수를 다음과 같이 수정합니다. ```lua void SpawnByMode

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | mLua에서 엔티티를 생성하고 삭제하는 기본 흐름과 두 가지 삭제 방법(`_EntityService:Destroy`, `Entity:Destroy`)의 차이점에 대해 설명해 주세요. [answer] | mLua에서 엔티티를 생성하고 삭제하는 기본 흐름과 두 가지 삭제 방법의 차이는 다음과 같습니다. ### 1. 엔티티 생성 기본 흐름 엔티티를 생성하는 과정은 크게 모델 준비, ID 복사, 스크립팅, 실행 확인 순서로 진행됩니다. 1. **모델 추가**: `Preset List`에서 원하는 모델을 선택하여 콘텍스트 메뉴의 **Add to Workspace**를 눌러 Workspace에 추가합니다. 2. **Entry ID 복사**: 추가한 모델의 콘텍스트 메뉴에서 **Copy Entry ID**를 눌러 ID를 클립보드에 복 [followup] | `_SpawnService:SpawnByModelId` 호출 후 반환된 `spawnedEntity`가 `nil`이거나 유효하지 않은 경우 어떻게 처리해야 하는지 예외 처리 코드와 함께 알려 주세요. [followup_answer] | `_SpawnService:SpawnByModelId` 호출 후 반환된 `spawnedEntity`가 `nil`이거나 유효하지 않은 경우, `isvalid()` 함수를 사용하여 유효성을 체크하고 생성 실패 시 로그를 출력하는 방식으로 처리합니다. 참고 문서에 제시된 예외 처리 코드는 다음과 같습니다. ```lua Method: [server only] void SpawnByModelId() { -- Copy Entry ID를 눌러 복사했던 ID를 붙여넣습니다. 앞에 "model://"은 제거합니다. local id [scores] | [judge_reason] | [source_doc] | 1. **Preset List**에서 원하는 모델의 콘텍스트 메뉴를 연 뒤, **Add to Workspace**를 눌러 **Workspace**에 모델을 추가합니다. 2. 추가한 모델의 콘텍스트 메뉴에서 **Copy Entry ID**를 눌러 **Entry ID**를 클립보드에 복사합니다. 3. **SpawnManager** 컴포넌트를 열고 `SpawnByModelId` 함수를 생성합니다. ```lua void SpawnByModelId() { local id =

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인내의 숲 만들기 [question] | 타일 배치 시 [박스 칠하기] 기능의 동작 방식과 해제 시 변화점을 3문장 이내로 설명하세요. [answer] | [박스 칠하기] 버튼을 클릭한 상태에서 드래그하면 선택된 영역이 표시되고, 마우스를 떼면 해당 영역 전체에 타일이 배치됩니다. 기능을 해제하면 영역 배치 대신 드래그한 경로 위에만 타일이 하나씩 배치됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 "인내의 숲"을 알고 계신가요? 인내의 숲을 검색해보면 많은 모험가들의 이야기를 찾아볼 수 있습니다. $$youtube HXMM4Vbx8aA $$ 인내의 숲은 점프를 이용해 발판을 넘어가며 목적지로 올라가는 게임입니다. 여러분은 인내의 숲을 보다 재미있게 만들 수 있는 색다른 아이디어를 갖고 있을지도 모릅니다. * 기존 인내의 숲은 너무 쉬운데? * 이렇게 하면 더 재미있을 것 같아. * 순위를 매기면 더 재미있지 않을까? * 서로 공격할 수 있으면 좋겠어. 메이플스토리 월드에서 이러한 아이디어를 현실화할

[task] | single_turn [pass] | ⏳ 미판정 [title] | Hierarchy [question] | World 하위 엔트리 중 common, maps, ui 각각에 어떤 종류의 엔티티나 컴포넌트를 배치하는 것이 적절한가요? [answer] | 메이플스토리 월드의 Hierarchy 구조에서 `World` 하위의 `common`, `maps`, `ui` 엔트리는 각각 다른 목적을 가지고 있어, 배치할 엔티티나 컴포넌트의 종류가 명확히 구분됩니다. **1. common** 게임 전체에 걸쳐 공통적으로 적용되는 룰이나 로직을 관리하는 영역입니다. * **배치 대상:** 게임 전반의 규칙, 전역 로직, 또는 여러 맵에서 공유할 수 있는 시스템 관련 엔티티 및 컴포넌트를 추가해 사용합니다. * **특징:** 특정 맵이나 UI에 종속되지 않고 게임 전체 범위로 영향을 미치는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **Hierarchy** 탭을 이용해 제작 현황을 확인하고, 제작 능률을 높일 수 있습니다. # Hierarchy 소개 **Hierarchy** 탭은 제작 중인 게임 현황을 **계층 구조(부모-자식)**로 볼 수 있는 패널입니다. 복잡하게 구성한 맵에서 원하는 엔티티를 빠르게 찾을 때 사용하거나, 체계적으로 엔티티를 관리할 때 사용합니다. 가장 상위인 **World** 계층 아래에 **common**, **maps**, **ui** 엔트리가 있으며 **maps**와 **ui** 엔트리는 각자 기본 하위 엔트

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | isvalid와 _EntityService:IsValid 함수의 차이점과 사용 시 주의사항이 궁금합니다. [answer] | 제공된 문서에 따르면, `isvalid`와 `_EntityService:IsValid` 함수는 기능적으로 차이가 없습니다. 두 함수 모두 동일한 유효성 체크를 수행하며, 매개 변수로 넘겨진 엔티티의 상태에 따라 동일한 결과를 반환합니다. **반환 값 기준** 두 함수 모두 다음과 같은 조건에 따라 값을 반환합니다. * **true**: 매개 변수로 넘겨진 엔티티가 존재하는 경우 * **false**: 엔티티가 `nil`이거나, 삭제 대기 중이거나, 이미 삭제된 경우 **사용 예시 및 주의사항** 실제 스크립트 작성 시 두 [followup] | 두 함수가 동일한 기능을 수행한다고 하지만, 실제 스크립트에서 어떤 상황에서 각각을 선택해야 하는지 Destroy 함수 호출 전후 로그 출력 예시를 포함해 비교해 주세요. [followup_answer] | 제공된 문서에 따르면, `isvalid`와 `_EntityService:IsValid`는 기능적으로 완전히 동일하며 반환 값도 같습니다. 문서에서는 "글로벌 함수인 `isvalid`를 주로 이용하지만"이라고 언급하고 있어, 일반적으로는 `isvalid`를 사용하는 것이 일반적이라는 뉘앙스를 가지고 있습니다. 따라서 선택 기준은 다음과 같이 정리할 수 있습니다. 1. **`isvalid(entity)`**: 짧은 코드와 가독성을 위해 **주로 사용**하는 글로벌 함수입니다. 2. **`_EntityService:IsValid( [scores] | [judge_reason] | [source_doc] | | Parameter | Description | | :--: | ----------- | | entity | 유효성 체크 대상이 되는 엔티티를 넣어줍니다. | #### 반환 값 * 매개 변수로 넘겨진 엔티티가 존재하면 **true**를 반환합니다. * 엔티티가 nil이거나 삭제 대기 중, 또는 삭제된 엔티티라면 **false**를 반환합니다. #### 사용 예시 위 `Destroy` 함수 예제에 이어서 엔티티 삭제 전후로 `isvalid` 함수가 어떤 값을 반환하는지 확인하고 실제 사용법을 살펴봅니다. 1. **Spawn

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | _DestroyService:Destroy() 호출 전후로 isvalid()의 반환 값 변화를 로그로 출력하여 엔티티 상태 전이를 검증하는 스크립트를 작성해줘 [answer] | 사용자가 `_DestroyService:Destroy()`를 언급하셨으나, 제공된 참고 문서에는 `_DestroyService`에 대한 정보가 없습니다. 문서에서 엔티티 삭제에 사용된 메서드는 엔티티 객체 자체에 대한 `entity:Destroy()` 또는 `_EntityService:Destroy(entity)`입니다. 따라서 문서에 근거하여, 엔티티를 삭제하는 올바른 방법(`entity:Destroy()` 또는 `_EntityService:Destroy(entity)`)을 사용하여 `isvalid()` 또는 `_EntitySe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | Parameter | Description | | :--: | ----------- | | entity | 유효성 체크 대상이 되는 엔티티를 넣어줍니다. | #### 반환 값 * 매개 변수로 넘겨진 엔티티가 존재하면 **true**를 반환합니다. * 엔티티가 nil이거나 삭제 대기 중, 또는 삭제된 엔티티라면 **false**를 반환합니다. #### 사용 예시 위 `Destroy` 함수 예제에 이어서 엔티티 삭제 전후로 `isvalid` 함수가 어떤 값을 반환하는지 확인하고 실제 사용법을 살펴봅니다. 1. **Spawn

[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | 엔티티 생성 시 SpawnByEntity와 SpawnByModelId의 차이점과 각각의 사용 장점은 무엇인가요? [answer] | 엔티티 생성을 위한 `SpawnService`의 두 가지 주요 함수인 `SpawnByEntity`와 `SpawnByModelId`는 데이터의 출처가 다르며, 이는 각 함수의 사용 장점으로 이어집니다. ### 1. SpawnByEntity **차이점:** 기존에 맵에 배치되어 있는 **엔티티**를 템플릿으로 사용하여 새로운 엔티티를 복제해 생성합니다. **매개 변수 특징:** * `entity`: 복제할 대상 엔티티를 지정합니다. * `includeChild` (선택 사항): 복제할 엔티티의 하위 엔티티(자식)도 함께 복제 [followup] | SpawnByModelId를 사용했는데 반환값이 nil로 나와 스폰에 실패한 경우, Entry ID 확인을 포함해 어떤 사항을 점검해야 하나요? [followup_answer] | `SpawnByModelId`를 호출했을 때 `nil`이 반환되어 스폰에 실패한 경우, 다음 사항들을 점검해야 합니다. ### 1. Entry ID 정확성 확인 가장 흔한 실패 원인은 `id` 매개변수로 전달된 Entry ID가 올바르지 않은 경우입니다. * **Workspace 확인**: 해당 모델이 실제로 **Workspace**에 추가되어 있는지 확인합니다. * **ID 복사 방법**: Workspace에서 대상 모델을 우클릭하여 **Copy Entry ID**를 선택한 값을 정확히 복사했는지 확인합니다. * ** [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D

[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 기반 모델에 새로운 컴포넌트를 추가하면 확장 모델에도 자동으로 반영되는데, 반대로 확장 모델에만 특정 컴포넌트를 추가하려면 어떻게 해야 하나요? [answer] | 기반 모델에 새로운 컴포넌트를 추가하면 그 기반 모델에서 확장된 모든 모델에도 해당 컴포넌트가 자동으로 추가됩니다. 반대로, 특정 확장 모델에만 컴포넌트를 추가하고 싶다면 **확장 모델 자체를 선택하여 컴포넌트를 추가**하면 됩니다. 확장 모델에 추가한 컴포넌트는 기반 모델에 반영되지 않습니다. 즉, 기반 모델 **Model A**의 확장 모델 **A1**에 컴포넌트 C를 추가하면, 컴포넌트 C는 **A1**에는 포함되지만 **Model A**에는 포함되지 않습니다. 이를 통해 확장 모델만이 가질 수 있는 고유한 컴포넌트를 추가하 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존

[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 모델을 복사한 것과 확장한 것의 가장 큰 차이점은 무엇이며, 기반 모델의 속성을 수정했을 때 각각 어떻게 반응하나요? [answer] | 모델을 복사한 것과 확장한 것의 가장 큰 차이점은 모델 간의 **독립성 유무**입니다. 1. **복사 (Copy)** * 원본 모델과 복사된 모델은 **독립적으로 존재**합니다. * 복사된 모델의 속성을 수정하더라도 원본 모델에는 영향을 주지 않으며, 반대로 원본 모델의 속성을 수정해도 복사된 모델에는 반영되지 않습니다. 2. **확장 (Extend)** * 기반 모델과 확장 모델의 **관계가 유지**됩니다. * 기반 모델의 속성을 변경하면 확장 모델에도 **자동으로 적용**됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존

[task] | two_turn [pass] | ⏳ 미판정 [title] | Hierarchy [question] | Hierarchy 검색창에서 Name과 Component 검색 기준의 차이와 사용 예시를 설명해 주세요. [answer] | Hierarchy 검색창은 탭 타이틀 바로 아래에 위치하며, 검색 기준에 따라 다른 결과가 표시됩니다. 검색 기준은 **Name**과 **Component** 두 가지입니다. ### 1. Name 검색 * **특징**: **Workspace**의 전 영역에서 엔티티의 **이름(Name)**과 일치하는 값을 찾습니다. * **사용 예시**: "chat"이라고 검색하면, Workspace 내의 모든 레벨(World, common, maps, ui 등)에서 이름이 "chat"인 엔티티를 찾아줍니다. ### 2. Componen [followup] | Component 검색으로 'chat'을 입력했을 때 Name 검색과 어떻게 다른 엔티티가 조회되는지 구체적으로 알려주세요. [followup_answer] | Component 검색으로 'chat'을 입력했을 때, Name 검색과 조회되는 엔티티의 범위가 다음과 같이 다릅니다. **1. Name 검색의 경우** * **조회 조건**: Workspace의 전 영역에서 엔티티의 **이름이 'chat'과 정확히 일치**하는 엔티티만 찾습니다. * **결과**: 이름이 "chat"인 엔티티(예: `/ui/chat`)가 조회됩니다. 이름이 다르더라도 chat 관련 기능이 있는 엔티티는 조회되지 않습니다. **2. Component 검색의 경우** * **조회 조건**: 엔티티의 이름 [scores] | [judge_reason] | [source_doc] | 검색 창은 탭 타이틀 바로 아래에 위치합니다. 검색 기준에 따라 다른 결괏값이 나오기에 필요에 따라 선택해 검색합니다.검색 기준은 **Name**과 **Component** 두 가지이며, 다음과 같이 사용합니다. * **Name** : **Workspace**의 전 영역에서 검색한 이름과 맞는 값을 찾을 때 사용합니다. * **Component** : 엔티티 중 검색어에 해당하는 컴포넌트가 포함된 값을 찾을 때 사용합니다. | Name "chat" 검색 | Component "chat" 검색 | | -------------- |

[task] | single_turn [pass] | ⏳ 미판정 [title] | Hierarchy [question] | Hierarchy 탭에서 드래그 앤 드롭으로 만든 부모-자식 구조가 스크립트에서 _EntityService:GetEntityByPath를 사용할 때 경로에 어떻게 반영되나요? [answer] | Hierarchy 탭에서 드래그 앤 드롭으로 만든 부모-자식 구조는 `_EntityService:GetEntityByPath`에서 사용하는 경로에 **슬래시(`/`)로 구분된 계층 경로**로 그대로 반영됩니다. 경로의 규칙은 다음과 같습니다: 1. 가장 최상위 루트(`World`) 아래에 위치한 엔트리 이름(`common`, `maps`, `ui`)이 경로의 시작이 됩니다. 2. 그 아래로 이어지는 부모-자식 관계의 엔티티 이름들이 순서대로 `/`를 구분자로 붙어 하나의 문자열 경로를 형성합니다. 3. 예시에서 `/maps/ [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **Hierarchy** 탭을 이용해 제작 현황을 확인하고, 제작 능률을 높일 수 있습니다. # Hierarchy 소개 **Hierarchy** 탭은 제작 중인 게임 현황을 **계층 구조(부모-자식)**로 볼 수 있는 패널입니다. 복잡하게 구성한 맵에서 원하는 엔티티를 빠르게 찾을 때 사용하거나, 체계적으로 엔티티를 관리할 때 사용합니다. 가장 상위인 **World** 계층 아래에 **common**, **maps**, **ui** 엔트리가 있으며 **maps**와 **ui** 엔트리는 각자 기본 하위 엔트

[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | Scene에 이미 배치하고 컴포넌트 값을 설정한 엔티티를 Workspace의 모델로 변환하여 재사용할 때, 어떤 메뉴를 통해 이 작업을 수행할 수 있나요? [answer] | Scene에 배치한 엔티티를 Workspace의 모델로 변환하려면 해당 엔티티의 **콘텍스트 메뉴**에서 **Create Model From Entity**를 클릭하면 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티를 생성할 때는 주로 **Preset List**의 모델을 활용합니다. **Preset List**의 모델은 기본적으로 **NativeModel**의 특성을 물려받습니다. 그래서 **Preset List**의 모델 속성을 변경하려면 **NativeModel**을 수정해야 합니다. 하지만 **NativeModel**의 속성을 변경하면 해당 **NativeModel**에서 확장된 **Preset List**의 모델 속성이 모두 변경되어 버립니다. 작업 과정에서 원래 모델의 특성이 필요할 때는 또다시 수정해야 하므로 불편합니다.

[task] | single_turn [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | Workspace에서 만든 신규 모델을 실제 Scene에 배치하여 엔티티로 생성하려면 어떤 조작을 해야 하나요? [answer] | Workspace에서 만든 신규 모델을 Scene에 배치하여 엔티티로 생성하려면, Workspace에서 원하는 모델을 Scene으로 드래그하면 됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티를 생성할 때는 주로 **Preset List**의 모델을 활용합니다. **Preset List**의 모델은 기본적으로 **NativeModel**의 특성을 물려받습니다. 그래서 **Preset List**의 모델 속성을 변경하려면 **NativeModel**을 수정해야 합니다. 하지만 **NativeModel**의 속성을 변경하면 해당 **NativeModel**에서 확장된 **Preset List**의 모델 속성이 모두 변경되어 버립니다. 작업 과정에서 원래 모델의 특성이 필요할 때는 또다시 수정해야 하므로 불편합니다.

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인내의 숲 만들기 [question] | NPC 네임택(NameTagComponent - Name) 설정 절차만 코드 블록으로 출력하되, 각 단계 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void OnBeginPlay() { -- 1. NPC 엔티티를 경로로 조회합니다. local npcEntity = _EntityService:GetEntityByPath("/maps/map01/npc-2412") -- 2. NPC의 NameTagComponent에 접근합니다. local nametag = npcEntity.NameTagComponent -- 3. 네임택의 Name 프로퍼티에 원하는 이름을 설정합니다. nametag.N [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 "인내의 숲"을 알고 계신가요? 인내의 숲을 검색해보면 많은 모험가들의 이야기를 찾아볼 수 있습니다. $$youtube HXMM4Vbx8aA $$ 인내의 숲은 점프를 이용해 발판을 넘어가며 목적지로 올라가는 게임입니다. 여러분은 인내의 숲을 보다 재미있게 만들 수 있는 색다른 아이디어를 갖고 있을지도 모릅니다. * 기존 인내의 숲은 너무 쉬운데? * 이렇게 하면 더 재미있을 것 같아. * 순위를 매기면 더 재미있지 않을까? * 서로 공격할 수 있으면 좋겠어. 메이플스토리 월드에서 이러한 아이디어를 현실화할

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인내의 숲 만들기 [question] | CustomFootholdComponent 가 적용된 풋홀드와 일반 오브젝트의 차이점을 2열 3행 표로 정리하세요. [answer] | 참고 문서에 따르면, 풋홀드 엔티티와 일반 오브젝트 엔티티의 차이점은 다음과 같습니다. | 구분 | 풋홀드 엔티티 | 일반 오브젝트 엔티티 | | :--- | :--- | :--- | | **기본 구성** | `CustomFootholdComponent`가 적용되어 있습니다. | `CustomFootholdComponent`가 기본적으로 적용되어 있지 않습니다. | | **기능** | 캐릭터가 밟고 올라설 수 있는 발판으로 기능합니다. | 기본적으로 캐릭터가 밟고 올라설 수 없습니다. | | **변경 방법** | - | `Cust [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 "인내의 숲"을 알고 계신가요? 인내의 숲을 검색해보면 많은 모험가들의 이야기를 찾아볼 수 있습니다. $$youtube HXMM4Vbx8aA $$ 인내의 숲은 점프를 이용해 발판을 넘어가며 목적지로 올라가는 게임입니다. 여러분은 인내의 숲을 보다 재미있게 만들 수 있는 색다른 아이디어를 갖고 있을지도 모릅니다. * 기존 인내의 숲은 너무 쉬운데? * 이렇게 하면 더 재미있을 것 같아. * 순위를 매기면 더 재미있지 않을까? * 서로 공격할 수 있으면 좋겠어. 메이플스토리 월드에서 이러한 아이디어를 현실화할

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