[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | `SpawnByModelId` 함수를 작성할 때 `Entry ID`를 어떻게 가져와서 코드에 적용해야 하는지 단계별로 설명해 주세요. [answer] | `SpawnByModelId` 함수에서 사용할 `Entry ID`를 가져오고 코드에 적용하는 과정은 다음과 같습니다. 1. **Preset List**에서 원하는 모델의 콘텍스트 메뉴를 연 뒤 **Add to Workspace**를 눌러 **Workspace**에 모델을 추가합니다. 2. 추가한 모델의 콘텍스트 메뉴에서 **Copy Entry ID**를 눌러 **Entry ID**를 클립보드에 복사합니다. 3. 복사한 `Entry ID`를 스크립트의 `id` 변수에 대입합니다. 이때 `Entry ID` 앞의 `model://` 문 [followup] | `parent` 파라미터에 `_EntityService:GetEntityByPath`를 사용하여 특정 맵 경로를 지정할 때, 해당 경로가 존재하지 않으면 어떤 문제가 발생하며 이를 방지하기 위한 유효성 체크 코드는 어떻게 작성해야 하나요? [followup_answer] | 참고 문서에는 `parent` 파라미터에 `_EntityService:GetEntityByPath`를 사용할 때 경로가 존재하지 않는 경우의 구체적인 문제나 이를 방지하기 위한 유효성 체크 코드 예시가 포함되어 있지 않습니다. 문서에서 확인 가능한 내용은 `_EntityService:GetEntityByPath`를 사용하여 엔티티를 가져오는 방법과, `_SpawnService:SpawnByModelId`의 반환값에 대해 `isvalid` 함수를 사용하여 생성 실패 여부를 확인하는 방법뿐입니다. `GetEntityByPath`의 반 [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] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | 생성된 엔티티의 부모 엔티티를 지정할 때 _EntityService:GetEntityByPath의 경로 형식은 어떻게 작성해야 하나요? [answer] | `_EntityService:GetEntityByPath`에서 사용할 경로 형식은 **슬래시(`/`)로 구분된 절대 경로**를 사용합니다. 참고 문서에 포함된 예시를 바탕으로 한 구체적인 형식은 다음과 같습니다. 1. **맵 경로**: `/maps/{맵 이름}` * 예: `/maps/map01` 2. **UI 경로**: `/ui/{UI 그룹 이름}` * 예: `/ui/DefaultGroup` 3. **일반 엔티티 경로**: `{엔티티 경로}` * 예: `"Entity Path"` (문서 예시 [followup] | [followup_answer] | [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] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | isvalid 함수가 true를 반환하는데도 특정 프로퍼티 값을 읽으려 하니 nil이 나오는 경우가 발생하는 원인은 무엇인가요? [answer] | `isvalid` 함수가 `true`를 반환하는 상황에서도 특정 프로퍼티 값이 `nil`로 나타나는 원인은 엔티티의 **생성 시점**과 관련이 있습니다. `isvalid`는 엔티티가 **현재 삭제 대기 중**이거나 **이미 삭제되었는지**를 확인하는 함수입니다. 즉, 엔티티가 정상적으로 존재하고 삭제되지 않았을 때 `true`를 반환합니다. 하지만 엔티티가 스폰(생성)된 직후에는 모든 프로퍼티와 컴포넌트가 완전히 초기화 및 로드되기 전에 `isvalid`가 이미 `true`를 반환할 수 있는 상태가 됩니다. 따라서 엔티티가 생성 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **SpawnService**의 스폰 기능을 통해 엔티티를 생성하고, 생성된 후 3초 후에 제거되도록 합니다. 예제는 위 엔티티 생성에서 사용한 **SpawnManager** 스크립트 컴포넌트를 활용합니다. 1. 프로퍼티를 추가하고, 타입과 이름을 다음과 같이 설정합니다. ```lua Property: [none] any SpawnedEntity = nil ``` 2. `SpawnByModelId` 함수를 다음과 같이 수정합니다. ```lua void SpawnByMode
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Hierarchy [question] | Box1, Box2, Box3, Box4를 활용한 이중 계층 구조 예시에서 각 오브젝트 선택 시 발생하는 동작(이동, 회전/확대, 독립 이동)을 단계별 번호 목록으로 작성하세요. [answer] | 참고 문서에 따르면, Box1, Box2, Box3, Box4를 활용한 이중 계층 구조(부모-자식) 예시에서 각 오브젝트 선택 시 발생하는 동작은 다음과 같습니다. 1. **Box1 선택 시**: Box1을 선택하면 Box1의 자식으로 분류된 나머지 오브젝트들까지 한꺼번에 이동합니다. 2. **Box2 선택 시**: Box2를 선택하면 Box2의 자식으로 분류된 Box3까지 함께 오브젝트를 회전하고 확대합니다. 3. **Box4 선택 시**: Box4만 선택해 부모 계층에 영향을 끼치지 않고 Box4만 독립적으로 이동합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **Hierarchy** 탭을 이용해 제작 현황을 확인하고, 제작 능률을 높일 수 있습니다. # Hierarchy 소개 **Hierarchy** 탭은 제작 중인 게임 현황을 **계층 구조(부모-자식)**로 볼 수 있는 패널입니다. 복잡하게 구성한 맵에서 원하는 엔티티를 빠르게 찾을 때 사용하거나, 체계적으로 엔티티를 관리할 때 사용합니다. 가장 상위인 **World** 계층 아래에 **common**, **maps**, **ui** 엔트리가 있으며 **maps**와 **ui** 엔트리는 각자 기본 하위 엔트
[task] | instruction_following [pass] | ⏳ 미판정 [title] | Hierarchy [question] | World, common, maps, ui 엔트리의 기본 하위 엔트리와 용도를 2단 표(항목, 설명)로 정리하세요. [answer] | 참고 문서에 따르면, World, common, maps, ui 엔트리의 기본 하위 엔트리와 용도는 다음과 같습니다. | 항목 | 설명 | | :--- | :--- | | **World** | 실제로 제작에 사용한 엔티티들이 모여 있는 가장 상위 계층입니다. `common`, `maps`, `ui`가 기본 하위 엔트리로 속해 있으며, 제작 중인 게임의 구성 방식을 확인하고 수정할 수 있습니다. | | **common** | 게임 전체에 적용되는 룰을 만들 수 있습니다. 컴포넌트를 추가해 사용하며, 기본 하위 엔트리는 명시되어 있지 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **Hierarchy** 탭을 이용해 제작 현황을 확인하고, 제작 능률을 높일 수 있습니다. # Hierarchy 소개 **Hierarchy** 탭은 제작 중인 게임 현황을 **계층 구조(부모-자식)**로 볼 수 있는 패널입니다. 복잡하게 구성한 맵에서 원하는 엔티티를 빠르게 찾을 때 사용하거나, 체계적으로 엔티티를 관리할 때 사용합니다. 가장 상위인 **World** 계층 아래에 **common**, **maps**, **ui** 엔트리가 있으며 **maps**와 **ui** 엔트리는 각자 기본 하위 엔트
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | EntityService*의 `GetEntityByPath`로 "/maps/map01/obj" 엔티티를 조회하여, `isvalid` 체크를 통해 존재 여부를 확인하고 결과에 따라 로그를 출력하는 스크립트를 작성해줘. [answer] | `_EntityService:GetEntityByPath` 함수를 사용하여 지정된 경로에 있는 엔티티를 조회하고, `isvalid` 함수로 존재 여부를 확인하여 결과를 로그로 출력하는 스크립트입니다. ```lua Method: [server only] void OnBeginPlay() { local targetEntity = _EntityService:GetEntityByPath("/maps/map01/obj") if isvalid(targetEntity) then log("Entity fou [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | code [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | InputService의 ScreenTouchHoldEvent에서 터치 좌표를 추적하여, 특정 시간(예: 1초) 이상 같은 위치에서 터치를 유지하고 있을 때만 ScreenTouchReleaseEvent 발생 시 "롱프레스"로 판정하고 로그를 기록하는 스크립트를 작성해줘. [answer] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생하며, `event.TouchPoint`를 통해 현재 터치 좌표를 제공합니다. `ScreenTouchReleaseEvent`는 터치를 종료했을 때 1회 발생하며, 이때 `event.TouchPoint`는 터치를 뗀 위치의 좌표를 제공합니다. 1초 이상 같은 위치에서 터치를 유지했는지 판정하려면, `ScreenTouchHoldEvent`에서 처음 터치가 시작될 때의 좌표와 시간을 기록해 두었다가, `ScreenTouchReleaseEvent`에서 현 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | SpawnService*의 `SpawnByModelId` 함수를 사용해 Entry ID가 "model_001"인 모델을 (10, 0, 10) 위치에 스폰하고, 부모 엔티티로 `self.Entity`를 지정하는 스크립트를 작성해줘. [answer] | SpawnService의 `SpawnByModelId` 함수를 사용하여 Entry ID가 "model_001"인 모델을 (10, 0, 10) 위치에 생성하고, 부모 엔티티로 `self.Entity`를 지정하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void SpawnModel() { local modelId = "model_001" local spawnPosition = Vector3(10, 0, 10) local parentEntity = self.Entity [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | _spawnService:SpawnByModelId의 parent 인수로 "/maps/map01" 경로를 지정했는데, 해당 경로가 없거나 비활성 상태일 때 발생하는 오류는 어떻게 처리해야 하나요? [answer] | 제공된 참고 문서에는 `_SpawnService:SpawnByModelId`의 `parent` 인수로 전달된 경로가 존재하지 않거나 비활성 상태일 때 발생하는 구체적인 오류 유형이나 해당 오류를 포착하기 위한 `pcall` 같은 예외 처리 기법에 대한 설명이 없습니다. 문서에서 확인 가능한 정보는 다음과 같습니다. 1. **생성 실패 확인**: 스폰된 엔티티의 유효성을 `isvalid` 함수로 체크하여 생성이 실패했는지(`false` 반환)를 확인하는 방법만 제시되어 있습니다. ```lua self.Spawned [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] | Hierarchy [question] | Hierarchy에서 특정 엔티티의 경로를 스크립트에 바로 붙여넣고 싶을 때 복사해야 하는 메뉴 이름은 무엇인가요? [answer] | Hierarchy에서 특정 엔티티의 경로를 복사하려면 해당 엔티티에서 **Copy Entity Path** 메뉴를 선택해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색 창은 탭 타이틀 바로 아래에 위치합니다. 검색 기준에 따라 다른 결괏값이 나오기에 필요에 따라 선택해 검색합니다.검색 기준은 **Name**과 **Component** 두 가지이며, 다음과 같이 사용합니다. * **Name** : **Workspace**의 전 영역에서 검색한 이름과 맞는 값을 찾을 때 사용합니다. * **Component** : 엔티티 중 검색어에 해당하는 컴포넌트가 포함된 값을 찾을 때 사용합니다. | Name "chat" 검색 | Component "chat" 검색 | | -------------- |
[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | 엔티티 생성 후 유효성 체크를 위해 isvalid 함수를 사용하는 것이 권장되는 이유는 무엇인가요? [answer] | 엔티티 생성 후 `isvalid` 함수를 사용하여 유효성 체크를 권장하는 이유는 **생성 실패 시 `nil`을 반환하기 때문**입니다. `SpawnByEntity`와 `SpawnByModelId` 함수는 스폰에 성공하면 생성된 `Entity` 객체를 반환하지만, 스폰에 실패하면 `nil`을 반환합니다. 만약 반환값이 `nil`인 상태에서 해당 엔티티에 접근하거나 메서드를 호출하면 오류가 발생할 수 있으므로, `isvalid`를 통해 유효한 엔티티인지 확인하는 것이 안전합니다. 참고 문서의 `SpawnByEntity` 사용 예시에 [followup] | 스폰된 엔티티가 nil이 아니더라도 특정 조건(예: 잘못된 경로, 존재하지 않는 모델 ID)에서 예외가 발생할 수 있는가? 그리고 스크립트에서 이러한 실패 상황을 로그로 기록하고 복구하는 로직을 작성해 주세요. [followup_answer] | 참고 문서에 따르면, `SpawnByEntity`와 `SpawnByModelId` 함수는 스폰 실패 시 **`nil`**을 반환하며, 성공 시에만 `Entity`를 반환합니다. 질문하신 "스폰된 엔티티가 nil이 아니더라도 예외가 발생하는 경우"에 대해, 제공된 참고 문서에는 **`nil`이 아닌 유효한 `Entity` 객체가 반환되었음에도 특정 조건에서 예외가 발생하는 시나리오에 대한 설명이 없습니다.** 문서에 명시된 실패 조건은 스폰 실패 시 `nil` 반환뿐입니다. 따라서 문서 근거 내에서 답변하자면, 스폰 함수의 실패는 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | _spawnService:SpawnByModelId 호출 후 반환값이 nil이 아닌데도 스폰에 실패한 것처럼 보이는 현상은 왜 발생하는가요? [answer] | `_spawnService:SpawnByModelId` 호출 후 반환값이 `nil`이 아니더라도 스폰 실패처럼 보이는 현상은 **엔티티가 생성된 직후 '삭제 대기 중' 상태나 이미 삭제된 상태**일 수 있기 때문입니다. 메이플스토리 월드의 mLua에서는 단순히 반환값이 `nil`이 아니라도 엔티티가 실제로 사용 가능한 상태인지 확인해야 합니다. 엔티티가 삭제 대기 중이거나 이미 삭제된 경우, 해당 엔티티에서 값을 가져오거나 조작을 시도하면 의도한 대로 동작하지 않을 수 있습니다. 이 문제를 방지하기 위해 **`isvalid`** [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] | SpawnService*의 `SpawnByEntity` 함수를 사용해 `/maps/map01/monster-8` 엔티티를 복제하고, 생성된 엔티티의 이름을 "Copy"로 변경하며, 스폰 실패 시 로그를 남기는 스크립트를 작성해줘. [answer] | 요청하신 조건에 맞는 mLua 스크립트는 다음과 같습니다. ```lua Property: [None] Method: [server only] void OnBeginPlay() { -- 1. 복제할 원본 엔티티 경로로 엔티티 가져오기 local originalEntity = _EntityService:GetEntityByPath("/maps/map01/monster-8") -- 2. 원본 엔티티가 존재하는지 확인 (유효성 체크) if originalEntity == nil then [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | `OnBeginPlay` 이벤트 핸들러에서 *SpawnService*의 `SpawnByEntity`를 호출하여 엔티티를 생성한 뒤, 반환값이 `nil`인지 `isvalid`로 확인하여 실패 시 에러 로그를 출력하는 스크립트를 작성해줘. [answer] | `OnBeginPlay`에서 `SpawnByEntity`를 호출하여 엔티티를 생성하고, 반환값이 `nil`인지 `isvalid`로 확인하여 실패 시 로그를 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { -- 복제할 원본 엔티티 경로 지정 local entity = _EntityService:GetEntityByPath("/maps/map01/monster-8") -- 생성할 엔티티 이름 및 위치 설정 local n [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | OnUpdate에서 self._T.time을 직접 초기화하여 3초 타이머를 구현했는데, _TimerService:SetTimerOnce를 사용하는 방식과 어떤 장단점 차이가 있나요? [answer] | 제시된 참고 문서에 `OnUpdate`의 `delta`를 누적하는 방식과 `_TimerService:SetTimerOnce`를 사용하는 방식의 **장단점 비교**에 대한 설명은 포함되어 있지 않습니다. 참고 문서에 포함된 내용만 바탕으로 두 방식의 구현 차이점을 정리하면 다음과 같습니다. **1. `OnUpdate`에서 `delta`를 누적하는 방식** * 매 프레임마다 `self._T.time`에 `delta`를 더하여 3초가 되었는지 확인합니다. * 조건(`self._T.time >= 3`)이 충족되면 `_Entity [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] | Hierarchy [question] | 특정 맵 엔티티를 RectTileMap이나 SideViewRectTileMap으로 전환하고 싶을 때 어떤 콘텍스트 메뉴를 사용해야 하나요? [answer] | 특정 맵 엔티티(예: `map01`)를 `RectTileMap` 또는 `SideViewRectTileMap`으로 전환하려면 Hierarchy 뷰에서 해당 맵 엔티티를 우클릭하여 콘텍스트 메뉴를 열고 다음 메뉴 항목을 선택합니다. * **RectTileMap으로 전환**: `Switch To RectTileMap` * **SideViewRectTileMap으로 전환**: `Switch To SideViewRectTileMap` 이 메뉴 항목들은 Hierarchy의 상위 엔트리 중 `map01`과 같은 맵 엔티티에서 활성화됩 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색 창은 탭 타이틀 바로 아래에 위치합니다. 검색 기준에 따라 다른 결괏값이 나오기에 필요에 따라 선택해 검색합니다.검색 기준은 **Name**과 **Component** 두 가지이며, 다음과 같이 사용합니다. * **Name** : **Workspace**의 전 영역에서 검색한 이름과 맞는 값을 찾을 때 사용합니다. * **Component** : 엔티티 중 검색어에 해당하는 컴포넌트가 포함된 값을 찾을 때 사용합니다. | Name "chat" 검색 | Component "chat" 검색 | | -------------- |
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 기반 모델에서 확장 모델을 만들 때 발생하는 컴포넌트 변경 전파 방향을 '기반 모델 -> 확장 모델'과 '확장 모델 -> 기반 모델' 두 가지 케이스로 구분한 2줄짜리 목록으로 작성해 주세요. [answer] | - 기반 모델 -> 확장 모델: 기반 모델에서 컴포넌트를 추가하거나 삭제하면 해당 변경 사항이 확장 모델에 자동으로 적용됩니다. - 확장 모델 -> 기반 모델: 확장 모델에서 컴포넌트를 추가해도 기반 모델에는 반영되지 않으며, 물려받은 컴포넌트를 삭제하는 것도 불가능합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | _EntityService:Destroy와 Entity:Destroy를 사용할 때 어떤 기준으로 선택해야 하는지 차이점을 알고 싶습니다. [answer] | `_EntityService:Destroy`와 `Entity:Destroy`의 선택 기준은 **삭제 대상이 누구인가**에 따라 결정됩니다. 두 함수 모두 엔티티를 삭제하는 동작은 동일하지만, 호출 방식과 대상 지정 방식이 다릅니다. ### 주요 차이점 1. **`_EntityService:Destroy(entity)`** * **대상:** 매개변수로 넘겨받은 특정 엔티티를 삭제합니다. * **사용 시점:** 현재 스크립트가 부착된 엔티티가 아닌, **다른 엔티티**를 삭제할 때 사용합니다. * [followup] | [followup_answer] | [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] | single_turn [pass] | ⏳ 미판정 [title] | Hierarchy [question] | 맵 엔티티에서 Rename 메뉴를 사용할 수 있지만 World 엔트리에서는 사용할 수 없는 이유가 무엇인가요? [answer] | 제공된 문서의 정보에 따르면, Hierarchy의 상위 엔트리별 콘텍스트 메뉴 목록에서 **World** 엔트리는 `Rename` 메뉴가 포함되어 있지 않습니다. World 엔트리의 활성화되는 메뉴는 다음과 같습니다: * Create Entity * Create Entity as Child * Property * Go To Entity * Copy Entity ID 반면, **map01** (맵 엔티티)의 활성화되는 메뉴에는 `Rename` 항목이 포함되어 있어 이름을 변경할 수 있습니다. 즉, World 엔 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색 창은 탭 타이틀 바로 아래에 위치합니다. 검색 기준에 따라 다른 결괏값이 나오기에 필요에 따라 선택해 검색합니다.검색 기준은 **Name**과 **Component** 두 가지이며, 다음과 같이 사용합니다. * **Name** : **Workspace**의 전 영역에서 검색한 이름과 맞는 값을 찾을 때 사용합니다. * **Component** : 엔티티 중 검색어에 해당하는 컴포넌트가 포함된 값을 찾을 때 사용합니다. | Name "chat" 검색 | Component "chat" 검색 | | -------------- |
[task] | single_turn [pass] | ⏳ 미판정 [title] | Hierarchy [question] | World 엔트리에는 Add Component 메뉴가 없고 common 엔트리에는 있는 이유는 무엇인가요? [answer] | World 엔트리는 최상위 레벨의 루트 노드이기 때문에 컴포넌트를 직접 추가할 수 없으며, 이는 Hierarchy 구조상 World에는 `Add Component` 또는 `Add New Component` 메뉴가 제공되지 않는 이유입니다. 반면, common 엔트리는 World의 하위에 위치하는 일반 엔트리이므로 컴포넌트를 추가할 수 있습니다. 따라서 common 엔트리의 콘텍스트 메뉴에는 `Add Component`와 `Add New Component` 항목이 활성화되어 있습니다. 요약하자면: * **World**: 루트 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색 창은 탭 타이틀 바로 아래에 위치합니다. 검색 기준에 따라 다른 결괏값이 나오기에 필요에 따라 선택해 검색합니다.검색 기준은 **Name**과 **Component** 두 가지이며, 다음과 같이 사용합니다. * **Name** : **Workspace**의 전 영역에서 검색한 이름과 맞는 값을 찾을 때 사용합니다. * **Component** : 엔티티 중 검색어에 해당하는 컴포넌트가 포함된 값을 찾을 때 사용합니다. | Name "chat" 검색 | Component "chat" 검색 | | -------------- |
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 확장 모델이 물려받은 컴포넌트를 삭제할 수 없는 이유와 올바른 삭제 방법을 코드 없이 3문장 이내로 요약해 주세요. [answer] | 확장 모델은 기반 모델과의 관계가 유지되므로, 물려받은 컴포넌트를 임의로 삭제할 경우 기반 모델의 구조적 일관성이 깨지는 것을 방지하기 위해 편집이 제한됩니다. 따라서 확장 모델 자체에서 해당 컴포넌트를 삭제하는 대신, 해당 컴포넌트를 포함하고 있는 원본 기반 모델에서 직접 삭제해야 합니다. 이렇게 기반 모델에서 삭제하면, 그 기반 모델에서 파생된 모든 확장 모델에도 삭제가 자동으로 적용됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | UI 엔티티를 모델화할 수 없는 경우의 예시를 3문장 이내로 요약해 주세요. [answer] | 모든 UIGroup 엔티티는 모델화할 수 없습니다. Default Group 내 Native 상태로 구현된 UIChat과 UIJoystick은 모델화할 수 없습니다. Extension Info에서 Break되는 일부 모델은 모델 확장 기능을 사용할 수 없습니다. [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] | Workspace에서 신규 모델을 만드는 두 가지 방법을 단계별 번호 목록으로 제시해 주세요. [answer] | Workspace에서 신규 모델을 만드는 두 가지 방법은 다음과 같습니다. 1. **Workspace**에서 **[+]** 버튼을 클릭한 후 **Create Model**을 선택합니다. 2. **Workspace**에서 원하는 위치의 콘텍스트 메뉴를 열고 **Create Model**을 클릭합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티를 생성할 때는 주로 **Preset List**의 모델을 활용합니다. **Preset List**의 모델은 기본적으로 **NativeModel**의 특성을 물려받습니다. 그래서 **Preset List**의 모델 속성을 변경하려면 **NativeModel**을 수정해야 합니다. 하지만 **NativeModel**의 속성을 변경하면 해당 **NativeModel**에서 확장된 **Preset List**의 모델 속성이 모두 변경되어 버립니다. 작업 과정에서 원래 모델의 특성이 필요할 때는 또다시 수정해야 하므로 불편합니다.
[task] | two_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | SpawnByEntity 함수에서 parent와 includeChild 매개 변수를 지정할 때의 구체적인 효과와 주의사항은 무엇인가요? [answer] | 참고 문서에 따르면 `SpawnByEntity` 함수의 `parent`와 `includeChild` 매개 변수에 대한 구체적인 효과와 주의사항은 다음과 같습니다. ### 1. `parent` 매개 변수 * **유형:** `Entity` * **옵션 여부:** Optional (선택 사항) * **효과:** 생성된 엔티티의 부모가 될 엔티티를 지정합니다. 즉, 복제된 새 엔티티가 해당 부모 엔티티의 자식으로 배치되어 계층 구조(Hierarchy)를 형성합니다. * **주의사항:** 문서에는 `parent`를 지정할 때 [followup] | includeChild를 true로 설정하여 하위 엔티티까지 복제할 때, 부모 엔티티의 TransformComponent 위치가 자식 엔티티의 상대 좌표에 어떻게 영향을 미치는지 코드 예시를 통해 설명해 주세요. [followup_answer] | 참고 문서에는 `includeChild`를 true로 설정했을 때 부모 엔티티의 `TransformComponent` 위치가 자식 엔티티의 상대 좌표에 어떻게 영향을 미치는지에 대한 구체적인 설명, 동작 원리, 또는 관련 코드 예시가 포함되어 있지 않습니다. 문서에서 `includeChild` 매개 변수에 대해 설명하는 내용은 오직 "복제할 엔티티의 하위 엔티티도 함께 복제할 것인지 설정합니다"라는 기능 설명뿐이며, 복제된 엔티티들 간의 좌표계 계층 구조(Hierarchy)나 TransformComponent의 상호작용에 대한 기 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 신규 모델 생성 시 월드 엔티티와 UI 엔티티에 각각 추가해야 하는 기본 컴포넌트를 표로 정리해서 알려주세요. [answer] | 신규 모델 생성 시 엔티티 용도에 따라 추가해야 하는 기본 컴포넌트는 다음과 같습니다. | 엔티티 유형 | 추가할 기본 컴포넌트 | | :--- | :--- | | **월드 엔티티** | `TransformComponent`<br>`SpriteRendererComponent` | | **UI 엔티티** | `UITransformComponent`<br>`SpriteGUIRendererComponent` | [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] | Hierarchy [question] | Hierarchy 검색에서 Name 기준과 Component 기준은 각각 어떤 상황에서 선택해야 하는지 차이점이 무엇인가요? [answer] | Hierarchy 검색 창은 탭 타이틀 바로 아래에 위치하며, 검색 기준에 따라 결괏값이 달라지므로 목적에 맞게 선택해야 합니다. **Name**과 **Component** 두 가지 기준의 차이와 사용 상황은 다음과 같습니다. **1. Name 기준** * **목적**: `Workspace`의 전 영역에서 이름이 검색어와 일치하는 값을 찾는 데 사용합니다. * **사용 상황**: 특정 엔티티, 맵, 또는 UI 요소의 이름(예: "chat", "map01")을 알고 있을 때 해당 객체를 빠르게 찾아야 할 때 선택합니다. * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색 창은 탭 타이틀 바로 아래에 위치합니다. 검색 기준에 따라 다른 결괏값이 나오기에 필요에 따라 선택해 검색합니다.검색 기준은 **Name**과 **Component** 두 가지이며, 다음과 같이 사용합니다. * **Name** : **Workspace**의 전 영역에서 검색한 이름과 맞는 값을 찾을 때 사용합니다. * **Component** : 엔티티 중 검색어에 해당하는 컴포넌트가 포함된 값을 찾을 때 사용합니다. | Name "chat" 검색 | Component "chat" 검색 | | -------------- |
[task] | code [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | Resource Storage의 'MSW 리소스' 카테고리에서 제공되는 리소스는 직접 저장할 수 없으므로, 해당 리소스의 RUID 값만 추출하여 제작물에 활용하기 위한 RUID 조회 및 유효성 검증 스크립트를 작성해줘 [answer] | 참고 문서에 따르면, **MSW 리소스**는 메이플스토리 월드에서 제공하는 리소스로, 해당 리소스 자체를 저장할 수 없으며 **RUID 값**을 통해 제작물에 활용해야 합니다. 하지만, 제공된 참고 문서에는 **RUID 값을 조회하거나 유효성을 검증하는 mLua API(예: `ResourceService`의 특정 메서드)가 명시되어 있지 않습니다.** 문서에는 `ResourceService`를 이용한 `HandleResourceUploadEvent` 핸들러 예시는 있으나, 이는 "리소스 업로드 성공 시" 발생하는 이벤트이며, 특정 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 방대한 리소스 속에서 크리에이터에게 필요한 리소스만 골라 활용할 수 있습니다. 또한 크리에이터가 제작한 리소스를 추가해 제작에 활용할 수도 있습니다. # 리소스 스토리지 소개 메이플스토리 월드에서는 많은 리소스를 **Preset List**로 제공하지만, 모든 리소스가 **Preset List**에 있는 것은 아닙니다. 보다 방대한 데이터에서 원하는 리소스를 검색할 때는 **Resource Storage**를 활용해 봅시다. **Resource Storage**의 기본 위치는 **Scene** 탭 옆입니다
[task] | code [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | _SpawnService:SpawnByModelId()로 생성된 엔티티가 유효하지 않을 경우( false 반환) 즉시 함수를 종료하고, 유효할 경우에만 3초 타이머를 진행하는 스크립트를 작성해줘 [answer] | `_SpawnService:SpawnByModelId()`로 생성된 엔티티를 `Property`로 선언하고, `OnUpdate`에서 매 프레임 유효성 여부를 체크해야 합니다. 참고 문서에 따르면 `isvalid(entity)` 글로벌 함수 또는 `_EntityService:IsValid(entity)`를 사용하여 엔티티가 존재하는지, 삭제 대기 중인지 등을 확인할 수 있습니다. 엔티티가 유효하지 않다면(`false`) 함수를 즉시 종료하고, 유효하다면(`true`)에만 시간 누적 로직을 진행하도록 작성합니다. ```lua Pro [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | Parameter | Description | | :--: | ----------- | | entity | 유효성 체크 대상이 되는 엔티티를 넣어줍니다. | #### 반환 값 * 매개 변수로 넘겨진 엔티티가 존재하면 **true**를 반환합니다. * 엔티티가 nil이거나 삭제 대기 중, 또는 삭제된 엔티티라면 **false**를 반환합니다. #### 사용 예시 위 `Destroy` 함수 예제에 이어서 엔티티 삭제 전후로 `isvalid` 함수가 어떤 값을 반환하는지 확인하고 실제 사용법을 살펴봅니다. 1. **Spawn
[task] | single_turn [pass] | ⏳ 미판정 [title] | Hierarchy [question] | UI 편집기에서 추가한 엔티티들이 Hierarchy의 어느 하위 엔트리 아래에 위치하며, 기본으로 제공되는 하위 엔트리 이름은 무엇인가요? [answer] | UI 편집기에서 추가한 엔티티들은 Hierarchy의 **ui** 엔트리 아래에 위치합니다. **ui** 엔트리에 기본으로 제공되는 하위 엔트리의 이름은 다음과 같습니다. * DefaultGroup * PopupGroup * ToastGroup [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **Hierarchy** 탭을 이용해 제작 현황을 확인하고, 제작 능률을 높일 수 있습니다. # Hierarchy 소개 **Hierarchy** 탭은 제작 중인 게임 현황을 **계층 구조(부모-자식)**로 볼 수 있는 패널입니다. 복잡하게 구성한 맵에서 원하는 엔티티를 빠르게 찾을 때 사용하거나, 체계적으로 엔티티를 관리할 때 사용합니다. 가장 상위인 **World** 계층 아래에 **common**, **maps**, **ui** 엔트리가 있으며 **maps**와 **ui** 엔트리는 각자 기본 하위 엔트
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 모델의 활용 [question] | 복사와 확장의 차이를 '복사'와 '확장' 두 항목으로 나눈 표로 정리해서 설명해 주세요. [answer] | 모델의 **복사**와 **확장**은 개념이 비슷해 보이지만, 원본 모델과 생성된 모델 간의 관계 및 수정 시 영향 범위에 있어 명확한 차이가 있습니다. 아래 표에 두 방식의 차이를 정리했습니다. | 구분 | 복사 | 확장 | | :--- | :--- | :--- | | **모델 간 관계** | 원본 모델과 복사된 모델이 독립적으로 존재합니다. | 기반 모델과 확장 모델의 관계가 유지됩니다. | | **속성 수정 시 영향** | 속성을 수정해도 서로에게 영향을 주지 않습니다. | 기반 모델의 속성을 변경하면 확장 모델에도 적용됩니다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 모델 확장과 모델 생성 방법, 그리고 모델 프로퍼티의 편집 방법을 알아봅니다. 본 과정을 진행하기 전에 [모델](https://mod-developers.nexon.com/docs?postId=55) 가이드를 먼저 살펴보면 도움이 됩니다. # 모델 확장 **모델**은 자신이 갖고 있던 속성, 즉 같은 컴포넌트와 프로퍼티 값을 물려받은 확장 모델을 생성할 수 있습니다. 얼핏 복사와 개념이 비슷한 것 같지만 복사와는 다릅니다. * **복사** * 원본 모델과 복사된 모델이 독립적으로 존