[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic [question] | MoveOffset 메서드를 통해 Entity를 현재 위치에서 Vector2(10, 0)만큼 0.5초간 EaseType.EaseOut 보간으로 이동시키는 스크립트를 작성해줘 [answer] | `TweenLogic.MoveOffset` 메서드를 사용하여 요청하신 조건에 맞는 스크립트를 작성하면 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { _TweenLogic:MoveOffset(self.Entity, Vector2(10, 0), 0.5, EaseType.EaseOut) } ``` **설명:** * `_TweenLogic:MoveOffset`는 엔티티를 현재 위치 기준으로 `offset`만큼 이동시키는 트윈을 생성하고 자동으로 재생합니다. * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Tween 관련 기능들을 제공합니다. # Methods - **float Ease(float startValue, float endValue, float duration, EaseType type, float tweenTime)** 시작값과 끝값 사이의 보간을 수행합니다. tweenTime을 duration으로 나눈 값으로 보간을 수행합니다. duration이 0인 경우 endValue를 반환하며, tweenTime이 0보다 작거나 duration보다 큰 경우 예상치 못한 값이 반환될 수 있습니다. - **Tweener Ma
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | IsClient()와 IsServer() 함수는 어떤 상황에서 각각 true를 반환하며, 이 정보로 서버와 클라이언트에서 실행되는 로직을 어떻게 분리할 수 있나요? [answer] | `IsClient()`와 `IsServer()` 함수는 스크립트가 현재 어떤 실행 환경(클라이언트 또는 서버)에서 실행되고 있는지를 판별할 때 사용됩니다. **반환 값 기준** * **`IsClient()`**: 현재 실행 환경이 **클라이언트**인 경우 `true`를 반환합니다. * **`IsServer()`**: 현재 실행 환경이 **서버**인 경우 `true`를 반환합니다. **서버/클라이언트 로직 분리 방법** 이 함수들을 활용하여 동일한 이벤트 핸들러나 메서드 내에서 실행 공간에 따라 동작을 다르게 처리할 수 있 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ffset을 축으로 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener RotateTo(Entity entity, float angle, float duration, EaseType type)** entity를 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener ScaleTo(Entity entity, Vector2 targetScale, float duration, EaseType type)** entity를 targetScal
[task] | code [pass] | ⏳ 미판정 [title] | TimeSpan [question] | OnBeginPlay에서 _TimerService:SetTimerOnce를 사용하여 10초 후 실행되는 콜백에서 TimeSpan.FromSeconds(10)으로 생성된 시간을 ToFormattedString("mm\\:ss") 포맷으로 변환하여 log에 출력하는 스크립트를 작성해줘 [answer] | 요청하신 내용을 바탕으로, `OnBeginPlay`에서 10초 후 콜백이 실행되어 `TimeSpan.FromSeconds(10)`으로 생성된 시간을 지정된 포맷으로 변환해 로그에 출력하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { _TimerService:SetTimerOnce(function() local timeSpan = TimeSpan.FromSeconds(10) local formattedTime = timeSp [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | - **TimeSpan Duration()** 개체의 절댓값으로 TimeSpan을 생성해 반환합니다. - **TimeSpan Negate()** 개체의 부정값으로 TimeSpan을 생성해 반환합니다. - **string ToFormattedString(string format)** TimeSpan을 문자열로 변환해 반환합니다. format에는 표준 TimeSpan 서식 지정자 및 사용자 지정 TimeSpan 서식 지정자가 포함될 수 있습니다. - **string ToFormattedString(string format,
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | PlayTween의 tweenCallback에서 self.Entity.TransformComponent.Position을 수정할 때 Vector2와 Vector3 변환을 왜 해야 하나요? [answer] | `PlayTween` 함수의 `tweenCallback`에서 `Vector2`와 `Vector3` 간 변환이 필요한 이유는 **타입의 차이** 때문입니다. 1. **`PlayTween`의 입력/출력 타입**: `_TweenLogic:PlayTween`은 2D 좌표계를 기반으로 동작하며, 시작 위치와 종료 위치를 `Vector2`로 받습니다. 따라서 이 함수가 콜백(`tweenCallback`)에 전달하는 `tweenValue` 역시 **`Vector2`** 타입입니다. 2. **`TransformComponent.Positio [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Examples #### MoveOffset `MoveOffset()` 함수를 활용해 움직임을 구현하는 예제입니다. ```lua Method: [server only] void OnBeginPlay () { _TweenLogic:MoveOffset(self.Entity, Vector2(6,0), 6, EaseType.QuartEaseIn) } ``` #### PlayTween `PlayTween()` 함수를 활용해 움직임을 구현하는 예제입니다. ```lua Method: [server only] void OnBegi
[task] | single_turn [pass] | ⏳ 미판정 [title] | FootholdLeaveEvent [question] | FootholdLeaveEvent의 생성자에서 entity와 foothold 인자가 nil로 기본값을 가지고 있는데, 이 기본값을 사용하는 것이 어떤 상황에서 유용한가요? [answer] | `FootholdLeaveEvent`의 생성자에서 `entity`와 `foothold` 인자의 기본값이 `nil`인 것은 주로 **이벤트를 직접 생성하는 경우**에 유용합니다. 메이플스토리 월드(mLua)의 이벤트 시스템에서 이벤트 객체는 보통 엔진(서비스)이 발생시키는 것입니다. 하지만 스크립트 작성자가 특정 상황에서 이벤트를 **수동으로 생성하여 발생시키거나**, 이벤트 핸들러 로직을 테스트하거나, 이벤트 데이터를 커스텀으로 만들어 전달해야 할 때 이 기본값이 중요합니다. 구체적으로 다음과 같은 상황에서 유용합니다: 1. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 발판에서 떨어졌을 때 발생하는 이벤트입니다. 이 Event는 아래 API에 의해 발생합니다. * RigidbodyComponent <img src="https://img.shields.io/static/v1?label=Space&message=Server,Client&color=c4a484" alt="custom" title="Server, Client에서 이벤트가 발생합니다." data-nodeid="4"> # Properties - **Entity Entity** 발판에서 떨어진 엔티티입니다. - **Footh
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | MoveTo와 MoveOffset의 차이점을 이해했는데, 이 둘 중 하나로 엔티티를 이동시킬 때 EaseType을 어떻게 설정해야 부드러운 움직임이 나오나요? [answer] | `MoveTo`와 `MoveOffset` 모두 `duration`(총 이동 시간)과 `EaseType`(이동 곡선) 인자를 받습니다. 부드러운 움직임을 위해 `EaseType`을 설정하는 방법은 다음과 같습니다. ### EaseType 설정 가이드 메이플스토리 월드 mLua 문서에서 `EaseType`의 구체적인 상수 목록(예: `Linear`, `QuadEaseIn` 등)은 명시되어 있지 않지만, 제공된 예제 코드에서 **`EaseType.QuartEaseIn`** 이 사용된 것을 확인할 수 있습니다. 일반적인 Tweenin [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Tween 관련 기능들을 제공합니다. # Methods - **float Ease(float startValue, float endValue, float duration, EaseType type, float tweenTime)** 시작값과 끝값 사이의 보간을 수행합니다. tweenTime을 duration으로 나눈 값으로 보간을 수행합니다. duration이 0인 경우 endValue를 반환하며, tweenTime이 0보다 작거나 duration보다 큰 경우 예상치 못한 값이 반환될 수 있습니다. - **Tweener Ma
[task] | two_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | `ScaleTo` 메서드의 `targetScale`에 `Vector2` 타입을 전달할 때, X축과 Y축을 독립적으로 다른 값으로 지정하여 비정방 비율(Skew) 효과와 동일한 결과를 낼 수 있나요? [answer] | 제공된 문서에 따르면, `ScaleTo` 메서드는 `entity`를 `targetScale`(Vector2 타입)의 값으로 확대하거나 축소하는 Tweener를 생성하고 재생합니다. `Vector2`는 X와 Y 두 가지 성분을 가진 벡터 타입이므로, `ScaleTo` 호출 시 X축과 Y축을 독립적으로 다른 값으로 지정할 수 있습니다. (예: `Vector2(2, 1)`) **결과에 대한 설명:** 문서에는 `ScaleTo`가 단순히 엔티티의 스케일(크기)을 해당 값으로 변경한다고만 기술되어 있습니다. 질문에서 언급한 '비정방 비율 [followup] | 비정방 비율 효과를 원할 때 `ScaleTo`만 사용하는 것이 적합한지, 아니면 다른 트랜스폼 조작이 필요한지 조언해 주세요. [followup_answer] | 제공된 문서에 따르면, `TweenLogic`에서 제공되는 트랜스폼 관련 메서드는 다음과 같습니다. 1. **`RotateTo`**: 엔티티를 특정 각도만큼 회전시킵니다. 2. **`ScaleTo`**: 엔티티를 특정 `Vector2` 값으로 확대하거나 축소합니다. **조언:** 1. **`ScaleTo`의 기능 한계**: `ScaleTo`는 `Vector2` 타입의 `targetScale`을 매개변수로 받으며, 이를 통해 X축과 Y축의 스케일 값을 독립적으로 지정할 수 있습니다. 따라서 X축만 크게 늘리거나 Y축 [scores] | [judge_reason] | [source_doc] | ffset을 축으로 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener RotateTo(Entity entity, float angle, float duration, EaseType type)** entity를 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener ScaleTo(Entity entity, Vector2 targetScale, float duration, EaseType type)** entity를 targetScal
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | Ease 함수를 OnUpdate에서 직접 호출하여 트윈을 구현할 때 elapsedTime이 tweenDuration을 초과하면 어떤 처리를 해야 하나요? [answer] | `Ease()` 함수를 `OnUpdate`에서 직접 호출하여 트윈을 구현할 때, `elapsedTime`이 `tweenDuration`을 초과하면 트윈이 완료된 것으로 간주하고 트윈 처리를 중단해야 합니다. 구체적인 처리 방법은 다음과 같습니다. 1. **시간 초과 판별**: 매 프레임마다 `delta`를 `elapsedTime`에 누적합니다. 2. **상한 설정 (Clamp)**: `elapsedTime`이 `tweenDuration`을 넘으면, `elapsedTime`을 `tweenDuration` 값으로 고정(상한 설정 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Examples #### MoveOffset `MoveOffset()` 함수를 활용해 움직임을 구현하는 예제입니다. ```lua Method: [server only] void OnBeginPlay () { _TweenLogic:MoveOffset(self.Entity, Vector2(6,0), 6, EaseType.QuartEaseIn) } ``` #### PlayTween `PlayTween()` 함수를 활용해 움직임을 구현하는 예제입니다. ```lua Method: [server only] void OnBegi
[task] | two_turn [pass] | ⏳ 미판정 [title] | TimeSpan [question] | TimeSpan 객체의 생성과 변환 메서드(FromDays, ToFormattedString 등)는 mLua에서 어떻게 사용하나요? [answer] | mLua에서 `TimeSpan` 객체를 생성하고 변환하는 방법은 다음과 같습니다. ### 1. TimeSpan 객체 생성 `TimeSpan`은 특정 시간 단위를 나타내는 정적 메서드를 사용하여 생성할 수 있습니다. 모든 값은 밀리초 단위로 반올림됩니다. * **FromDays**: 지정된 일 수로 생성 * **FromHours**: 지정된 시간 수로 생성 * **FromMinutes**: 지정된 분 수로 생성 * **FromSeconds**: 지정된 초 수로 생성 * **FromMilliseconds**: 지 [followup] | FromSeconds로 생성한 TimeSpan을 ToFormattedString으로 출력할 때 format 문자열에 표준 서식 지정자를 적용하는 구체적인 코드 예제를 보여주세요. [followup_answer] | `FromSeconds`로 생성한 `TimeSpan` 객체에 `ToFormattedString`의 표준 서식 지정자를 적용하는 구체적인 코드 예제는 다음과 같습니다. 참고 문서의 실제 mLua 예제에서 `"c"`(일반 날짜/시간 서식)와 `"g"`(짧은 날짜/시간 서식) 두 가지 표준 서식 지정자가 사용되고 있음을 확인할 수 있습니다. ```lua Method: [server only] void OnBeginPlay() { -- FromSeconds로 TimeSpan 객체 생성 (예: 45초) local durat [scores] | [judge_reason] | [source_doc] | - **TimeSpan Duration()** 개체의 절댓값으로 TimeSpan을 생성해 반환합니다. - **TimeSpan Negate()** 개체의 부정값으로 TimeSpan을 생성해 반환합니다. - **string ToFormattedString(string format)** TimeSpan을 문자열로 변환해 반환합니다. format에는 표준 TimeSpan 서식 지정자 및 사용자 지정 TimeSpan 서식 지정자가 포함될 수 있습니다. - **string ToFormattedString(string format,
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | MoveOffset 함수와 PlayTween 함수를 사용할 때 각각 어떤 상황에서 선택하는 것이 좋나요? [answer] | `MoveOffset` 함수와 `PlayTween` 함수는 모두 `_TweenLogic`을 통해 엔티티의 움직임을 구현할 때 사용되지만, 구현 방식과 적용 상황에 차이가 있습니다. **1. MoveOffset 함수** * **특징**: 엔티티의 현재 위치를 기준으로 특정 벡터(`Vector2`)만큼의 오프셋을 지정하고, 지속 시간 및 이징 타입(`EaseType`)을 설정하여 이동하게 만듭니다. * **적합한 상황**: 코드를 간결하게 유지하고 싶거나, 복잡한 콜백 함수를 정의하지 않고도 엔티티를 즉시 이동시키고자 할 때 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # Examples #### MoveOffset `MoveOffset()` 함수를 활용해 움직임을 구현하는 예제입니다. ```lua Method: [server only] void OnBeginPlay () { _TweenLogic:MoveOffset(self.Entity, Vector2(6,0), 6, EaseType.QuartEaseIn) } ``` #### PlayTween `PlayTween()` 함수를 활용해 움직임을 구현하는 예제입니다. ```lua Method: [server only] void OnBegi
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | ConnectEvent 메서드를 통해 이벤트를 연결했는데, DisconnectEvent를 호출해도 이벤트 핸들러가 계속 실행되는 원인은 무엇인가요? [answer] | `DisconnectEvent`를 호출해도 이벤트 핸들러가 계속 실행되는 가장 흔한 원인은 **연결할 때 반환받은 `EventHandlerBase` 객체를 정확히 관리하지 않고 있기 때문**입니다. `ConnectEvent`는 연결된 이벤트 정보를 나타내는 `EventHandlerBase` 객체를 반환합니다. `DisconnectEvent`는 이 반환된 객체와 연결된 `key`(또는 `Type`)를 매개변수로 함께 전달해야만 연결을 정상적으로 해제합니다. 원인 및 해결 방법은 다음과 같습니다. ### 1. 원인: 반환된 핸들러 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ffset을 축으로 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener RotateTo(Entity entity, float angle, float duration, EaseType type)** entity를 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener ScaleTo(Entity entity, Vector2 targetScale, float duration, EaseType type)** entity를 targetScal
[task] | single_turn [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | 메이커 환경에서 저장한 데이터가 출시된 월드에서 조회가 안 되는 이유는 무엇인가요? [answer] | 메이커 환경과 출시 환경은 CreatorDataStorage 저장소를 공유하지 않기 때문입니다. CreatorDataStorage는 크리에이터가 소유한 모든 월드에서 사용 가능하고 데이터를 공유하지만, 개발을 위한 메이커 환경과 실제 플레이어가 접속하는 출시 환경은 서로 다른 저장소를 사용합니다. 따라서 메이커 환경에서 저장한 데이터는 출시된 월드에서는 조회할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이 저장소는 크리에이터가 소유한 모든 월드에서 사용 가능하고, 저장된 데이터를 공유합니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 CreatorDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | `GetAndWait`와 `GetAsync`의 반환값 및 콜백 인자 차이를 3문장 이내로 설명하세요. [answer] | `GetAndWait`는 스크립트 실행을 중단시킨 뒤 에러 코드와 데이터 문자열을 직접 반환합니다. 반면 `GetAsync`는 비동기로 처리되며 완료 시 에러 코드, 키, 데이터의 세 가지 인자를 콜백 함수로 전달합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | erOnly]** 입력한 DataStorageKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void DeleteAsync(string key, fu
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | TweenLogic에서 MakeNativeTween과 MakeTween을 사용할 때 각각의 차이점과 성능 차이가 궁금합니다. [answer] | `MakeNativeTween`과 `MakeTween`의 주요 차이점과 성능 차이는 다음과 같습니다. **1. 동작 방식 차이** * **MakeNativeTween**: 네이티브 컴포넌트(Native Component)의 메서드를 자동으로 호출하여 보간을 수행합니다. * `targetComponent` 인자에 **네이티브 컴포넌트만** 지정할 수 있습니다. * `methodName` 인자에는 해당 컴포넌트에 존재하는 메서드 중 **리턴 타입이 `void`이고, 매개변수가 `float` 하나**인 메서드를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Tween 관련 기능들을 제공합니다. # Methods - **float Ease(float startValue, float endValue, float duration, EaseType type, float tweenTime)** 시작값과 끝값 사이의 보간을 수행합니다. tweenTime을 duration으로 나눈 값으로 보간을 수행합니다. duration이 0인 경우 endValue를 반환하며, tweenTime이 0보다 작거나 duration보다 큰 경우 예상치 못한 값이 반환될 수 있습니다. - **Tweener Ma
[task] | code [pass] | ⏳ 미판정 [title] | FootholdLeaveEvent [question] | RigidbodyComponent 에서 FootholdLeaveEvent 를 수신하여 이벤트의 Entity 속성으로 접근한 엔티티의 이름과 Foothold 속성으로 접근한 발판 ID 를 log 함수로 출력하는 스크립트를 작성해줘 [answer] | `FootholdLeaveEvent`는 `RigidbodyComponent`에서 발생하는 이벤트이며, 이벤트 객체를 통해 `Entity`와 `Foothold` 속성에 접근할 수 있습니다. 요청하신 내용을 반영하여 엔티티의 이름과 발판 ID를 로그로 출력하는 스크립트는 다음과 같습니다. ```lua Event Handler: [self] HandleFootholdLeaveEvent (FootholdLeaveEvent event) { --------------- Native Event Sender Info -------------- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 발판에서 떨어졌을 때 발생하는 이벤트입니다. 이 Event는 아래 API에 의해 발생합니다. * RigidbodyComponent <img src="https://img.shields.io/static/v1?label=Space&message=Server,Client&color=c4a484" alt="custom" title="Server, Client에서 이벤트가 발생합니다." data-nodeid="4"> # Properties - **Entity Entity** 발판에서 떨어진 엔티티입니다. - **Footh
[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic [question] | IsServer()로 서버 실행 환경을 확인한 후, TweenLogic의 ScaleTo 메서드로 엔티티를 0.5배로 축소하는 스크립트를 작성해줘 [answer] | `IsServer()`는 현재 스크립트가 서버에서 실행되고 있는지 확인하는 데 사용되며, `TweenLogic`의 `ScaleTo` 메서드를 통해 엔티티를 지정된 스케일로 변경할 수 있습니다. 요청하신 대로 서버 환경에서만 실행되며 엔티티를 0.5배로 축소하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void ShrinkEntity() { if self:IsServer() then local targetScale = Vector2(0.5, 0.5) loca [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ffset을 축으로 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener RotateTo(Entity entity, float angle, float duration, EaseType type)** entity를 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener ScaleTo(Entity entity, Vector2 targetScale, float duration, EaseType type)** entity를 targetScal
[task] | code [pass] | ⏳ 미판정 [title] | FootholdLeaveEvent [question] | RigidbodyComponent 에서 FootholdLeaveEvent 를 수신하여 이벤트의 Foothold 속성 값이 특정 ID 와 일치할 경우에만 "발판에서 떨어졌습니다" 라는 메시지를 log 함수로 출력하는 스크립트를 작성해줘 [answer] | RigidbodyComponent에서 발생하는 `FootholdLeaveEvent`는 `[self]` 이벤트 핸들러를 통해 수신할 수 있습니다. 이벤트 객체의 `Foothold` 속성을 확인하여 특정 ID와 일치하는지 판단하고, 조건이 충족되면 로그를 출력하는 스크립트는 다음과 같습니다. ```lua Property: [None] string TargetFootholdId = "specific_id" Event Handler: [self] HandleFootholdLeaveEvent (FootholdLeaveEvent event [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 발판에서 떨어졌을 때 발생하는 이벤트입니다. 이 Event는 아래 API에 의해 발생합니다. * RigidbodyComponent <img src="https://img.shields.io/static/v1?label=Space&message=Server,Client&color=c4a484" alt="custom" title="Server, Client에서 이벤트가 발생합니다." data-nodeid="4"> # Properties - **Entity Entity** 발판에서 떨어진 엔티티입니다. - **Footh
[task] | code [pass] | ⏳ 미판정 [title] | FootholdLeaveEvent [question] | RigidbodyComponent 에서 FootholdLeaveEvent 를 수신하여 이벤트의 Entity 속성으로 접근한 엔티티의 TransformComponent.Position 을 Vector3(0, 0, 0) 으로 설정하는 스크립트를 작성해줘 [answer] | RigidbodyComponent에서 발생하는 FootholdLeaveEvent를 처리하기 위해 Event Handler 블록을 사용합니다. 이벤트 핸들러의 서비스 접두사는 이벤트가 발생하는 컴포넌트(또는 서비스)와 일치해야 하므로 `[self]`를 사용하여 엔티티 자체의 이벤트를 수신합니다. 이벤트 객체의 `Entity` 속성에 접근하여 해당 엔티티의 `TransformComponent.Position`을 `Vector3(0, 0, 0)`으로 설정하는 코드는 다음과 같습니다. ```lua Event Handler: [self] [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 발판에서 떨어졌을 때 발생하는 이벤트입니다. 이 Event는 아래 API에 의해 발생합니다. * RigidbodyComponent <img src="https://img.shields.io/static/v1?label=Space&message=Server,Client&color=c4a484" alt="custom" title="Server, Client에서 이벤트가 발생합니다." data-nodeid="4"> # Properties - **Entity Entity** 발판에서 떨어진 엔티티입니다. - **Footh
[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic [question] | MakeNativeTween 메서드를 사용하여 네이티브 컴포넌트의 float 매개변수를 가진 void 메서드를 호출하며, 1초 동안 EaseType.Linear 보간으로 값이 변화하는 스크립트를 작성해줘 [answer] | `TweenLogic`의 `MakeNativeTween` 메서드는 네이티브 컴포넌트의 `void` 타입 메서드를 자동 호출하여 보간을 수행할 때 사용합니다. 이 메서드는 `MakeTween`보다 성능이 우수하며, 대상 컴포넌트에 존재하는 특정 시그니처의 메서드(`void Method(float value)`)를 지정해야 합니다. 아래 예제는 `self.Entity`가 가지고 있는 가상의 네이티브 컴포넌트 `MyNativeComponent`의 `SetMyValue` 메서드를 대상으로, 0에서 100까지의 값을 1초 동안 `EaseT [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | Tween 관련 기능들을 제공합니다. # Methods - **float Ease(float startValue, float endValue, float duration, EaseType type, float tweenTime)** 시작값과 끝값 사이의 보간을 수행합니다. tweenTime을 duration으로 나눈 값으로 보간을 수행합니다. duration이 0인 경우 endValue를 반환하며, tweenTime이 0보다 작거나 duration보다 큰 경우 예상치 못한 값이 반환될 수 있습니다. - **Tweener Ma
[task] | single_turn [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | CreatorDataStorage의 Name 프로퍼티가 ReadOnly로 표시되는 이유는 무엇이며, 이 값을 수정하려면 어떻게 해야 하나요? [answer] | CreatorDataStorage의 `Name` 프로퍼티가 `ReadOnly`로 표시되는 이유는, 이 값이 저장소 객체의 고유 식별자로서 외부에서 임의로 변경될 수 없도록 설계되었기 때문입니다. 따라서 이 값을 직접 수정하는 메서드나 방법은 존재하지 않습니다. CreatorDataStorage는 크리에이터가 소유한 모든 월드에서 공유되는 저장소이며, 메이커와 출시 환경은 서로 다른 저장소를 사용합니다. 특정 저장소를 얻는 방식은 `_DataStorageService:GetCreatorDataStorage()`를 호출하는 것이며, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이 저장소는 크리에이터가 소유한 모든 월드에서 사용 가능하고, 저장된 데이터를 공유합니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 CreatorDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다.
[task] | code [pass] | ⏳ 미판정 [title] | FootholdEnterEvent [question] | RigidbodyComponent 의 FootholdEnterEvent 핸들러를 구현하여 이벤트의 Entity 프로퍼티를 통해 발판에 붙은 엔티티를 식별하고 log() 함수로 해당 엔티티 이름이 출력되도록 작성해줘. [answer] | `RigidbodyComponent`가 발생하는 `FootholdEnterEvent` 핸들러는 `[self]` 스페이스를 사용합니다. 이벤트 객체의 `Entity` 프로퍼티를 통해 발판에 붙은 엔티티를 얻고, 해당 엔티티의 `Name`을 `log()` 함수로 출력하는 구현은 다음과 같습니다. ```lua Event Handler: [self] HandleFootholdEnterEvent (FootholdEnterEvent event) { -- 발판에 붙은 엔티티를 식별 local entity = event.Entit [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 발판에 붙었을 때 발생하는 이벤트입니다. 이 Event는 아래 API에 의해 발생합니다. * RigidbodyComponent <img src="https://img.shields.io/static/v1?label=Space&message=Server,Client&color=c4a484" alt="custom" title="Server, Client에서 이벤트가 발생합니다." data-nodeid="4"> # Properties - **Entity Entity** 발판에 붙은 엔티티입니다. - **Foothold
[task] | instruction_following [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | `GetVersionsAndWait` 메서드 호출 예제를 코드만 출력하고, 인자 설명은 주석으로 달아주세요. [answer] | ```lua local globalDataStorage = _DataStorageService:GetGlobalDataStorage("globalDS") -- 조회할 데이터의 키 local key = "Key" -- 정렬 방향 (Ascending: 오름차순, Descending: 내림차순) local sortDirection = SortDirection.Ascending -- 조회 시작 시간 (이 시점 이후에 생성된 버전만 조회) local minDate = DateTime(2022, 4, 20) -- 조회 종료 시간 (이 시점 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | erOnly]** 입력한 DataStorageKeyInfo들로 데이터들을 저장합니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 저장에 성공한 DataStorageKeyInfo들과 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 DeleteAndWait(string key) [ServerOnly] [Yield]** 입력한 키로 데이터를 삭제하고 에러 코드를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. - **void DeleteAsync(string key, fu
[task] | instruction_following [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | CreatorDataStorage의 SetAndWait와 SetAsync 메서드의 차이점을 3문장 이내로 설명하세요. [answer] | `SetAndWait`는 작업 완료까지 스크립트 실행을 중단하고 에러 코드를 직접 반환하는 동기 방식입니다. 반면 `SetAsync`는 비동기로 수행되며 작업 완료 시 에러 코드와 키를 callbackFunction을 통해 전달합니다. 따라서 다른 로직을 병렬로 처리해야 할 때는 `SetAsync`를, 순차적 처리가 필요할 때는 `SetAndWait`를 사용합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 력한 키에 해당하는 데이터의 버전들을 조회합니다. sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에
[task] | instruction_following [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | 문서에 명시된 TransactDeleteAndWait와 TransactSetAndWait 메서드의 최대 조작 가능한 Key 수와 실패 시 동작을 표로 정리하세요. [answer] | | 메서드 | 최대 조작 가능한 Key 수 | 실패 시 동작 | | :--- | :--- | :--- | | `TransactDeleteAndWait` | 20개 | 모든 작업 중 하나라도 실패하면 함수 호출이 실패합니다. | | `TransactSetAndWait` | 20개 | 모든 작업 중 하나라도 실패하면 함수 호출이 실패합니다. | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 력한 키에 해당하는 데이터의 버전들을 조회합니다. sortDirection으로 오름/내림차순 정렬을 설정할 수 있습니다. minDate, maxDate로 설정한 시간대 내에서 생성된 버전을 조회할 수 있습니다. 이 작업은 비동기로 수행되며, 작업이 완료되면 에러 코드, 키, 조회용 객체와 함께 callbackFunction으로 전달된 함수가 호출됩니다. - **int32 SetAndWait(string key, string value) [ServerOnly] [Yield]** 입력한 키로 데이터를 저장합니다. 작업이 완료되면 에
[task] | two_turn [pass] | ⏳ 미판정 [title] | TweenLogic [question] | PlayTween 함수로 Entity의 위치를 이동시킬 때 Vector2와 Vector3 중 어떤 것을 선택해야 하며, MoveTo와 차이점은 무엇인지 [answer] | ## Vector2와 Vector3 선택 기준 `PlayTween`을 사용하여 Entity의 위치를 이동시킬 때는 **`Vector2`**를 선택해야 합니다. 메이플스토리 월드의 `Entity.TransformComponent.Position`은 `Vector3` 타입이지만, 2D 게임 환경에서 X, Y 좌표만 주로 사용됩니다. 제공된 실제 mLua 예제에서도 `PlayTween`의 `Vector2` 오버로드를 사용하고, 콜백 함수 내에서 `tweenValue:ToVector3()`를 호출하여 `Position`에 할당하는 방식 [followup] | MoveTo와 PlayTween(Vector3)를 각각 사용하여 엔티티를 이동시키는 mLua 스크립트 코드 예제를 작성해 주세요. [followup_answer] | ```lua Property: [None] Vector3 TargetPos = Vector3(10, 0, 0) Method: [server only] void OnBeginPlay() { -- 1. MoveTo 사용 예제 -- 현재 위치에서 TargetPos까지 이동 -- MoveTo는 Vector2 destination을 받으므로 Vector3을 Vector2로 변환하거나 X, Y만 사용 _TweenLogic:MoveTo(self.Entity, Vector2(TargetPos.x, TargetPos. [scores] | [judge_reason] | [source_doc] | Tween 관련 기능들을 제공합니다. # Methods - **float Ease(float startValue, float endValue, float duration, EaseType type, float tweenTime)** 시작값과 끝값 사이의 보간을 수행합니다. tweenTime을 duration으로 나눈 값으로 보간을 수행합니다. duration이 0인 경우 endValue를 반환하며, tweenTime이 0보다 작거나 duration보다 큰 경우 예상치 못한 값이 반환될 수 있습니다. - **Tweener Ma
[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic [question] | EntityService를 통해 생성한 엔티티를 TweenLogic의 ScaleTo 메서드로 초기 크기의 2배로 확대하는 스크립트를 작성해줘 [answer] | EntityService를 통해 생성한 엔티티를 TweenLogic의 ScaleTo 메서드로 초기 크기의 2배로 확대하는 스크립트는 다음과 같습니다. ```lua Method: [server only] void OnBeginPlay() { -- 1. EntityService를 통해 엔티티 생성 local monsterTemplate = _EntityService:GetEntityByPath("/maps/map01/monster-1") local spawnedEntity = _SpawnService:SpawnB [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ffset을 축으로 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener RotateTo(Entity entity, float angle, float duration, EaseType type)** entity를 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener ScaleTo(Entity entity, Vector2 targetScale, float duration, EaseType type)** entity를 targetScal
[task] | single_turn [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | BatchGetByInfoAndWait 메서드에 전달하는 DataStorageKeyInfo 객체는 어떤 정보를 포함해야 하는가요? [answer] | `BatchGetByInfoAndWait` 메서드에 전달하는 `DataStorageKeyInfo` 객체는 데이터의 고유 식별자를 정의하는 세 가지 문자열 정보를 포함해야 합니다. 참고 문서의 예제 코드를 통해 `DataStorageKeyInfo`가 생성될 때 다음 3가지 인수를 받는 것을 확인할 수 있습니다. ```lua local keyInfo1 = DataStorageKeyInfo("Key1", "Version1", "Tag1") ``` 각 인수의 의미는 다음과 같습니다. 1. **Key (키)**: 저장소에서 데이터를 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 이 저장소는 크리에이터가 소유한 모든 월드에서 사용 가능하고, 저장된 데이터를 공유합니다. 메이커와 출시 환경은 저장소를 공유하지 않습니다. # Properties - **string Name [ReadOnly]** 이 CreatorDataStorage의 이름입니다. # Methods - **int32, List<string> BatchDeleteAndWait(List<string> keys) [ServerOnly] [Yield]** 입력한 키들로 데이터들을 삭제합니다. 에러 코드와 삭제에 성공한 키들을 반환합니다.
[task] | code [pass] | ⏳ 미판정 [title] | FootholdLeaveEvent [question] | RigidbodyComponent 에서 FootholdLeaveEvent 를 수신하여 이벤트의 Foothold 속성으로 접근한 발판 ID 를 테이블에 저장하고, 저장된 발판 ID 가 3개 이상 쌓이면 log 함수로 "연속 낙하 감지" 를 출력하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서와 mLua 스크립트 규칙에 기반하여 요청하신 기능을 구현한 스크립트입니다. 1. **이벤트 수신**: `RigidbodyComponent`가 발생시키는 `FootholdLeaveEvent`를 처리합니다. 2. **데이터 저장**: 이벤트의 `Foothold` 속성에서 발판 ID를 가져와 테이블에 추가합니다. 3. **조건 확인**: 저장된 발판 ID의 개수가 3개 이상인지 확인합니다. 4. **로그 출력**: 조건을 만족하면 `log` 함수를 통해 "연속 낙하 감지"를 출력합니다. ```lua Prope [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 엔티티가 발판에서 떨어졌을 때 발생하는 이벤트입니다. 이 Event는 아래 API에 의해 발생합니다. * RigidbodyComponent <img src="https://img.shields.io/static/v1?label=Space&message=Server,Client&color=c4a484" alt="custom" title="Server, Client에서 이벤트가 발생합니다." data-nodeid="4"> # Properties - **Entity Entity** 발판에서 떨어진 엔티티입니다. - **Footh
[task] | instruction_following [pass] | ⏳ 미판정 [title] | CreatorDataStorage [question] | TransactSetByInfoAsync와 UpdateAndWait의 차이점을 3문장 이내로 설명하세요. [answer] | `TransactSetByInfoAsync`는 여러 개의 `DataStorageKeyInfo`를 비동기로 일괄 저장하는 반면, `UpdateAndWait`는 단일 키의 값을 동기적으로 갱신합니다. `TransactSetByInfoAsync`는 작업 완료 시 콜백 함수를 통해 결과를 전달하지만, `UpdateAndWait`는 수행 중 스크립트 실행을 중단하고 함수 반환값으로 결과를 즉시 제공합니다. 또한 `UpdateAndWait`는 기존 값이 `expectedValue`와 일치하는지 확인하여 불일치 시 에러를 반환하는 조건부 갱신 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ndWait(Dictionary<DataStorageKeyInfo, string> keyValues) [ServerOnly] [Yield]** 입력한 DataStorageKeyInfo들로 데이터를 저장합니다. 모든 데이터 저장에 성공하면 에러 코드와 성공한 DataStorageKeyInfo를 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 모든 작업 중 하나라도 실패한다면, 함수 호출이 실패합니다. 한 번에 최대 20개 Key까지 조작 할 수 있습니다. - **void TransactSetByInfoAsync(Dictio
[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic [question] | EntityService를 통해 생성한 엔티티를 TweenLogic의 RotateTo 메서드로 180도 회전시키는 스크립트를 작성해줘 [answer] | 참고 문서에 포함된 `TweenLogic`의 API 시그니처는 `Tweener RotateTo(Entity entity, float angle, float duration, EaseType type)` 입니다. `EntityService`를 통해 엔티티를 직접 생성(Spawn)하는 메서드(`SpawnByModelId`, `SpawnByEntityTemplate` 등)와 `TweenLogic` 서비스의 정확한 접근 방식(예: `_TweenLogic:RotateTo` 등)은 제공된 참고 문서에 명시되어 있지 않습니다. 따라서 제공된 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ffset을 축으로 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener RotateTo(Entity entity, float angle, float duration, EaseType type)** entity를 angle만큼 반시계 방향으로 회전시키는 Tweener를 생성하고 재생합니다. - **Tweener ScaleTo(Entity entity, Vector2 targetScale, float duration, EaseType type)** entity를 targetScal