[task] | two_turn [pass] | ⏳ 미판정 [title] | 공격과 피격 [question] | AttackComponent와 HitComponent의 기본 상호작용 방식과 OnHit() 함수의 오버라이드 구조는 어떻게 되나요? [answer] | **AttackComponent**와 **HitComponent**의 기본 상호작용 방식은 다음과 같습니다. 1. **기본 동작**: `AttackComponent`를 가진 엔티티가 `HitComponent`를 가진 엔티티를 공격하면, 별도의 추가 스크립트 처리 없이도 피격 상태가 자동으로 적용됩니다. 2. **기본 대미지**: 추가 처리가 없는 경우, 대미지 스킨(Damage Skin)은 기본값인 **1**로 재생됩니다. 3. **피격량 계산**: 공격량 그대로 대미지로 적용할 수도 있지만, 방어력 등 다른 공식을 사용해 피격량 [followup] | OnHit()에서 damage를 20으로 고정하고 __base:OnHit()을 호출하는 구체적인 코드 예시와, 기본 HitComponent를 제거하지 않으면 발생하는 오류에 대해 설명해 주세요. [followup_answer] | `OnHit()` 함수에서 대미지를 20으로 고정하고 기본 동작을 유지하기 위한 코드 예시는 다음과 같습니다. 이 코드는 `HitComponent`를 확장한 커스텀 컴포넌트(예: `MonsterHit`)의 `Method:` 블록에 작성됩니다. ```lua Method: override void OnHit(Entity attacker, int damage, boolean isCritical, string attackInfo, int hitCount) { __base:OnHit(attacker, 20, isCritical, a [scores] | [judge_reason] | [source_doc] | **AttackComponent**를 가진 엔티티가 **HitComponent**를 가진 엔티티를 공격하면, 별다른 추가 처리를 하지 않아도 엔티티는 피격 당하게 됩니다. 이 경우 추가 처리가 없기 때문에 기본값인 1로 대미지 스킨이 재생됩니다. 피격을 구현할 때는 공격량 그대로 대미지로 받을 수도 있지만, 공격과 다른 공식을 함께 사용해 피격량을 계산할 수도 있습니다. 예를 들어 100의 공격력으로 공격했지만 몬스터의 방어력이 높은 경우 절반의 공격만 유효하게 처리할 수 있습니다. 이번에는 아래 두 가지를 구현해 피격 당하는지를
[task] | instruction_following [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | IsKeyPressed()와 IsAnyKeyPressed() 함수의 반환값과 목적을 비교하는 표로 정리하세요. [answer] | `IsKeyPressed()`와 `IsAnyKeyPressed()` 함수의 반환값과 목적을 비교한 표는 다음과 같습니다. | 함수 | 반환값 | 목적 | | :--- | :--- | :--- | | `IsKeyPressed(KeyboardKey key)` | `true` / `false` | 특정 키가 현재 눌린 상태인지 확인합니다. 키가 눌려 있으면 `true`, 눌리지 않은 상태면 `false`를 반환합니다. | | `IsAnyKeyPressed()` | `true` / `false` | 어떤 키라도 현재 눌린 상태인지 확인합 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | `KeyDownEvent`는 키를 눌렀을 때 발생하는 이벤트입니다. `KeyDownEvent`가 발생하면 **HandleKeyDownEvent**가 실행됩니다. `KeyDownEvent`가 핸들러의 매개 변수로 전송되며, 이벤트에는 유저가 입력한 키가 enum으로 넘어오게 됩니다. 다음은 `T` 키를 눌렀을 때 로그를 출력하는 예제입니다. ```lua Event Handler: [service: InputService] HandleKeyDownEvent(KeyDownEvent event) { --------------- N
[task] | code [pass] | ⏳ 미판정 [title] | 공격과 피격 [question] | AttackComponent의 Attack() 함수와 HitComponent의 대미지 처리 기능을 활용해 Ctrl 키 입력 시 캐릭터 위치를 기준으로 원형 공격 범위를 설정하고 해당 범위 내 HitComponent가 있는 엔티티에 기본 대미지를 적용하는 스크립트를 작성해줘 [answer] | 사용자가 요청한 기능(원형 공격 범위, Ctrl 키 입력 감지, 기본 대미지 적용)을 구현하기 위해 `AttackComponent`와 `HitComponent`를 함께 사용하는 스크립트를 작성했습니다. 참고 문서에 따르면: 1. **공격 범위 설정**: `Attack()` 함수를 사용하며, 캐릭터 위치를 기준으로 범위를 설정합니다. 공격 범위 형태(shape)와 충돌 그룹(CollisionGroup)을 지정할 수 있습니다. 2. **대미지 설정**: `CalcDamage()` 함수를 오버라이드하여 엔티티가 받을 기본 대미지를 반환 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 메이플스토리에서 플레이어는 모험가가 되어 메이플 세계를 탐험하고 몬스터를 만나 전투를 합니다. 전투 과정에서 다른 몬스터를 공격하거나 피격당합니다. 메이플스토리뿐만 아니라 다양한 게임에서 공격과 피격은 중요한 개념입니다. 이번 과정에서는 공격과 피격을 구현하는 방법을 학습합니다. ##### 참고 가이드/레퍼런스 [AttackComponent](/apiReference/Components/AttackComponent) [HitComponent](/apiReference/Components/HitComponent
[task] | single_turn [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | table 타입 프로퍼티는 동기화가 불가능하다고 하는데, 실시간 동기화가 꼭 필요한 데이터라면 어떤 타입으로 대체해야 하나요? [answer] | `table` 타입의 프로퍼티는 동기화가 불가능합니다. 실시간 동기화가 필요한 데이터라면 `SyncTable` 타입으로 대체해야 합니다. 참고 문서에 따르면, `SyncTable< v >` (값만 저장)와 `SyncTable< k,v >` (키와 값 저장) 모두 동기화 가능합니다. **대체 예시:** ```lua Property: [Sync] SyncTable<string> ItemIds = {} ``` 위처럼 `table` 대신 `SyncTable`을 사용하면 프로퍼티 값이 클라이언트와 서버 간에 동기화됩니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이
[task] | code [pass] | ⏳ 미판정 [title] | 공격과 피격 [question] | **AttackComponent**의 `IsAttackTarget()`에서 `true`를 반환하여 공격자 자신을 포함시킨 후, **HitComponent**의 `IsHitTarget()`이 호출되지 않도록 하여 무조건 대미지가 적용되도록 하는 스크립트를 작성해줘. [answer] | 문서에 명시된 로직에 따라 `AttackComponent`의 `IsAttackTarget()`에서 `true`를 반환하면, 피격자의 `HitComponent`에서 `IsHitTarget()`이 호출되지 않고 무조건 대미지가 적용됩니다. 따라서 아래 스크립트는 `AttackComponent`에서 `IsAttackTarget()`을 오버라이드하여 항상 `true`를 반환하도록 구성했습니다. ```lua Property: [None] number DamageValue = 50 Method: [server only] void OnBe [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 크리에이터의 공격 제작 방식에 따라 `IsAttackTarget()` 함수를 활용해 피격 대상을 선정할 수 있습니다. `IsAttackTarget()` 함수는 공격자가 공격 박스에 포함되지 않도록 처리되어 있으므로, 공격자가 타격을 받지 않게 처리할 필요가 없습니다. **Entity** 타입의 `defender` 매개변수는 충돌한 엔티티가 공격 대상인지 판단할 수 있는 엔티티 정보를 받습니다. 함수의 리턴값이 **false**면 **AttackComponent**에서 적합한 공격 대상으로 판별하고 이후 판단을 **HitCompone
[task] | single_turn [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | 서버에서 클라이언트로의 프로퍼티 동기화 과정에서 값이 즉시 반영되지 않고 약간의 딜레이가 발생하는 것은 정상적인 동작인가요? [answer] | 네, 정상적인 동작입니다. 서버에서 프로퍼티의 값이 변경되면 해당 값이 클라이언트로 전송되어 같은 프로퍼티에 할당되는데, 이 과정에는 약간의 딜레이가 발생합니다. 따라서 서버에서 값을 변경한 즉시 클라이언트에 반영되지 않습니다. 서버에서 변경한 값이 클라이언트로 동기화된 시점에 특정 액션을 수행해야 한다면, 기본 이벤트 함수인 `OnSyncProperty`를 활용해야 합니다. `OnSyncProperty`는 같은 컴포넌트에 있는 프로퍼티 값이 동기화되었을 때 호출되는 함수로, 서버로부터 동기화된 값을 클라이언트 상에 출력하거나 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당
[task] | single_turn [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | 프로퍼티 선언 시 동기화 여부를 설정하는 것 외에는 서버와 클라이언트 간 데이터 전송을 위해 별도의 코드를 작성해야 하나요? [answer] | 아니요, 별도의 코드를 작성할 필요가 없습니다. 메이플스토리 월드에서는 프로퍼티를 선언한 후 `[Sync]` 속성을 설정해 주기만 하면 프로퍼티가 자동으로 동기화됩니다. 즉, 서버에서 프로퍼티의 값을 변경하면 해당 값이 자동으로 클라이언트로 전송되어 같은 프로퍼티에 할당되므로, 수동으로 데이터를 전송하거나 갱신하는 로직을 직접 구현할 필요가 없습니다. 참고로 프로퍼티 동기화는 기본적으로 서버에서 클라이언트로单向(단방향)으로 진행됩니다. 서버의 값이 변경되면 클라이언트로 전송되지만, 클라이언트에서 값을 단독으로 변경한다고 해서 서 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당
[task] | single_turn [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | 서버에서 HP를 줄여도 클라이언트의 UI에는 HP가 그대로 보이는 현상이 발생하는 원인이 무엇인가요? [answer] | 서버에서 HP 값을 변경해도 클라이언트 UI에 반영되지 않는 현상의 원인은 **프로퍼티 동기화가 설정되지 않았거나, 동기화 방향의 한계** 때문입니다. 1. **서버와 클라이언트의 독립적 공간**: 메이플스토리 월드에서 서버와 클라이언트는 각각 독립된 공간에 존재하며, 같은 이름의 프로퍼티도 서로 다른 값으로 유지될 수 있습니다. 2. **동기화 미설정 시**: 프로퍼티 선언 시 동기화를 활성화하지 않으면, 서버에서 로직을 통해 HP를 감소시킨다고 해서 클라이언트의 HP 프로퍼티 값은 자동으로 갱신되지 않습니다. 결과적으로 서버에 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 서버, 클라이언트 간 데이터 전송 방식 중 하나인 프로퍼티 동기화에 대해 알아봅시다. # 동기화 메이플스토리 월드에서의 동기화는 서버, 클라이언트 간 데이터 전송 방식의 일종으로,각각의 공간에 존재하는 같은 이름의 프로퍼티를 같은 값으로 맞춰주는 것을 의미합니다. 기본적으로 프로퍼티는 선언과 동시에 서버, 클라이언트 각각의 공간에 생성되지만, 만일 프로퍼티 동기화가 되지 않는다면 이름은 같지만 서로 다른 값으로 설정할 수 있습니다. 제작자의 의도에 따라서 같은 프로퍼티의 값을 각 공간에 따라 다르게 할당
[task] | two_turn [pass] | ⏳ 미판정 [title] | 공격과 피격 [question] | AttackComponent를 확장하여 NormalAttack 함수를 정의하고 PlayerActionEvent로 호출하는 기본 구조는 어떻게 구현합니까? [answer] | `AttackComponent`를 확장하여 `NormalAttack` 함수를 정의하고 `PlayerActionEvent`로 호출하는 기본 구현 절차와 코드는 다음과 같습니다. ### 1. 컴포넌트 확장 및 스크립트 에디터 열기 1. Workspace에서 `BaseEnvironment > NativeScripts > Component > AttackComponent`를 선택합니다. 2. 콘텍스트 메뉴에서 **Extend**를 눌러 컴포넌트를 확장하고, 이름을 `CharacterAttack`으로 변경합니다. 3. `CharacterA [followup] | Attack 범위를 Vector2로 설정할 때 attackOffset 값이 공격 판정 위치에 미치는 영향과, CalcDamage()에서 100으로 고정된 대미지를 몬스터의 방어력이나 상태에 따라 동적으로 계산하려면 어떤 로직을 추가해야 합니까? [followup_answer] | 제공된 참고 문서를 기준으로 질문에 답변합니다. ### 1. attackOffset 값의 영향 참고 문서에는 `attackOffset`이 `Vector2` 타입으로 정의되고 `self:Attack(attackSize, attackOffset, nil)` 호출 시 매개변수로 전달된다는 사실만 명시되어 있습니다. 문서에는 **`attackOffset` 값이 공격 판정 위치에 구체적으로 어떠한 영향을 미치는지(좌표계 기준, 상대적 위치 등)에 대한 설명이 없습니다.** 따라서 문서 근거만으로 offset의 정확한 물리적 의미나 판정 위 [scores] | [judge_reason] | [source_doc] | 1. **Workspace - BaseEnvironment - NativeScripts - Component - AttackComponent**를 선택합니다. 2. 콘텍스트 메뉴에서 **Extend**를 눌러 컴포넌트를 확장합니다. 확장한 컴포넌트의 이름을 **CharacterAttack**으로 변경합니다. 3. **CharacterAttack** 컴포넌트를 더블 클릭하여 스크립트 에디터를 엽니다. 4. **Method**에서 새로운 함수를 추가하고, 이름을 **NormalAttack** 으로 변경합니다. 5. `Att
[task] | code [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | string PlayerName = "Maple" 프로퍼티를 가진 스크립트를 작성해줘 [answer] | string 타입의 프로퍼티는 동기화가 가능합니다. 기본값으로 "Maple"을 가진 `PlayerName` 프로퍼티를 작성한 스크립트는 다음과 같습니다. ```lua Property: [Sync] string PlayerName = "Maple" ``` [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이
[task] | single_turn [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | SyncTable< v >와 SyncTable< k,v >의 차이점과 각각 어떤 상황에서 사용해야 하는지 알려주세요. [answer] | 제공된 참고 문서에는 `SyncTable< v >`와 `SyncTable< k,v >`의 구체적인 차이점이나 각각의 사용 시나리오에 대한 설명이 포함되어 있지 않습니다. 문서에서 확인 가능한 정보는 다음과 같습니다. 1. `SyncTable< v >`와 `SyncTable< k,v >` 모두 **동기화가 가능한 타입**입니다. 2. 일반 `table` 타입은 동기화가 불가능하며, 동기화가 필요한 테이블 데이터를 다루기 위해 `SyncTable`을 사용해야 합니다. 따라서 두 타입의 정확한 기능적 차이와 권장 사용 상황은 현재 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이
[task] | instruction_following [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | KeyHoldEvent와 KeyReleaseEvent의 발생 시점 차이를 3문장 이내로 설명하세요. [answer] | KeyHoldEvent는 키가 눌려 있는 동안 프레임마다 반복적으로 발생하며, KeyReleaseEvent는 키를 눌렀다가 손을 떼는 순간 1회만 발생합니다. 따라서 KeyHoldEvent는 지속 입력 상태를, KeyReleaseEvent는 입력 종료 시점을 나타냅니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende
[task] | single_turn [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | Vector2와 EntityRef 타입은 동기화가 가능한데, 두 타입을 사용하면서 동기화 오류가 발생하는 원인은 무엇일까요? [answer] | 제공된 문서에는 `Vector2`와 `EntityRef` 타입이 동기화 가능한 타입으로 명시되어 있습니다. 하지만 두 타입을 사용하면서 동기화 오류가 발생하는 구체적인 원인에 대한 설명은 문서에 포함되어 있지 않습니다. 문서에서 확인할 수 있는 정보는 다음 두 가지입니다. 1. `Vector2`와 `EntityRef`는 동기화 가능 여부 표에서 'O'로 표시되어 있습니다. 2. 프로퍼티 상단의 `Sync` 표시가 `None`으로 변경되어 있으면 동기화가 이루어지지 않습니다. 따라서 동기화 오류의 원인은 해당 프로퍼티의 동기화 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이
[task] | two_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | InputService를 통해 유저의 키 입력 이벤트를 처리하고 액션을 수행하는 기본 구조가 어떻게 되나요? [answer] | InputService를 활용한 키 입력 이벤트 처리의 기본 구조는 다음과 같습니다. 유저가 키를 입력하면 **InputService**가 이벤트를 발생시키고, 이를 스크립트 컴포넌트의 **이벤트 핸들러(Event Handler)**가 받아서 액션을 수행합니다. 모든 유저 입력 이벤트는 클라이언트에서만 발생하며, 따라서 해당 이벤트 핸들러도 클라이언트에서만 실행됩니다. ### 기본 구조 및 코드 예시 키 입력을 처리하는 가장 기본적인 `KeyDownEvent` 핸들러 구조는 아래와 같습니다. ```lua Event Handl [followup] | KeyDownEvent가 반복적으로 발생하는 특성을 고려해, 키를 누르고 있는 동안 액션을 연속적으로 실행하려면 어떤 방식으로 로직을 작성해야 하나요? [followup_answer] | 제공된 참고 문서에는 `KeyDownEvent`가 "유저의 입력 형태에 따라 발생하는 시점과 횟수가 달라진다"는 설명만 있을 뿐, 키를 누르고 있는 동안 반복적으로 발생하는지, 아니면 한 번만 발생하는지에 대한 구체적인 특성 설명이 없습니다. 따라서 문서 근거만으로 "키를 누르고 있는 동안 액션을 연속적으로 실행하는 로직"을 어떻게 작성해야 하는지(예: OnUpdate에서 키 상태 확인, 타이머 사용 등)에 대한 정확한 방법이나 API를 제시할 수 없습니다. 문서에 명시된 정보만으로는 이 질문에 답할 수 없으며, 반복 입력 처리 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176
[task] | code [pass] | ⏳ 미판정 [title] | 프로퍼티 [question] | `OnBeginPlay` 메서드에서 `self` 키워드를 사용하여 같은 컴포넌트의 `StringProperty` 프로퍼티에 접근하여 "Hello!!" 값을 확인하고, 다른 엔티티의 컴포넌트 프로퍼티 접근 시 `_EntityService`와 컴포넌트 참조(`entityA.ComponentA`)를 어떻게 결합해야 하는지 시연하는 스크립트를 작성해줘. [answer] | 요청하신 두 가지 시나리오(같은 컴포넌트 접근, 다른 엔티티 컴포넌트 접근)를 하나의 스크립트에서 시연하기 위해, 주어진 예제 코드들을 결합하여 작성했습니다. 1. **같은 컴포넌트 접근**: `self.StringProperty`를 통해 "Hello!!" 값을 읽어 `log`로 출력합니다. 2. **다른 엔티티 접근**: `_EntityService:GetEntityByPath`로 엔티티 "A"를 찾고, `entityA.ComponentA`를 통해 해당 컴포넌트를 참조한 뒤, 그 안의 `PropertyA` 값을 읽어 `sel [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 함수에서 프로퍼티에 접근하는 방법을 알아봅시다. 먼저 같은 컴포넌트에서는 다음과 같이 접근할 수 있습니다. ```lua Property: [None] string StringProperty = "Hello!!" Method: [Server Only] void OnBeginPlay() { local stringProperty = self.StringProperty --"self.프로퍼티명"으로 해당 프로퍼티를 가져옴 } ``` 다른 컴포넌트의 프로퍼티는 다음과 같이 접근할 수 있습니다. 아래 상황에서 접근하는 방법
[task] | code [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | number CurrentHealth = 100 와 [None] [answer] | `number CurrentHealth = 100`에 `[None]` 동기화 설정을 적용하면, 해당 프로퍼티는 서버와 클라이언트 간에 동기화되지 않습니다. mLua 스크립트 형식에 맞춰 작성하면 다음과 같습니다. ```lua Property: [None] number CurrentHealth = 100 ``` 이 설정이 적용되면 `CurrentHealth` 값은 각 공간(서버 또는 클라이언트)에서 독립적으로 관리됩니다. 즉, 서버에서 값을 변경해도 클라이언트에 자동으로 반영되지 않으며, 클라이언트에서 변경해도 서버에 반영되지 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이
[task] | two_turn [pass] | ⏳ 미판정 [title] | 서버와 클라이언트 [question] | 서버와 클라이언트 간의 정보 전달 시, 클라이언트의 입력이 서버에 반영되고 다시 모든 클라이언트에 동기화되는 흐름을 자세히 설명해 주세요. [answer] | 서버와 클라이언트 간의 정보 전달 및 동기화 흐름은 다음과 같은 단계로 진행됩니다. **1. 클라이언트에서 입력 처리 및 서버로 전송** 클라이언트는 유저의 입력을 받아 처리합니다. 입력된 내용에 따라 서버에게 정보를 요청하거나, 현재 클라이언트의 상황을 서버에게 알립니다. 이때 클라이언트는 다른 클라이언트와 직접 통신하지 않으며, 오직 서버와만 정보를 주고받습니다. **2. 서버에서 정보 수신 및 게임 상태 업데이트** 특정 클라이언트로부터 정보를 받은 서버는 해당 내용을 게임 진행 상황에 업데이트합니다. MapleStory [followup] | 특정 클라이언트로부터 입력을 받은 서버가 게임 상태를 업데이트하고 모든 클라이언트에 전송하는 과정에서 mLua의 Event Handler와 Method를 어떻게 활용해야 하는지 코드 예시를 요청합니다. [followup_answer] | 참고 문서에는 서버와 클라이언트 간의 통신 모델 개념과 `HandleUserEnterEvent`, `HandleUserLeaveEvent`와 같은 Event Handler의 기본 형식만 제공되고 있으며, 특정 클라이언트 입력을 받아 게임 상태를 업데이트하고 모든 클라이언트에 동기화하는 구체적인 mLua API(예: 클라이언트 입력 수신 이벤트, 서버 상태 변경 메서드, 멀티캐스트 전송 메서드 등)에 대한 설명이나 코드 예제는 포함되어 있지 않습니다. 따라서 요청하신 "특정 클라이언트로부터 입력을 받은 서버가 게임 상태를 업데이트하 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 멀티 플레이를 제공하는 게임의 경우 각 게임의 특성에 따라 사용되는 통신 모델들이 다양합니다. MapleStory World는 다양한 통신 모델 중에서도 서버 - 클라이언트 모델을 사용하고 있습니다. 이번 과정에서는 MapleStory World의 통신 모델인 서버와 클라이언트의 개념과 구조, 그리고 각 공간 간의 정보전달 방법에 대해 알아보도록 하겠습니다. # 서버와 클라이언트 클라이언트는 게임을 플레이하는 유저들의 모바일이나 PC, 또는 해당 기기에서 개별적으로 돌아가는 프로그램을 의미합니다.주로 유저의
[task] | code [pass] | ⏳ 미판정 [title] | 공격과 피격 [question] | 기본 HitComponent를 삭제하고 확장된 MonsterHit 컴포넌트만 적용하여, OnHit 함수 내에서 __base:OnHit(attacker, 20, isCritical, attackInfo, hitCount)를 호출한 후 Scale 수정 코드를 실행하는 정확한 순서를 가진 스크립트를 작성해줘 [answer] | 참고 문서에 제시된 절차와 코드를 바탕으로, 확장된 `MonsterHit` 컴포넌트에 적용할 스크립트를 작성해 드립니다. 1. **Workspace - BaseEnvironment - NativeScripts - HitComponent** 를 선택하여 **Extend** 로 `MonsterHit` 컴포넌트를 생성합니다. 2. 대상 몬스터 모델(예: `MoveMonster`)에서 기본 **HitComponent** 를 **Remove** 합니다. 3. 몬스터에 **MonsterHit** 컴포넌트를 추가합니다. 4. 아래 코드 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | **AttackComponent**를 가진 엔티티가 **HitComponent**를 가진 엔티티를 공격하면, 별다른 추가 처리를 하지 않아도 엔티티는 피격 당하게 됩니다. 이 경우 추가 처리가 없기 때문에 기본값인 1로 대미지 스킨이 재생됩니다. 피격을 구현할 때는 공격량 그대로 대미지로 받을 수도 있지만, 공격과 다른 공식을 함께 사용해 피격량을 계산할 수도 있습니다. 예를 들어 100의 공격력으로 공격했지만 몬스터의 방어력이 높은 경우 절반의 공격만 유효하게 처리할 수 있습니다. 이번에는 아래 두 가지를 구현해 피격 당하는지를
[task] | code [pass] | ⏳ 미판정 [title] | 공격과 피격 [question] | **HitComponent**의 `OnHit()` 함수에서 `HitEvent`를 발생시키고, 해당 이벤트 핸들러에서 엔티티의 `TransformComponent` 스케일을 공격당할 때마다 1.1배씩 증가시키는 스크립트를 작성해줘. [answer] | `OnHit()` 함수는 `HitComponent` 내부에서 호출되며, 이때 `HitEvent`가 발생하면 엔티티에 등록된 이벤트 핸들러가 실행됩니다. 질문하신 요구사항은 이 `HitEvent` 핸들러 안에서 해당 엔티티의 `TransformComponent` 스케일을 1.1배로 늘리는 것입니다. 참고 문서의 예제에서 `HitEvent` 핸들러는 `[server only] [self]` 속성을 가진 `HandleHitEvent` 함수로 구현되어 있으며, 이벤트 매개변수에서 필요한 정보를 추출할 수 있습니다. 스케일 변경은 `sel [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 크리에이터의 공격 제작 방식에 따라 `IsAttackTarget()` 함수를 활용해 피격 대상을 선정할 수 있습니다. `IsAttackTarget()` 함수는 공격자가 공격 박스에 포함되지 않도록 처리되어 있으므로, 공격자가 타격을 받지 않게 처리할 필요가 없습니다. **Entity** 타입의 `defender` 매개변수는 충돌한 엔티티가 공격 대상인지 판단할 수 있는 엔티티 정보를 받습니다. 함수의 리턴값이 **false**면 **AttackComponent**에서 적합한 공격 대상으로 판별하고 이후 판단을 **HitCompone
[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | 스크립트 컴포넌트에 InputService 이벤트를 추가할 때 이벤트 센더 선택을 누락하면 어떤 오류나 문제가 발생합니까? [answer] | 제공된 문서에는 이벤트 센더 선택을 누락했을 때 발생하는 구체적인 오류 메시지나 시스템적 문제에 대한 설명이 포함되어 있지 않습니다. 문서에서는 스크립트 컴포넌트에 이벤트 핸들러를 추가하는 과정으로, 이벤트 핸들러가 추가된 후 **이벤트 센더가 `InputService`로 선택되어 있는지 확인**하는 단계를 안내하고 있을 뿐, 누락 시의 결과에 대해서는 언급하고 있지 않습니다. [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176
[task] | code [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | boolean IsActive = true 프로퍼티를 가진 스크립트를 작성해줘 [answer] | boolean 타입의 프로퍼티는 동기화(Sync)가 지원되는 타입입니다. 따라서 `IsActive` 프로퍼티를 `[Sync]` 속성으로 선언하고, 기본값을 `true`로 설정하여 서버와 클라이언트 간에 상태가 실시간으로 동기화되도록 구성할 수 있습니다. 요청하신 형식의 mLua 스크립트는 다음과 같습니다. ```lua Property: [Sync] boolean IsActive = true Method: [server only] void OnBeginPlay() { log("IsActive 상태: " .. tostrin [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이
[task] | code [pass] | ⏳ 미판정 [title] | 서버와 클라이언트 [question] | 서버와 클라이언트 공간에서 독립적으로 동작하는 프로퍼티와 함수를 선언하여 한쪽의 변경이 다른쪽에 영향을 주지 않도록 하는 스크립트를 작성해줘 [answer] | 메이플스토리 월드의 스크립트 컴포넌트에서 프로퍼티와 함수는 별도의 설정이 없으면 기본적으로 서버와 클라이언트 두 공간에 각각 독립적으로 생성됩니다. 따라서 특정 프로퍼티나 함수가 어느 한쪽 공간에서만 동작하도록 하려면, 해당 코드 블록 위에 `[server only]` 또는 `[client only]` 어노테이션을 명시적으로 지정해야 합니다. 아래 예제는 서버 공간과 클라이언트 공간에서 독립적으로 동작하는 프로퍼티와 함수를 선언한 스크립트입니다. 1. `ServerOnlyProperty`와 `ServerOnlyFunction`: [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 서버와 클라이언트가 어떻게 상호작용을 하는지를 알아보았으니, 이제 메이커에서 작성한 프로그램이 서버와 클라이언트에서 어떻게 돌아가는지 알아보도록 합니다. 제작자가 스크립트에서 선언한 프로퍼티와 함수는 별도의 설정을 하지 않는 한 기본적으로 서버와 클라이언트 두 개의 공간에 각각 독립적으로 생성됩니다. 이름은 같지만 서로 다른 공간에 존재하기 때문에 별도의 프로퍼티 또는 함수라 보는 것이 좋습니다. 기본적으로 함수의 호출과 프로퍼티의 값 참조 및 할당은 같은 공간 내에서만 이루어집니다. 예를 들어 A라는 프로퍼티에 값을 B라는 함
[task] | instruction_following [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | 문서에 등장하는 3가지 입력 이벤트와 해당 핸들러 이름을 표로 정리해서 나열하세요. [answer] | 문서에 등장하는 3가지 입력 이벤트와 해당 핸들러 이름은 다음과 같습니다. | 이벤트 이름 | 핸들러 이름 | | :--- | :--- | | `KeyHoldEvent` | `HandleKeyHoldEvent` | | `KeyReleaseEvent` | `HandleKeyReleaseEvent` | | `ScreenTouchEvent` | `HandleScreenTouchEvent` | *(참고: 문서에는 `ScreenTouchHoldEvent`와 `HandleScreenTouchHoldEvent`도 등장하지만, 질문에서 요구한 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende
[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | KeyDownEvent와 다른 입력 이벤트는 유저의 입력 형태에 따라 발생하는 시점과 횟수가 어떻게 다른지 구체적인 차이가 있나요? [answer] | 제공된 참고 문서에는 `KeyDownEvent`를 제외한 다른 입력 이벤트(예: KeyUpEvent, TouchEvent 등)에 대한 구체적인 발생 시점이나 횟수 차이를 설명하는 내용이 포함되어 있지 않습니다. 문서에서는 "InputService에서 제공하는 유저 입력과 관련된 각 이벤트는 유저의 입력 형태에 따라 발생하는 시점과 횟수가 달라집니다"라는 일반적인 설명만 제시하고 있으며, 특정 이벤트별 구체적인 차이점을 나열하지 않았습니다. 따라서 현재 문서 기준으로 `KeyDownEvent`와 다른 입력 이벤트의 구체적인 발생 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176
[task] | code [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | Vector3 TargetPosition = Vector3(0,0,0) 프로퍼티를 가진 스크립트를 작성해줘 [answer] | `Vector3` 타입은 프로퍼티 동기화가 가능한 타입이므로 `[Sync]` 또는 `[None]` 설정을 적용할 수 있습니다. 요청하신 초기값 `Vector3(0,0,0)`을 가진 프로퍼티를 포함하는 기본 스크립트 예제는 다음과 같습니다. ```lua Property: [Sync] Vector3 TargetPosition = Vector3(0, 0, 0) Method: [server only] void OnBeginPlay() { log("TargetPosition initialized: " .. tostring(self [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이
[task] | two_turn [pass] | ⏳ 미판정 [title] | 서버와 클라이언트 [question] | 게임의 주요 로직을 클라이언트에서 처리하고 서버는 동기화만 맡기는 구조가 해킹에 취약한 이유를 레벨업 예시를 들어 설명해 주세요. [answer] | 메이플스토리 월드의 서버-클라이언트 모델에서 주요 로직을 클라이언트에서 처리하고 서버는 동기화만 맡기는 구조가 해킹에 취약한 이유는, 서버가 클라이언트에서 전달받은 결과를 검증 없이 그대로 신뢰하기 때문입니다. 레벨업 처리 과정을 예시로 보면 다음과 같습니다. 1. **클라이언트 중심 구조의 문제점** * 캐릭터가 몬스터를 잡았을 때 경험치를 얻고 레벨업하는 로직이 유저의 PC나 모바일(클라이언트)에서 수행됩니다. * 클라이언트는 레벨업이 완료되었다는 결과를 서버에게 전송합니다. * 서버는 이 [followup] | 서버에서 검증 로직을 추가해도 비효율적인 구조가 되는 이유와, 이를 방지하기 위해 서버에서 로직을 처리하는 mLua 스크립트 구조를 어떻게 설계해야 하는지 코드로 보여주세요. [followup_answer] | ### 서버 검증 로직이 비효율적인 이유 클라이언트에서 로직을 수행하고 서버에서 검증하는 구조를 채택하면, 동일한 게임 로직(예: 경험치 계산, 레벨업 판정)이 클라이언트와 서버 양쪽에 중복으로 존재하게 됩니다. 1. **코드 중복**: 클라이언트와 서버에 동일한 로직을 작성해야 하므로 개발 비용이 증가합니다. 2. **동기화 문제**: 로직이 변경될 때 클라이언트와 서버 코드 모두를 수정해야 하며, 한쪽만 수정되면 버그가 발생할 수 있습니다. 3. **본질적 해결 불가**: 서버가 검증만 할 뿐, 실제 게임 상태의 주인이 [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 멀티 플레이를 제공하는 게임의 경우 각 게임의 특성에 따라 사용되는 통신 모델들이 다양합니다. MapleStory World는 다양한 통신 모델 중에서도 서버 - 클라이언트 모델을 사용하고 있습니다. 이번 과정에서는 MapleStory World의 통신 모델인 서버와 클라이언트의 개념과 구조, 그리고 각 공간 간의 정보전달 방법에 대해 알아보도록 하겠습니다. # 서버와 클라이언트 클라이언트는 게임을 플레이하는 유저들의 모바일이나 PC, 또는 해당 기기에서 개별적으로 돌아가는 프로그램을 의미합니다.주로 유저의
[task] | instruction_following [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | HandleKeyHoldEvent와 HandleScreenTouchEvent의 코드 예제를 각각 출력하되, 설명은 주석으로만 작성하세요. [answer] | ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sender Info ---------------- -- Sender: InputService -- Space: Client --------------------------------------------------------- -- Parameters local key = event.key -- [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | KeyHoldEvent는 키보드의 키가 눌려있는 동안 프레임마다 발생하며, 이벤트가 발생할 때마다 HandleKeyHoldEvent 역시 매번 실행됩니다. KeyHoldEvent가 핸들러의 매개 변수로 전송되며, 다른 이벤트와 마찬가지로 유저가 입력한 키 정보가 포함되어 들어옵니다. 다음은 키를 누르는 동안 로그를 출력하는 예제입니다. ```lua [service: InputService] HandleKeyHoldEvent(KeyHoldEvent event) { --------------- Native Event Sende
[task] | single_turn [pass] | ⏳ 미판정 [title] | InputService를 활용한 입력과 액션 [question] | Event Handler 추가 시 이벤트 탐색 창에서 원하는 InputService 이벤트를 찾을 수 없다면 어떤 부분을 확인해야 합니까? [answer] | 참고 문서에 따르면, Event Handler 추가 시 이벤트 탐색 창에서 원하는 InputService 이벤트를 찾을 수 없다면 스크립트 컴포넌트가 **임의의 엔티티에 추가되어 있는지**를 확인해야 합니다. 문서는 이벤트 핸들러를 추가하는 절차로 다음을 명시합니다: 1. 스크립트 컴포넌트를 생성한 뒤 임의의 엔티티에 추가합니다. 2. Event Handler에서 [+] 버튼을 눌러 이벤트 탐색 창을 열고, 핸들러에 추가할 이벤트를 찾아 선택합니다. 3. 핸들러가 추가되면 이벤트 센더가 InputService로 선택되어 있는지 확 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | # 학습 과정 소개 모든 게임은 유저의 입력과 입력에 대한 피드백으로 게임이 진행됩니다. 메이플스토리 월드에서는 InputService를 통해 유저의 입력에 대한 액션을 제어할 수 있습니다. 이번 과정에서는 유저의 입력이 발생했을 때의 액션을 추가하는 방법을 알아보겠습니다. # 참고 가이드 [Event System](https://mod-developers.nexon.com/docs?postId=73) [Entity Event System](https://mod-developers.nexon.com/docs?postId=176
[task] | code [pass] | ⏳ 미판정 [title] | 서버와 클라이언트 [question] | 서버에서 클라이언트로 UI 업데이트 액션을 요청하여 클라이언트에서 경험치 바를 갱신하는 스크립트를 작성해줘 (Method: [client] UpdateXPBar, Method: [server] RequestXPUpdate) [answer] | 제시된 참고 문서에는 `UpdateXPBar` 또는 `RequestXPUpdate`라는 특정 함수 이름, 그리고 경험치 바를 갱신하는 구체적인 API나 메서드가 명시되어 있지 않습니다. 문서에서 설명하는 '실행제어' 개념에 따르면, 서버에서 클라이언트의 함수를 호출하려면 해당 함수의 실행 공간을 클라이언트로 설정하고, 서버의 함수에서 그 함수를 호출하는 방식으로 구현해야 합니다. 하지만 실제로 경험치 UI를 조작하는 구체적인 API(예: UI 컴포넌트 접근법, 경험치 값 설정 메서드 등)는 제공된 문서에 포함되어 있지 않으므로, [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 서버와 클라이언트 간 통신에는 데이터의 전달, 즉 동기화 외에도 공간에 정의된 "액션"을 요청하고 수행하는 과정도 필요합니다. 위의 레벨업 처리 과정을 예시로 들면, 클라이언트가 유저의 입력을 받으면, 서버에게 "몬스터 공격"이라는 "액션"을 요청하게 되고, 서버는 클라이언트의 요청에 따라 "몬스터 공격"이라는 "액션"을 수행하게 되는데요, 이렇듯 각 공간에 정의된 액션을 서로 요청하여 수행케 하는 것을 실행제어라고 합니다. 실행제어는 제작자의 의도에 따라 설정할 수 있습니다. 위에 말한 "액션"은 결국 스크립트에서는 "함수"라 할
[task] | code [pass] | ⏳ 미판정 [title] | 프로퍼티 동기화 [question] | number LocalDebugLog = 0 프로퍼티를 가진 스크립트를 작성해줘 [answer] | 사용자 질문에서 `number LocalDebugLog = 0` 프로퍼티를 가진 스크립트를 작성해달라고 요청했습니다. 주어진 참고 문서에 따르면, 프로퍼티의 동기화 설정은 상단의 `[Sync]` 또는 `[None]` 태그로 결정됩니다. 1. `number` 타입은 동기화 가능 여부 표에서 'O'로 표시되어 있어 동기화가 가능합니다. 2. 질문의 변수 이름 `LocalDebugLog`에서 'Local'이라는 단어가 포함되어 있고, 디버그 로그 용도로 사용될 가능성이 높으므로, 클라이언트와 서버 간에 값이 달라져야 하거나 공간별로 따 [followup] | [followup_answer] | [scores] | [judge_reason] | [source_doc] | 동기화 설정 방법은 매우 간단합니다. 스크립트 에디터를 한 번이라도 열어서 프로퍼티를 추가해봤다면 프로퍼티 상단에 Sync라고 쓰여 있는 것을 본 적이 있을 것입니다. 이 Sync는 프로퍼티 동기화가 되고 있다는 것을 의미합니다. 만일 프로퍼티 동기화를 원치 않는다면 Sync를 눌러 None으로 변경해 줍니다. 동기화 표시가 None으로 되어 있으면 프로퍼티 동기화는 이루어지지 않는다는 것을 의미하며, 프로퍼티 값을 공간별로 따로 관리할 수 있게 됩니다. #### 타입별 동기화 가능 여부 일부 타입의 프로퍼티는 동기화 설정이