[task] | single_turn [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | 레벨 업이나 메소 같은 특정 스프라이트를 스크립트에서 불러오려면 RUID를 어떻게 사용해야 하나요? [answer] | 메이플스토리 월드 스크립트에서 레벨 업이나 메소와 같은 특정 스프라이트를 불러오려면 해당 리소스에 부여된 고유 식별자, 즉 **RUID**를 사용합니다. RUID는 32자리의 16진수 문자열(예: `486a0ba11a6c474a81d13641876f8808`) 형태입니다. 제공된 참고 문서에는 스프라이트 RUID 목록(레벨 업, 동색/은색/금색 메소 등)이 포함되어 있으나, **mLua 스크립트 내에서 특정 RUID의 스프라이트를 직접 로드하거나 렌더링하기 위한 구체적인 API 함수명(예: `LoadSprite`, `SetSpri [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록
[task] | code [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체와 이펙트의 SpriteRUID 프로퍼티를 커스터마이즈하여 시각적 효과를 변경하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 발사체와 이펙트의 `SpriteRUID`를 변경하는 구체적인 API 호출 코드나 메서드 명세가 포함되어 있지 않습니다. 문서에는 "발사체 및 이펙트의 **SpriteRUID**를 변경하거나 ... 프로퍼티를 변경하여 ... 구현할 수 있습니다"라는 설명만 있을 뿐, 이를 수행하는 구체적인 mLua 코드 패턴(예: `SpriteRendererComponent.SpriteRUID` 에 직접 값을 대입하는 식 등)이 명시되어 있지 않습니다. 따라서 참고 문서에 근거하여 **발사체와 이펙트의 SpriteRUID 프로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | code [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체의 속도와 대미지 프로퍼티를 설정하고 공격 키 입력 시 발사체를 생성하는 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 발사체의 '속도(Speed)'나 '대미지(Damage)' 프로퍼티, 그리고 공격 키 입력 시 발사체를 생성하는 구체적인 API나 예제 코드가 포함되어 있지 않습니다. 문서에는 발사체 및 이펙트의 `SpriteRUID`를 변경하거나 대미지, 속도 등 프로퍼티를 변경하여 원거리 공격을 구현할 수 있다는 **개념적 설명**만 존재할 뿐, 이를 위한 실제 mLua 코드(속도/대미지 프로퍼티 선언, 키 입력 이벤트 핸들러, 발사체 생성 로직)는 제공되어 있지 않습니다. 따라서 요청하신 "발사체의 속도와 대미지 프로퍼 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | code [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체가 몬스터와 충돌하거나 지정된 시간 동안 이동 후 소멸되도록 하는 이벤트 핸들러 스크립트를 작성해줘 [answer] | 제공된 참고 문서에는 발사체의 구체적 충돌 이벤트 핸들러 코드, 타이머 서비스(`_TimerService`)를 이용한 시간 기반 소멸 코드, 또는 몬스터 대상 데미지 적용 로직이 포함되어 있지 않습니다. 문서에서 확인 가능한 정보는 다음과 같습니다. 1. 발사체와 이펙트의 `SpriteRUID`를 변경할 수 있습니다. 2. 대미지, 속도 등 프로퍼티를 변경하여 원거리 공격을 구현할 수 있습니다. 3. 공격 키를 누르면 발사체가 날아가고, 몬스터에게 닿거나 일정 시간이 지나면 폭발한다는 동작 설명만 있습니다. 따라서 요청하신 "충 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | 인벤토리 초기화 데이터를 클라이언트 UI로 전달하기 위해 생성해야 하는 이벤트 타입 이름과 생성 경로를 2문장 이내로 설명하세요. [answer] | 새로운 이벤트 타입의 이름은 `OnInventoryInitialized`로 설정해야 합니다. 생성 경로는 `MyDesk`에서 `Create Scripts`를 선택한 뒤 `Create EventType`를 클릭하는 방식입니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 인벤토리의 동작을 제어할 인벤토리 스크립트를 작성합니다. 1. 새 스크립트 컴포넌트를 생성하고 이름을 **LiteInventory**로 설정합니다. 2. **Workspace - DefaultPlayer**의 콘텍스트 메뉴에서 **Add Component**를 클릭한 후 **LiteInventory** 컴포넌트를 추가합니다. 3. **LiteInventory** 스크립트를 열고 스크립트 에디터에서 프로퍼티를 추가합니다. ```lua Property: [Sync] boolean IsInitialize
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 테스트 시 발사체가 일정 시간 이후에야 폭발하는 동작이 정상인지, 즉시 폭발하도록 설정하는 방법이 궁금합니다. [answer] | 제공된 참고 문서에는 발사체가 일정 시간 후에 폭발하는 동작이 정상적인지, 또는 즉시 폭발하도록 설정하는 구체적인 방법(관련 프로퍼티 이름, 메서드, 또는 이벤트 핸들러)에 대한 정보가 포함되어 있지 않습니다. 문서에는 발사체 및 이펙트의 `SpriteRUID`를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 원거리 공격을 구현할 수 있다는 일반적인 설명만 있을 뿐, 폭발 타이밍을 제어하는 구체적인 API나 설정 방법은 명시되어 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체가 몬스터에게 닿은 즉시 폭발하지 않고 지나쳐가는 현상을 해결하려면 어떤 프로퍼티를 조정해야 하나요? [answer] | 제공된 참고 문서에는 발사체가 몬스터에게 닿았을 때 폭발하는 로직의 상세 코드나, 충돌 감지 방식을 제어하는 구체적인 프로퍼티(예: 물리 충돌 박스 크기, 충돌 레이어 설정 등)에 대한 정보가 포함되어 있지 않습니다. 문서에는 "발사체 및 이펙트의 SpriteRUID를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여" 공격을 구현할 수 있다고만 언급되어 있을 뿐, "닿은 즉시 폭발하지 않고 지나쳐가는 현상"을 해결하기 위해 조정해야 하는 특정 프로퍼티 이름이나 충돌 처리 메서드(Event Handler 등)에 대한 설명 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 원거리 공격 스킬을 만들 때 이펙트의 SpriteRUID만 바꾸고 발사체 자체는 기본값으로 유지해도 되는지, 둘 중 하나만 변경하면 오류가 나는지 알려주세요. [answer] | 참고 문서에 따르면, 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 원하는 원거리 공격을 구현할 수 있다고 명시되어 있습니다. 문서에는 발사체와 이펙트 중 하나만 변경했을 때 오류가 발생하는지에 대한 구체적인 설명이나 제약 조건이 언급되어 있지 않습니다. 따라서 제공된 문서 정보만으로는 둘 중 하나만 변경해도 오류가 나는지 여부를 판단할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | LiteInventory 스크립트에서 UserItemDataSet의 행 수만큼 인벤토리 데이터를 초기화하는 코드 블록만 출력하고 설명은 주석으로 작성하세요. [answer] | ```lua Property: [Sync] boolean IsInitialized = false Method: [server only] void OnBeginPlay() { -- UserItemDataSet의 행 수만큼 inventoryData를 0으로 초기화 self._T.inventoryData = {} for i = 1, _DataService:GetRowCount("UserItemDataSet") do self._T.inventoryData[i] = 0 end } ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 인벤토리의 동작을 제어할 인벤토리 스크립트를 작성합니다. 1. 새 스크립트 컴포넌트를 생성하고 이름을 **LiteInventory**로 설정합니다. 2. **Workspace - DefaultPlayer**의 콘텍스트 메뉴에서 **Add Component**를 클릭한 후 **LiteInventory** 컴포넌트를 추가합니다. 3. **LiteInventory** 스크립트를 열고 스크립트 에디터에서 프로퍼티를 추가합니다. ```lua Property: [Sync] boolean IsInitialize
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체의 속도와 대미지를 변경할 때, 발사체 생성 시점에 값을 고정해야 하는지 매 프레임마다 계산해야 하는지 차이는 무엇인가요? [answer] | 제공된 참고 문서에는 발사체의 속도나 대미지를 '발사체 생성 시점에 고정'하는지와 '매 프레임마다 계산'하는지 사이의 차이, 또는 각각의 구현 방식에 대한 기술적 설명이 포함되어 있지 않습니다. 문서에는 다음과 같은 내용만 언급되어 있습니다: 1. 발사체 및 이펙트의 `SpriteRUID`를 변경하거나, **대미지, 속도 등 여러 가지 프로퍼티를 변경**하여 원하는 원거리 공격을 구현할 수 있습니다. 2. 공격 키를 누르면 발사체가 날아가고, 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. 따라서, 제공된 문서의 근거만으로 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `HandleUserLeaveEvent` 이벤트 핸들러에서 `SetAndWait` 호출 전 수행되는 검증 로직을 3문장 이내로 설명하세요. [answer] | `self.Entity.PlayerComponent.UserId`를 가져와 이벤트의 `UserId`와 일치하는지 확인합니다. 값이 다르면 함수를 즉시 종료합니다. `self._T.userDataStorage`가 존재하는지 검사합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체의 SpriteRUID를 변경할 때 특정 이미지가 보이지 않고 기본 모양으로 나오는 원인은 무엇인가요? [answer] | 발사체의 `SpriteRUID`를 변경했을 때 특정 이미지가 보이지 않고 기본 모양으로 나오는 원인은 **입력한 `SpriteRUID` 값이 유효하지 않거나 존재하지 않는 RUID**이기 때문입니다. `SpriteRUID`는 에셋(이미지)을 식별하는 고유 ID이므로, 실제 존재하는 에셋의 RUID가 정확히 입력되어야 올바른 스프라이트가 표시됩니다. 만약 잘못된 문자열, 빈 문자열, 또는 에셋이 삭제된 경우의 RUID를 사용하게 되면 엔진은 해당 이미지를 렌더링할 수 없어 기본 형태(또는 빈 상태)로 표시합니다. 따라서 `Spri [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | single_turn [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | Explosion 이펙트를 재생할 때 `FlipX` 옵션을 `not self.ToLeft`로 설정하는 이유와 좌우 방향 반전 로직이 어떻게 동작하는지 궁금합니다. [answer] | 원거리 발사체가 폭발할 때 이펙트의 좌우 방향을 발사체의 진행 방향과 일치시키기 위해 `FlipX` 옵션에 `not self.ToLeft` 값을 사용합니다. ### 동작 원리 1. **`self.ToLeft` 프로퍼티의 의미**: * `self.ToLeft`는 발사체가 **왼쪽 방향으로 이동하는지**를 나타내는 boolean 값입니다. * `true`: 발사체가 왼쪽으로 이동 중입니다. * `false`: 발사체가 오른쪽으로 이동 중입니다. 2. **`not self.ToLeft`의 논리** [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 9. 폭발 이펙트를 재생하고 발사체를 없애기 위해 `Explode()` 함수의 위 내용에 이어서 아래 내용을 작성합니다. ```lua -- 폭발 이펙트 재생 local effectPosition = Vector3(transform.Position.x + effectOffset.x, transform.Position.y + effectOffset.y, transform.Position.z) local options = { ["FlipX"] = not self.ToLeft } _EffectService:PlayEff
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `ModifyItem` 함수의 매개변수 이름과 각각의 데이터 타입을 표로 정리해서 제시하세요. [answer] | `ModifyItem` 함수의 매개변수는 다음과 같습니다. | 매개변수 이름 | 데이터 타입 | | :--- | :--- | | itemIndex | number | | deltaAmount | number | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | ModifyItem 함수에서 itemIndex가 유효하지 않을 때 발생하는 처리를 2문장 이내로 요약해 주세요. [answer] | `log_error("itemIndex error")`를 출력한 후 함수를 즉시 종료합니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local
[task] | two_turn [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | 메이플스토리 월드에서 Preset List, 리소스 스토리지, MSW 리소스 조회 페이지를 통해 사용할 수 있는 범용 리소스에는 어떤 종류가 있으며 각각의 특징은 무엇인가요? [answer] | 메이플스토리 월드에서 Preset List, 리소스 스토리지, MSW 리소스 조회 페이지를 통해 사용할 수 있는 범용 리소스는 크게 **스프라이트**와 **오디오** 두 가지 종류로 나뉩니다. ### 1. 스프라이트 원작의 풍부한 그래픽 리소스를 제공하며, UI 효과, 안내 아이콘, 상태 표시 등 다양한 목적에 따라 세분화되어 있습니다. * **일반 스프라이트** * **특징**: 게임 진행 중 발생하는 기본 이벤트나 아이템을 시각적으로 표현하는 리소스입니다. * **예시**: 레벨 업 효과, 동색/은색 [followup] | 스프라이트 리소스 중 '일반' 카테고리에 포함된 레벨 업, 메소, 지폐 등 주요 항목들의 RUID 값과 용도를 구체적으로 알려주세요. [followup_answer] | 스프라이트 리소스의 '일반' 카테고리에는 게임 진행과 관련된 주요 시각 효과 및 아이템 아이콘들이 포함되어 있습니다. 각 항목의 RUID 값과 용도는 다음과 같습니다. | 항목 | RUID | 용도 | | :--- | :--- | :--- | | **레벨 업** | `486a0ba11a6c474a81d13641876f8808` | 캐릭터의 레벨이 상승할 때 사용되는 시각 효과입니다. | | **동색 메소** | `a724200c454c4fcf878b0a3cdbb706d6` | 동색 메소 아이템을 나타내는 아이콘입니다. | | ** [scores] | [judge_reason] | [source_doc] | 메이플스토리 월드에서는 원작의 풍부한 리소스를 제공하고 있습니다. 크리에이터는 **Preset List**와 **리소스 스토리지**, **MSW 리소스 조회 페이지**에서 다양한 리소스를 사용할 수 있습니다. 원작 리소스의 양이 워낙 방대하기 때문에 원하는 리소스를 찾기 어려울 때가 종종 있습니다. 크리에이터들이 자주 찾을 만한 리소스를 소개합니다. > **더 알아보기** > 메이플스토리 월드 팀은 보다 편리한 리소스 이용 환경을 만들기 위해 꾸준히 노력하고 있습니다. > 여기서 소개되는 리소스는 앞으로 손쉽게 검색할 수 있도록
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | SpawnByModelId 호출 시 부모 엔티티를 self.Entity.Parent 로 지정하면 발사체의 위치가 캐릭터를 기준으로 어떻게 계산되는지 설명해 주세요. [answer] | `_SpawnService:SpawnByModelId` 호출 시 부모 엔티티를 `self.Entity.Parent`로 지정하면, 발사체는 캐릭터(`self.Entity`)의 **부모 엔티티**를 직접적인 상위 객체로 가지게 됩니다. 이때 발사체의 최종 위치는 다음과 같이 계산됩니다. 1. **발생 위치(`transform.Position + projectileOffset`)**: * `transform.Position`: 캐릭터의 현재 월드 좌표(World Position)입니다. * `projectile [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [원거리 발사체 만들기](/docs?postId=935) > **▶ 2편.** [**캐릭터가 발사체로 몬스터 공격하기**](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어보는 마지막 과정입니다. 이제 캐릭터가 발사체로 몬스터를 공격하도록 만들어봅시다. # 공격 키 누르면 발사체 날리기 1. **PlayerAttack** 스크립트를 열고 아래와 같이 프로퍼티를 추가합니다. ```lua Prop
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `OnInventoryInitialized` 스크립트의 `AllItemCounts` 프로퍼티 선언 코드를 주석 없이 한 줄로 출력하세요. [answer] | ```lua SyncTable<number> AllItemCounts ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 6. **OnInventoryInitialized** 스크립트를 연 뒤, 아래와 같이 프로퍼티를 추가합니다. 프로퍼티 타입으로 SyncTable\<v>를 선택하고, v를 **number**로 설정하면 됩니다. ```lua Property: SyncTable<number> AllItemCounts ``` 7. 다시 **LiteInventory** 스크립트로 돌아갑니다. 이제 인벤토리 UI에 로드된 데이터를 전달해야 합니다. 위에서 작성한 `OnBeginPlay()` 함수에 아래 내용을 추가합니다
[task] | two_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체의 SpriteRUID나 대미지, 속도 등 프로퍼티를 변경하여 원거리 공격을 커스터마이징하는 방법은 무엇인가요? [answer] | 발사체의 스프라이트(`SpriteRUID`), 대미지, 속도 등 프로퍼티를 변경하여 원거리 공격을 커스터마이징하는 방법은 스크립트의 `Property:` 블록에 해당 값들을 선언하고, 발사체 스폰 시나 발사체 엔티티의 생명주기 메서드에서 이 값들을 적용하는 것입니다. 참고 문서에서 제공된 구체적인 코드 예제는 카드 게임이나 메소(Meso) 관련 로직이 포함되어 있어, 원거리 발사체 스크립트의 전체 구조(예: `HandleAttackEvent`나 발사체 스폰 로직)는 문서에 명시되어 있지 않습니다. 따라서 **문서에 있는 정보만 사 [followup] | 발사체가 몬스터에게 닿거나 시간이 지나 폭발할 때 발생하는 이벤트 핸들러를 mLua로 구현하는 코드 예제를 보여주세요. [followup_answer] | 제공된 참고 문서에는 발사체가 몬스터에게 닿거나 시간이 지나 폭발할 때 발생하는 구체적인 이벤트 핸들러 이름(예: `HandleCollisionEvent`, `HandleExplosionEvent` 등)이나 폭발 로직에 사용되는 API가 명시되어 있지 않습니다. 문서에는 "공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다"라는 동작 설명과, `SpriteRUID`나 대미지, 속도 프로퍼티를 변경하는 방법만 언급되어 있으며, 이를 구현하는 mLua 코드 예제(이벤트 핸들러 포함)는 제공되지 않았습니 [scores] | [judge_reason] | [source_doc] | **[시작]** 버튼을 누른 뒤 테스트해 봅시다. 공격 키를 누르면 발사체가 날아가고 몬스터에게 닿거나 일정 시간이 지나면 폭발합니다. # 응용하기 발사체 및 이펙트의 **SpriteRUID**를 변경하거나 대미지, 속도 등 여러 가지 프로퍼티를 변경하여 크리에이터가 원하는 원거리 공격을 구현할 수 있습니다. 본 가이드를 참고하여 크리에이터의 개성을 살린 원거리 공격 스킬을 만들어봅시다.
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | `saveInventory` 함수와 `_TimerService:SetTimerRepeat` 호출 코드를 출력하되, 설명은 코드 내 주석으로만 작성하세요. [answer] | ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self._T.inventoryData, ",") self._T.userDataStorage:SetAsync("ItemData", dataConcatString, function() log("저장 완료") end) log("저장 중...") end -- 저장 주기 설정 (300초) local saveInterval = 300 _Time [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 본 예제에서는 저장 주기를 300초로 설정하였습니다. 저장 주기를 더 짧게 설정하면 인벤토리 데이터 정보 유실의 위험은 줄어들겠지만 불필요하게 자주 `_DataStorageService`를 호출하면 부하가 발생할 수 있고, 추후 DB 저장에 제약이 생길 수 있기 때문에 적당한 주기로 설정해야 합니다. ```lua -- 인벤토리 정보를 저장하도록 설정 local saveInventory = function() local dataConcatString = table.concat(self.
[task] | two_turn [pass] | ⏳ 미판정 [title] | 범용 리소스 모음 [question] | 메이커에서 사용할 수 있는 범용 리소스(효과음, BGM, 아바타)에는 어떤 종류가 있으며 각각의 RUID가 어떻게 분류되어 있나요? [answer] | 메이커에서 사용할 수 있는 범용 리소스는 효과음, BGM, 아바타로 나뉘며, 각 리소스는 고유한 RUID(Resource ID)를 가집니다. ### 1. 효과음 (Sound Effects) 게임 플레이 중 발생하는 다양한 상황에 맞춰 사용할 수 있는 효과음입니다. **점프 효과음** * 기본 점프 효과음: `d881a73a0700404a91bcf753474274c3` * 귀여운 기본 점프 효과음: `dfca55f443464fd5801952efeb50d819` **버튼/입력 효과음** * 기본 버튼 효과음: `7eda [followup] | 특정 효과음(예: '기본 점프 효과음' 또는 'Win 효과음')의 RUID 값을 확인하고, 해당 리소스를 스크립트에서 참조하기 위해 어떤 식으로 사용해야 하는지 알려주세요. [followup_answer] | 요청하신 특정 효과음의 RUID 값은 다음과 같습니다. * **기본 점프 효과음**: `d881a73a0700404a91bcf753474274c3` * **Win 효과음**: `713eb3fa83e14498b012d6466977989a` mLua 스크립트에서 이 RUID 값을 참조하는 구체적인 문법(예: 특정 서비스나 메서드를 통해 RUID로 리소스를 로드/재생하는 API)에 대한 정보는 제공된 문서에 포함되어 있지 않습니다. 따라서 문서에 근거하여 RUID 값이 어떻게 코드 내에서 호출되는지(예: `_AudioServi [scores] | [judge_reason] | [source_doc] | | 항목 | 설명 | RUID | | --- | --- | --- | | @cols=1:@rows=2:점프 효과음 | 기본 점프 효과음 |d881a73a0700404a91bcf753474274c3 | | 귀여운 기본 점프 효과음 |dfca55f443464fd5801952efeb50d819 | | @cols=1:@rows=4:버튼 효과음 | 기본 버튼 효과음 | 7eda004ded944e459f1fbb16c7f0f3f4 | | 기본 버튼 효과음2 | cd0bd46d7f454640b82c9dfff0c6677b | | 버튼 클릭
[task] | two_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체와 몬스터 간의 충돌 검지를 위해 설정해야 할 TriggerComponent의 CollisionGroup 값은 무엇이며, 이 설정이 누락되면 어떤 현상이 일어나는가? [answer] | 발사체와 몬스터 간의 충돌 검지를 위해 **TriggerComponent**의 **CollisionGroup** 값은 **Monster**로 설정해야 합니다. 이 설정이 누락되면 발사체와 몬스터 간의 충돌이 체크되지 않아, 발사체가 몬스터를 통과하게 됩니다. 그 결과 몬스터에게 대미지가 적용되지 않으며, 발사체를 통한 몬스터 처치가 불가능해집니다. [followup] | StaticMonster, MoveMonster, ChaseMonster 모두에 Monster 그룹을 적용해야 하는 이유와, 발사체 쪽의 충돌 그룹 설정도 함께 언급해줘. [followup_answer] | 제공된 참고 문서에는 **StaticMonster, MoveMonster, ChaseMonster** 모두에 **Monster** 충돌 그룹을 적용해야 하는 구체적인 이유(예: 각 몬스터 타입별 동작 차이 등)가 명시되어 있지 않습니다. 문서에서는 단순히 "발사체와 몬스터가 충돌하는 것을 체크할 수 있도록" 이 세 몬스터 모델에 TriggerComponent를 추가하고 CollisionGroup을 Monster로 설정하라고 지시하고 있을 뿐입니다. 또한, **발사체 쪽의 충돌 그룹 설정**에 대한 내용은 제공된 참고 문서에 포함되 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [원거리 발사체 만들기](/docs?postId=935) > **▶ 2편.** [**캐릭터가 발사체로 몬스터 공격하기**](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어보는 마지막 과정입니다. 이제 캐릭터가 발사체로 몬스터를 공격하도록 만들어봅시다. # 공격 키 누르면 발사체 날리기 1. **PlayerAttack** 스크립트를 열고 아래와 같이 프로퍼티를 추가합니다. ```lua Prop
[task] | single_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체 생성 시 좌우 방향에 따라 ProjectileOffset 의 x 값을 반전시키는 로직의 구체적인 이유는 무엇인가요? [answer] | 발사체 생성 시 `ProjectileOffset`의 x 값을 반전시키는 이유는 **캐릭터가 바라보는 방향에 따라 발사체 생성 위치가 자연스럽게 위치하도록 하기 위해서**입니다. 구체적인 이유는 다음과 같습니다. 1. **스프라이트 기준 좌표의 비대칭성**: `Model_Projectile_Arrow`와 같은 발사체 모델은 스프라이트(이미지) 좌표 기준이 정해져 있습니다. 예를 들어, 캐릭터가 오른쪽을 보고 있을 때 발사체가 몸체 앞쪽(오른쪽)에서 나가는 것이 자연스럽습니다. 하지만 캐릭터가 왼쪽을 보게 되면, 같은 오프 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [원거리 발사체 만들기](/docs?postId=935) > **▶ 2편.** [**캐릭터가 발사체로 몬스터 공격하기**](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어보는 마지막 과정입니다. 이제 캐릭터가 발사체로 몬스터를 공격하도록 만들어봅시다. # 공격 키 누르면 발사체 날리기 1. **PlayerAttack** 스크립트를 열고 아래와 같이 프로퍼티를 추가합니다. ```lua Prop
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | OnInventoryModified 이벤트 타입에 선언된 프로퍼티와 SendModifiedEvent 함수의 실행 공간을 표로 정리해 주세요. [answer] | `OnInventoryModified` 이벤트 타입에 선언된 프로퍼티와 `SendModifiedEvent` 함수의 실행 공간은 다음과 같습니다. | 구분 | 항목 | | :--- | :--- | | **이벤트 타입 프로퍼티** (`OnInventoryModified`) | `number ItemIndex = 0`<br>`number ItemCount = 0` | | **함수 실행 공간** (`SendModifiedEvent`) | `multicast` | [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | ```lua [server only] void ModifyItem(number itemIndex, number deltaAmount) { -- 아이템 인덱스가 정상인지 확인 if itemIndex < 1 or itemIndex > #self._T.inventoryData then log_error("itemIndex error") return end -- 변경 이전 아이템 개수 확인 local
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | 인벤토리 스크립트에서 DB에 아이템 정보를 저장하는 구체적인 메서드나 프로퍼티는 무엇인가요? [answer] | 제공된 참고 문서에는 인벤토리 스크립트가 "DB에 아이템 정보를 저장하도록 처리할 것입니다"라고 언급하고 있지만, 이를 위한 구체적인 메서드 이름, 프로퍼티, 또는 API 호출 예제는 포함되어 있지 않습니다. 따라서 주어진 문서 범위 내에서는 DB 저장에 사용되는 구체적인 메서드나 프로퍼티를 확인할 수 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > 2편. [몬스터 드롭 아이템과 인벤토리 UI 만들기](/docs?postId=943) > **▶ 3편.** [**인벤토리 스크립트 작성하기**](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 인벤토리 스크립트를 작성해 보겠
[task] | code [pass] | ⏳ 미판정 [title] | 원거리 발사체 만들기 [question] | _EffectService 와 _ResourceService 를 활용해 스프라이트 프레임 정보를 기반으로 BoxShape 공격 영역을 계산하고 CollisionGroups.Monster 대상에 PlayerAttack:AttackFast 로 피해를 입히는 스크립트를 작성해줘 [answer] | _EffectService 와 _ResourceService 를 활용하여 스프라이트 프레임 정보를 기반으로 BoxShape 공격 영역을 계산하고, 해당 영역에서 CollisionGroups.Monster 대상에 PlayerAttack:AttackFast 로 피해를 입히는 스크립트는 다음과 같습니다. 참고 문서에 제시된 `Explode()` 함수 로직을 기반으로, 스프라이트의 픽셀 크기, PPU(Pixel Per Unit), 피벗(Pivot) 정보를 활용해 오프셋과 크기를 보정하는 방식으로 작성되었습니다. ```lua Proper [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 완성된 `Explode()` 함수 전체는 아래와 같습니다. ```lua void Explode() { local shape = BoxShape(Vector2.zero, Vector2.one, 0) -- 폭발 이펙트 sprite 사이즈를 가져와 공격 영역으로 설정 _ResourceService:PreloadAsync({self.ExplodeSpriteRUID}, function() if not isvalid(self.Firer) and n
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | OnBeginPlay() 함수에서 DataStorageService를 통해 아이템 데이터를 로드하고 에러 처리를 하는 과정을 단계별 번호 목록으로 정리하세요. [answer] | `OnBeginPlay()` 함수에서 `DataStorageService`를 통해 아이템 데이터를 로드하고 에러를 처리하는 과정은 다음과 같습니다. 1. `inventoryData` 테이블을 초기화합니다. `_DataService:GetRowCount("UserItemDataSet")`을 호출하여 데이터셋의 행 수를 확인한 후, 해당 수만큼 반복문을 돌리며 `self._T.inventoryData[i]`의 값을 0으로 설정합니다. 2. `_DataStorageService:GetUserDataStorage(self.Entity.P [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 인벤토리의 동작을 제어할 인벤토리 스크립트를 작성합니다. 1. 새 스크립트 컴포넌트를 생성하고 이름을 **LiteInventory**로 설정합니다. 2. **Workspace - DefaultPlayer**의 콘텍스트 메뉴에서 **Add Component**를 클릭한 후 **LiteInventory** 컴포넌트를 추가합니다. 3. **LiteInventory** 스크립트를 열고 스크립트 에디터에서 프로퍼티를 추가합니다. ```lua Property: [Sync] boolean IsInitialize
[task] | instruction_following [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | Enable 프로퍼티의 true/false 상태에 따른 인벤토리 초기화 동작 차이를 3문장 이내로 서술하세요. [answer] | Enable 프로퍼티가 true로 설정되면 캐릭터가 새로 접속할 때마다 인벤토리가 비워집니다. 반면 Enable 프로퍼티가 false로 설정되면 인벤토리가 초기화되지 않습니다. 이 경우 이전에 데이터베이스에 저장된 아이템 정보가 인벤토리에 그대로 표시됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 인벤토리 비우기 테스트 편의를 위해 캐릭터가 게임에 새로 접속할 때마다 인벤토리를 비우도록 설정해 봅시다. 1. 아이템 삭제를 처리하기 위해 **LiteInventory**에 `RemoveItem()` 함수를 추가합니다. 실행 공간은 **server only**로 설정합니다. 매개 변수로 **number** 타입의 **itemIndex**를 추가합니다. 그리고 아래와 같이 작성합니다. ```lua [server only] void RemoveItem(number itemIndex) {
[task] | two_turn [pass] | ⏳ 미판정 [title] | 캐릭터가 발사체로 몬스터 공격하기 [question] | 발사체 스크립트에서 공격자와 피격 대상의 데미지를 반환하는 CalcDamage() 함수의 구현 방식을 알려줘. [answer] | `CalcDamage()` 함수는 공격자(attacker)와 피격 대상(defender) 정보, 그리고 공격 정보(attackInfo)를 인자로 받아 실제 적용할 데미지 값을 반환하는 역할을 합니다. 제공된 문서의 예시에서는 이 함수가 `PlayerAttack` 스크립트의 `Damage` 프로퍼티 값을 그대로 반환하도록 구현되어 있습니다. 이는 발사체가 몬스터를 명중했을 때, 해당 스크립트에 설정된 고정 데미지량이 적용되도록 하는 방식입니다. 구체적인 구현 코드는 다음과 같습니다. ```lua Method: override i [followup] | self.Damage 프로퍼티를 직접 반환하는 방식과, 공격 정보(attackInfo)나 방어자 정보(defender)를 기반으로 동적으로 계산하는 방식의 차이점은 무엇인가? [followup_answer] | 제공된 문서에는 `CalcDamage()` 함수가 `self.Damage` 프로퍼티 값을 그대로 반환하는 고정 데미지 방식의 구현만 포함되어 있습니다. 문서에는 `attackInfo`나 `defender` 정보를 기반으로 데미지를 동적으로 계산하는 구체적인 코드 예제나 논리 설명이 제공되지 않았습니다. 따라서 두 방식의 차이점에 대해 문서 내에서 확인 가능한 내용은, 제공된 예시가 단순한 프로퍼티 값 반환에 그친다는 사실뿐입니다. [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [원거리 발사체 만들기](/docs?postId=935) > **▶ 2편.** [**캐릭터가 발사체로 몬스터 공격하기**](/docs?postId=937) 원거리 발사체를 날려서 몬스터를 처치하는 월드를 만들어보는 마지막 과정입니다. 이제 캐릭터가 발사체로 몬스터를 공격하도록 만들어봅시다. # 공격 키 누르면 발사체 날리기 1. **PlayerAttack** 스크립트를 열고 아래와 같이 프로퍼티를 추가합니다. ```lua Prop
[task] | single_turn [pass] | ⏳ 미판정 [title] | 인벤토리 스크립트 작성하기 [question] | 인벤토리 스크립트와 인벤토리 UI 스크립트 간에 데이터를 주고받을 때, 직접 참조를 사용하는 것보다 이벤트나 메시지를 사용하는 것이 나은 이유와 방법은 무엇인가요? [answer] | 제공된 참고 문서에는 인벤토리 스크립트와 인벤토리 UI 스크립트 간의 데이터 전달 방식(직접 참조 vs 이벤트/메시지)에 대한 비교, 장단점, 또는 구체적인 구현 방법이 포함되어 있지 않습니다. 문서에는 인벤토리 스크립트가 "인벤토리 UI에 변경되는 아이템 정보를 전달"한다고만 언급되어 있을 뿐, 이를 위해 이벤트나 메시지를 사용해야 하는 이유나 구체적인 API 사용법에 대한 설명은 없습니다. 따라서 제공된 문서를 근거로 해당 질문에 답변할 수 있는 정보가 없습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 > 본 가이드는 아래의 순서로 이어지는 과정입니다. > 1편. [몬스터를 스폰해보자](/docs?postId=204) > 2편. [몬스터 드롭 아이템과 인벤토리 UI 만들기](/docs?postId=943) > **▶ 3편.** [**인벤토리 스크립트 작성하기**](/docs?postId=942) > 4편. [인벤토리 UI 스크립트 작성하기](/docs?postId=946) > 5편. [아이템 스크립트 작성하기](/docs?postId=947) 지난 시간에 이어 이번 과정에서는 인벤토리 스크립트를 작성해 보겠