[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | SpawnByEntity 함수 호출 시 스폰 실패를 확인하기 위한 유효성 체크 로직을 3문장 이내로 설명하세요. [answer] | `SpawnByEntity` 함수의 반환값이 `nil`인지 `isvalid` 함수로 확인합니다. 만약 유효하지 않다면 스폰이 실패한 것으로 판단합니다. 이 경우 실패를 알리는 로그를 출력하는 로직을 작성합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | single_turn [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | multicast 실행 제어는 서버에서 실행된 후 클라이언트로 전송되어 실행된다는데, 이 과정이 일반적인 메시지 전송 방식과 어떻게 다른가요? [answer] | 문서에 제시된 정보에 따르면, `multicast` 실행 제어와 일반적인 메시지 전송 방식은 **개발자가 직접 구현해야 하는 과정의 유무**에서 차이가 있습니다. **1. 일반적인 메시지 전송 방식의 과정** 문서에서 설명하는 초기 방식(반복적으로 메시지를 생성·부호화·송신·수신·복호화하는 방식)은 다음과 같은 복잡한 단계를 거칩니다. * 서버에서 효과음과 연관된 메시지를 생성해야 합니다. * 메시지를 부호화해야 합니다. * 메시지를 클라이언트로 송신해야 합니다. * 클라이언트에서 메시지를 수신해야 합니다. * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 실행 제어의 동작 방식을 이해하기 위해 함수 호출 상황을 살펴봅시다. 특정한 소리 효과를 내는 `PlaySoundEffect` 함수가 있다고 가정합니다. 소리 효과는 개인 PC에서 나야 하므로 클라이언트에서만 사용하는 함수일 것입니다. 만약, 서버에서 특정 타이밍에 소리 효과를 내야 한다면, 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출합니다. | 메시지 전송 흐름 | 참고 이미지 | | --------- | ------ | | 메시지 생성 | | | 메
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | SpawnByEntity 함수의 매개 변수와 반환값을 2단 표로 정리하세요. [answer] | `SpawnByEntity` 함수의 매개 변수와 반환값은 다음과 같습니다. | 구분 | 내용 | | :--- | :--- | | **매개 변수** | `entity` (Entity): 복제할 엔티티<br>`name` (string): 생성할 엔티티의 이름<br>`spawnPosition` (Vector3): 엔티티가 생성될 위치 좌표<br>`parent` (Entity, Optional): 생성된 엔티티의 부모가 될 엔티티<br>`includeChild` (boolean, Optional): 복제할 엔티티의 하위 엔티티도 함께 복 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | 복제할 엔티티의 하위 엔티티까지 함께 생성하려면 어떤 옵션을 설정해야 하나요? [answer] | 복제할 엔티티의 하위 엔티티까지 함께 생성하려면 `SpawnByEntity` 함수의 `includeChild` 매개 변수를 `true`로 설정해야 합니다. 이 옵션은 선택 사항(Optional)이며, `true`로 지정하면 지정된 엔티티의 자식 엔티티들도 함께 복제되어 생성됩니다. ```lua local entity = _EntityService:GetEntityByPath("/maps/map01/monster-8") local name = entity.Name .. "Copy" local spawnPosition = Vecto [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | SpawnByEntity 사용 예시 코드를 출력하되, 설명은 코드 주석으로만 작성하세요. [answer] | ```lua Method: [server only] void OnBeginPlay() { -- 배치된 엔티티의 경로를 가져와 복제 대상 엔티티를 지정합니다. local entity = _EntityService:GetEntityByPath("/maps/map01/monster-8") -- 생성할 새 엔티티의 이름을 기존 이름 뒤에 "Copy"를 붙여 설정합니다. local name = entity.Name .. "Copy" -- 새 엔티티가 생성될 위치 좌표를 원점으로 설정합니다 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | single_turn [pass] | ⏳ 미판정 [title] | 실행 제어 [question] | 서버에서 클라이언트로 데이터를 전송할 때 Vector3이나 EntityRef 같은 타입을 매개 변수로 직접 전달할 수 있는지 여부가 궁금합니다. [answer] | 네, `Vector3`과 `EntityRef` 타입은 서버에서 클라이언트로 데이터를 전송할 때 매개 변수로 직접 전달할 수 있습니다. 실행 제어 함수의 매개 변수로 사용할 수 있는 타입 목록에 따르면, `any` 타입을 제외한 모든 타입을 사용할 수 있으며, 구체적으로 `Vector3`과 `EntityRef` 모두 "사용 가능"으로 명시되어 있습니다. 다음은 서버 함수에서 `Vector3`과 `EntityRef`를 매개 변수로 받아 클라이언트 함수를 호출하는 예시입니다. ```lua Method: [server only] vo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트 함수의 실행 제어 설정을 아이콘으로 표시합니다. 아이콘은 다음과 같습니다. | Icon | 실행 제어 설정 | | ---- | -------- | | 없음 | 사용하지 않음 | | | Client | | | ClientOnly | | | Server | | | ServerOnly | | | Multicast | 실행 제어가 설정된 함수에는 실행 제어 아이콘이 표시됩니다. 실행될 수 없는 함수는 아이콘이 표시됩니다. # 실행 제어 함수의 매개 변수 서로 다른 공간의 함수를 실행할 때 매개 변수를 통해 다른
[task] | code [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | AnimationClip 카테고리에서 npc 하위 카테고리에 해당하는 리소스 RUID를 즐겨찾기에서 가져와서 엔티티에 적용하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 AnimationClip 카테고리의 하위 카테고리가 `npc`임을 확인하고, RUID를 복사하는 방법(텍스트/이미지 검색 후 [RUID 복사] 버튼 클릭)과 즐겨찾기 저장 기능(별 모양 버튼, 최대 5,000개)에 대한 설명만 포함되어 있습니다. 하지만, **RUID를 엔티티에 적용하는 구체적인 mLua API(예: 애니메이션 컴포넌트 접근 방법, 애니메이션 재생 메서드 등)에 대한 정보는 참고 문서에 없습니다.** 또한, "AnimationClip"이라는 리소스 유형이 스크립트에서 어떻게 인스턴스화되거나 엔 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색한 리소스를 즐겨찾기에 등록해 편리하게 RUID를 찾을 수 있습니다. 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. # 리소스 카테고리 구분 리소스는 4개의 상위 카테고리 **Sprite, AnimationClip, AudioClip, AvatarItem** 아래에 하위 카테고리로 분류되어 있습니다. 4개의 카테고리 중 찾으려는 분류를 선택해 검색합니다. | 카테고리 | 설명 | | --- | --- | | Sprite | 다양하게 활용할 수 있는 스프라이트
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | _spawnPosition 매개변수에 Vector3를 사용할 때 좌표 값은 어떻게 설정하나요? [answer] | `_SpawnService:SpawnByEntity`와 `_SpawnService:SpawnByModelId` 함수의 `spawnPosition` 매개변수에 사용할 좌표 값은 `Vector3` 타입으로 설정합니다. `Vector3`는 `Vector3(x, y, z)` 형식으로 생성하며, 여기서 x, y, z는 각각 숫자(number) 값입니다. 문서의 예시에서는 다음과 같은 방식으로 좌표를 지정하고 있습니다: ```lua local spawnPosition = Vector3(0, 0, 0) ``` 또는 인라인으로 바로 전달하는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | single_turn [pass] | ⏳ 미판정 [title] | 제작한 월드 불러오기 및 관리 [question] | 개인 월드와 그룹 월드는 리비전을 되돌리는 절차에서 어떤 차이가 있나요? [answer] | 개인 월드는 리비전을 바로 되돌릴 수 있습니다. 반면, 그룹 월드는 복구 모드를 켠 뒤에야 리비전을 되돌릴 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 제작한 월드 불러오기 및 관리 [question] | 출시한 월드에서 실수로 중요한 오브젝트를 지워버렸는데, 리비전으로 되돌리기 전에 반드시 복구 모드를 켜야 하는 이유가 무엇인가요? [answer] | 출시한 월드는 그룹 월드에 해당하며, 리비전으로 되돌리기 전에 반드시 복구 모드를 켜야 합니다. 이는 개인 월드와 달리 그룹 월드는 복구 모드를 켠 상태에서만 리비전을 되돌릴 수 있는 제한이 있기 때문입니다. 복구 모드를 켜지 않으면 리비전 되돌리기 기능을 사용할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | 엔티티 스폰이 실패했을 때 반환값을 어떻게 확인하고 로그를 출력해야 하나요? [answer] | 엔티티를 생성하는 `SpawnByEntity`와 `SpawnByModelId` 함수는 스폰이 성공하면 생성된 엔티티(**Entity**)를, 실패하면 **nil**을 반환합니다. 따라서 반환값이 `nil`인 경우(또는 유효하지 않은 경우)를 확인하여 로그를 출력할 수 있습니다. `isvalid()` 함수를 사용하여 반환된 엔티티의 유효성을 체크하고, 실패 시 로그를 출력하는 방법은 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { local entity = _Ent [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | two_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | InputService를 활용해 키보드 입력과 화면 터치 이벤트를 처리하는 방식은 무엇인가요? [answer] | InputService를 통해 키보드 입력과 화면 터치 이벤트를 처리하는 방식은 각 입력 상태에 해당하는 이벤트 핸들러를 등록하고, 이벤트 객체에서 필요한 정보(키 종류, 터치 좌표 등)를 추출하는 것입니다. ### 1. 키보드 입력 처리 키보드 입력은 키를 누르는 순간, 누르고 있는 동안, 그리고 키를 떼는 순간에 따라 다른 이벤트가 발생합니다. * **KeyHoldEvent**: 키보드의 키가 눌려 있는 동안 프레임마다 발생하는 이벤트입니다. 이 이벤트가 발생할 때마다 `HandleKeyHoldEvent` 핸들러가 실행 [followup] | KeyHoldEvent와 KeyReleaseEvent의 발생 조건 차이와, 키를 눌렀다가 떼는 순간 액션을 실행하기 위해 어떤 핸들러를 선택해야 하는지 구체적으로 알려주세요. [followup_answer] | `KeyHoldEvent`와 `KeyReleaseEvent`의 발생 조건 차이와 키를 눌렀다가 떼는 순간 액션을 실행하기 위한 핸들러 선택 기준은 다음과 같습니다. ### 1. 발생 조건 차이 * **KeyHoldEvent** * 키보드의 키가 **눌려 있는 동안** 프레임마다 발생하는 이벤트입니다. * 키를 누르고 있는 동안에는 매 프레임마다 `HandleKeyHoldEvent`가 반복적으로 실행됩니다. * 주로 지속적인 이동이나 사격과 같이 입력이 유지되는 동안 계속 처리가 필요한 로직에 [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende
[task] | two_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | 화면을 터치하고 있는 동안 매 프레임마다 좌표가 업데이트되는 ScreenTouchHoldEvent를 활용해 특정 UI 요소의 실시간 위치 추적 기능이 어떻게 구현되나요? [answer] | `ScreenTouchHoldEvent`는 화면을 터치하고 유지하는 동안 프레임마다 발생하며, 이 이벤트는 `HandleScreenTouchHoldEvent` 핸들러를 통해 수신됩니다. 이벤트 객체에는 `event.TouchPoint`라는 속성이 포함되어 있어, 현재 터치가 유지되고 있는 화면 좌표 정보를 제공합니다. 따라서 특정 UI 요소의 실시간 위치 추적을 구현하려면, `HandleScreenTouchHoldEvent` 안에서 매 프레임마다 갱신되는 `event.TouchPoint` 값을 읽어 해당 UI 요소의 위치를 동적으 [followup] | HandleScreenTouchHoldEvent 안에서 event.TouchPoint 값을 가져와서 로컬 변수에 저장하고, OnUpdate 메서드에서 그 값이 변할 때마다 특정 엔티티의 Position을 변경하는 mLua 코드 예시를 작성해 주세요. [followup_answer] | 요청하신 로직을 구현하기 위해 `ScreenTouchHoldEvent`로 수신된 `TouchPoint`를 프로퍼티에 저장하고, `OnUpdate`에서 해당 값이 변경된 경우 엔티티의 위치를 갱신하는 mLua 스크립트 예제는 다음과 같습니다. 참고로, `ScreenTouchHoldEvent`는 클라이언트 공간(`Client`)에서 발생하는 이벤트입니다. 따라서 서버 공간(`[server]`)의 `OnUpdate`에서 이 값을 바로 읽을 수 없습니다. 클라이언트와 서버 간 동기화가 필요한 경우 `[Sync]` 프로퍼티를 사용하거나, [scores] | [judge_reason] | [source_doc] | `ScreenTouchHoldEvent`는 화면을 터치하고 있는 동안 프레임마다 발생합니다. 이벤트가 발생할 때마다 **HandleScreenTouchHoldEvent**가 실행됩니다. `ScreenTouchHoldEvent`가 핸들러의 매개 변수로 전송되며, 터치 중인 위치의 좌표 정보가 포함되어 있습니다. 화면을 터치 중일 때 터치한 위치의 좌표를 콘솔 창에 출력하는 예제입니다. ```lua [service: InputService] HandleScreenTouchHoldEvent(ScreenTouchHoldEvent even
[task] | two_turn [pass] | ⏳ 미판정 [title] | 제작한 월드 불러오기 및 관리 [question] | 메이커에서 제작 중인 월드를 불러오는 기본 절차가 궁금해요 [answer] | 메이커에서 제작 중인 월드를 불러오는 기본 절차는 다음과 같습니다. 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 표시되는 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보 화면에서 **[이어서 만들기]** 버튼을 클릭하면 해당 월드가 불러와집니다. [followup] | 리비전 관리 기능 중 '되돌리기' 시 개인 월드와 그룹 월드의 처리 방식이 어떻게 다른가요? [followup_answer] | 리비전 '되돌리기' 기능에서 개인 월드와 그룹 월드의 처리 방식은 다음과 같이 다릅니다. * **개인 월드**: 해당 리비전으로 바로 되돌릴 수 있습니다. * **그룹 월드**: 복구 모드를 켠 뒤 리비전을 되돌릴 수 있습니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 제작한 월드 불러오기 및 관리 [question] | 월드 목록에서 특정 월드의 [⋯] 버튼을 눌렀을 때 [월드 삭제] 버튼이 보이지 않고 [리비전]과 [크리티컬 리포트]만 있는 이유는 무엇인가요? [answer] | 월드 목록에서 특정 월드의 **[⋯]** 버튼을 눌렀을 때 **[월드 삭제]** 버튼이 보이지 않고 **[리비전]** 과 **[크리티컬 리포트]** 버튼만 보이는 이유는 해당 월드가 **이미 출시된 상태**이기 때문입니다. 월드 삭제 기능은 **출시하지 않은 월드**에만 적용됩니다. 출시한 월드는 삭제가 불가능하며, 이러한 월드의 **월드 관리** 팝업 창에는 삭제 옵션 대신 **[리비전]** 과 **[크리티컬 리포트]** 버튼만 표시됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 제작한 월드 불러오기 및 관리 [question] | File - Revisions 메뉴와 월드 정보의 [⋯] - [리비전] 버튼은 기능적으로 완전히 동일한가요? [answer] | 네, 기능적으로 동일합니다. 참고 문서에 따르면, **File - Revisions** 메뉴로 들어가는 것과 월드 정보에서 **[⋯] - [리비전]** 버튼을 클릭하는 것 모두 리비전 관리를 수행하기 위한 진입점입니다. 두 경로 모두 동일한 **Revisions** 창으로 이어져 리비전 기록, 메모 수정, 다운로드, 되돌리기, 제거 등의 기능을 사용할 수 있습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | `isvalid` 함수의 반환 값과 확인 대상 상태를 2문장 이내로 설명하세요. [answer] | `isvalid` 함수는 엔티티가 현재 삭제 대기 중이거나 이미 삭제되었는지 확인하여 `true` 또는 `false` 값을 반환합니다. [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] | 서버에서 특정 플레이어에게만 시스템 메시지를 보내기 위해 Client 함수의 마지막 매개 변수에 UserId를 적는 원리가 무엇인가요? [answer] | 서버에서 특정 플레이어에게만 메시지를 보내기 위해 `Client` 실행 공간 함수의 마지막 매개 변수에 `UserId`를 전달하는 원리는 다음과 같습니다. 1. **기본 동작**: 보통 서버에서 `Client` 실행 공간의 함수를 호출하면, 해당 함수는 **모든 클라이언트**에서 실행됩니다. 2. **특정 클라이언트 대상 지정**: `Client` 실행 공간 함수의 **마지막 매개 변수**에 `UserId` 타입의 값을 넣으면, 메이플스토리 월드 시스템은 이 `UserId`를 인식하여 해당 함수를 **해당 `UserId`에 해 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 스크립트 함수의 실행 제어 설정을 아이콘으로 표시합니다. 아이콘은 다음과 같습니다. | Icon | 실행 제어 설정 | | ---- | -------- | | 없음 | 사용하지 않음 | | | Client | | | ClientOnly | | | Server | | | ServerOnly | | | Multicast | 실행 제어가 설정된 함수에는 실행 제어 아이콘이 표시됩니다. 실행될 수 없는 함수는 아이콘이 표시됩니다. # 실행 제어 함수의 매개 변수 서로 다른 공간의 함수를 실행할 때 매개 변수를 통해 다른
[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | 워크스페이스에 추가된 모델의 Entry ID를 스크립트에서 어떻게 가져와야 하나요? [answer] | 워크스페이스에 추가된 모델의 Entry ID는 스크립트 안에서 직접 조회하는 함수를 제공하지 않으며, 에디터 화면에서 수동으로 복사하여 스크립트에 문자열 상수로 입력하는 방식으로 가져옵니다. 구체적인 절차는 다음과 같습니다. 1. **Workspace** 창을 엽니다. 2. 생성할 엔티티의 템플릿이 될 **모델**을 선택합니다. 3. 선택한 모델에서 **Copy Entry ID** 옵션을 선택하여 ID를 복사합니다. 4. 복사한 Entry ID를 스크립트에서 `_SpawnService:SpawnByModelId` 함수의 첫 번째 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 엔티티의 생성과 삭제는 월드를 제작하면서 가장 많이 사용하는 기능입니다. 이번 과정에서는 엔티티 생성과 삭제 방법, 그리고 엔티티 존재 여부를 확인하는 유효성 체크 기능을 살펴봅니다. # 엔티티 생성 **SpawnService**는 엔티티 생성 함수를 제공합니다. 주요 엔티티 생성 함수인 `SpawnByEntity`와 `SpawnByModelId`를 알아보겠습니다. ## SpawnByEntity 엔티티를 바탕으로 새로운 엔티티를 생성합니다. #### 매개 변수 |Parameter |Type |D
[task] | code [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | AvatarItem 카테고리에서 hair 하위 카테고리의 아이템 RUID를 Resource Picker를 통해 선택하여 아바타에 장착하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `AvatarItem` 카테고리의 존재와 `hair` 하위 카테고리가 있음을 설명하고 있으며, 프로퍼티 에디터의 RUID 입력 창 옆 버튼으로 **Resource Picker**를 사용해 특정 카테고리 리소스를 선택할 수 있음을 언급하고 있습니다. 그러나 **참고 문서에는 Resource Picker로 선택한 RUID 값을 mLua 스크립트에서 직접 읽어와 아바타에 장착하는 API(예: `_AvatarService:EquipItem` 등)나 관련 메서드, 이벤트가 명시되어 있지 않습니다.** 문서에는 리소스를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 검색한 리소스를 즐겨찾기에 등록해 편리하게 RUID를 찾을 수 있습니다. 별 모양 버튼을 누르면 즐겨찾기에 저장됩니다. 최대 5,000개의 리소스를 즐겨찾기에 저장할 수 있습니다. # 리소스 카테고리 구분 리소스는 4개의 상위 카테고리 **Sprite, AnimationClip, AudioClip, AvatarItem** 아래에 하위 카테고리로 분류되어 있습니다. 4개의 카테고리 중 찾으려는 분류를 선택해 검색합니다. | 카테고리 | 설명 | | --- | --- | | Sprite | 다양하게 활용할 수 있는 스프라이트
[task] | single_turn [pass] | ⏳ 미판정 [title] | 제작한 월드 불러오기 및 관리 [question] | 리비전을 기록할 때 메모를 나중에 수정하거나, 특정 리비전의 mod 파일을 다운로드하는 방법은 무엇인가요? [answer] | 리비전을 관리하려면 **File - Revisions** 메뉴로 들어가거나, 월드 정보에서 **[⋯] - [리비전]** 버튼을 클릭해 Revisions 창을 열 수 있습니다. Revisions 창에서 특정 리비전을 선택하면 다음 기능을 사용할 수 있습니다. * **메모 수정**: 해당 리비전의 메모를 수정할 수 있습니다. * **다운로드**: 해당 리비전의 mod 파일을 다운로드할 수 있습니다. 이 외에도 되돌리기와 제거 기능을 지원하며, 개인 월드는 바로 리비전을 되돌릴 수 있지만 그룹 월드는 복구 모드를 켠 뒤 되돌 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | `_EntityService:Destroy`와 `Entity:Destroy`의 차이를 비교하는 표로 정리하세요. [answer] | 제공된 문서에는 `_EntityService:Destroy`와 `Entity:Destroy` 두 가지 방식으로 엔티티를 삭제할 수 있음을 명시하고 있으나, 두 방법 간의 구체적인 차이점(성능, 내부 처리 방식, 호출 맥락 제한 등)에 대한 설명은 포함되어 있지 않습니다. 문서에서 확인할 수 있는 정보만으로는 두 함수의 차이를 비교하는 표를 만들 수 없습니다. [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] | 서버에서 클라이언트 전용 함수를 호출할 때 분기문(`if isClient` 등) 대신 실행 제어(Execution Space Setting)를 사용하는 이유는 **코드의 가독성 향상**과 **네트워크 통신 과정의 자동화**를 통해 개발 효율을 높이기 위함입니다. ### 분기문 사용 시의 문제점 서버에서 클라이언트 함수를 호출해야 하는 경우, 개발자가 직접 현재 실행 공간이 서버인지 클라이언트인지 판별하는 분기문을 작성해야 합니다. ```lua void CallPlaySoundEffect() { if isClient == [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 실행 제어의 동작 방식을 이해하기 위해 함수 호출 상황을 살펴봅시다. 특정한 소리 효과를 내는 `PlaySoundEffect` 함수가 있다고 가정합니다. 소리 효과는 개인 PC에서 나야 하므로 클라이언트에서만 사용하는 함수일 것입니다. 만약, 서버에서 특정 타이밍에 소리 효과를 내야 한다면, 서버는 효과음과 연관된 메시지를 생성해 송신하고, 클라이언트는 수신부를 구현해 `PlaySoundEffect` 함수를 호출합니다. | 메시지 전송 흐름 | 참고 이미지 | | --------- | ------ | | 메시지 생성 | | | 메
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | `_EntityService:Destroy`와 `Entity:Destroy`의 차이점을 대상 엔티티 기준으로 구분하여 2행의 표로 정리하세요. [answer] | `_EntityService:Destroy`와 `Entity:Destroy`는 삭제 동작이 동일하지만, 삭제 대상이 어떻게 결정되는지에 따라 차이가 있습니다. | 구분 | 삭제 대상 | | :-- | :-- | | `_EntityService:Destroy` | 매개 변수로 전달된 엔티티 | | `Entity:Destroy` | 함수를 호출한 엔티티 자신 | [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] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | `OnBeginPlay` 내에서 `self:SpawnByModelId()`를 호출하도록 수정하는 단계를 3문장 이내로 설명하세요. [answer] | `SpawnManager` 컴포넌트에서 `OnBeginPlay` 함수를 찾은 뒤 실행 공간이 `[server only]`로 설정되어 있는지 확인합니다. 함수 본문 안의 `self:SpawnByEntity()` 호출 주석 행을 삭제하고 `self:SpawnByModelId()` 호출만 남기도록 수정합니다. 마지막으로 **[시작]** 버튼을 눌러 Workspace의 모델과 동일한 엔티티가 정상적으로 생성되는지 확인합니다. [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] | two_turn [pass] | ⏳ 미판정 [title] | 제작한 월드 불러오기 및 관리 [question] | 리비전 관리에서 제공되는 다운로드, 메모 수정, 제거 기능 각각의 구체적인 사용 용도가 무엇인가요 [answer] | 리비전 관리에서 제공되는 각 기능의 구체적인 사용 용도는 다음과 같습니다. * **다운로드**: 해당 리비션 시점의 월드 데이터를 `.mod` 파일 형태로 받아들이는 용도로 사용합니다. 이를 통해 특정 버전의 월드를 백업하거나 다른 환경에서 로드할 수 있습니다. * **메모 수정**: 기록한 리비션의 설명 메모를 변경하거나 보완하는 용도로 사용합니다. 나중에 어떤 변경점이 있었는지 쉽게 식별할 수 있도록 기록을 업데이트할 때 활용합니다. * **제거**: 더 이상 필요하지 않거나 불필요하게 생성된 리비션 기록을 목록에서 [followup] | 리비전으로 되돌리기를 수행할 때 그룹 월드의 '복구 모드'를 켜야 하는 이유와 절차를 자세히 설명해 주세요. [followup_answer] | 제공된 참고 문서에는 그룹 월드에서 리비전을 되돌릴 때 '복구 모드'를 켜야 한다는 사실과, 그 자세한 절차에 대해서는 **[공동 제작]** 가이드의 **복구 모드** 내용을 참고하라는 언급만 존재하며, 구체적인 이유나 단계별 절차에 대한 정보는 포함되어 있지 않습니다. 따라서 주어진 문서 범위 내에서 설명 가능한 내용은 다음과 같습니다. * **개인 월드**: 리비전으로 되돌리기를 바로 수행할 수 있습니다. * **그룹 월드**: 복구 모드를 켠 뒤 리비전을 되돌려야 합니다. '복구 모드'를 켜야 하는 정확한 이유와 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다.
[task] | two_turn [pass] | ⏳ 미판정 [title] | 제작한 월드 불러오기 및 관리 [question] | 월드 목록에서 월드를 삭제하는 과정과 제한 사항이 어떻게 되나요? [answer] | 월드 목록에서 월드를 삭제하는 과정과 제한 사항은 다음과 같습니다. **삭제 과정** 1. 월드 목록에서 삭제하고자 하는 월드를 선택합니다. 2. 해당 월드 옆의 **[⋯]** 버튼을 클릭합니다. 3. 나타나는 **월드 관리** 팝업 창에서 **[월드 삭제]** 버튼을 누릅니다. **제한 사항** * **출시 여부 제한**: 출시하지 않은 월드만 삭제가 가능합니다. 이미 출시한 월드는 삭제가 불가능합니다. * **출시된 월드의 관리 메뉴**: 출시된 월드의 경우, **월드 관리** 팝업 창에서 **[월드 삭제]** 버튼이 [followup] | 이미 출시된 월드는 삭제가 불가능한데, 이 경우 월드 관리 팝업 창에서 확인 가능한 버튼이 무엇이며 각각 어떤 역할을 하나요? [followup_answer] | 이미 출시된 월드의 **월드 관리** 팝업 창에서는 **[리비전]**과 **[크리티컬 리포트]** 버튼만 확인 가능합니다. 각 버튼의 역할은 다음과 같습니다. * **[리비전]**: 클릭 시 리비전 관리 화면으로 이동하여 이전에 기록한 리비전을 확인, 메모 수정, mod 파일 다운로드, 특정 리비전으로 되돌리기(그룹 월드는 복구 모드 켜기 필요), 리비전 제거 등의 작업을 수행할 수 있습니다. * **[크리티컬 리포트]**: 제공된 문서에는 이 버튼에 대한 구체적인 역할이나 동작 설명이 없습니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 제작한 월드를 불러오고 관리하는 방법을 알아봅니다. # 제작 중인 월드 불러오기 1. 메뉴에서 **[만들기]** 버튼을 클릭합니다. 2. 월드 목록에서 불러올 월드를 선택합니다. 3. 월드 정보에서 **[이어서 만들기]** 버튼을 클릭하면 제작 중인 월드를 불러옵니다. # 리비전 관리 월드를 제작할 때는 리비전을 기록하고 관리하는 과정이 필요합니다. 중요한 변경점이 발생했을 때마다 리비전을 기록해두면 필요한 순간에 예전 리비전으로 월드를 되돌릴 수 있어 안전합니다.
[task] | two_turn [pass] | ⏳ 미판정 [title] | 리소스 찾기 [question] | 리소스 스토리지의 '내 리소스' 폴더 구조에서 최상위 Root 폴더 1개와 하위 폴더 4단계 구성 규칙은 구체적으로 어떻게 적용되며, 같은 단계에서 폴더 이름 중복 시 발생하는 제약 사항은 무엇인가요? [answer] | 리소스 스토리지의 '내 리소스' 폴더 구조는 다음과 같은 규칙에 따라 적용됩니다. **1. 폴더 단계 구성 규칙** * **최상위 Root 폴더**: 최상위에는 Root 폴더가 **1개만** 존재합니다. * **하위 폴더 단계**: Root 폴더를 기준으로 하위 폴더를 최대 **4단계**까지 구성할 수 있습니다. * **단계별 폴더 수**: 각 단계(레벨)에서 생성할 수 있는 하위 폴더의 최대 개수는 **100개**입니다. **2. 같은 단계 폴더 이름 중복 시 제약 사항** * 같은 단계(같은 레벨) 안에 **중 [followup] | 폴더 이름에 `/`, `\`, `|` 기호를 사용할 수 없고 상위 폴더 삭제 시 하위 내용물이 함께 삭제되는 규칙을 고려하여, 대량의 리소스를 효율적으로 관리하기 위한 폴더 네이밍 및 구조 설계 팁을 제시해 주세요. [followup_answer] | 제공된 문서에는 폴더 네이밍 컨벤션이나 구조 설계에 대한 구체적인 '팁'이나 '권장 사항'이 명시되어 있지 않습니다. 문서에 포함된 정보에 따르면, 폴더 구조를 설계할 때 반드시 준수해야 하는 **기술적 제약 사항**은 다음과 같습니다. 이 제약 사항들을 고려하여 대량의 리소스를 관리할 때 발생할 수 있는 문제를 방지하기 위한 실질적 접근 방법은 다음과 같이 정리할 수 있습니다. **1. 폴더 이름에 특수 기호(`/`, `\`, `|`) 사용 금지** * **제약:** 폴더 이름에 `/`, `\`, `|` 기호를 사용할 수 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 방대한 리소스 속에서 크리에이터에게 필요한 리소스만 골라 활용할 수 있습니다. 또한 크리에이터가 제작한 리소스를 추가해 제작에 활용할 수도 있습니다. # 리소스 스토리지 소개 메이플스토리 월드에서는 많은 리소스를 **Preset List**로 제공하지만, 모든 리소스가 **Preset List**에 있는 것은 아닙니다. 보다 방대한 데이터에서 원하는 리소스를 검색할 때는 **Resource Storage**를 활용해 봅시다. **Resource Storage**의 기본 위치는 **Scene** 탭 옆입니다
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | `_SpawnService:SpawnByModelId` 호출 후 반환값을 검증하는 로직이 포함된 `SpawnByModelId` 함수의 Lua 코드만 출력하고, 실패 시 로그 처리는 주석으로 작성하세요. [answer] | ```lua void SpawnByModelId() { local id = "maplestorymonster$0108737afb9548309c03795430b20c05" local name = "SpawnedEntity" local spawnPosition = Vector3(0,0,0) local parent = _EntityService:GetEntityByPath("/maps/map01") local spawnedEntity = _SpawnService:SpawnByModelId(id, na [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] | instruction_following [pass] | ⏳ 미판정 [title] | 엔티티의 생성과 삭제, 유효성 체크 [question] | 3초 후 엔티티를 삭제하는 `OnUpdate` 함수 코드만 출력하고, 실행 로직은 주석으로 설명하세요. [answer] | ```lua Method: [server only] void OnUpdate(number delta) { -- 스폰된 엔티티가 유효하지 않으면(삭제 대기 중이거나 이미 삭제된 경우) 더 이상 실행하지 않음 if isvalid(self.SpawnedEntity) == false then return end -- 초기화 로직: 첫 프레임에서 타이머 변수가 없으면 0으로 설정 if self._T.time == nil then self._T.time = 0 e [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **SpawnService**의 스폰 기능을 통해 엔티티를 생성하고, 생성된 후 3초 후에 제거되도록 합니다. 예제는 위 엔티티 생성에서 사용한 **SpawnManager** 스크립트 컴포넌트를 활용합니다. 1. 프로퍼티를 추가하고, 타입과 이름을 다음과 같이 설정합니다. ```lua Property: [none] any SpawnedEntity = nil ``` 2. `SpawnByModelId` 함수를 다음과 같이 수정합니다. ```lua void SpawnByMode