[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel 엔티티를 비활성화하는 단계를 단계별 번호 목록으로 작성하세요. [answer] | TalkPanel 엔티티를 비활성화하는 단계는 다음과 같습니다. 1. 앞서 제작한 **TalkPanel** 엔티티를 선택합니다. 2. **Enable** 체크를 해제하여 보이지 않는 상태로 변경합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 결과물은 다음과 같습니다. 10. 새로운 텍스트 엔티티를 추가합니다. 추가한 텍스트 엔티티를 클릭하고 이름을 **Name**으로 변경합니다. 11. **Name** 엔티티를 **TalkPanel**로 드래그하여 **TalkPanel**의 자식으로 설정합니다. 12. **Name** 엔티티의 프로퍼티를 다음과 같이 수정합니다. | 컴포넌트 | 프로퍼티 | 값 | | --- | --- | --- | | @cols=1:@rows=4:UITransformComponent | PosX | -600 |
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | CameraOffset과 Screen Offset이 모두 플레이어의 화면 위치를 수정하는 것인데, 두 프로퍼티의 계산 기준이나 값 입력 범위가 어떻게 다른가요? [answer] | CameraOffset과 Screen Offset은 모두 카메라가 플레이어를 비추는 지점을 조정하지만, 값의 기준과 입력 범위가 다릅니다. **1. CameraOffset** * **계산 기준:** 플레이어 아바타를 기준으로 한 카메라의 절대적인 위치 이동을 수정합니다. * **값 입력:** 문서에는 구체적인 입력 범위나 단위(예: 픽셀, 월드 단위 등)가 명시되어 있지 않습니다. 다만, 예시로 X값을 변경했을 때 카메라 위치가 이동하는 차이를 보여줍니다. **2. Screen Offset** * **계산 기준:** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임의 메인 카메라는 항상 플레이어를 따라다닙니다. 메인 카메라를 제어하는 camera 컴포넌트는 MapleStoryPlayer 모델이 가지고 있으며 이 모델의 프로퍼티 에디터나 스크립트를 이용해 주요 값을 수정할 수 있습니다. 이번 과정에서는 Camera 컴포넌트를 프로퍼티 에디터를 통해 수정해보며 전반적인 기능을 알아보는 시간을 가져보도록 하겠습니다. # Camera 컴포넌트 접근 Workspace에서 DefaultPlayer 모델을 선택합니다. 프로퍼티 에디터에서 CameraComponent를 확인
[task] | code [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | _EffectService:PlayEffectAttached 를 사용하여 부모 엔티티의 로컬 위치 Vector3(0, 0, 0) 에 RUID "effect_002" 이펙트를 자식으로 생성하여 무한 루프 재생하는 스크립트를 작성해줘 [answer] | 요청하신 기능을 구현하는 mLua 스크립트입니다. `_EffectService:PlayEffectAttached` 함수를 사용하여 지정된 RUID의 이펙트를 부모 엔티티(`self.Entity`)의 로컬 위치 `Vector3(0, 0, 0)` 에 자식으로 생성하고, `isLoop` 매개변수를 `true` 로 설정하여 무한 루프 재생하도록 구성했습니다. ```lua Method: [client only] void PlayAttachedEffect() { -- RUID: "effect_002" -- 부모 엔티티: sel [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 메이플스토리에서 사용되었던 수많은 이펙트 리소스들을 제공하고 있습니다. 그리고 우리는 이러한 이펙트들을 적절한 시점과 위치에 호출해 줌으로써 한층 더 멋진 연출을 구사할 수 있습니다. 이번 과정에서는 특정 키를 누를 때마다 스킬 이펙트가 노출되는 예제를 진행해봄으로써 스크립트를 통해 이펙트를 호출하는 방법에 대해 알아보도록 합니다. 다음 가이드를 먼저 학습하면 이번 과정을 진행하는 데 많은 도움이 될 것입니다. [스크립트 에디터 오리엔테이션](https://mod-developers.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | FootholdComponent와 CustomFootholdComponent는 모두 발판 관련 컴포넌트인데, 왜 새로운 발판을 만들 때 CustomFootholdComponent를 사용해야 하고 FootholdComponent는 직접 값을 수정할 수 없나요? [answer] | 새로운 발판을 만들 때 `CustomFootholdComponent`를 사용해야 하는 이유는 두 컴포넌트의 용도와 역할이 다르기 때문입니다. **`FootholdComponent`**는 맵 전체의 발판 정보를 저장하고 제공하는 컴포넌트입니다. 프로퍼티 에디터에서 검색하면 값은 확인될 수 있으나, 직접 값을 수정하거나 이용하는 것은 불가능합니다. 따라서 이 컴포넌트는 발판을 생성하거나 조정하는 도구가 아닙니다. 반면, **`CustomFootholdComponent`**는 실제로 발판을 만들고 조정하는 데 사용되는 컴포넌트입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 여러 오브젝트를 사용해 발판을 만들어 게임의 보는 재미를 풍성하게 만들어봅시다. **FootholdComponent**와 **CustomFootholdComponent** 개념과 발판 편집 방법을 소개합니다. # Foothold 모델로 발판 만들기 **Foothold** 모델을 이용해 발판을 만드는 방법입니다. 타일이 아닌 **Foothold** 모델을 이용해 다채로운 길을 만들 수 있습니다. 1. **Preset List** 패널에서 **Foothold**를 선택합니다. 2. 원하는 모델을 선택해 **S
[task] | code [pass] | ⏳ 미판정 [title] | 스킬 이펙트를 뿌려보자! [question] | _EffectService:PlayEffect 를 사용하여 지정한 World 좌표 Vector3(10, 0, 5) 에서 RUID "effect_003" 이펙트를 zRotation 90 도로 회전시켜 Vector3(2, 2, 2) 크기로 재생하는 스크립트를 작성해줘 [answer] | 요청하신 조건에 맞춰 `_EffectService:PlayEffect` 함수를 호출하는 스크립트를 작성했습니다. **주의 사항:** 1. `PlayEffect`의 두 번째 매개변수 `instigator`는 이펙트가 호출될 맵 정보를 가져오기 위해 **해당 맵에 존재하는 엔티티**여야 합니다. 따라서 `self.Entity`를 사용했습니다. 2. `PlayEffect`는 고정된 World 좌표에 이펙트를 생성하므로, 엔티티의 위치 변화에 따라 이동하지 않습니다. 3. RUID는 실제 프로젝트에서 사용 가능한 이펙트 리소스의 고유 식 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리 월드에서는 메이플스토리에서 사용되었던 수많은 이펙트 리소스들을 제공하고 있습니다. 그리고 우리는 이러한 이펙트들을 적절한 시점과 위치에 호출해 줌으로써 한층 더 멋진 연출을 구사할 수 있습니다. 이번 과정에서는 특정 키를 누를 때마다 스킬 이펙트가 노출되는 예제를 진행해봄으로써 스크립트를 통해 이펙트를 호출하는 방법에 대해 알아보도록 합니다. 다음 가이드를 먼저 학습하면 이번 과정을 진행하는 데 많은 도움이 될 것입니다. [스크립트 에디터 오리엔테이션](https://mod-developers.
[task] | code [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | FootholdWalkSpeedFactor 프로퍼티를 2.0으로 설정해 발판 위 이동 속도를 2배로 늘리는 스크립트를 작성해줘 [answer] | 제공된 문서에는 `FootholdWalkSpeedFactor` 프로퍼티의 존재와 "값이 클수록 이동속도가 빨라진다"는 설명만 있습니다. 그러나 **mLua 스크립트 코드에서 이 프로퍼티를 직접 참조하거나 값(2.0)으로 설정하는 API 또는 문법은 문서에 명시되어 있지 않습니다.** 문서 내용에 따르면, 이 값은 "새롭게 만든 발판에 속성을 바꿔" 조정하는 것으로, 이는 스크립트 코딩이 아닌 **에디터의 발판(Foothold) 컴포넌트 설정 패널에서 직접 수치를 입력하는 방식**일 가능성이 높습니다. 따라서 스크립트로 `Foot [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 새롭게 만든 발판에 속성을 바꿔 크리에이터만의 독특한 발판으로 만들 수 있습니다. 각 프로퍼티 값을 조정해 특정 방향에서 나아갈 수 없는 발판, 특별히 느리게 이동하는 발판 등으로 활용해 재미를 더할 수 있습니다. | 이름 | 설명 | | --- | --- | | FootholdDrag | RigidbodyComponent가 포함된 Entity가 발판 위에 있을 때 적용되는 마찰력을 의미합니다. 값이 클수록 엔티티가 발판에서 미끌어지다 빠르게 감속해 정지합니다. 특정 지점에서 엔티티가 날아와 해당 값이 1과 10인 발판에 각각
[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | UIGroup의 DefaultShow 프로퍼티 값을 true로 설정하는 이유와 UI 편집기에서 UIGroup을 추가하는 순서를 3문장 이내로 설명해 주세요. [answer] | UIGroup의 DefaultShow 값을 true로 설정하면 해당 그룹 내 UI 요소들이 게임 시작 시 자동으로 화면에 표시됩니다. UI 편집기에서 새로운 UIGroup을 추가한 후, 그 그룹의 프로퍼티 에디터에서 DefaultShow 값을 수정하는 순서를 따릅니다. 이후 생성한 UIGroup에 실제 대화창 구성 요소인 이미지 엔티티들을 추가하여 디자인을 진행합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 NPC들의 대화를 표현하기 위한 대화창을 제작해볼 것입니다. UI 편집기를 이용해 대화창을 구성하고 데이터 테이블에 데이터를 세팅 후 스크립트를 이용해 호출할 것입니다. 과정의 진행 순서는 다음과 같습니다. 1. UI 디자인 2. 데이터 테이블 추가 3. 스크립트 제작 제작 예시는 다음과 같습니다. # UI 디자인 1. UI 편집기 버튼을 클릭합니다. 2. UI 디자인을 진행할 새로운 **UIGroup**을 추가합니다. UIGroup을 추가한 적이 없다면 UIGroup이 추가됩
[task] | single_turn [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | DeadZone과 SoftZone 값이 각각 카메라 움직임에 어떤 영향을 주는지 차이가 궁금해요. [answer] | DeadZone과 SoftZone은 플레이어 아바타의 움직임에 따라 메인 카메라가 어떻게 반응하는지를 결정하는 서로 다른 영역입니다. 두 값의 차이와 카메라 움직임에 미치는 영향은 다음과 같습니다. **1. DeadZone (데드존)** * **역할:** 카메라가 플레이어의 움직임을 **따라가지 않는** 영역입니다. * **영향:** 플레이어 아바타가 DeadZone 범위 내에서 좌우 이동하거나 점프 등으로 Y축 방향으로 움직여도 카메라는 제자리에서 고정되어 움직이지 않습니다. * **값 조정 시 변화:** * [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임의 메인 카메라는 항상 플레이어를 따라다닙니다. 메인 카메라를 제어하는 camera 컴포넌트는 MapleStoryPlayer 모델이 가지고 있으며 이 모델의 프로퍼티 에디터나 스크립트를 이용해 주요 값을 수정할 수 있습니다. 이번 과정에서는 Camera 컴포넌트를 프로퍼티 에디터를 통해 수정해보며 전반적인 기능을 알아보는 시간을 가져보도록 하겠습니다. # Camera 컴포넌트 접근 Workspace에서 DefaultPlayer 모델을 선택합니다. 프로퍼티 에디터에서 CameraComponent를 확인
[task] | single_turn [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | FootholdWalkSpeedFactor를 높였는데 이동 속도가 빨라지지 않는 원인은 무엇일까요? [answer] | 참고 문서에 따르면 `FootholdWalkSpeedFactor`는 `RigidbodyComponent`가 포함된 Entity가 발판 위에 있을 때 **이동 속도에 곱해지는 계수**입니다. 즉, 이 값을 높이면 해당 발판 위에서 엔티티의 이동 속도가 빨라지는 것이 정상 동작입니다. 만약 값을 높였는데도 이동 속도가 빨라지지 않는다면, 다음과 같은 원인이 있을 수 있습니다. 1. **엔티티에 `RigidbodyComponent`가 없는 경우**: `FootholdWalkSpeedFactor`는 반드시 `RigidbodyCompo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 새롭게 만든 발판에 속성을 바꿔 크리에이터만의 독특한 발판으로 만들 수 있습니다. 각 프로퍼티 값을 조정해 특정 방향에서 나아갈 수 없는 발판, 특별히 느리게 이동하는 발판 등으로 활용해 재미를 더할 수 있습니다. | 이름 | 설명 | | --- | --- | | FootholdDrag | RigidbodyComponent가 포함된 Entity가 발판 위에 있을 때 적용되는 마찰력을 의미합니다. 값이 클수록 엔티티가 발판에서 미끌어지다 빠르게 감속해 정지합니다. 특정 지점에서 엔티티가 날아와 해당 값이 1과 10인 발판에 각각
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | 카메라의 기울어진 각도를 15도로 고정하기 위해 CameraComponent의 DutchAngle 프로퍼티를 15로 수정하는 스크립트를 작성해줘 [answer] | 카메라의 기울어진 각도(DutchAngle)를 15도로 고정하기 위한 스크립트입니다. 참고 문서에 따르면 `DutchAngle`은 카메라의 회전 값을 설정하는 프로퍼티이며, 각도를 입력하면 해당 값에 따라 카메라가 회전합니다. 따라서 `OnBeginPlay` 생명주기 메서드에서 플레이어의 `CameraComponent`에 접근하여 `DutchAngle` 값을 15로 설정하는 코드를 작성할 수 있습니다. ```lua Method: [server only] void OnBeginPlay ( ) { -- 플레이어의 카메라 컴포넌트에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임의 메인 카메라는 항상 플레이어를 따라다닙니다. 메인 카메라를 제어하는 camera 컴포넌트는 MapleStoryPlayer 모델이 가지고 있으며 이 모델의 프로퍼티 에디터나 스크립트를 이용해 주요 값을 수정할 수 있습니다. 이번 과정에서는 Camera 컴포넌트를 프로퍼티 에디터를 통해 수정해보며 전반적인 기능을 알아보는 시간을 가져보도록 하겠습니다. # Camera 컴포넌트 접근 Workspace에서 DefaultPlayer 모델을 선택합니다. 프로퍼티 에디터에서 CameraComponent를 확인
[task] | two_turn [pass] | ⏳ 미판정 [title] | 데이터 편집 [question] | 데이터 에디터에서 GoogleSpreadSheet나 CSV 파일을 불러올 때의 제한 사항과 덮어쓰기 방식에 대해 자세히 알고 싶습니다. [answer] | 데이터 에디터에서 외부 데이터를 가져올 때 GoogleSpreadSheet와 CSV 파일은 각각 다른 제한 사항과 덮어쓰기 방식을 가집니다. **1. GoogleSpreadSheet 데이터 가져오기** * **제한 사항**: GoogleSpreadSheet의 URL은 반드시 **웹에 게시(Publish to web)한 URL**만 사용할 수 있습니다. 비공개 상태이거나 일반 공유 링크인 경우 사용할 수 없습니다. * **덮어쓰기 방식**: 팝업창에 해당 URL을 입력하면, **현재 열려 있는 데이터셋의 기존 데이터를 모두 [followup] | utf-8로 저장된 CSV 파일만 정상적으로 가져올 수 있고, GoogleSpreadSheet URL은 웹에 게시한 URL만 사용 가능하다는 제한 사항이 있을 때, 로컬에 있는 일반 텍스트 파일이나 다른 형식의 스프레드시트 데이터를 직접 데이터셋에 반영하는 대안적인 방법이 있나요? [followup_answer] | 참고 문서에 따르면, 로컬의 일반 텍스트 파일이나 다른 형식의 스프레드시트를 **직접** 데이터셋 에디터에 불러오는 기능은 제공되지 않습니다. 문서에 명시된 데이터 가져오기 방법은 다음 두 가지뿐입니다. 1. **GoogleSpreadSheet**: 웹에 게시한 URL만 지원 2. **CSV 파일**: utf-8 인코딩의 CSV 파일만 지원 따라서 다른 형식(예: .txt, .xlsx, .xls 등)의 데이터를 사용하려면, **CSV 파일로 변환하여 utf-8 인코딩으로 저장한 후** 데이터 에디터의 'CSV 파일 불러오기' [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 데이터 셋을 이용해 데이터를 추가하거나 수정할 수 있습니다. 이번 가이드에서는 데이터의 생성 및 편집 방법, 스크립트로 데이터를 불러오는 방법에 대해 알아봅니다. # 데이터 셋 생성 및 데이터 에디터 열기 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create DataSet**을 클릭합니다. 2. 생성된 데이터를 더블클릭하여 데이터 에디터를 엽니다. # 데이터 에디터 | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합
[task] | code [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | FootholdForce 프로퍼티를 5로 설정해 발판 위 엔티티가 오른쪽으로 자동으로 이동하도록 하는 스크립트를 작성해줘 [answer] | FootholdForce는 발판(Foothold) 컴포넌트 자체의 프로퍼티이며, 스크립트를 통해 런타임에 동적으로 변경하거나 특정 로직을 구현하기 위한 mLua API(Setter/Getter)는 제공되지 않습니다. 따라서 `FootholdForce` 값을 5로 설정하는 것은 스크립트가 아닌 에디터에서 발판 컴포넌트를 선택하여 해당 프로퍼티 값을 직접 수정하는 방식으로 수행해야 합니다. 만약 발판 위에 있는 엔티티가 오른쪽으로 이동하도록 **추가적인 힘**을 가하거나, 발판의 기본 힘에 의존하지 않고 직접 제어하려는 의도라면 `R [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 새롭게 만든 발판에 속성을 바꿔 크리에이터만의 독특한 발판으로 만들 수 있습니다. 각 프로퍼티 값을 조정해 특정 방향에서 나아갈 수 없는 발판, 특별히 느리게 이동하는 발판 등으로 활용해 재미를 더할 수 있습니다. | 이름 | 설명 | | --- | --- | | FootholdDrag | RigidbodyComponent가 포함된 Entity가 발판 위에 있을 때 적용되는 마찰력을 의미합니다. 값이 클수록 엔티티가 발판에서 미끌어지다 빠르게 감속해 정지합니다. 특정 지점에서 엔티티가 날아와 해당 값이 1과 10인 발판에 각각
[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel의 PosX, PosY, Width, Height 값을 포함한 UITransformComponent 설정 코드를 주석으로 설명만 포함하여 출력해 주세요. [answer] | ```lua Method: [client only] void OnBeginPlay() { local defaultUIGroup = _EntityService:GetEntityByPath("/ui/DefaultGroup") if defaultUIGroup == nil then return end -- TalkPanel 엔티티 생성 local talkPanel = _SpawnService:SpawnByModelId("Model Entry ID", "TalkPanel", Vector3. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 NPC들의 대화를 표현하기 위한 대화창을 제작해볼 것입니다. UI 편집기를 이용해 대화창을 구성하고 데이터 테이블에 데이터를 세팅 후 스크립트를 이용해 호출할 것입니다. 과정의 진행 순서는 다음과 같습니다. 1. UI 디자인 2. 데이터 테이블 추가 3. 스크립트 제작 제작 예시는 다음과 같습니다. # UI 디자인 1. UI 편집기 버튼을 클릭합니다. 2. UI 디자인을 진행할 새로운 **UIGroup**을 추가합니다. UIGroup을 추가한 적이 없다면 UIGroup이 추가됩
[task] | two_turn [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | 카메라 제한 영역이 최종적으로 어떻게 결정되는지, CameraComponent와 MapComponent의 설정 조합에 따른 우선순위를 알려주세요. [answer] | 카메라 제한 영역은 `CameraComponent`의 `UseCustomBound` 값이 최우선 기준으로 판단되며, 이 값이 `False`인 경우에만 `MapComponent`의 `UseCustomBound` 값이 최종 영역을 결정합니다. 구체적인 우선순위와 결정 로직은 다음과 같습니다. **1. CameraComponent - UseCustomBound가 True인 경우** * **결정 방식:** 크리에이터가 직접 정의한 카메라 제한 영역을 사용합니다. * **사용 프로퍼티:** `LeftBottom`, `RightTo [followup] | CameraComponent의 UseCustomBound가 True인 경우와 False인 경우, 각각에서 LeftBottom과 RightTop 프로퍼티를 직접 정의하거나 맵 영역을 상속받는 로직을 설명하는 mLua 스크립트 예시를 작성해 주세요. [followup_answer] | 참고 문서에 따르면, `CameraComponent`의 `UseCustomBound` 값에 따라 카메라 제한 영역이 결정되는 로직은 다음과 같습니다. 1. **`UseCustomBound`가 `True`인 경우**: - `LeftBottom`과 `RightTop` 프로퍼티 값이 직접 사용되어 카메라 제한 영역으로 정의됩니다. - 이 경우 `MapComponent`의 설정은 무시됩니다. 2. **`UseCustomBound`가 `False`인 경우**: - `LeftBottom`과 `RightTop` 프로퍼티는 무 [scores] | [judge_reason] | [source_doc] | 카메라 제한 영역을 직접 정의해서 사용할 지 여부를 설정합니다. **UseCustomBound** 값이 **True**라면 **LeftBottom, RightTop** 프로퍼티를 사용해 카메라 제한 영역을 정의할 수 있습니다. **Collider Edit** 버튼을 누르면 Scene에 표시되는 기즈모를 통해 카메라 제한 영역을 시각적으로 확인하거나 핸들러를 통해 손쉽게 영역을 조절할 수 있습니다. CameraComponent - UseCustomBound 값이 **False**라면 맵 영역을 카메라 제한 영역으로 사용합니다. 맵
[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel과 Portrait의 UI 프로퍼티 설정값을 컴포넌트, 프로퍼티, 값으로 구분된 표 형식으로 정리해 주세요. [answer] | 참고 문서에 제시된 TalkPanel과 Portrait의 UI 프로퍼티 설정값은 다음과 같습니다. ### TalkPanel | 컴포넌트 | 프로퍼티 | 값 | | --- | --- | --- | | UITransformComponent | PosX | 0 | | UITransformComponent | PosY | 150 | | UITransformComponent | Width | 1600 | | UITransformComponent | Height | 200 | | SpriteGUIRendererComponent | Colo [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 이번 과정에서는 NPC들의 대화를 표현하기 위한 대화창을 제작해볼 것입니다. UI 편집기를 이용해 대화창을 구성하고 데이터 테이블에 데이터를 세팅 후 스크립트를 이용해 호출할 것입니다. 과정의 진행 순서는 다음과 같습니다. 1. UI 디자인 2. 데이터 테이블 추가 3. 스크립트 제작 제작 예시는 다음과 같습니다. # UI 디자인 1. UI 편집기 버튼을 클릭합니다. 2. UI 디자인을 진행할 새로운 **UIGroup**을 추가합니다. UIGroup을 추가한 적이 없다면 UIGroup이 추가됩
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | MapleStoryPlayer의 CameraComponent를 참조하여 DeadZone을 0으로 설정하고 Damping을 5.0으로 변경하는 스크립트를 작성해줘 [answer] | `MapleStoryPlayer` 모델이 가지고 있는 `CameraComponent`의 `DeadZone`과 `Damping` 값을 수정하는 스크립트는 다음과 같습니다. `OnBeginPlay` 생명주기 메서드 안에서 대상 엔티티를 찾은 후, 해당 엔티티의 `CameraComponent` 프로퍼티에 직접 접근하여 값을 변경합니다. ```lua Method: [server only] void OnBeginPlay () { -- DefaultPlayer 경로로 엔티티를 찾습니다. -- (실제 프로젝트의 엔티티 경로에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임의 메인 카메라는 항상 플레이어를 따라다닙니다. 메인 카메라를 제어하는 camera 컴포넌트는 MapleStoryPlayer 모델이 가지고 있으며 이 모델의 프로퍼티 에디터나 스크립트를 이용해 주요 값을 수정할 수 있습니다. 이번 과정에서는 Camera 컴포넌트를 프로퍼티 에디터를 통해 수정해보며 전반적인 기능을 알아보는 시간을 가져보도록 하겠습니다. # Camera 컴포넌트 접근 Workspace에서 DefaultPlayer 모델을 선택합니다. 프로퍼티 에디터에서 CameraComponent를 확인
[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | NPCTalk 데이터 테이블에 필요한 컬럼 3개의 이름을 3문장 이내로 나열하세요. [answer] | NPCTalk 데이터 테이블에 필요한 첫 번째 컬럼의 이름은 name입니다. 두 번째 컬럼의 이름은 portrait입니다. 세 번째 컬럼의 이름은 text입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | NPCTalk 데이터 테이블 생성 및 컬럼 추가 절차를 단계별 번호 목록으로 3단계 이내로 요약하세요. [answer] | 1. 새로운 데이터를 추가하고 이름을 **NPCTalk**으로 변경합니다. 2. **name**, **portrait**, **text** 이름의 2개 컬럼을 추가합니다. 3. 원하는 이름, 텍스트, RUID를 사용하여 대사를 구성합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | 카메라가 플레이어를 중앙이 아닌 화면 오른쪽 20% 지점에 보이도록 CameraComponent의 Screen Offset X 값을 0.8로 설정하는 스크립트를 작성해줘 [answer] | 메이플스토리 월드에서 카메라가 플레이어를 화면의 특정 위치에 보이도록 설정하려면 `CameraComponent`의 `ScreenOffset` 프로퍼티를 수정해야 합니다. 질문하신 대로 플레이어 아바타가 화면 오른쪽 20% 지점에 보이도록 하려면, `ScreenOffset`의 X 값을 `0.8`으로 설정하면 됩니다. (참고: `0.5`는 화면 중앙, 값이 클수록 오른쪽으로 이동합니다.) 아래 스크립트는 게임 시작(`OnBeginPlay`) 시점에 카메라의 `ScreenOffset`을 설정하는 예시입니다. ```lua Method [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임의 메인 카메라는 항상 플레이어를 따라다닙니다. 메인 카메라를 제어하는 camera 컴포넌트는 MapleStoryPlayer 모델이 가지고 있으며 이 모델의 프로퍼티 에디터나 스크립트를 이용해 주요 값을 수정할 수 있습니다. 이번 과정에서는 Camera 컴포넌트를 프로퍼티 에디터를 통해 수정해보며 전반적인 기능을 알아보는 시간을 가져보도록 하겠습니다. # Camera 컴포넌트 접근 Workspace에서 DefaultPlayer 모델을 선택합니다. 프로퍼티 에디터에서 CameraComponent를 확인
[task] | single_turn [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | CustomFootholdComponent의 edgeLists와 Size 프로퍼티를 설정할 때, 시작점과 연결점의 개수가 각각 어떤 기준으로 생성되는지 설명해 주세요. [answer] | `CustomFootholdComponent`의 `edgeLists`와 `Size` 프로퍼티를 설정할 때 시작점과 연결점이 생성되는 기준은 다음과 같습니다. **1. 시작점 (Start Point) 생성 기준** * `edgeLists`의 **`Size`** 값에 따라 생성됩니다. * `Size`에 입력한 숫자만큼 발판의 **시작점**이 생성됩니다. * 시작점을 여러 개 만들면, 하나의 엔티티에 개별 발판을 입력한 수만큼 만들 수 있습니다. **2. 연결점 (Connection Point) 생성 기준** * 각 시 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 여러 오브젝트를 사용해 발판을 만들어 게임의 보는 재미를 풍성하게 만들어봅시다. **FootholdComponent**와 **CustomFootholdComponent** 개념과 발판 편집 방법을 소개합니다. # Foothold 모델로 발판 만들기 **Foothold** 모델을 이용해 발판을 만드는 방법입니다. 타일이 아닌 **Foothold** 모델을 이용해 다채로운 길을 만들 수 있습니다. 1. **Preset List** 패널에서 **Foothold**를 선택합니다. 2. 원하는 모델을 선택해 **S
[task] | code [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | 플레이어의 마우스 휠 줌 인/아웃 기능을 비활성화하기 위해 CameraComponent의 isAllowZoomInOut 프로퍼티를 False로 설정하는 스크립트를 작성해줘 [answer] | 플레이어의 마우스 휠 줌 인/아웃 기능을 비활성화하려면, `DefaultPlayer` 모델의 `CameraComponent`에서 `isAllowZoomInOut` 프로퍼티를 `false`로 설정해야 합니다. 이 값은 **프로퍼티 에디터에서 직접 수정하는 것이 가장 일반적이고 권장되는 방법**입니다. 스크립트로 런타임에 수정하는 것도 가능하지만, 게임 시작 시점에(`OnBeginPlay`) 한 번만 설정하는 것이 일반적입니다. 아래는 게임이 시작될 때 플레이어의 카메라에서 마우스 휠 줌 기능을 비활성화하는 스크립트 예제입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임의 메인 카메라는 항상 플레이어를 따라다닙니다. 메인 카메라를 제어하는 camera 컴포넌트는 MapleStoryPlayer 모델이 가지고 있으며 이 모델의 프로퍼티 에디터나 스크립트를 이용해 주요 값을 수정할 수 있습니다. 이번 과정에서는 Camera 컴포넌트를 프로퍼티 에디터를 통해 수정해보며 전반적인 기능을 알아보는 시간을 가져보도록 하겠습니다. # Camera 컴포넌트 접근 Workspace에서 DefaultPlayer 모델을 선택합니다. 프로퍼티 에디터에서 CameraComponent를 확인
[task] | code [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | FootholdDrag, FootholdForce, FootholdWalkSpeedFactor 프로퍼티를 각각 5, -10, 0.5로 초기화하는 발판 설정 스크립트를 작성해줘 [answer] | 발판의 물리 특성을 조절하기 위해 `FootholdDrag`, `FootholdForce`, `FootholdWalkSpeedFactor` 프로퍼티를 각각 5, -10, 0.5로 초기화하는 스크립트입니다. ```lua Property: number FootholdDrag = 5 number FootholdForce = -10 number FootholdWalkSpeedFactor = 0.5 Method: [server only] void OnBeginPlay () { -- 발판 컴포넌트의 물리 속성 초기화 -- 참고: 실제 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 새롭게 만든 발판에 속성을 바꿔 크리에이터만의 독특한 발판으로 만들 수 있습니다. 각 프로퍼티 값을 조정해 특정 방향에서 나아갈 수 없는 발판, 특별히 느리게 이동하는 발판 등으로 활용해 재미를 더할 수 있습니다. | 이름 | 설명 | | --- | --- | | FootholdDrag | RigidbodyComponent가 포함된 Entity가 발판 위에 있을 때 적용되는 마찰력을 의미합니다. 값이 클수록 엔티티가 발판에서 미끌어지다 빠르게 감속해 정지합니다. 특정 지점에서 엔티티가 날아와 해당 값이 1과 10인 발판에 각각
[task] | two_turn [pass] | ⏳ 미판정 [title] | 데이터 편집 [question] | `OnBeginPlay()` 함수 내에서 데이터셋을 초기화하는 과정과 컴포넌트 추가 단계에 대해 이해하고 싶습니다. [answer] | `OnBeginPlay()` 함수 내에서 데이터셋을 초기화하고 컴포넌트를 추가하는 과정은 다음과 같습니다. ### 1. 데이터셋 생성 및 편집 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create DataSet**을 클릭하여 데이터셋을 생성합니다. 2. 생성된 데이터를 더블클릭하여 **데이터 에디터**를 엽니다. 3. 데이터 에디터에서 컬럼 셀(열 이름)을 정의하고, 셀에 데이터를 입력합니다. 입력한 데이터 값은 모두 문자열(string)로 저장됩니다. 4. 데이터를 저장합니다. ### 2. 컴포넌트 [followup] | `map01`의 Hierarchy에서 `Add Component`로 DataSet 컴포넌트를 추가한 후, `OnBeginPlay`에서 `local dataSet = _DataService:GetTable("NewDataSet")`을 호출했을 때 데이터셋 이름이 "NewDataSet"과 정확히 일치해야 한다는 점을 고려하여, 이름이 다른 경우나 데이터셋이 존재하지 않을 때 오류를 처리하는 예외 처리 코드는 어떻게 작성하나요? [followup_answer] | 제공된 참고 문서에는 `_DataService:GetTable()` 호출 시 데이터셋 이름이 일치하지 않거나 데이터셋이 존재하지 않을 경우 반환 값이 `nil`인지, 에러를 throw하는지, 또는 기본값을 반환하는지에 대한 정보가 포함되어 있지 않습니다. 또한, mLua에서 `nil` 체크나 `pcall` 등 예외 처리를 위한 구체적인 문법이나 API 사용법에 대한 설명도 문서에 없습니다. 따라서 주어진 참고 문서를 근거로 데이터셋이 존재하지 않을 때의 **오류 처리(예외 처리) 코드를 작성하는 방법은 설명할 수 없습니다.** [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 데이터 셋을 이용해 데이터를 추가하거나 수정할 수 있습니다. 이번 가이드에서는 데이터의 생성 및 편집 방법, 스크립트로 데이터를 불러오는 방법에 대해 알아봅니다. # 데이터 셋 생성 및 데이터 에디터 열기 1. **Workspace - MyDesk**의 콘텍스트 메뉴에서 **Create DataSet**을 클릭합니다. 2. 생성된 데이터를 더블클릭하여 데이터 에디터를 엽니다. # 데이터 에디터 | 번호 | 설명 | | --- | --- | | | **컬럼 셀** 각 열의 데이터명, 즉 컬럼 명을 정의합
[task] | single_turn [pass] | ⏳ 미판정 [title] | Event System [question] | 메이플스토리 월드에서 사용되는 Entity Event System이 Entity를 중계소로 이용한다는 말의 구체적인 의미는 무엇인가요? [answer] | 제공된 참고 문서에 따르면, "Entity Event System이 Entity를 중계소로 이용한다"는 구체적인 의미는 **이벤트의 발송(Sender)과 수신(Handler) 사이에서 Entity가 매개체 역할을 한다는 것**입니다. 문서는 메이플스토리 월드가 Entity Event System을 사용한다고 명시하고 있으며, 시스템의 구성 요소로 이벤트(Event), 핸들러(Handler), 센더(Sender)를 설명합니다. 여기서 Entity는 이벤트가 발생했을 때 그 정보를 전달하는 중심 지점(중계소)으로 기능합니다. 즉, 어 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 크리에이터는 로직을 여러 가지 방법으로 작성할 수 있습니다. 그 방법 중 하나는 **이벤트**를 활용하는 것입니다. 이번 시간에는 메이플스토리 월드의 이벤트 시스템과 여러 이벤트를 다루는 방법을 살펴봅니다. # 이벤트 기반의 로직 구성 로직을 작성하다 보면 **특정 타이밍에 해야 할 일**이 생깁니다. 그럴 때는 **행위가 일어난 주체**가 무엇을 할 것인지 결정해야 합니다. 예를 들어, 월드에서 캐릭터가 공격받았을 때 아래와 같이 구현한다고 가정해 봅시다. 1. **캐릭터의 HP를 감소시키고** 2.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | Scene 패널에서 발판 엔티티를 선택한 후 콘텍스트 메뉴를 통해 Add Point를 클릭해야 하는 이유가 무엇이며, 이 방법으로 추가한 연결점의 위치는 어떻게 지정되나요? [answer] | Scene 패널에서 발판 엔티티를 선택한 후 콘텍스트 메뉴의 **Add Point**를 클릭해야 하는 이유는, **CustomFootholdComponent**의 `edgeLists` 구조상 연결점(점)을 추가하는 공식적인 방법이기 때문입니다. 문서에 따르면 `edgeLists`는 발판의 시작점과 연결점을 정의하는 프로퍼티이며, 이 구조를 다음과 같이 이해해야 합니다: 1. **edgeLists**: 발판의 시작점을 의미합니다. 2. **Size**: `edgeLists`에 입력한 값만큼 시작점이 생성됩니다. 3. **[숫자 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 여러 오브젝트를 사용해 발판을 만들어 게임의 보는 재미를 풍성하게 만들어봅시다. **FootholdComponent**와 **CustomFootholdComponent** 개념과 발판 편집 방법을 소개합니다. # Foothold 모델로 발판 만들기 **Foothold** 모델을 이용해 발판을 만드는 방법입니다. 타일이 아닌 **Foothold** 모델을 이용해 다채로운 길을 만들 수 있습니다. 1. **Preset List** 패널에서 **Foothold**를 선택합니다. 2. 원하는 모델을 선택해 **S
[task] | two_turn [pass] | ⏳ 미판정 [title] | 플레이어 카메라 제어 [question] | Damping 값이 커질 때 카메라 움직임에 어떤 변화가 생기며, 극단적으로 높이면 어떤 상황이 발생하나요? [answer] | Damping 값은 플레이어 아바타가 DeadZone을 이탈했을 때, 카메라의 움직임이 급격하게 바뀌는 것을 방지하고 이전 상태와 이후 상태를 부드럽게 이어주는 역할을 합니다. Damping 값이 커질수록 카메라가 플레이어 아바타를 추적하는 속도가 더 부드러워집니다. 반대로, Damping 값을 극단적으로 높은 수치로 높이면 플레이어 아바타를 쫓아가는 카메라의 속도가 극단적으로 느려집니다. 이로 인해 카메라가 플레이어 아바타를 제대로 따라가지 못하고, 플레이어 아바타가 카메라 화면에서 이탈하는 상황이 발생할 수 있습니다. [followup] | SoftZone과 Damping 값을 모두 큰 수치로 설정했을 때 플레이어 아바타가 카메라를 이탈하는 상황을 방지하기 위한 조정 팁이 있을까요? [followup_answer] | 제공된 문서에는 SoftZone과 Damping 값을 모두 큰 수치로 설정했을 때 발생하는 카메라 이탈 상황을 방지하기 위한 구체적인 조정 팁이나 수치 범위가 명시되어 있지 않습니다. 문서에서는 이 두 값을 큰 수치로 높이면 플레이어 아바타를 쫓는 속도가 극단적으로 느려져 카메라 이탈이 발생할 수 있다는 사실과, Damping 값이 커지면 카메라 추적 속도가 부드러워진다는 점만 설명하고 있습니다. 따라서 카메라 이탈을 방지하려면 Damping 값을 낮추어 카메라의 추적 속도를 빠르게 해야 한다는 일반적인 원리는 적용할 수 있지만, [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 게임의 메인 카메라는 항상 플레이어를 따라다닙니다. 메인 카메라를 제어하는 camera 컴포넌트는 MapleStoryPlayer 모델이 가지고 있으며 이 모델의 프로퍼티 에디터나 스크립트를 이용해 주요 값을 수정할 수 있습니다. 이번 과정에서는 Camera 컴포넌트를 프로퍼티 에디터를 통해 수정해보며 전반적인 기능을 알아보는 시간을 가져보도록 하겠습니다. # Camera 컴포넌트 접근 Workspace에서 DefaultPlayer 모델을 선택합니다. 프로퍼티 에디터에서 CameraComponent를 확인
[task] | two_turn [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | TalkPanel에 Name과 Text 엔티티를 자식으로 설정할 때 프로퍼티 값을 어떻게 수정해야 하나요? [answer] | `TalkPanel`의 자식으로 설정할 `Name`과 `Text` 엔티티의 프로퍼티 값은 다음과 같이 수정해야 합니다. ### 1. Name 엔티티 프로퍼티 `Name` 엔티티는 `TalkPanel`의 자식으로 설정한 후, 아래 표와 같이 프로퍼티 값을 지정합니다. | 컴포넌트 | 프로퍼티 | 값 | | :--- | :--- | :--- | | **UITransformComponent** | PosX | -600 | | | PosY | 110 | | | Width | 300 | | | Height | 100 | | **Sprit [followup] | Name 엔티티의 PosX가 -600이고 Text 엔티티의 Width가 1550일 때, 두 엔티티의 정렬(Alignment)과 색상(Color, FontColor) 설정 값을 구체적으로 알려주세요. [followup_answer] | 참고 문서에 명시된 `Name`과 `Text` 엔티티의 정렬(Alignment) 및 색상(Color, FontColor) 설정 값은 다음과 같습니다. ### 1. Name 엔티티 * **Alignment**: 문서에 `Name` 엔티티의 `TextComponent` Alignment 값이 명시되어 있지 않습니다. * **Color** (`SpriteGUIRendererComponent`): RGB 255, 255, 255, A 0 (흰색, 투명도 0%) * **FontColor** (`TextComponent`): RG [scores] | [judge_reason] | [source_doc] | 결과물은 다음과 같습니다. 10. 새로운 텍스트 엔티티를 추가합니다. 추가한 텍스트 엔티티를 클릭하고 이름을 **Name**으로 변경합니다. 11. **Name** 엔티티를 **TalkPanel**로 드래그하여 **TalkPanel**의 자식으로 설정합니다. 12. **Name** 엔티티의 프로퍼티를 다음과 같이 수정합니다. | 컴포넌트 | 프로퍼티 | 값 | | --- | --- | --- | | @cols=1:@rows=4:UITransformComponent | PosX | -600 |
[task] | instruction_following [pass] | ⏳ 미판정 [title] | NPC 대화창 만들기 [question] | 문서 예시의 윌과 루시드 대사 2줄씩을 name, portrait, text 컬럼으로 구성된 표로 정리해서 출력하세요. [answer] | | name | portrait | text | | --- | --- | --- | | 윌 | 641962d7a2db445c9f1c58cfbec790a3 | 내가 이 역할을 맡게 될 줄이야. | | 윌 | 641962d7a2db445c9f1c58cfbec790a3 | 어...어서오시죠. 이곳은 대화 템플릿 예제를 위해 만들어진 세계입니다. | | 루시드 | f80b400198bc40dd947d7eb0c5935491 | 하하, 안내역이 멋지군요, 윌. 거울 세계의 지배자라는 이명이 아주 잘 어울려요. | | 루시드 | dcbd5c05 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 데이터 테이블 추가 1. 새로운 데이터를 추가합니다. 데이터의 이름을 **NPCTalk**으로 변경합니다. 2. 2개의 컬럼을 추가하고 각 컬럼 이름으로 **name, portrait, text** 를 입력합니다. 3. 사용하고 싶은 이름이나 텍스트, RUID를 사용하여 대사를 구성합니다. 예시의 경우 다음과 같은 값을 사용했습니다. | name | portrait | text | | --- | --- | --- | | 윌 |641962d7a2db445c9f1c58cfbec790a3 | 내가
[task] | single_turn [pass] | ⏳ 미판정 [title] | 발판 만들기 [question] | 발판의 시작점과 연결점을 설정했는데 아바타가 동선을 따라 이동하지 않거나 이동이 막히는 원인은 무엇이며, 해결을 위해 어떤 사항을 테스트해야 하나요? [answer] | 발판의 시작점(`edgeLists`)과 연결점([숫자]의 Size 및 좌표)을 설정했음에도 아바타가 동선을 따라 이동하지 않거나 이동이 막히는 주요 원인은 **연결점의 기울기가 너무 가파른 경우**입니다. 문서에서 강조하듯, 점들의 연결이 완만할수록 플레이어 아바타가 수월하게 이동할 수 있습니다. 즉, 시작점과 연결점 사이의 y축 차이에 비해 x축 간격이 너무 좁으면(가파른 경사) 아바타가 정상적으로 발판을 따라 이동하지 못하고 멈추거나 넘어질 수 있습니다. ### 해결 및 테스트 방법 이 문제를 해결하기 위해 다음과 같은 사 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 여러 오브젝트를 사용해 발판을 만들어 게임의 보는 재미를 풍성하게 만들어봅시다. **FootholdComponent**와 **CustomFootholdComponent** 개념과 발판 편집 방법을 소개합니다. # Foothold 모델로 발판 만들기 **Foothold** 모델을 이용해 발판을 만드는 방법입니다. 타일이 아닌 **Foothold** 모델을 이용해 다채로운 길을 만들 수 있습니다. 1. **Preset List** 패널에서 **Foothold**를 선택합니다. 2. 원하는 모델을 선택해 **S
[task] | single_turn [pass] | ⏳ 미판정 [title] | Event System [question] | 이벤트 시스템에서 '행위가 일어난 주체'와 '행동 실행 주체'의 역할 차이가 정확히 무엇인지 설명해 주세요. [answer] | 이벤트 시스템에서 두 주체의 역할 차이는 다음과 같이 명확히 구분됩니다. **1. 행위가 일어난 주체 (Sender 역할)** * **역할:** 특정 사건의 발생 시점과 해당 사건에 필요한 정보(파라미터)를 가지고 있는 객체입니다. * **행동:** 실제로 어떤 로직을 실행하는 것이 아니라, 사건의 발생 사실과 데이터를 **이벤트로 전송**하는 것만 담당합니다. * **특징:** 구체적인 처리 로직(예: HP 감소, 이펙트 표시 등)을 직접 관리하지 않으며, 자신의 상태 변화나 사용자 입력 등 '사건'이 발생했다는 신호 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 크리에이터는 로직을 여러 가지 방법으로 작성할 수 있습니다. 그 방법 중 하나는 **이벤트**를 활용하는 것입니다. 이번 시간에는 메이플스토리 월드의 이벤트 시스템과 여러 이벤트를 다루는 방법을 살펴봅니다. # 이벤트 기반의 로직 구성 로직을 작성하다 보면 **특정 타이밍에 해야 할 일**이 생깁니다. 그럴 때는 **행위가 일어난 주체**가 무엇을 할 것인지 결정해야 합니다. 예를 들어, 월드에서 캐릭터가 공격받았을 때 아래와 같이 구현한다고 가정해 봅시다. 1. **캐릭터의 HP를 감소시키고** 2.