← 목록

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

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

[task] | code [pass] | ⏳ 미판정 [title] | Workspace [question] | BaseEnvironment에서 Place to Hierarchy로 배치한 모델을 대상으로 _EntityService:GetEntityByPath("/maps/map01/obj")를 사용해 해당 엔티티의 TransformComponent.Position을 Vector3(10, 0, 10)으로 설정하는 [server only] OnBeginPlay 스크립트를 작성해줘 [answer] | BaseEnvironment의 콘텍스트 메뉴에서 "Place to Hierarchy"를 사용하면 해당 모델이 Scene에 배치되며, 이후 `_EntityService:GetEntityByPath`를 통해 그 엔티티에 접근할 수 있습니다. 요청하신 스크립트는 서버에서 실행되며, 지정된 경로에 있는 엔티티를 찾아 그 위치를 변경합니다. ```lua Method: [server only] void OnBeginPlay() { local targetEntity = _EntityService:GetEntityByPath("/maps/ma [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | 목록 | 설명 | | --- | --- | | Duplicate | DefaultPlayer를 복제한 모델을 생성합니다. | | Open | Player의 상태 혹은 변경 점을 확인하기 위해 사용합니다.| | Add Component | DefaultPlayer에 컴포넌트를 추가합니다. | | Add New Component | 새로운 컴포넌트를 생성한 후 DefaultPlayer에 추가합니다. | | Extend | DefaultPlayer의 확장 모델을 생성합니다. | | Copy Entry ID | DefaultPlayer

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | UseReturnTweenType을 활성화하고 ReturnTweenType을 Linear로 설정했는데 왕복 경로에서 반환 시 가감속이 적용되지 않는 이유는 무엇인가요? [answer] | 참고 문서에 `UseReturnTweenType` 및 `ReturnTweenType` 프로퍼티의 정확한 동작 논리나 가·감속 적용 조건에 대한 기술이 포함되어 있지 않습니다. 문서에는 다음과 같은 정보만 제공됩니다: 1. **UseReturnTweenType**: "활성화하면 엔티티가 반환점을 돌며 **별도로 설정한 방식**으로 운동합니다." 2. **ReturnTweenType**: "종료 방식을 OneRoundTrip/RepeatRoundTrip으로 선택한 경우 반환점을 돌아올 때의 **운동 방식**을 설정합니다." 3. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 목적지까지 선형 운동을 하게 만들 때 사용합니다. 목적지까지 편도, 왕복 운동 여부와 더불어 가·감속, 도달 시 튕김 등 운동 방식을 설정할 수 있습니다. **TweenLineComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | ------ | --- | | TweenType | 기본값은 Linear입니다. 다른 모양의 운동 방식을 선택할 수 있습니다. 선형운동 종류별 설명은 하단의 참고자료를 참고하세요. | | Duration | 목적지까지 도달하는 데 걸리는 시간을 의미합니다. | |

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | 택시 이동에 사용할 수 있는 Position 변경 방식과 Translate 함수 사용 예시를 두 가지 방법으로 나눈 표로 정리하세요. [answer] | 택시를 이동시키는 방법은 `TransformComponent`의 `Position` 값을 직접 수정하는 방식과 `Translate()` 함수를 호출하는 방식의 두 가지가 있습니다. 아래 표에 두 가지 방법의 특징과 예시 코드를 정리했습니다. | 구분 | Position 변경 방식 | Translate 함수 방식 | | :--- | :--- | :--- | | **원리** | `TransformComponent`의 `Position` 프로퍼티에서 x, y, z 값을 직접 읽어와 수정한 후 다시 설정합니다. | `TransformCo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 택시를 이동시키기 위해서는 `TransformComponent`의 **Position** 값을 변경해야 합니다. 맵에 배치되는 모든 엔티티는 위치 정보를 가지고 있습니다. 이 위치 정보는 TransformComponent에서 Position x, y, z 값으로 표현됩니다. 오른쪽으로 이동시키기 위해서는 x 값이 커지도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.g

[task] | code [pass] | ⏳ 미판정 [title] | Workspace [question] | `_TimerService:SetTimerOnce`를 활용해 스크립트 실행 3초 후 "타이머 종료"라는 메시지를 로그로 출력하고, 5초 후 다시 "2번째 타이머 종료"를 출력하도록 체인된 타이머 로직을 구현하는 스크립트를 작성해줘. [answer] | `_TimerService:SetTimerOnce`를 사용하여 첫 번째 타이머가 종료되는 시점에 두 번째 타이머를 등록하는 방식으로 체인된 타이머 로직을 구현할 수 있습니다. 아래는 요청하신 기능을 수행하는 mLua 스크립트입니다. ```lua Property: [None] number timerCount = 0 Method: [server only] void OnBeginPlay () { -- 첫 번째 타이머: 3초 후 실행 _TimerService:SetTimerOnce(function() log("타이머 종료") [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 **Workspace**를 이용해 엔티티, 스크립트, 이미지를 효율적으로 관리할 수 있습니다. ##### 참고 가이드 [Entity, Component, Property](/docs?postId=54) [Model](/docs?postId=55) # Workspace 소개 **Workspace**는 폴더 형식의 리소스 관리 공간입니다. 필요한 것을 찾을 수 있는 **Workspace**는 효율적인 월드 제작을 위해 필요합니다. **Workspace** 패널의 기본 위치는 우측 중앙입니다. 크리에이터의 편의에

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | `OnUpdate()` 함수에서 택시가 아잘린을 향해 이동하는 조건 분기 로직을 단계별 번호 목록으로 정리하세요. [answer] | 참고 문서에 제시된 `OnUpdate()` 함수의 택시 이동 조건 분기 로직은 다음과 같습니다. 1. 택시의 현재 위치 정보를 `pos` 변수에 할당합니다. 2. 아잘린의 현재 위치 정보를 `targetPos` 변수에 할당합니다. 3. 택시의 현재 X 좌표(`pos.x`)가 아잘린의 X 좌표(`targetPos.x`)보다 작은지 확인합니다. 4. 조건이 참이면(택시가 아잘린보다 왼쪽에 있으면), 택시의 X 좌표를 0.02만큼 증가시킵니다. 5. 수정된 위치를 `self.TaxiTransform.Position`에 다시 적용하여 택 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 만든 택시는 멈추지 않고 계속 이동하고 있습니다. 택시는 아잘린이 서 있는 곳에서 멈춰야 하므로, 아잘린의 위치 정보를 이용해야 합니다. 택시가 이동하다 아잘린과의 거리가 가까워지면, 멈추도록 조건을 추가해봅시다. 1. **Taxi**컴포넌트에 새로운 **AzallinTransform** 프로퍼티를 추가하고, 타입을 **Component**로 변경합니다. ```lua Property: [Sync] Component AzallinTransform = nil ``` 2. `OnBeginP

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | OnBeginPlay에서 self.Entity의 TransformComponent를 가져와야 하는데, 이 시점에 엔티티가 아직 생성되지 않아 nil 에러가 발생하면 어떻게 해결해야 하나요? [answer] | 참고 문서에 따르면, `OnBeginPlay()` 함수는 스크립트가 작동하는 시점에 가장 먼저 1회 호출되는 함수이며, 예제 코드에서 `OnBeginPlay()` 내부에 `self.Entity`를 통해 엔티티를 참조하고 `TransformComponent`를 가져오는 방식으로 구현하고 있습니다. 문서에는 `OnBeginPlay()` 시점에 엔티티가 아직 생성되지 않아 `nil` 에러가 발생할 수 있다는 문제 상황이나, 이를 해결하기 위한 `nil` 체크, 대기(`wait`), 또는 다른 생명주기 함수로 대체하는 등의 구체적인 해결 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 택시를 이동시키기 위해서는 `TransformComponent`의 **Position** 값을 변경해야 합니다. 맵에 배치되는 모든 엔티티는 위치 정보를 가지고 있습니다. 이 위치 정보는 TransformComponent에서 Position x, y, z 값으로 표현됩니다. 오른쪽으로 이동시키기 위해서는 x 값이 커지도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.g

[task] | code [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | 원운동이 완료된 후 AutoDestroy 를 활성화하여 컴포넌트가 자동으로 삭제되도록 설정하는 스크립트를 작성해줘 [answer] | `TweenCircularComponent`의 `AutoDestroy` 프로퍼티를 활성화하면 원운동이 끝나면 해당 컴포넌트가 자동으로 삭제됩니다. 이 동작을 적용하기 위해 스크립트에서 `AutoDestroy` 값을 `true`로 설정하면 됩니다. 참고로, 원운동이 "완료"되는 조건은 `Degree` 값에 따라 달라집니다. `Degree`가 0이면 계속 회전하므로 완료 시점이 없으며, 0이 아닌 값을 입력해야 설정된 각도만큼 회전 후 멈추고 `AutoDestroy`가 발동합니다. 아래는 원운동 설정과 함께 `AutoDestroy` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 원형 운동을 하게 만들 때 사용합니다. 회전 수, 속도, 반경을 설정할 수 있습니다. **TweenCircularComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | --- | --- | | Radius | 원점을 기준으로 입력한 값만큼 멀어져 원운동을 합니다. 숫자가 클수록 중심에서 멀어집니다. | | Speed | 입력한 숫자가 클수록 엔티티가 빠르게 원운동을 합니다. | | LookAtCenter | 활성화하면 엔티티 사각형 테두리 윗변이 중심점을 바라보고 회전합니다. | | Deg

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | StaticNPC에서 RigidbodyComponent를 제거하는 과정 중 'Remove Component' 메뉴가 안 보일 때, 어떤 조건을 확인해야 하는지 궁금합니다. [answer] | 제공된 참고 문서에는 `RigidbodyComponent`의 컨텍스트 메뉴에서 **Remove Component** 옵션이 보이지 않는 경우에 대한 원인이나 해결 방법이 설명되어 있지 않습니다. 문서에는 StaticNPC를 선택한 후 프로퍼티 에디터에서 `RigidbodyComponent`의 컨텍스트 메뉴를 눌러 **Remove Component**를 선택해야 한다는 절차만 안내하고 있으며, 메뉴가 안 보일 때 확인해야 할 조건에 대한 정보는 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 용감한 시그너스 기사단 소속 아잘린이 먼저 고통의 미궁으로 출발한 나이트워커 부대에 합류할 수 있도록 택시를 불러봅시다. 부른 택시가 아잘린을 지나치지 않고 아잘린 앞에서 멈춰서 아잘린이 탑승할 수 있도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.gif "Example") # StaticNPC 모델 수정하기 StaticNPC 모델에서 Rigid

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | `TransformComponent`와 `RigidbodyComponent`의 `Translate` 함수를 각각 어떤 객체에 적용해야 하는지 구분하여 2줄 이내로 답하세요. [answer] | `TransformComponent`의 `Translate`는 택시 이동에, `RigidbodyComponent`의 `Translate`는 원숭이를 밀어내는 데 각각 적용해야 합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 가이드는 [물체의 이동 Ⅰ](/docs?postId=123)을 따라 만든 월드에서 이어서 제작해야 정상적으로 동작합니다. 택시가 아잘린을 태우러 가야하는데 원숭이가 길을 가로 막고 있습니다. `TransformComponent`의 `Translate`를 이용하여 택시를 이동시키고 `RigidbodyComponent`의 `Translate` 함수를 사용하여 원숭이를 밀어내봅시다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/174790801778

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | StaticNPC 모델에 RigidbodyComponent와 TransformComponent가 동시에 존재할 때, Position 값을 변경하면 왜 원하는 방향으로 움직이지 않는 오류가 발생하는지 궁금합니다. [answer] | StaticNPC 모델에는 기본적으로 `RigidbodyComponent`와 `TransformComponent`가 모두 포함되어 있습니다. 이 두 컴포넌트가 동시에 존재하는 상태에서 `Position` 값을 직접 변경하면, 두 컴포넌트의 값이 충돌하여 물체가 원하는 방식으로 움직이지 않는 오류가 발생합니다. 따라서 StaticNPC를 스크립트로 직접 이동시키려면, **WorkSpace - NativeModel - StaticNPC**를 선택한 후 프로퍼티 에디터에서 `RigidbodyComponent`의 컨텍스트 메뉴를 통해 * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 용감한 시그너스 기사단 소속 아잘린이 먼저 고통의 미궁으로 출발한 나이트워커 부대에 합류할 수 있도록 택시를 불러봅시다. 부른 택시가 아잘린을 지나치지 않고 아잘린 앞에서 멈춰서 아잘린이 탑승할 수 있도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.gif "Example") # StaticNPC 모델 수정하기 StaticNPC 모델에서 Rigid

[task] | code [pass] | ⏳ 미판정 [title] | Workspace [question] | BaseEnvironment의 NativeScripts 폴더 구조를 이해하고, 확장 컴포넌트를 MyDesk에 저장하도록 설정하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에 따르면, `NativeScripts` 폴더는 `Component`, `Service`, `Logic`, `Event`, `Misc` 하위 폴더로 구성되어 있으며, 이 폴더 내의 모든 스크립트는 삭제할 수 없고, 특성을 변경하려면 해당 스크립트를 확장(Extend)해야 합니다. 확장된 컴포넌트는 `MyDesk` 폴더에 저장됩니다. 문서에 명시된 내용을 기반으로, `NativeScripts`의 `Component` 폴더에 있는 기본 컴포넌트(예: `HealthComponent` 가정)를 확장하여 `MyDesk`에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메이커에서 기본 제공하는 기능을 모아 둔 폴더입니다. 총 2개의 폴더로 구성되어 있습니다. * **NativeScripts** * **NativeModel** **BaseEnvironment**의 폴더 순서를 바꾸거나, 하위 목록을 옮길 수 없습니다. **NativeScripts**의 모든 계층은 복제/삭제할 수 없습니다. **NativeScripts**의 특성을 변경해 사용하려면 해당 스크립트를 확장(Extend)하여 사용해야 합니다. 또한 **NativeModel**은 복제하거나 확장해 활용할 수 있습니다. **BaseEn

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | 이번 가이드가 정상 동작하기 위해 사전에 완료해야 할 이전 가이드의 제목을 1문장 이내로 명시하세요. [answer] | [물체의 이동 Ⅰ](/docs?postId=123) [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 가이드는 [물체의 이동 Ⅰ](/docs?postId=123)을 따라 만든 월드에서 이어서 제작해야 정상적으로 동작합니다. 택시가 아잘린을 태우러 가야하는데 원숭이가 길을 가로 막고 있습니다. `TransformComponent`의 `Translate`를 이용하여 택시를 이동시키고 `RigidbodyComponent`의 `Translate` 함수를 사용하여 원숭이를 밀어내봅시다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/174790801778

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | TweenLineComponent에서 StopType을 Oneway로 설정했는데 엔티티가 목적지에 도착한 뒤에도 계속 움직이는 이유는 무엇인가요? [answer] | `TweenLineComponent`의 `StopType`을 `Oneway`로 설정했음에도 엔티티가 계속 움직이는 현상은 문서에 명시된 동작 방식과 다른 외부 요인 때문일 수 있습니다. 문서에 따르면, `StopType`이 `Oneway`로 설정되면 엔티티는 **편도로 움직이며 목적지에 도착한 후 운동을 종료**해야 합니다. 따라서 이 설정값 자체가 반복 운동이나 왕복 운동을 유발하는 원인은 아닙니다. 엔티티가 계속 움직이는 것으로 보이는 경우, 다음과 같은 사항을 점검해야 합니다. 1. **다른 이동 컴포넌트의 간섭**: [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 목적지까지 선형 운동을 하게 만들 때 사용합니다. 목적지까지 편도, 왕복 운동 여부와 더불어 가·감속, 도달 시 튕김 등 운동 방식을 설정할 수 있습니다. **TweenLineComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | ------ | --- | | TweenType | 기본값은 Linear입니다. 다른 모양의 운동 방식을 선택할 수 있습니다. 선형운동 종류별 설명은 하단의 참고자료를 참고하세요. | | Duration | 목적지까지 도달하는 데 걸리는 시간을 의미합니다. | |

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | 원숭이 엔티티를 배치할 때 선택해야 하는 몬스터 ID와 변경해야 할 엔티티 이름을 표로 정리하세요. [answer] | 원숭이 엔티티를 배치할 때 필요한 정보는 다음과 같습니다. | 항목 | 값 | | :--- | :--- | | **몬스터 ID** | monster-1415 | | **엔티티 이름** | Monkey | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 가이드는 [물체의 이동 Ⅰ](/docs?postId=123)을 따라 만든 월드에서 이어서 제작해야 정상적으로 동작합니다. 택시가 아잘린을 태우러 가야하는데 원숭이가 길을 가로 막고 있습니다. `TransformComponent`의 `Translate`를 이용하여 택시를 이동시키고 `RigidbodyComponent`의 `Translate` 함수를 사용하여 원숭이를 밀어내봅시다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/174790801778

[task] | two_turn [pass] | ⏳ 미판정 [title] | CameraService를 활용한 카메라 제어 [question] | `CurrentZoomRatio` 프로퍼티와 `GetCurrentCameraComponent()` 함수를 활용해 카메라 상태를 동적으로 확인하거나 조작하는 방법을 알고 싶다. [answer] | `CameraService`를 통해 카메라의 현재 줌 상태와 카메라 컴포넌트 정보를 조회하는 방법은 다음과 같습니다. ### 1. 현재 줌 비율 확인: `CurrentZoomRatio` `CurrentZoomRatio`는 현재 카메라의 줌 비율을 **퍼센트(%)** 단위로 반환하는 **읽기 전용(read only)** 프로퍼티입니다. 기본값은 `100`입니다. * **주의:** 이 프로퍼티는 읽기 전용이므로 값을 직접 변경할 수 없습니다. 줌을 변경하려면 `ZoomTo()` 함수를 사용해야 합니다. * **접근 방법:** [followup] | `CurrentZoomRatio`가 읽기 전용이므로, 특정 조건(예: 플레이어 이동 속도)에 따라 `ZoomTo()`를 호출하기 전에 현재 줌 비율을 확인하여 중복 제어를 방지하는 로직을 `OnUpdate` 메서드 내에서 어떻게 구현해야 하는지 코드 예시를 만들어 주세요. [followup_answer] | `CurrentZoomRatio`는 읽기 전용 프로퍼티이므로 직접 변경할 수 없으며, `ZoomTo()`를 호출하기 전에 현재 줌 상태를 확인하여 불필요한 반복 호출을 방지하는 로직을 구현할 수 있습니다. 아래 예시는 `OnUpdate` 메서드 내에서 특정 조건(예: 플레이어 이동 속도가 일정 값 이상일 때)이 충족되면 줌을 변경하되, 이미 해당 줌 값으로 설정된 상태라면 `ZoomTo()` 호출을 생략하는 방식을 보여줍니다. > **참고:** 문서에는 플레이어 이동 속도를 직접 조회하는 `CameraService` API가 명 [scores] | [judge_reason] | [source_doc] | `ZoomReset()`는 변경된 줌 값을 초깃값으로 되돌리는 함수입니다. `ZoomReset()`을 사용하면 `ZoomTo()`를 이용해 줌 값을 변경하더라도, 다시 초깃값으로(100%) 맞출 수 있습니다. `ZoomTo()` 예시에 이어 `ZoomReset()`을 사용해 5초 뒤 줌 값을 100%로 변경하는 예시 코드입니다. 이해를 돕기 위해 **TimerService**를 활용했습니다. [TimerService](/docs?postId=47%7B%22target%22:%22\_self%22%7D) 가이드를 참고하세요. ``

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | 택시와 아잘린을 배치할 때 엔티티 이름을 변경하는 것이 스크립트에서 엔티티를 호출하는 경로에 어떤 영향을 미치는지 설명해 주세요. [answer] | 엔티티의 이름을 변경하면, 스크립트에서 해당 엔티티를 호출할 때 사용하는 경로가 간결해집니다. 참고 문서의 '택시와 아잘린 배치' 섹션에서 엔티티 이름을 **Taxi**와 **Azallin**으로 변경하도록 안내하며, 이는 "보다 쉽게 식별하고, 스크립트에서 간결한 경로로 엔티티를 호출할 수 있기 때문"이라고 설명하고 있습니다. 즉, 기본 이름 대신 명확하고 짧은 이름을 부여하면 `_EntityService:GetEntityByPath`와 같은 메서드를 사용할 때 복잡한 경로 대신 엔티티 이름 기반의 짧은 경로를 사용할 수 있어 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 용감한 시그너스 기사단 소속 아잘린이 먼저 고통의 미궁으로 출발한 나이트워커 부대에 합류할 수 있도록 택시를 불러봅시다. 부른 택시가 아잘린을 지나치지 않고 아잘린 앞에서 멈춰서 아잘린이 탑승할 수 있도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.gif "Example") # StaticNPC 모델 수정하기 StaticNPC 모델에서 Rigid

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | TaxiTransform 프로퍼티의 타입을 Component로 설정한 이유는 무엇인가요? [answer] | `TaxiTransform` 프로퍼티의 타입을 `Component`로 설정하는 이유는 엔티티의 위치를 변경하기 위해 필요한 **`TransformComponent`** 객체를 참조하고 조작하기 위함입니다. 메이플스토리 월드에서 맵에 배치된 모든 엔티티는 위치 정보(x, y, z)를 `TransformComponent`의 `Position` 값으로 관리합니다. 물체를 이동시키려면 이 `TransformComponent`에 접근하여 `Position` 값을 수정해야 하므로, 스크립트에서 해당 컴포넌트 자체를 저장할 수 있도록 타입을 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 택시를 이동시키기 위해서는 `TransformComponent`의 **Position** 값을 변경해야 합니다. 맵에 배치되는 모든 엔티티는 위치 정보를 가지고 있습니다. 이 위치 정보는 TransformComponent에서 Position x, y, z 값으로 표현됩니다. 오른쪽으로 이동시키기 위해서는 x 값이 커지도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.g

[task] | two_turn [pass] | ⏳ 미판정 [title] | CameraService를 활용한 카메라 제어 [question] | 문에 닿았을 때 발생하는 `TriggerEnterEvent` 내에서 카메라 제어가 어떻게 트리거되는지 이해하고 싶으며, 이 이벤트를 다른 객체나 서비스와 결합할 수 있는지 궁금하다. [answer] | `TriggerEnterEvent`는 특정 트리거 영역에 엔티티가 진입할 때 발생하는 이벤트입니다. 이 이벤트를 처리하는 핸들러 안에서 `_CameraService` 메서드를 호출함으로써 카메라 제어를 트리거할 수 있습니다. 문서에 제시된 예시는 `HandleTriggerEnterEvent` 안에서 `_CameraService:ZoomTo(150, 5)`를 호출하여 5초 동안 줌을 150%로 변경하고, `_TimerService:SetTimerOnce`를 사용하여 10초 뒤(줌 인 5초 + 유지 5초) `_CameraService [followup] | 만약 `TriggerEnterEvent`가 클라이언트와 서버 양쪽에서 동시에 발생한다고 가정할 때, `_CameraService`의 줌 제어가 어떤 실행 공간(Execution Space)에서 처리되어야 하는지, 그리고 `HandleTriggerEnterEvent` 핸들러에 `[client only]` 또는 `[server only]` 속성을 붙이는 것이 적절한지 API 문서의 제한 사항을 근거로 설명해 주세요. [followup_answer] | 제공된 참고 문서에 따르면, `HandleTriggerEnterEvent` 핸들러는 `[self]` 속성을 가지고 있으며, 네이티브 이벤트 정보(Native Event Sender Info)에 "Space: Server, Client"라고 명시되어 있습니다. 이는 해당 이벤트가 서버와 클라이언트 양쪽에서 발생함을 의미합니다. 다만, 문서에는 `_CameraService` 메서드(`ZoomTo`, `ZoomReset`, `SwitchCameraTo` 등)가 특정 실행 공간(예: `[server only]` 또는 `[client on [scores] | [judge_reason] | [source_doc] | `ZoomReset()`는 변경된 줌 값을 초깃값으로 되돌리는 함수입니다. `ZoomReset()`을 사용하면 `ZoomTo()`를 이용해 줌 값을 변경하더라도, 다시 초깃값으로(100%) 맞출 수 있습니다. `ZoomTo()` 예시에 이어 `ZoomReset()`을 사용해 5초 뒤 줌 값을 100%로 변경하는 예시 코드입니다. 이해를 돕기 위해 **TimerService**를 활용했습니다. [TimerService](/docs?postId=47%7B%22target%22:%22\_self%22%7D) 가이드를 참고하세요. ``

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | OnUpdate 함수에서 Position 값을 변경할 때 왜 로컬 변수 pos를 선언해서 처리해야 하는가요? [answer] | mLua에서 `TransformComponent`의 `Position` 값을 변경할 때 로컬 변수 `pos`를 선언해서 처리하는 주된 이유는 **값의 참조와 대입 방식을 명확히 하기 위해서**입니다. 제공된 문서의 예제 코드에서는 다음과 같이 작성합니다. ```lua local pos = self.TaxiTransform.Position pos.x = pos.x + 0.02 self.TaxiTransform.Position = pos ``` 이 과정은 다음 두 단계로 나뉩니다. 1. **현재 위치 가져오기**: `local [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 택시를 이동시키기 위해서는 `TransformComponent`의 **Position** 값을 변경해야 합니다. 맵에 배치되는 모든 엔티티는 위치 정보를 가지고 있습니다. 이 위치 정보는 TransformComponent에서 Position x, y, z 값으로 표현됩니다. 오른쪽으로 이동시키기 위해서는 x 값이 커지도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.g

[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | OnBeginPlay에서 self.Entity.TransformComponent를 TaxiTransform 프로퍼티에 할당하고 OnUpdate에서 Position을 변경하는 TaxiComponent 스크립트를 작성해줘 [answer] | 참고 문서의 지침에 따라, `TaxiTransform` 프로퍼티에 `TransformComponent`를 할당하고 `OnUpdate`에서 `Position` 값을 변경하는 `TaxiComponent` 스크립트는 다음과 같습니다. ```lua Property: [Sync] Component TaxiTransform = nil Method: [server only] void OnBeginPlay() { local taxi = self.Entity self.TaxiTransform = taxi.TransformCompo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 택시를 이동시키기 위해서는 `TransformComponent`의 **Position** 값을 변경해야 합니다. 맵에 배치되는 모든 엔티티는 위치 정보를 가지고 있습니다. 이 위치 정보는 TransformComponent에서 Position x, y, z 값으로 표현됩니다. 오른쪽으로 이동시키기 위해서는 x 값이 커지도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.g

[task] | code [pass] | ⏳ 미판정 [title] | Workspace [question] | MyDesk의 Create Scripts > Create Component로 만든 스크립트에서 [multicast] 메서드를 정의하여 클라이언트와 서버 모두에서 log("Hello")를 출력하고, _TimerService:SetTimerOnce를 사용해 2초 후 실행되는 스크립트를 작성해줘 [answer] | 요청하신 `MyDesk > Create Scripts > Create Component`로 생성한 스크립트 컴포넌트에서 `[multicast]` 메서드를 사용하여 클라이언트와 서버 모두에서 로그를 출력하고, 2초 후 타이머가 실행되도록 작성한 mLua 코드는 다음과 같습니다. ```lua Property: [None] number testValue = 0 Method: [multicast] void StartHelloAndTimer() { log("Hello") local callback = functio [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | 목록 | 설명 | | --- | --- | | Duplicate | DefaultPlayer를 복제한 모델을 생성합니다. | | Open | Player의 상태 혹은 변경 점을 확인하기 위해 사용합니다.| | Add Component | DefaultPlayer에 컴포넌트를 추가합니다. | | Add New Component | 새로운 컴포넌트를 생성한 후 DefaultPlayer에 추가합니다. | | Extend | DefaultPlayer의 확장 모델을 생성합니다. | | Copy Entry ID | DefaultPlayer

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | 택시 스크립트에서 아잘린의 위치를 기준으로 택시를 이동시킬 때, 두 엔티티의 TransformComponent를 어떻게 참조해야 하는지 알려주세요. [answer] | 참고 문서에 포함된 예제 코드를 분석하면, 다른 엔티티의 `TransformComponent`를 참조하는 구체적인 코드 패턴(예: `_EntityService`를 이용한 경로 기반 참조)은 명시되어 있지 않습니다. 문서의 예제에서는 현재 스크립트가 부착된 엔티티 자체의 위치(`self.Entity.TransformComponent.Position`)를 조회하거나, 이벤트 인자로 전달된 엔티티(`monsterEntity.TransformComponent.Position`)의 위치를 조회하는 방식만 보여줍니다. 따라서 "아잘린의 위치 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 용감한 시그너스 기사단 소속 아잘린이 먼저 고통의 미궁으로 출발한 나이트워커 부대에 합류할 수 있도록 택시를 불러봅시다. 부른 택시가 아잘린을 지나치지 않고 아잘린 앞에서 멈춰서 아잘린이 탑승할 수 있도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.gif "Example") # StaticNPC 모델 수정하기 StaticNPC 모델에서 Rigid

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | TransformComponent의 Position 값을 직접 수정하는 방식과 Translate() 함수를 사용하는 방식의 차이점은 무엇인가요? [answer] | 제공된 참고 문서에 따르면, 두 방식 모두 택시(엔티티)를 이동시키는 데 사용되지만, 적용하는 대상과 코드의 구조가 다릅니다. **1. Position 값 직접 수정 방식** * **원리:** `TransformComponent`의 `Position` 프로퍼티에서 현재 x, y, z 값을 가져와서 원하는 방향으로 값을 변경한 뒤, 다시 `Position`에 대입하는 방식입니다. * **특징:** 특정 방향(예: 오른쪽으로 이동)을 만들려면 해당 축(예: x)의 값을 직접 증가시키거나 감소시켜야 합니다. * **코드 예시 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 택시를 이동시키기 위해서는 `TransformComponent`의 **Position** 값을 변경해야 합니다. 맵에 배치되는 모든 엔티티는 위치 정보를 가지고 있습니다. 이 위치 정보는 TransformComponent에서 Position x, y, z 값으로 표현됩니다. 오른쪽으로 이동시키기 위해서는 x 값이 커지도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.g

[task] | code [pass] | ⏳ 미판정 [title] | Workspace [question] | BaseEnvironment의 NativeModel에 Add Component로 추가한 스크립트에서 [server only] 메서드 OnUpdate를 활용해 self.Entity.TransformComponent.Position의 Y 좌표를 10초 후 5.0으로 변경하는 스크립트를 작성해줘 [answer] | BaseEnvironment의 NativeModel에 추가한 스크립트에서 `OnUpdate`를 사용하여 10초 후 Y 좌표를 5.0으로 변경하는 로직은, 매 프레임마다 경과 시간을 추적하고 10초가 지난 시점에 해당 값을 적용하는 방식으로 구현할 수 있습니다. 아래는 요청하신 조건을 만족하는 mLua 스크립트입니다. ```lua Property: [None] number elapsedTime = 0 [None] boolean isChanged = false Method: [server only] void OnBeginPlay( [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | | 목록 | 설명 | | --- | --- | | Duplicate | DefaultPlayer를 복제한 모델을 생성합니다. | | Open | Player의 상태 혹은 변경 점을 확인하기 위해 사용합니다.| | Add Component | DefaultPlayer에 컴포넌트를 추가합니다. | | Add New Component | 새로운 컴포넌트를 생성한 후 DefaultPlayer에 추가합니다. | | Extend | DefaultPlayer의 확장 모델을 생성합니다. | | Copy Entry ID | DefaultPlayer

[task] | single_turn [pass] | ⏳ 미판정 [title] | 엔티티 구간 이동시키기 [question] | DestinationCoordinateType을 Absolute로 설정할 때 좌표 값이 Scene의 원점 기준이 아니라 다른 기준에 맞춰져 보이는 이유는 무엇인가요? [answer] | `DestinationCoordinateType`을 `Absolute`로 설정했을 때 좌표 값이 Scene의 원점(0,0) 기준이 아닌 것처럼 보이는 이유는, **`Absolute`가 엔티티의 현재 위치 또는 다른 기준점을 기준으로 절대 좌표를 해석하기 때문**이 아닙니다. 참고 문서에 따르면 `DestinationCoordinateType`의 `Absolute`는 **"목적지 위치로 입력한 값을 절대 좌표로 인식합니다"**라고 명시되어 있습니다. 이는 Scene의 원점(0,0)을 기준으로 한 좌표계를 의미합니다. 만약 Scen [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 원점을 기준으로 목적지까지 선형 운동을 하게 만들 때 사용합니다. 목적지까지 편도, 왕복 운동 여부와 더불어 가·감속, 도달 시 튕김 등 운동 방식을 설정할 수 있습니다. **TweenLineComponent**의 프로퍼티를 살펴봅시다. | 프로퍼티 명 | 설명 | | ------ | --- | | TweenType | 기본값은 Linear입니다. 다른 모양의 운동 방식을 선택할 수 있습니다. 선형운동 종류별 설명은 하단의 참고자료를 참고하세요. | | Duration | 목적지까지 도달하는 데 걸리는 시간을 의미합니다. | |

[task] | two_turn [pass] | ⏳ 미판정 [title] | CameraService를 활용한 카메라 제어 [question] | `ZoomTo()`와 `ZoomReset()`의 동작 원리와 `TimerService`를 연동하여 줌 효과를 제어하는 방식이 궁금하다. [answer] | `ZoomTo()`와 `ZoomReset()`는 `_CameraService`를 통해 카메라의 줌 비율을 제어하는 함수입니다. ### 1. `ZoomTo()`와 `ZoomReset()`의 동작 원리 * **`ZoomTo(percent, duration)`**: * 카메라의 줌을 지정한 `percent`(퍼센트) 값으로 변경합니다. * 두 번째 인자인 `duration`(초)은 줌이 변경되기까지 걸리는 시간입니다. * 예를 들어, `ZoomTo(150, 5)`는 5초 동안 카메라를 150%로 확 [followup] | `TimerService`의 타이머 시간(10초)과 `ZoomTo`의 지속 시간(5초)이 왜 그렇게 설정되어야 하는지, 그리고 `ZoomReset()` 호출 시점이 5초가 아닌 다른 값으로 바뀌면 어떤 현상이 일어나는지 구체적으로 설명해 주세요. [followup_answer] | `TimerService`의 타이머 시간(10초)과 `ZoomTo`의 지속 시간(5초)이 그렇게 설정된 이유는 **줌 변경 애니메이션이 완료된 후, 원하는 만큼의 시간 동안 확대된 상태를 유지하기 위함**입니다. 구체적인 시간 계산과 시나리오는 다음과 같습니다. ### 1. 시간 설정의 논리 (10초 = 5초 + 5초) * **`ZoomTo(150, 5)`**: 카메라 줌이 100%에서 150%로 변하는 데 **5초**가 걸립니다. * **목표**: "5초간 150% 확대되었다가, **5초 뒤** 다시 원래대로 돌아오는 [scores] | [judge_reason] | [source_doc] | `ZoomReset()`는 변경된 줌 값을 초깃값으로 되돌리는 함수입니다. `ZoomReset()`을 사용하면 `ZoomTo()`를 이용해 줌 값을 변경하더라도, 다시 초깃값으로(100%) 맞출 수 있습니다. `ZoomTo()` 예시에 이어 `ZoomReset()`을 사용해 5초 뒤 줌 값을 100%로 변경하는 예시 코드입니다. 이해를 돕기 위해 **TimerService**를 활용했습니다. [TimerService](/docs?postId=47%7B%22target%22:%22\_self%22%7D) 가이드를 참고하세요. ``

[task] | single_turn [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | SpriteRendererComponent의 FlipX 값을 True로 변경하는 것이 택시의 이동 방향이나 로직에 직접적인 영향을 주는지, 아니면 단순히 외형만 변경하는 것인지 차이를 알고 싶습니다. [answer] | 제공된 문서에 따르면, `SpriteRendererComponent`의 `FlipX` 값을 `True`로 변경하는 것은 택시의 이동 방향이나 로직에 직접적인 영향을 주지 않으며, **단순히 외형(스프라이트 방향)만 변경**합니다. 문서에서 이 설정을 하는 이유는 다음과 같이 설명됩니다. 1. **배치 방향 일치:** 택시 엔티티(`npc-3539`)를 맵 왼쪽에 배치할 때, `FlipX`를 `True`로 설정하여 택시의 외관이 이동 방향(또는 원하는 시선 방향)을 향하도록 맞춥니다. 2. **로직과의 무관성:** 문서의 '택 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 용감한 시그너스 기사단 소속 아잘린이 먼저 고통의 미궁으로 출발한 나이트워커 부대에 합류할 수 있도록 택시를 불러봅시다. 부른 택시가 아잘린을 지나치지 않고 아잘린 앞에서 멈춰서 아잘린이 탑승할 수 있도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.gif "Example") # StaticNPC 모델 수정하기 StaticNPC 모델에서 Rigid

[task] | instruction_following [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅱ [question] | 택시가 원숭이를 밀어내는 조건을 판단하는 OnUpdate 로직을 3문장 이내로 요약해서 설명하세요. [answer] | `IsHit`가 `false`일 때만 택시와 원숭이의 현재 위치를 비교합니다. 택시의 x좌표가 원숭이의 x좌표에서 0.8을 뺀 값보다 크면, 원숭이의 Rigidbody에 `(8, 8)` 힘 벡터를 적용해 밀어냅니다. 이후 `IsHit`를 `true`로 변경하여 반복적인 힘 적용을 방지합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | RigidbodyComponent를 활용해 질주하는 택시가 원숭이를 밀어낼 수 있도록 만들어 봅시다. 원숭이를 밀어내기 위해서는 원숭이가 택시 위치를 확인하고, 택시가 원숭이게 근접하면 원숭이의 RigidbodyComponent에 힘을 주도록 만들어봅시다. 1. **Workspace - MyDesk - Create Scripts - Create Component**을 선택해 새 스크립트 컴포넌트를 추가하고 이름을 **Monkey**로 변경합니다. 2. **Monkey** 엔티티에 **Monkey 컴포넌트**를 추가합니

[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | OnUpdate 함수에서 TransformComponent.Position의 x값을 0.02씩 증가시켜 택시를 오른쪽으로 이동시키는 TaxiComponent 스크립트를 작성해줘 [answer] | 택시를 오른쪽으로 이동시키려면 `TransformComponent`의 `Position` x 값을 변경해야 합니다. 아래는 요청하신 `TaxiComponent` 스크립트입니다. ```lua Property: [Sync] Component TaxiTransform = nil Method: [server only] void OnBeginPlay() { self.TaxiTransform = self.Entity.TransformComponent } [server only] void OnUpdate(number delta) { [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 택시를 이동시키기 위해서는 `TransformComponent`의 **Position** 값을 변경해야 합니다. 맵에 배치되는 모든 엔티티는 위치 정보를 가지고 있습니다. 이 위치 정보는 TransformComponent에서 Position x, y, z 값으로 표현됩니다. 오른쪽으로 이동시키기 위해서는 x 값이 커지도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.g

[task] | code [pass] | ⏳ 미판정 [title] | 물체의 이동 Ⅰ [question] | OnUpdate 함수에서 TransformComponent:Translate(0.02, 0) 메서드를 호출하여 택시를 이동시키는 TaxiComponent 스크립트를 작성해줘 [answer] | 택시를 이동시키기 위해 `TransformComponent`의 위치를 변경하는 `TaxiComponent` 스크립트입니다. 질문하신 대로 `OnUpdate` 함수 내에서 `Translate` 메서드를 사용하여 택시를 오른쪽(+x 방향)으로 0.02씩 이동시키도록 작성했습니다. ```lua Property: [None] Component TaxiTransform = nil Method: [server only] void OnBeginPlay() { self.TaxiTransform = self.Entity.Transfor [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 택시를 이동시키기 위해서는 `TransformComponent`의 **Position** 값을 변경해야 합니다. 맵에 배치되는 모든 엔티티는 위치 정보를 가지고 있습니다. 이 위치 정보는 TransformComponent에서 Position x, y, z 값으로 표현됩니다. 오른쪽으로 이동시키기 위해서는 x 값이 커지도록 만들어야 합니다. ![[object Object]](https://mod-file.dn.nexoncdn.co.kr/bbs/1747902531299ee5bec9350ac458d9f255a76eba57191.g

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