[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent의 ContentType을 EmailAddress로 설정하고 TextInputEndEditEvent 발생 시 입력된 문자열에 @ 기호가 포함되어 있지 않으면 TextComponent에 "잘못된 이메일 형식"이라고 표시하는 스크립트를 작성해줘 [answer] | TextInputComponent의 `ContentType`을 `EmailAddress`로 설정하면 이메일 형식의 입력을 유도할 수 있습니다. 요청하신 대로 `TextInputEndEditEvent`가 발생했을 때 입력된 문자열에 `@` 기호가 포함되어 있는지 확인하고, 없으면 연결된 TextComponent에 "잘못된 이메일 형식"이라고 표시하는 스크립트는 다음과 같습니다. ```lua Property: [None] TextInputComponent EmailInput = EntityPath [None] TextComponent [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>
[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent의 ContentType을 Password로 설정하고 TextInputEndEditEvent를 처리하여 입력된 비밀번호가 4자리 이상일 때만 로그로 "인증 성공"을 출력하는 스크립트를 작성해줘 [answer] | TextInputComponent의 `ContentType` 프로퍼티를 `InputContentType.Password`로 설정하면 입력된 문자가 별표로 표시되며 비밀번호 입력이 가능합니다. 입력이 완료될 때 발생하는 `TextInputEndEditEvent`를 처리하여, 이벤트의 `text` 파라미터로 받은 비밀번호 길이가 4 이상인지 확인하고 조건이 맞을 때 로그를 출력하는 스크립트는 다음과 같습니다. ```lua Property: [None] TextInputComponent PasswordInput = EntityPath [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>
[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | OnBeginPlay에서 Tween을 설정하고 OnEndPlay에서 안전하게 파괴하는 mLua 스크립트 예제를 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Property: [None] any tween = nil [Sync] number LoopCount = 0 [Sync] number Delay = 0 Method: [server only] void OnBeginPlay() { -- 이동할 목적지(0.5, 현재 y좌표), 소요 시간(4초), 이징 타입(BounceEaseOut)을 지정하여 트윈을 생성 self.tween = _TweenLogic:MoveTo(self.Entity, Vector2(0.5, self.Entity.TransformCompone [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하
[task] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextComponent의 Font, FontColor, FontSize, Text 프로퍼티를 설정해 UI에 텍스트를 표시하는 기본 구조가 궁금합니다. [answer] | 제공된 문서에 따르면, `TextComponent`는 UI에 텍스트를 표시하는 컴포넌트입니다. 이 컴포넌트는 `SpriteGUIRendererComponent`와 함께 사용할 경우 `SpriteGUIRendererComponent`보다 위에 그려지며, UI 엔티티에 포함되어 있으면 엔티티를 더블클릭하여 텍스트를 쉽게 편집할 수 있습니다. 질문하신 4가지 프로퍼티(`Font`, `FontColor`, `FontSize`, `Text`)를 설정하여 텍스트를 표시하는 기본 구조는 다음과 같습니다. 1. **`Font`**: `Def [followup] | SpriteGUIRendererComponent와 함께 사용할 때 TextComponent가 위에 그려지는 순서와, 엔티티 더블클릭으로 텍스트를 편집하는 기능의 구체적인 사용 예시를 알려주세요. [followup_answer] | **TextComponent의 렌더링 순서와 편집 기능** `TextComponent`는 `SpriteGUIRendererComponent`와 동일한 UI 엔티티에 함께 존재할 경우, `SpriteGUIRendererComponent`보다 항상 **위에** 그려집니다. 즉, 스프라이트(배경 이미지 등)를 `SpriteGUIRendererComponent`로 표시하고 그 위에 텍스트를 `TextComponent`로 배치하면, 텍스트가 스프라이트를 가리지 않고 스프라이트 위에 겹쳐서 표시됩니다. 엔티티 더블클릭 편집 기능은 에디터 [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |
[task] | code [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent의 LineType을 MultiLineNewline으로 설정하고 TextInputValueChangeEvent를 통해 입력된 문자열의 길이가 100자를 초과하면 TextComponent의 텍스트에 "자수 초과"라고 표시하는 스크립트를 작성해줘 [answer] | TextInputComponent의 `LineType`을 `MultiLineNewline`으로 설정하고, `TextInputValueChangeEvent` 이벤트 핸들러에서 입력된 텍스트 길이를 확인하여 100자를 초과할 경우 연결된 TextComponent의 텍스트를 "자수 초과"로 변경하는 스크립트입니다. 참고로 `TextComponent`는 `TextInputComponent`와 동일한 엔티티에 존재하거나, 다른 엔티티의 `TextComponent`를 참조해야 합니다. 아래 예제는 `TextInputComponent`와 `T [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>
[task] | single_turn [pass] | ⏳ 미판정 [title] | Callback [question] | 비동기 작업이 완료된 후 특정 연산을 수행하려면 Callback을 어떻게 연결해야 하나요? [answer] | mLua에서 비동기 작업이 완료된 후 특정 연산을 수행하려면, 해당 비동기 함수의 인수로 **Callback 함수**를 전달하여 연결합니다. Callback은 비동기 작업이 끝났을 때 실행될 함수(또는 anonymous function)를 의미하며, 주요 흐름과 별개로 처리된 작업의 완료 시점을 파악하고 이후 연계 작업을 수행하는 데 사용됩니다. ### Callback 연결 방법 1. **Callback 함수 정의**: 비동기 작업 완료 후 실행할 로직을 포함하는 함수(또는 anonymous function)를 만듭니다. 2 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다
[task] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputEndEditEvent와 TextInputValueChangeEvent의 발생 시점 차이는 무엇이며, 어떤 상황에서는 각각을 사용해야 하나요? [answer] | `TextInputEndEditEvent`와 `TextInputValueChangeEvent`는 텍스트 입력을 감지하는 시점이 다릅니다. **1. 발생 시점 차이** * **TextInputEndEditEvent**: 사용자가 입력을 **완료했을 때** 발생하는 이벤트입니다. * 일반적으로 사용자가 Enter 키를 누르거나, 입력 영역에서 포커스가 벗어날 때 등 입력 동작이 끝나는 시점에 발생합니다. * **TextInputValueChangeEvent**: 입력값이 **변경될 때마다** 발생하는 이벤트입니다. [followup] | 사용자가 숫자만 입력하도록 제한하면서, 입력값이 변할 때마다 실시간으로 유효성을 검사하는 스크립트 로직을 작성해 주세요. [followup_answer] | 숫자만 입력하도록 제한하려면 `TextInputComponent`의 `ContentType`을 `IntegerNumber`로 설정해야 합니다. 그리고 입력값이 변할 때마다 실시간으로 유효성을 검사하기 위해서는 `TextInputValueChangeEvent` 핸들러를 구현해야 합니다. 아래는 해당 요구사항을 만족하는 mLua 스크립트 예시입니다. ```lua Property: [None] TextInputComponent NumericInput = EntityPath Method: [client only] void OnBegi [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>
[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | `MakeTween()`으로 Alpha를 0으로 변경하는 로직을 코드만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Method: [server only] void OnBeginPlay() { -- SpriteRenderer 컴포넌트 참조 local spriteRenderer = self.Entity.SpriteRendererComponent -- Tween 변수 선언 local tween -- Alpha 값 변경 콜백 함수 정의 local tweenAlpha = function(tweenValue) -- SpriteRenderer가 유효하지 않으면 Tween 종료 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MakeTween()`에서 **Alpha** 값을 조절해 특정 엔티티가 점점 옅어지게 만들 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. `MakeTween()`의 startvalue를 SpriteRenderer의 a로 지정하고, endvalue를 0으로 지정해 엔티티가 투명해질 수 있도록 아래와 같이 작성합니다. ```lua Method: [server only] void OnBeginPlay() { local spriteRenderer
[task] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | ButtonComponent는 출력 기능이 없어 SpriteGUIRendererComponent나 TextComponent와 결합해야 하는데, 버튼 클릭 시 TextComponent의 Text 프로퍼티를 변경하는 로직을 어떻게 구현해야 하나요. [answer] | ButtonComponent는 입력만 감지하고 직접적인 시각적 출력을 제공하지 않으므로, 버튼의 상태 변화(클릭 등)를 시각적으로 표현하려면 `TextComponent`와 같은 출력용 컴포넌트를 스크립트로 제어해야 합니다. 버튼 클릭 시 `TextComponent`의 `Text` 프로퍼티를 변경하는 로직은 `ButtonClickEvent`를 연결하여 이벤트 핸들러에서 해당 텍스트 컴포넌트를 참조하고 값을 수정하는 방식으로 구현합니다. 아래는 버튼 클릭 시 텍스트 내용을 변경하는 mLua 스크립트 예제입니다. ```lua Pro [followup] | ButtonClickEvent 핸들러 내에서 self.Entity.TransformComponent를 통해 TextComponent에 접근하여 텍스트를 바꾸는 mLua 코드 블록을 작성해 주세요. [followup_answer] | 참고 문서에 따르면 `TextComponent`는 UI에 텍스트를 표시하는 컴포넌트이며, 주요 프로퍼티 중 `Text`를 사용하여 표시할 텍스트를 설정합니다. 또한 `ButtonComponent`는 출력 기능이 없어 `TextComponent`와 결합하여 사용하며, `ButtonClickEvent`를 통해 버튼 클릭을 감지하여 로직을 작성해야 합니다. 질문에서 요청하신 `self.Entity.TransformComponent`를 통해 `TextComponent`에 접근하는 방식은 mLua의 컴포넌트 접근 규칙(`self.Entit [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |
[task] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | TextInputComponent와 TextComponent를 함께 사용할 때, 입력된 텍스트를 화면에 표시하기 위한 기본적인 연결 구조와 이벤트 처리 방법은 어떻게 되나요? [answer] | TextInputComponent와 TextComponent를 함께 사용할 때의 기본 연결 구조와 이벤트 처리 방법은 다음과 같습니다. ### 1. 기본 연결 구조 * **TextInputComponent**: 사용자의 키보드 입력을 받아들이는 역할을 합니다. 입력 자체는 화면에 바로 최종 텍스트로 고정되는 것이 아니라 입력 중인 상태를 유지합니다. * **TextComponent**: 실제 화면에 텍스트를 렌더링(표시)하는 역할을 합니다. * **연결 방식**: `TextInputComponent`에서 입력이 완료되거 [followup] | MultiLineNewline LineType을 사용하여 여러 줄의 메모를 입력받고, 입력 완료 시 TextComponent에 해당 내용을 반영하는 mLua 스크립트 예제를 만들어 주세요. [followup_answer] | `MultiLineNewline` LineType를 설정하여 여러 줄의 메모를 입력받고, 입력이 완료될 때 `TextInputEndEditEvent` 이벤트를 통해 해당 내용을 `TextComponent`에 반영하는 mLua 스크립트 예제는 다음과 같습니다. ```lua Property: [None] TextInputComponent MemoInput = EntityPath [None] TextComponent MemoDisplay = EntityPath Method: [client only] void OnBeginPlay () [scores] | [judge_reason] | [source_doc] | [TextInputComponent](/apiReference/Components/TextInputComponent)은 텍스트 입력을 받을 수 있는 컴포넌트입니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: | :---: | --- | | | AutoClear | True 이면 텍스트 입력 후 입력 영역을 자동으로 초기화합니다. | | | ContentType | 입력할 수 있는 텍스트 유형을 지정합니다. <ul> <li>**Standard** : 모든 입력을 허용합니다. </li>
[task] | single_turn [pass] | ⏳ 미판정 [title] | Callback [question] | 콜백 함수 내부에서 errorcode 매개변수가 어떤 의미인지, 저장 실패 시 특정 에러 코드가 반환되는지 확인하고 싶어요. [answer] | 제공된 참고 문서에는 콜백 함수의 `errorcode` 매개변수가 의미하는 구체적인 내용이나, 저장 실패 시 반환되는 특정 에러 코드 목록에 대한 정보가 포함되어 있지 않습니다. 문서에서 확인할 수 있는 내용은 다음과 같습니다: 1. `_DataStorageService`의 `SetAsync`와 `GetAsync` 메서드 호출 시 마지막 인자로 콜백 함수를 전달할 수 있습니다. 2. 이 콜백 함수는 처리가 완료되었을 때 실행되며, 매개변수로 `errorcode`와 `key` (또는 `value`)를 받습니다. 3. `SetAsyn [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 처리가 완료되었을 때 Callback 함수를 실행하는 예시입니다. ```lua Property: [Sync] number Power = 0 Method: [server only] void OnBeginPlay () { local data = _DataStorageService:GetGlobalDataStorage("data") self.Power = 20 local callBack = function (errorcode, key) log("Power is saved")
[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | 스크립트 실행 5초 후 특정 컴포넌트가 제거되는 과정을 단계별 번호 목록으로 정리하세요. [answer] | 참고 문서에 제시된 코드를 바탕으로, 스크립트 실행 후 5초 뒤에 특정 컴포넌트가 제거되는 과정은 다음과 같은 단계로 정리할 수 있습니다. 1. `OnBeginPlay()` 메서드가 서버에서만 실행되며 시작됩니다. 2. `self.Entity.SpriteRendererComponent`를 참조하여 스프라이트 렌더러를 `spriteRenderer` 변수에 할당합니다. 3. `tweenAlpha` 함수를 정의합니다. 이 함수는 `tweenValue`를 인자로 받아 `spriteRenderer`가 유효하지 않으면 `tween:Destr [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MakeTween()`에서 **Alpha** 값을 조절해 특정 엔티티가 점점 옅어지게 만들 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. `MakeTween()`의 startvalue를 SpriteRenderer의 a로 지정하고, endvalue를 0으로 지정해 엔티티가 투명해질 수 있도록 아래와 같이 작성합니다. ```lua Method: [server only] void OnBeginPlay() { local spriteRenderer
[task] | two_turn [pass] | ⏳ 미판정 [title] | 기본 UI 컴포넌트 [question] | ButtonComponent에서 ButtonClickEvent와 ButtonPressedEvent, ButtonStateChangeEvent를 구별하여 각각 다른 로직을 처리하는 스크립트 작성법이 궁금합니다. [answer] | ButtonComponent에서 ButtonClickEvent, ButtonPressedEvent, ButtonStateChangeEvent를 각각 다른 로직으로 처리하려면, 각 이벤트에 대해 별도의 이벤트 핸들러(Event Handler)를 정의하면 됩니다. * **ButtonClickEvent**: 버튼이 눌린 후 놓였을 때(클릭 완료) 발생 * **ButtonPressedEvent**: 버튼이 눌려져 있는 동안 발생 * **ButtonStateChangeEvent**: 버튼의 상태(Normal, Hover, Pre [followup] | Transition을 ColorTint와 SpriteSwap으로 설정했을 때 버튼 상태(Normal, Hover, Pressed, Released, Clicked) 변경에 따라 각 이벤트 핸들러에서 실행되는 코드 예제를 작성해 주세요. [followup_answer] | ButtonComponent의 `Transition` 프로퍼티를 `ColorTint` 또는 `SpriteSwap`으로 설정하더라도, 스크립트에서 이벤트 핸들러를 통해 감지하는 방식은 동일합니다. `ButtonComponent` 자체가 시각적 전환(색상이나 스프라이트 변경)을 처리하며, 스크립트는 `ButtonStateChangeEvent` 등을 통해 상태 변경을 감지하여 추가 로직(예: 사운드 재생, 텍스트 변경, 다른 UI 요소 제어 등)을 실행합니다. 참고 문서에는 `ButtonStateChangeEvent`의 구체적인 파라미 [scores] | [judge_reason] | [source_doc] | [TextComponent](/apiReference/Components/TextComponent)는 UI에 텍스트를 표시하는 컴포넌트입니다. **SpriteGUIRendererComponent**와 같이 사용할 경우 **SpriteGUIRendererComponent**보다 **TextComponent**를 위에 그립니다. UI 엔티티에 **TextComponent**가 포함되어 있으면 엔티티를 더블클릭하여 손쉽게 텍스트를 편집할 수 있습니다. 주요 프로퍼티는 다음과 같습니다. | 번호 | 항목 | 설명 | | :---: |
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | TweenLogic과 TweenComponent는 화면에서 비슷하게 보여서 헷갈리는데, 멀티플레이 환경에서 많은 엔티티를 움직여야 할 때 성능을 위해 반드시 TweenComponent를 써야 하나요? [answer] | 멀티플레이 환경에서 다수의 엔티티를 Tween 시킬 때 성능 향상을 기대할 수 있으므로, 스크립트를 작성하지 않고 엔티티에 애니메이션을 부여하고 싶을 때는 **TweenLineComponent, TweenCircularComponent, TweenFloatingComponent**와 같은 TweenComponent 사용을 권장합니다. 이는 네트워크 최적화가 되어 있기 때문입니다. 반면, **TweenLogic**은 동적 트윈이 필요한 경우(예: 런타임에 동적으로 목적지나 지속 시간을 변경해야 할 때)에 사용되며, 반환되는 Twee [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [TweenLogic](/apiReference?postId=700)을 사용해 엔티티를 확대, 축소, 회전, 이동시킬 수 있습니다. [Tweener](/apiReference?postId=714)를 함께 확인해보세요. # TweenLogic 개념 **TweenLogic**은 엔티티에 애니메이션 효과를 줄 수 있는 다양한 함수를 제공합니다. 여러 프레임에 걸쳐 Entity의 위치나 크기를 변화시키거나 회전시킬 수 있습니다. 다양한 함수를 사용해 엔티티를 Tween 시켜 애니메이션을 한 번의 함수 호출로 간단
[task] | single_turn [pass] | ⏳ 미판정 [title] | Callback [question] | DataStorageService의 GetGlobalDataStorage로 가져온 객체에 SetAsync를 호출할 때 전달해야 하는 매개변수 순서와 콜백 함수의 파라미터 구조가 어떻게 되나요? [answer] | `_DataStorageService:GetGlobalDataStorage`로 가져온 객체에 `SetAsync`를 호출할 때의 매개변수 순서와 콜백 함수의 파라미터 구조는 다음과 같습니다. **1. SetAsync 매개변수 순서** `SetAsync` 함수에는 총 3개의 매개변수를 순서대로 전달합니다. 1. **키 (key)**: 저장할 데이터의 이름 (문자열, `string`) 2. **값 (value)**: 저장할 데이터의 내용 (문자열, `string`) 3. **콜백 함수 (callback)**: 처리가 완료되었을 때 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 처리가 완료되었을 때 Callback 함수를 실행하는 예시입니다. ```lua Property: [Sync] number Power = 0 Method: [server only] void OnBeginPlay () { local data = _DataStorageService:GetGlobalDataStorage("data") self.Power = 20 local callBack = function (errorcode, key) log("Power is saved")
[task] | two_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | TweenLogic의 MoveTo()로 엔티티를 이동시킬 때 설정해야 하는 주요 파라미터와 반환되는 Tweener 객체의 기본 동작 방식이 궁금합니다 [answer] | `TweenLogic` 서비스의 `MoveTo()` 메서드를 사용하여 엔티티를 이동시킬 때 주요 파라미터와 반환되는 `Tweener` 객체의 동작 방식은 다음과 같습니다. ### 1. MoveTo() 주요 파라미터 `MoveTo()` 함수를 호출할 때 다음 4가지 값을 지정해야 합니다. 1. **대상 엔티티**: 이동시킬 대상이 되는 `Entity` 객체입니다. 2. **목적지**: 엔티티가 도달할 위치를 나타내는 `Vector2` 값입니다. 3. **시간**: 이동에 걸리는 시간(초)을 나타내는 `number` 값입니다 [followup] | AutoDestroy를 false로 설정하거나 LoopCount를 -1로 지정해 트윈을 지속 실행시킬 경우 발생하는 성능 저하 문제와, OnEndPlay나 엔티티 파괴 시점에 Destroy()를 호출해야 하는 구체적인 이유가 무엇인가요? [followup_answer] | `AutoDestroy`를 `false`로 설정하거나 `LoopCount`를 `-1`로 지정하여 트윈을 지속 실행시킬 경우 발생하는 성능 저하 문제와 `Destroy()` 호출이 필요한 구체적인 이유는 다음과 같습니다. ### 1. 발생하는 성능 저하 문제 * **작동하지 않는 객체의 누적**: `AutoDestroy`를 `false`로 하거나 무한 반복(`LoopCount = -1`)으로 설정하면, 트윈 로직이 실제로 더 이상 필요 없거나 완료되었음에도 불구하고 `Tweener` 객체가 메모리에 계속 남아 있게 됩니다. * [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하
[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | RotateAroundOffset() 구현 시 필요하는 Property 선언과 OnBeginPlay 내 offset 계산 로직을 포함해 단계별 번호 목록으로 정리하세요. [answer] | `RotateAroundOffset()`를 활용해 특정 엔티티를 중심으로 다른 엔티티가 회전하도록 구현하기 위한 단계는 다음과 같습니다. 1. 새로운 컴포넌트를 생성하고, 회전시킬 대상 엔티티에 추가합니다. 2. `Property` 블록에 `RotateCenter` 프로퍼티를 선언합니다. 이 프로퍼티는 `[Sync]` 속성을 가지며 타입은 `Entity`이고 기본값은 `nil`입니다. 3. 컴포넌트 에디터에서 `RotateCenter` 프로퍼티를 설정하여 중심점으로 삼을 엔티티를 선택합니다. 4. `Method` 블록에 ` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `RotateTo()`를 활용해 엔티티를 회전시킬 수 있고, `TweenLogic:RotateAroundOffset()`를 활용해 특정 엔티티의 offset을 기준으로 따라다니게 회전시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. **angle**을 360도로 설정해 엔티티가 한 바퀴 돌 수 있게 작성합니다. ```lua Method: void OnBeginPlay() { self._T.tween = _TweenLogic:RotateTo(self.E
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | 스크립트 없이 간단히 애니메이션을 주고 싶은 경우와, 동적으로 트윈을 제어해야 하는 경우 각각 어떤 기능을 선택해야 하는지 알려주세요. [answer] | 스크립트 작성 없이 간단하게 애니메이션을 부여하고 싶다면 **TweenLineComponent**, **TweenCircularComponent**, **TweenFloatingComponent** 중 상황에 맞는 컴포넌트를 선택하여 사용해야 합니다. 이 컴포넌트들은 네트워크 최적화가 되어 있어 멀티 플레이 환경에서 다수의 엔티티를 Tween시킬 때 성능 향상을 기대할 수 있습니다. 반면, 동적으로 트윈을 제어해야 하는 경우(예: 중간에 방향을 반전시키거나, 지연 시간을 설정하거나, 완료 시 특정 콜백을 실행해야 하는 경우)에는 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [TweenLogic](/apiReference?postId=700)을 사용해 엔티티를 확대, 축소, 회전, 이동시킬 수 있습니다. [Tweener](/apiReference?postId=714)를 함께 확인해보세요. # TweenLogic 개념 **TweenLogic**은 엔티티에 애니메이션 효과를 줄 수 있는 다양한 함수를 제공합니다. 여러 프레임에 걸쳐 Entity의 위치나 크기를 변화시키거나 회전시킬 수 있습니다. 다양한 함수를 사용해 엔티티를 Tween 시켜 애니메이션을 한 번의 함수 호출로 간단
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | 트윈이 더 이상 필요 없게 되었을 때, OnEndPlay 함수 안에서 특정 함수를 호출해야 하는데 그 함수 이름은 무엇인가요? [answer] | 트윈이 더 이상 필요 없게 되었을 때, `OnEndPlay` 함수 안에서 Tweener 객체를 파괴하기 위해 호출해야 하는 함수 이름은 `Destroy()` 입니다. 참고 문서의 예제 코드와 설명에 따르면, 컴포넌트의 `OnEndPlay` 시점에 Tweener의 `Destroy()` 함수를 호출하여 트윈을 파괴하는 것이 권장됩니다. ```lua Method: [server only] void OnEndPlay() { self.tween:Destroy() } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | TweenLogic 컴포넌트의 OnBeginPlay에서 MoveTo를 실행할 때, 목적지 좌표의 y 값을 Entity.TransformComponent.Position.y로 가져와야 하는 이유는 무엇인가요? [answer] | 제공된 문서에는 `MoveTo()` 함수의 목적지 좌표에서 `y` 값을 `Entity.TransformComponent.Position.y`로 가져와야 하는 **구체적인 이유(이론적 근거)에 대한 설명이 없습니다.** 문서에는 단순히 `_TweenLogic:MoveTo(self.Entity, Vector2(0.5, self.Entity.TransformComponent.Position.y), 4, EaseType.BounceEaseOut)`와 같이 `x` 좌표를 변경하고 `y` 좌표를 현재 위치의 `y` 값으로 유지하는 **코드 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하
[task] | code [pass] | ⏳ 미판정 [title] | Callback [question] | _DataStorageService_의 비동기 저장 API를 호출하고 완료 시 Callback에서 다음 로직을 실행하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 `_DataStorageService`의 **비동기 저장 API(Async)** 또는 **Callback 파라미터를 받는 저장 함수**에 대한 정보가 포함되어 있지 않습니다. 문서에는 다음과 같은 내용만 포함되어 있습니다: 1. **동기/비동기 구분 방법**: 함수명 어미가 `Wait`이면 동기, `Async`이면 비동기라고 설명하고 있습니다. 2. **사용 예제**: `_DataStorageService:GetUserDataStorage(...)` 호출 후, `userDataStorage:GetAndWa [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다
[task] | code [pass] | ⏳ 미판정 [title] | Callback [question] | 비동기 작업이 완료될 때까지 대기하지 않고 다른 작업을 병행한 후, Callback에서 완료 알림을 받아 후속 처리를 하는 스크립트를 작성해줘 [answer] | 비동기 작업은 `Async`로 끝나는 함수를 호출하여 시작하고, 작업이 완료되면 Callback 함수를 통해 알림을 받아 후속 처리를 진행합니다. 제공된 문서의 예제에서 보여준 `_TimerService:SetTimerRepeat`와 `_TimerService:SetTimerOnce`는 Callback을 사용하여 특정 타이밍에 작업을 실행하는 방법입니다. 사용자가 요청한 "비동기 작업 병행 및 Callback 후속 처리" 시나리오는 `wait()` 함수(동기적 대기)를 사용하지 않고, 비동기 함수를 호출한 후 반환되는 Timer [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 로직은 기본적으로 순차적으로 진행되지만 그렇지 않은 경우도 종종 있습니다. 작업을 순차적으로 진행하는 동기 방식과 그렇게 진행하지 않는 비동기 방식의 차이점을 살펴보고, 비동기 방식을 활용하는데 필요한 Callback에 대해서도 살펴봅시다. # 동기, 비동기 로직을 처리하는 방식에는 두 가지가 있습니다. 1. 동기(Synchronous) 2. 비동기(Asynchronous) **동기 방식(Synchronous)**은 로직을 순서대로 처리합니다. 이를 실생활에 대입해봅시다. 톰은 집 대청소를 하는 날입니다
[task] | two_turn [pass] | ⏳ 미판정 [title] | Callback [question] | mLua에서 비동기 데이터 저장 처리가 완료된 후 후속 작업을 실행하려면 어떻게 해야 하나? [answer] | mLua에서 비동기 데이터 저장 처리(`SetAsync`)가 완료된 후 후속 작업을 실행하려면, `SetAsync` 메서드의 마지막 인자로 **Callback 함수**를 전달해야 합니다. ### 핵심 원리 `SetAsync`는 비동기(non-blocking)로 동작하므로, 호출 직후에는 저장 작업이 아직 완료되지 않았을 수 있습니다. 따라서 저장 작업이 실제로 끝나고 나서 실행되어야 할 로직은 Callback 함수 내부에 작성해야 합니다. ### Callback 함수 작성 규칙 1. **인수**: Callback 함수는 `(er [followup] | `_DataStorageService:GetGlobalDataStorage`로 가져온 인스턴스에서 `SetAsync`를 호출할 때 Callback 함수의 인자(`errorcode`, `key`)를 어떻게 활용하며, 저장 실패 시 예외 처리를 위한 구체적인 코드 예시를 보여주세요. [followup_answer] | 참고 문서에 제시된 Callback 함수의 인자(`errorcode`, `key`) 활용 방법과 저장 실패 시 예외 처리를 위한 구체적인 코드 예시는 제공되지 않습니다. 문서에는 Callback 함수가 `(errorcode, key)` 인자를 받는다는 사실과, 성공 시 `log("Power is saved")` 또는 `log(key.."값이 저장되었다.")`와 같이 로그를 출력하는 예시만 포함되어 있습니다. `errorcode`의 구체적인 값(성공/실패 코드)이 무엇인지, 그리고 저장 실패 시 어떤 조건으로 분기 처리해야 하는지에 [scores] | [judge_reason] | [source_doc] | 처리가 완료되었을 때 Callback 함수를 실행하는 예시입니다. ```lua Property: [Sync] number Power = 0 Method: [server only] void OnBeginPlay () { local data = _DataStorageService:GetGlobalDataStorage("data") self.Power = 20 local callBack = function (errorcode, key) log("Power is saved")
[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | _ TweenLogic:PlayTween 메서드의 시그니처와 인자 순서를 4줄 이내로 설명하세요. [answer] | `_TweenLogic:PlayTween(startValue, endValue, duration, easeType, callback)` 시그니처입니다. 첫 번째와 두 번째 인자는 시작 값과 목표 값을 나타내는 숫자입니다. 세 번째 인자는 Tween 지속 시간(초)이며, 네 번째 인자는 이징 타입(EaseType)입니다. 다섯 번째 인자는 Tween 진행 시 호출되는 콜백 함수로, 현재 값을 전달받습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 높은 곳에서 공을 던졌을 때 공이 앞으로 나아감과 동시에 통통 튀게 만들어 봅시다. 1. 새로운 Model_Ball 모델을 생성합니다. TransformComponent, SpriteRendererComponent를 추가하고, 아래의 Ruid를 사용합니다. * SpriteRuid: d4dddd1f07d445939433f70cd1aa82fa 2. 새로운 BallComponent 생성하고, Model Ball에 추가합니다. 3. 공이 돌면서 날아가게 만들기 위해 `PlayTween()`과 `RotateTo()`를
[task] | code [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | MakeTween으로 생성한 Tweener 객체의 Delay 기능을 사용해 1초 후 엔티티 확대 애니메이션을 시작하는 스크립트를 작성해줘 [answer] | `MakeTween()`으로 생성한 `Tweener` 객체를 사용하고, `Delay()` 메서드를 통해 1초 지연 후 확대 애니메이션을 시작하는 스크립트는 다음과 같습니다. 참고로 `Tweener` 객체에서 크기를 변경하기 위한 구체적 메서드 이름(예: `ScaleTo` 등)은 제공된 문서에 명시되어 있지 않습니다. 따라서 아래 예제는 `MakeTween`으로 생성된 `Tweener` 객체의 `Delay` 기능을 어떻게 적용하는지 보여주는 구조이며, 실제 확대 동작을 수행하는 부분은 `Tweener` API 문서에 명시된 해당 메 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [TweenLogic](/apiReference?postId=700)을 사용해 엔티티를 확대, 축소, 회전, 이동시킬 수 있습니다. [Tweener](/apiReference?postId=714)를 함께 확인해보세요. # TweenLogic 개념 **TweenLogic**은 엔티티에 애니메이션 효과를 줄 수 있는 다양한 함수를 제공합니다. 여러 프레임에 걸쳐 Entity의 위치나 크기를 변화시키거나 회전시킬 수 있습니다. 다양한 함수를 사용해 엔티티를 Tween 시켜 애니메이션을 한 번의 함수 호출로 간단
[task] | single_turn [pass] | ⏳ 미판정 [title] | Callback [question] | Power 프로퍼티의 값을 20으로 설정한 직후 SetAsync를 호출하면 저장되는 값이 항상 20으로 고정되는 건지, 콜백 실행 시점에 다시 읽히는 건지 원리가 궁금합니다. [answer] | `SetAsync`는 호출 시점에 전달된 인수의 값이 즉시 저장 대상이 되며, 콜백이 실행되는 시점에 `self.Power` 프로퍼티를 다시 읽어서 저장하지 않습니다. 제시된 예제 코드에서 `self.Power = 20`을 실행한 직후 `tostring(self.Power)`를 인자로 전달합니다. 이는 문자열 `"20"`이 즉시 생성되어 `SetAsync`에 전달됩니다. 따라서 저장되는 값은 `SetAsync` 호출 당시의 `Power` 값인 20으로 고정됩니다. 콜백 함수(`callBack`)는 데이터가 실제 서버에 저장 처리 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 처리가 완료되었을 때 Callback 함수를 실행하는 예시입니다. ```lua Property: [Sync] number Power = 0 Method: [server only] void OnBeginPlay () { local data = _DataStorageService:GetGlobalDataStorage("data") self.Power = 20 local callBack = function (errorcode, key) log("Power is saved")
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | EaseType.BounceEaseOut 외에 다른 이징 타입도 사용할 수 있는지, 그리고 MoveTo의 인자 중 시간 값은 어떤 단위로 입력하는지 궁금합니다. [answer] | 제공된 문서에는 `EaseType.BounceEaseOut` 외에 다른 이징 타입에 대한 목록이 명시되어 있지 않습니다. 또한 `MoveTo()` 함수의 시간 인자가 어떤 단위(초, 밀리초 등)로 입력되는지에 대한 정보도 문서에 포함되어 있지 않습니다. 문서에서 확인할 수 있는 내용은 `MoveTo()` 호출 시 목적지, 시간, EaseType을 인자로 전달하며, 반환된 Tweener 객체에 대해 `Delay`, `LoopCount`, `LoopType`, `AutoDestroy` 속성을 설정할 수 있다는 점뿐입니다. ```lu [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `MoveTo()`를 활용해 엔티티를 이동시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. 엔티티가 이동할 목적지, 시간, EaseType을 작성합니다. 3. 반환하는 Tweener의 지연 시간, 반복 타입, 횟수, 자동 파괴 여부 처리를 함께 작성합니다. 자동 파괴를 false로 하거나 LoopCount를 -1로 설정해 트윈이 계속 실행되도록 하는 경우 의도치 않게 더 이상 작동하지 않는 Tweener 객체가 쌓일 수도 있습니다. 이러한 Tweener 객체가 지나치게 많아지면 월드에 성능 하
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | MoveTo 함수에서 EaseType을 설정했는데, x축과 y축의 원점과 끝값이 각각 무엇을 의미하는지 구체적으로 설명해 주세요. [answer] | `MoveTo` 함수에서 `EaseType`을 설정할 때, Easing 함수 그래프의 x축과 y축의 원점과 끝값은 다음과 같은 의미를 가집니다. **1. x축 (시간)** * **의미:** Tween 애니메이션이 진행되는 데 걸리는 시간입니다. * **원점 값:** `0` (애니메이션 시작 시점) * **끝값:** `duration` 파라미터에 지정된 총 소요 시간 (예: 3초 동안 이동한다면 `3`) **2. y축 (이동 위치)** * **의미:** 엔티티가 이동하는 실제 좌표 값입니다. * **원점 값:** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 [TweenLogic](/apiReference?postId=700)을 사용해 엔티티를 확대, 축소, 회전, 이동시킬 수 있습니다. [Tweener](/apiReference?postId=714)를 함께 확인해보세요. # TweenLogic 개념 **TweenLogic**은 엔티티에 애니메이션 효과를 줄 수 있는 다양한 함수를 제공합니다. 여러 프레임에 걸쳐 Entity의 위치나 크기를 변화시키거나 회전시킬 수 있습니다. 다양한 함수를 사용해 엔티티를 Tween 시켜 애니메이션을 한 번의 함수 호출로 간단
[task] | instruction_following [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | _ TweenLogic:RotateTo 호출 시 사용되는 EaseType 값과 회전 각도 계산식을 표로 정리해서 보여주세요. [answer] | 제공된 문서에 포함된 `Model_Ball` 예제 코드에 근거하여 `_TweenLogic:RotateTo` 호출 시 사용된 값을 정리하면 다음과 같습니다. | 항목 | 값/식 | | :--- | :--- | | **EaseType** | `EaseType.QuartEaseOut` | | **회전 각도** | `-1800 * _UtilLogic:RandomIntegerRange(95, 105)/100` | 위 회전 각도 식은 `-1800`을 기준으로 `_UtilLogic:RandomIntegerRange(95, 105)` 함수가 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 높은 곳에서 공을 던졌을 때 공이 앞으로 나아감과 동시에 통통 튀게 만들어 봅시다. 1. 새로운 Model_Ball 모델을 생성합니다. TransformComponent, SpriteRendererComponent를 추가하고, 아래의 Ruid를 사용합니다. * SpriteRuid: d4dddd1f07d445939433f70cd1aa82fa 2. 새로운 BallComponent 생성하고, Model Ball에 추가합니다. 3. 공이 돌면서 날아가게 만들기 위해 `PlayTween()`과 `RotateTo()`를
[task] | single_turn [pass] | ⏳ 미판정 [title] | TweenLogic을 활용해 엔티티 제어하기 [question] | LoopCount를 -1로 설정하면 무한 루프가 되는데, 이 루프를 중단하거나 정리하려면 OnEndPlay에서 어떤 메서드를 호출해야 하나요? [answer] | 무한 루프(`LoopCount = -1`)를 중단하거나 정리하려면 `OnEndPlay`에서 해당 Tween 객체의 `Destroy()` 메서드를 호출해야 합니다. 예를 들어, `RotateTo()` 또는 `RotateAroundOffset()`로 생성한 Tween을 `self._T.tween`에 저장했다면, 다음과 같이 정리할 수 있습니다. ```lua Method: [server only] void OnEndPlay() { self._T.tween:Destroy() } ``` 이 메서드를 호출하면 해당 Tween 애니 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `RotateTo()`를 활용해 엔티티를 회전시킬 수 있고, `TweenLogic:RotateAroundOffset()`를 활용해 특정 엔티티의 offset을 기준으로 따라다니게 회전시킬 수 있습니다. 1. 새로운 컴포넌트를 생성하고, 특정 엔티티에 추가합니다. 2. **angle**을 360도로 설정해 엔티티가 한 바퀴 돌 수 있게 작성합니다. ```lua Method: void OnBeginPlay() { self._T.tween = _TweenLogic:RotateTo(self.E