msw-ai-tf/maplestory-worlds-creator-docs huggingface dataset:
UIAreaParticleComponent

UI에 생성 영역을 조절할 수 있는 파티클 효과를 만드는 기능을 제공합니다.

# Properties

[{"index":"Vector2 AreaOffset","0":"엔티티를 기준으로 생성 범위의 중심점 위치를 설정합니다."}]

[{"index":"Vector2 AreaSize","0":"파티클 생성 범위의 너비와 높이를 지정합니다."}]

[{"index":"UIAreaParticleType ParticleType","0":"생성할 파티클 타입을 설정합니다."}]

##### inherited from UIBaseParticleComponent:

[{"index":"boolean AutoRandomSeed","0":"파티클 입자 방출이 시작될 때마다 랜덤 시드를 새로 생성할지 여부를 설정합니다."}]

[{"index":"Color Color","0":"렌더링될 파티클의 색상을 보정합니다."}]

[{"index":"boolean IsEmitting (ReadOnly) (HideFromInspector)","0":"새 파티클을 방출하고 있는지를 나타냅니다."}]

[{"index":"Vector2 LocalScale","0":"파티클의 크기입니다."}]

[{"index":"boolean Loop","0":"파티클의 반복 재생 여부를 설정합니다."}]

[{"index":"float ParticleCount","0":"파티클 입자 개수를 설정합니다."}]

[{"index":"float ParticleLifeTime","0":"파티클 입자의 지속시간을 설정합니다."}]

[{"index":"float ParticleSize","0":"파티클 입자의 크기를 설정합니다."}]

[{"index":"float ParticleSpeed","0":"파티클 입자의 속도를 설정합니다."}]

[{"index":"boolean PlayOnEnable","0":"파티클 컴포넌트가 Enable일 때, 파티클을 재생할지 여부를 설정합니다."}]

[{"index":"float PlaySpeed","0":"파티클 재생 속도를 설정합니다."}]

[{"index":"boolean Prewarm","0":"값이 true일 경우 파티클이 처음 재생될 때 이미 재생되고 있었던 것과 같은 상태로 시작합니다."}]

[{"index":"integer RandomSeed","0":"파티클이 재생될 때의 생성 위치, 방출 방향, 속도 등을 결정하기 위해 사용하는 랜덤 시드를 설정합니다."}]

##### inherited from Component:

[{"index":"boolean Enable (Sync)","0":"컴포넌트 활성화 여부를 확인합니다."}]

[{"index":"boolean EnableInHierarchy (ReadOnly) (HideFromInspector)","0":"계층 구조상에서 이 컴포넌트가 Enable 상태인지를 반환합니다. Enable이 true일지라도 엔티티의 Enable이 false라면 false를 반환합니다."}]

[{"index":"Entity Entity (ReadOnly)","0":"이 컴포넌트를 소유한 엔티티입니다."}]

# Methods

##### inherited from UIBaseParticleComponent:

[{"index":"void Play() (ClientOnly)","0":"파티클을 재생합니다."}]

[{"index":"void Stop() (ClientOnly)","0":"파티클 재생을 멈춥니다."}]

##### inherited from Component:

[{"index":"boolean IsClient()","0":"현재 실행 환경이 클라이언트인지 아닌지의 여부를 반환합니다."}]

[{"index":"boolean IsServer()","0":"현재 실행 환경이 서버인지 아닌지의 여부를 반환합니다."}]

# Events

[{"index":"ParticleEmitEndEvent","0":"파티클의 방출이 종료되었을 때 BaseParticleComponent에서 발생하는 이벤트입니다."}]

[{"index":"ParticleEmitStartEvent","0":"파티클 입자 방출이 시작될 때 발생하는 이벤트입니다."}]

[{"index":"ParticleLoopEvent","0":"Loop 프로퍼티가 활성화 된 경우, 파티클의 방출 주기가 돌아와서 방출을 반복할 때 발생하는 이벤트입니다."}]
UISpriteParticleComponent

기본 파티클의 설정 및 제어 기능을 제공합니다.

# Properties

[{"index":"boolean ApplySpriteColor","0":"파티클이 사용할 스프라이트에 Color 프로퍼티를 적용할지 여부를 설정합니다. 프로퍼티가 false일지라도 Color의 투명도 값은 적용됩니다."}]

[{"index":"UISpriteParticleType ParticleType","0":"생성할 파티클의 타입을 설정합니다."}]

[{"index":"string SpriteRUID","0":"파티클로 사용할 SpriteRUID를 설정합니다."}]

##### inherited from UIBaseParticleComponent:

[{"index":"boolean AutoRandomSeed","0":"파티클 입자 방출이 시작될 때마다 랜덤 시드를 새로 생성할지 여부를 설정합니다."}]

[{"index":"Color Color","0":"렌더링될 파티클의 색상을 보정합니다."}]

[{"index":"boolean IsEmitting (ReadOnly) (HideFromInspector)","0":"새 파티클을 방출하고 있는지를 나타냅니다."}]

[{"index":"Vector2 LocalScale","0":"파티클의 크기입니다."}]

[{"index":"boolean Loop","0":"파티클의 반복 재생 여부를 설정합니다."}]

[{"index":"float ParticleCount","0":"파티클 입자 개수를 설정합니다."}]

[{"index":"float ParticleLifeTime","0":"파티클 입자의 지속시간을 설정합니다."}]

[{"index":"float ParticleSize","0":"파티클 입자의 크기를 설정합니다."}]

[{"index":"float ParticleSpeed","0":"파티클 입자의 속도를 설정합니다."}]

[{"index":"boolean PlayOnEnable","0":"파티클 컴포넌트가 Enable일 때, 파티클을 재생할지 여부를 설정합니다."}]

[{"index":"float PlaySpeed","0":"파티클 재생 속도를 설정합니다."}]

[{"index":"boolean Prewarm","0":"값이 true일 경우 파티클이 처음 재생될 때 이미 재생되고 있었던 것과 같은 상태로 시작합니다."}]

[{"index":"integer RandomSeed","0":"파티클이 재생될 때의 생성 위치, 방출 방향, 속도 등을 결정하기 위해 사용하는 랜덤 시드를 설정합니다."}]

##### inherited from Component:

[{"index":"boolean Enable (Sync)","0":"컴포넌트 활성화 여부를 확인합니다."}]

[{"index":"boolean EnableInHierarchy (ReadOnly) (HideFromInspector)","0":"계층 구조상에서 이 컴포넌트가 Enable 상태인지를 반환합니다. Enable이 true일지라도 엔티티의 Enable이 false라면 false를 반환합니다."}]

[{"index":"Entity Entity (ReadOnly)","0":"이 컴포넌트를 소유한 엔티티입니다."}]

# Methods

##### inherited from UIBaseParticleComponent:

[{"index":"void Play() (ClientOnly)","0":"파티클을 재생합니다."}]

[{"index":"void Stop() (ClientOnly)","0":"파티클 재생을 멈춥니다."}]

##### inherited from Component:

[{"index":"boolean IsClient()","0":"현재 실행 환경이 클라이언트인지 아닌지의 여부를 반환합니다."}]

[{"index":"boolean IsServer()","0":"현재 실행 환경이 서버인지 아닌지의 여부를 반환합니다."}]

# Events

[{"index":"ParticleEmitEndEvent","0":"파티클의 방출이 종료되었을 때 BaseParticleComponent에서 발생하는 이벤트입니다."}]

[{"index":"ParticleEmitStartEvent","0":"파티클 입자 방출이 시작될 때 발생하는 이벤트입니다."}]

[{"index":"ParticleLoopEvent","0":"Loop 프로퍼티가 활성화 된 경우, 파티클의 방출 주기가 돌아와서 방출을 반복할 때 발생하는 이벤트입니다."}]
ImageComponent

SpriteGUIRendererComponent등과 같이 UI에 이미지를 출력하는 컴포넌트의 부모 컴포넌트입니다. 엔티티에 직접 추가해서 사용할 수 없습니다.

# Properties

[{"index":"Color Color","0":"이미지의 기본 색상을 설정합니다"}]

[{"index":"boolean DropShadow","0":"이미지의 그림자 출력 여부를 설정합니다."}]

[{"index":"float DropShadowAngle","0":"그림자를 출력할 각도를 설정합니다"}]

[{"index":"Color DropShadowColor","0":"그림자 색상을 설정합니다."}]

[{"index":"float DropShadowDistance","0":"이미지와 그림자의 거리입니다."}]

[{"index":"float FillAmount","0":"Type이 Filled로 설정되어 있을 때 표시되는 이미지의 비율입니다. 0부터 1 사이의 값을 사용합니다."}]

[{"index":"boolean FillCenter","0":"Type이 Sliced 또는 Tiled로 설정되어 있을 때 이미지 영역의 가운데를 채울지를 설정합니다."}]

[{"index":"boolean FillClockWise","0":"FillMethod가 Radial90, Radial180, Radial360으로 설정되어 있을 때 채우기 방향을 설정합니다. 값이 true면 시계 방향으로 채워집니다."}]

[{"index":"FillMethodType FillMethod","0":"Type이 Filled일 때의 채우기 방식을 설정합니다."}]

[{"index":"int32 FillOrigin","0":"Type이 Filled로 설정되어 있을 때 채우기 시작점을 설정합니다. FillMethod가 Horizontal 또는 Vertical일 경우 0 ~ 1 값을 사용할 수 있습니다. Radial90, Radial180, Radial360일 경우 0 ~ 3 값을 사용할 수 있습니다."}]

[{"index":"boolean FlipX","0":"이미지의 X축을 기준으로 반전 여부를 결정합니다."}]

[{"index":"boolean FlipY","0":"이미지의 Y축을 기준으로 반전 여부를 결정합니다."}]

[{"index":"int32 FrameColumn (Deprecated)","0":"더는 사용하지 않는 프로퍼티입니다. AnimationClip Editor를 사용하세요."}]

[{"index":"int32 FrameRate (Deprecated)","0":"더는 사용하지 않는 프로퍼티입니다. AnimationClip Editor를 사용하세요."}]

[{"index":"int32 FrameRow (Deprecated)","0":"더는 사용하지 않는 프로퍼티입니다. AnimationClip Editor를 사용하세요."}]

[{"index":"DataRef ImageRUID","0":"화면에 표시될 이미지 RUID입니다."}]

[{"index":"boolean Outline","0":"이미지 외곽선 출력 여부를 설정합니다."}]

[{"index":"Color OutlineColor","0":"이미지 외곽선 색상입니다."}]

[{"index":"float OutlineWidth","0":"외곽선 두께입니다."}]

[{"index":"boolean RaycastTarget","0":"true로 설정할 경우 화면 터치 또는 마우스 클릭 대상이 되며, 뒤에 가려진 UI는 화면 터치와 마우스 클릭 입력을 받지 못합니다."}]

[{"index":"ImageType Type","0":"이미지를 표시하는 방식입니다."}]

##### inherited from Component:

[{"index":"boolean Enable (Sync)","0":"컴포넌트 활성화 여부를 확인합니다."}]

[{"index":"boolean EnableInHierarchy (ReadOnly) (HideFromInspector)","0":"계층 구조상에서 이 컴포넌트가 Enable 상태인지를 반환합니다. Enable이 true일지라도 엔티티의 Enable이 false라면 false를 반환합니다."}]

[{"index":"Entity Entity (ReadOnly)","0":"이 컴포넌트를 소유한 엔티티입니다."}]

# Methods

[{"index":"void SetNativeSize()","0":"이미지를 원본 크기로 조정합니다."}]

##### inherited from Component:

[{"index":"boolean IsClient()","0":"현재 실행 환경이 클라이언트인지 아닌지의 여부를 반환합니다."}]

[{"index":"boolean IsServer()","0":"현재 실행 환경이 서버인지 아닌지의 여부를 반환합니다."}]
특정 함수를 비동기로 실행하는 법 알아보기

이 게시글은 기존 정보에 기반해 크리에이터에게 유용하도록 AI가 재구성한 내용입니다.

# 특정 함수를 비동기로 실행하는 법 알아보기

> 이 아티클에서는 비동기 프로그래밍의 기본 개념을 이해하고, `TimerService`를 활용하여 특정 함수를 비동기로 실행하는 방법을 단계별로 설명합니다. 또한, 비동기 실행의 필요성과 실제 사용 사례를 탐색합니다.

## 비동기 프로그래밍의 기본 개념

비동기 프로그래밍은 함수 호출이 즉시 반환되어 다른 작업을 수행할 수 있게 하는 프로그래밍 방식입니다. 이는 주로 I/O 작업이나 타이머 기능과 결합하여 사용됩니다. 비동기 프로그래밍을 통해 시스템의 효율성을 높이고 사용자의 경험을 개선할 수 있습니다.

## TimerService의 기능 및 사용법

`TimerService`는 함수를 일정 시간 뒤에 호출하거나 반복적으로 호출할 수 있는 기능을 제공합니다. 이를 통해 비동기적으로 함수를 실행할 수 있습니다. `SetTimerOnce` 메서드를 사용하여 특정 함수를 일정 시간 후에 실행되도록 예약할 수 있습니다. 이 메서드는 특히 즉시 실행하는 것처럼 보이는 비동기 호출을 구현할 때 유용합니다.

## 사용 사례 및 필요성

비동기 프로그래밍은 다양한 상황에서 필요합니다. 예를 들어, 사용자가 인터페이스와 상호작용하는 동안 백그라운드에서 데이터를 로드하거나 업데이트할 때 유용합니다. 실제 산업에서는 웹 서버의 요청 처리, 게임의 애니메이션 업데이트, 그리고 다양한 실시간 데이터 처리에 비동기 프로그래밍이 활용됩니다.

## SetTimerOnce를 사용하여 비동기 함수 구현

`SetTimerOnce` 메서드를 사용하여 함수를 비동기적으로 호출하는 예제를 구현해 보겠습니다. 아래의 코드는 `asyncFunc`가 `SetTimerOnce`를 통해 0초의 지연 후에 호출되며, 이는 비동기 실행처럼 동작합니다.
    
    
    local asyncFunc = function()
        local transform = self.Entity.TransformComponent
        local zRot = transform.ZRotation
         
        transform.ZRotation = zRot - (360.0 / 60.0)
    end
    
    self.TimerId = _TimerService:SetTimerOnce(asyncFunc, 0.0)
    if self.TimerId == 0 then
        log_error("Timer reservation failed.")
    end
    

## 타이머 예약 실패 처리

타이머 예약이 실패할 경우의 오류 처리를 구현하는 것은 중요합니다. 위 예제 코드에서는 타이머 예약이 실패했을 때 오류 로그를 기록하여 개발자가 문제를 인지하고 해결할 수 있도록 돕습니다.

## 추가적인 비동기 실행 방법 탐색

`TimerService` 외에도 다른 비동기 실행 방법을 탐색하여 더 다양한 비동기 프로그래밍 패턴을 이해할 수 있습니다. 예를 들어, 이벤트 기반 프로그래밍이나 Promise 패턴을 학습하면 비동기 프로그래밍의 범위를 넓힐 수 있습니다.

## 결론 및 추가 자료

이번 아티클에서는 비동기 프로그래밍의 기본 개념을 이해하고, `TimerService`를 활용하여 특정 함수를 비동기로 실행하는 방법을 살펴보았습니다. 비동기 프로그래밍은 시스템의 효율성을 높이고 사용자 경험을 개선하는 데 필수적인 기술입니다.

추가로 학습할 수 있는 자료는 다음 링크를 참조하세요:

  *
비어 있는 엔티티 생성하는 법

이 게시글은 기존 정보에 기반해 크리에이터에게 유용하도록 AI가 재구성한 내용입니다.

# 비어 있는 엔티티 생성하는 법

> 이 아티클에서는 메이플스토리 월드에서 비어 있는 엔티티를 생성하는 방법에 대해 알아봅니다. 엔티티는 메이플스토리 월드 내에서 여러 컴포넌트의 집합체로, 초기 상태의 엔티티를 생성하는 방법을 이해하면 더 나은 게임 개발을 할 수 있습니다.

## 비어 있는 엔티티란 무엇인가?

비어 있는 엔티티는 초기 상태의 `엔티티`를 의미합니다. 이는 메이플스토리 월드 내에서 다양한 컴포넌트를 추가하여 원하는 형태로 발전시킬 수 있는 기본적인 객체입니다. 비어 있는 엔티티를 생성하는 것은 게임 개발의 유연성을 높이고, 다양한 시나리오에서 재사용할 수 있는 베이스를 제공하기 때문에 중요합니다.

## 메이커에서 비어 있는 엔티티 생성 방법

### Hierarchy 창을 통한 엔티티 생성

  1. `Hierarchy` 창에서 `maps`를 선택하고 마우스 우클릭을 합니다.
  2. 팝업 컨텍스트 메뉴에서 `Create Entity` 항목을 선택합니다.
  3. `Create Empty` 항목을 선택하여 비어 있는 엔티티를 생성합니다.
  4. 활성화된 `map` 하위에 `EmptyEntity` 객체가 생성된 것을 확인할 수 있습니다. 이 객체의 `Property`는 비어 있습니다.



## 스크립트를 통한 비어 있는 엔티티 생성 방법

### _SpawnService의 활용

스크립트에서 비어 있는 엔티티를 생성하려면 `_SpawnService`의 `SpawnByModelId` 함수를 사용할 수 있습니다. 다음은 그 방법입니다:

  * `SpawnByModelId` 함수의 `id` 매개 변수에 `"model://transformonly"`를 입력하여 비어 있는 모델을 지정합니다.
  * 이 방법을 사용하면 동적 방식의 비어 있는 엔티티를 생성할 수 있으며, 이 경우 `Property`에 `TransformComponent`가 포함됩니다.



### 예제 코드

다음은 루아스크립트를 사용하여 비어 있는 엔티티를 생성하는 예제 코드입니다:
    
    
    local entity = _SpawnService:SpawnByModelId("model://transformonly", "TestSpawnEntity", Vector3.zero, _UserService.LocalPlayer.CurrentMap)
    

## 클라이언트와 서버 환경에서의 엔티티 생성 차이점

### 클라이언트 환경에서의 로컬 엔티티

클라이언트에서만 존재하는 `로컬 엔티티`는 서버와 독립적으로 작동하며, 클라이언트 측에서만 필요한 데이터를 처리하는 데 유용합니다.

### 서버 환경에서의 동기화 필요성

서버에서 생성된 엔티티는 클라이언트와 `동기화`되어야 합니다. 이는 서버와 클라이언트 간의 데이터 일관성을 유지하고, 모든 사용자가 동일한 게임 상태를 경험할 수 있도록 보장합니다.

## 추가적인 리소스 및 참조

  * 
  * 
  * 
  * 



이 아티클을 통해 비어 있는 엔티티를 생성하는 방법과 그 중요성을 이해하고, 실제 프로젝트에 적용할 수 있기를 바랍니다. 추가적인 학습을 위해 제공된 링크를 참고하세요.
런타임에 컴포넌트 추가하는 법

이 게시글은 기존 정보에 기반해 크리에이터에게 유용하도록 AI가 재구성한 내용입니다.

# 런타임에 컴포넌트 추가하는 법

> 런타임에 엔티티에 컴포넌트를 추가하는 방법을 이해하고 구현하는 방법을 설명합니다. 이 과정은 메이플스토리 월드에서 엔티티의 기능을 동적으로 확장할 수 있는 중요한 기술입니다.

## 엔티티와 컴포넌트의 이해

엔티티(Entity)는 메이플스토리 월드 내에서 여러 `컴포넌트`의 집합체로, 다양한 기능을 수행할 수 있는 기본 단위입니다. 각 엔티티는 고유한 `프로퍼티`와 `메서드`를 가지고 있으며, 특히 `AddComponent` 메서드를 통해 런타임에 새로운 컴포넌트를 추가할 수 있습니다. 이는 엔티티의 기능을 확장하거나 변경할 때 매우 유용합니다.

## 런타임에 컴포넌트 추가하기

런타임 중에 컴포넌트를 추가하는 방법은 `OnBeginPlay` 메서드를 활용하여 구현할 수 있습니다. 아래 샘플 코드는 `StateComponent`와 `ChatBalloonComponent`를 엔티티에 추가하는 과정을 보여줍니다:
    
    
    Method:
    [server only]
    void OnBeginPlay ()
    {
        local state = self.Entity.StateComponent
        if state == nil then
            state = self.Entity:AddComponent("StateComponent")
        end
          
        local chatBallon = self.Entity.ChatBalloonComponent
        if chatBallon == nil then
            chatBallon = self.Entity:AddComponent("ChatBalloonComponent")
        end
          
        self.Entity.ChatBalloonComponent.AutoShowEnabled = true
        self.Entity.ChatBalloonComponent.ChatModeEnabled = false
        self.Entity.ChatBalloonComponent.ShowDuration = 1
        self.Entity.ChatBalloonComponent.HideDuration = 0
        self.Entity.ChatBalloonComponent.FontSize = 2
    }
    
    [server only]
    void OnUpdate (number delta)
    {
        self.Entity.ChatBalloonComponent.Message = self.Entity.StateComponent.CurrentStateName
    }
    

위 코드에서는 특정 조건에 따라 컴포넌트를 추가하고, 해당 컴포넌트의 `프로퍼티`를 설정하는 과정을 보여줍니다.

## 컴포넌트 중복 문제 해결

컴포넌트를 추가할 때, 필요 컴포넌트가 자동으로 추가되면서 중복 컴포넌트가 발생할 수 있습니다. 이 경우, 중복된 컴포넌트를 `Remove`하고 필요한 컴포넌트를 재추가하여 문제를 해결합니다. 이러한 과정은 로직의 수정이 필요할 수 있습니다.

## 컴포넌트의 동기화와 최적화

추가된 컴포넌트는 `동기화`가 필요합니다. `SetEnable` 및 `SetVisible` 메서드를 사용하여 컴포넌트의 활성화 및 가시성을 동기화할 수 있습니다. 또한, 최적화(Optimization) 작업을 통해 런타임 성능을 개선하는 것이 중요합니다.

## 테스트 및 검증

런타임에 추가된 컴포넌트가 의도한 대로 동작하는지 확인하기 위해 테스트 플레이 상태에서 검증을 수행합니다. 문제 발생 시, 코드 검사 및 디버깅을 통해 대처할 수 있습니다.

## 관련 자료

  * 
  * 



이 아티클은 런타임에 엔티티에 컴포넌트를 추가하는 방법을 이해하는 데 도움이 되기를 바랍니다. 추가적인 학습을 위해 제공된 링크를 참고하세요.
월드 인스턴스

# 학습 과정 안내

월드 인스턴스 개념과 생성, 파괴에 관해 알아봅시다. 월드 인스턴스를 이해하기 위해 [인스턴스 맵 만들기](/docs/?postId=540)의 룸 관련 내용을 먼저 학습하면 도움이 됩니다.

# 월드 인스턴스

월드 인스턴스란 크리에이터가 메이커에서 제작한 월드의 정보를 기반으로 생성한 실제 객체입니다. 월드 인스턴스는 독립적으로 실행되며, 크리에이터의 제작 방식에 따라 정적 룸과 인스턴스룸이 구성됩니다.

> TIP. 제작한 월드의 모든 월드 인스턴스는 하나의 DataStorage를 사용합니다.

[png](1679291060113a0eff84f08214ed49d8a58ab3ba25664)

#### 월드 인스턴스끼리 통신

월드 인스턴스는 저마다 개별적으로 실행되고 있으므로 월드 인스턴스끼리의 통신이 필요하거나 이벤트 전달이 필요하다면 [RoomService](/apiReference/Services/RoomService)와 [WorldInstanceService](/apiReference/Services/WorldInstanceService)를 활용해야 합니다. 자세한 활용 방법은 [월드 인스턴스 통신](/docs?postId=999)을 참고하세요.

# 월드 인스턴스의 생성과 파괴

월드 출시 단계에서 크리에이터는 월드의 최대 플레이어 수를 설정합니다. 이 인원수가 새로운 월드 인스턴스를 생성하는 기준 중 하나입니다. 예를 들어 최대 플레이어 수를 10명으로 설정한 월드에 100명의 유저가 접속했다면, 월드 인스턴스가 10개 생성됩니다. 월드 인스턴스 파괴 기준은 유저의 이탈입니다. 모든 유저가 월드 플레이를 종료해 남아있는 유저가 없다면 월드 인스턴스는 자동으로 파괴됩니다. 월드 인스턴스는 생성된 후 일정 시간이 지나면 은퇴 준비를 합니다. 은퇴 준비란 새로운 유저의 접속을 허용하지 않는 것입니다. 월드 인스턴스는 기존에 접속해 있던 유저들만으로 월드 인스턴스를 운영하며 모든 유저가 떠나면서 자연스럽게 월드 인스턴스가 파괴되기를 기다립니다. [png](1679291087805feeafc80d6894e21bb6fa7acd50caf64)

#### 월드 인스턴스의 유저 할당

유저를 어떤 월드 인스턴스로 보낼지의 기준은 월드 인스턴스의 인원수입니다. 생성된 월드 인스턴스가 없을 때 새로운 월드 인스턴스를 하나 생성해 총원이 찰 때까지 해당 월드 인스턴스로 보냅니다. 이 월드 인스턴스에 정원이 모두 차면, 또 다른 새로운 월드 인스턴스를 생성해 유저를 보냅니다. 만약 여러 개의 월드 인스턴스를 운영 중인 상황에서 유저들이 월드를 떠나면 빈자리가 발생합니다. 그러면 새로운 유저가 접속했을 때 더 이상 새로운 월드 인스턴스를 생성하지 않습니다. 대신 빈자리가 있는 월드 인스턴스 중 유저가 가장 많은 곳으로 새로운 유저를 보냅니다. 이때 은퇴 준비를 시작한 월드 인스턴스는 유저 수가 가장 많더라도 대상에 포함되지 않습니다. [png](167929120294711f23765789448a4a0b99bacfb91db09)
Scene

# 학습 과정 소개

Scene은 월드와 UI 제작 및 테스트에 사용하는 필수 창입니다. Scene을 구성하는 다양한 기능을 살펴봅시다.

##### 참고 가이드

  * [Workspace](/docs/?postId=121%7B%22target%22:%22_blank%22%7D)
  * [Hierarchy](/docs/?postId=453%7B%22target%22:%22_blank%22%7D)
  * [프로퍼티 에디터](/docs/?postId=1087%7B%22target%22:%22_blank%22%7D)
  * [UI 에디터 활용과 제어](/docs/?postId=120%7B%22target%22:%22_blank%22%7D)



# Scene

Scene은 UI 화면, 맵, 테스트 중인 월드의 상태를 모두 볼 수 있는 창입니다. 크리에이터의 선택에 맞는 모습으로 UI 에디터, 테스트 화면으로 전환됩니다.

  * 맵은 Hierarchy에서 선택한 맵이 보여집니다.
  * [UI] 버튼을 눌러 UI 편집 창으로 진입하면, Scene 창이 에디터로 전환됩니다.
  * [시작] 버튼을 눌러 제작한 월드를 테스트하면 Scene 화면이 월드 테스트 편집 화면으로 변경됩니다. 테스트를 종료 시 제작 중인 Scene 화면으로 다시 전환됩니다. 월드 테스트 중 편집한 엔티티 정보는 테스트 중에만 유효합니다.



#### Scene의 기능

Scene의 상태에 따라 다양한 기능을 사용할 수 있습니다. 상단 메뉴에 아이콘이 노출됩니다.

[png](1737097069972da535f8e4e944afdb42c571b35b73088)

[{"아이콘":"-","이름":"Scale","설명":"Scene을 확대, 축소할 수 있습니다."},{"아이콘":"!","이름":"초기화","설명":"조정한 확대\/축소 값을 기본 값으로 되돌립니다."},{"아이콘":"!","이름":"그리드 정보","설명":"그리드 신 위에 격자선을 보여줍니다."},{"아이콘":"!","이름":"발판 정보","설명":"FootholdComponent가 있는 엔티티의 발판을 보여줍니다. 발판은 빨간선으로 표시됩니다."},{"아이콘":"\u0001","이름":"시작 맵에서 플레이","설명":"제작한 월드 테스트 시 시작 맵에서 테스트를 시작합니다."},{"아이콘":"!","이름":"커서 위치","설명":"Scene에서의 커서 위치를 나타냅니다."},{"아이콘":"!","이름":"Scene 최대화","설명":"Scene을 전체 화면으로 전환합니다. [축소] 버튼을 누르면 이전 크기로 돌아갑니다."},{"아이콘":"!","이름":"UI Snap","설명":"UI 정렬에 도움을 주는 기능입니다. UI의 외곽선끼리 겹치지 않고 정렬되도록 합니다."},{"아이콘":"!","이름":"Play Here","설명":"테스트를 시작할 위치를 크리에이터가 지정할 수 있습니다."}]

#### 테스트 시 Scene의 기능

테스트 시 Scene에서 사용할 수 있는 기능이 변경됩니다. [png](173745185491329d2287c7cbd4506bdbbc1c9144c56db)

[{"아이콘":"-","이름":"Scale","설명":"Scene을 확대, 축소할 수 있습니다."},{"아이콘":"!","이름":"초기화","설명":"조정한 확대\/축소 값을 기본 값으로 되돌립니다."},{"아이콘":"!","이름":"커서 위치","설명":"Scene에서의 커서 위치를 나타냅니다."},{"아이콘":"!","이름":"Scene 최대화","설명":"Scene을 전체 화면으로 전환합니다. [축소] 버튼을 누르면 이전 크기로 돌아갑니다."}]
MobileGyroscopeService

모바일 기기의 중력 센서를 사용합니다. 사용자 기기에서 중력 센서 기능을 지원해야 사용할 수 있습니다.

# Methods

[{"index":"Vector3 GetAttitudeEuler() (ClientOnly)","0":"기기의 현재 회전각을 오일러 각 형태로 반환합니다."}]

[{"index":"Vector3 GetGravity() (ClientOnly)","0":"기기의 월드 좌표계를 기준으로 나타낸 중력 가속도 값을 반환합니다"}]

[{"index":"Vector3 GetRotationRate() (ClientOnly)","0":"기기의 초당 회전 변화량을 반환합니다."}]

[{"index":"Vector3 GetRotationRateUnbiased() (ClientOnly)","0":"기기의 초당 회전 변화량을 오차 보정된 값으로 반환합니다."}]

[{"index":"float GetUpdateInterval() (ClientOnly)","0":"중력 센서 측정 주기입니다. 주기 단위는 '초'로, 기본값은 0.2초입니다."}]

[{"index":"Vector3 GetUserAcceleration() (ClientOnly)","0":"기기의 선형 가속도 값을 반환합니다."}]

[{"index":"boolean IsEnabled() (ClientOnly)","0":"중력 센서가 측정 중인지 여부를 반환합니다."}]

[{"index":"boolean IsHWSupported() (ClientOnly)","0":"기기가 중력 센서 기능을 지원하는지 여부를 반환합니다."}]

[{"index":"void SetUpdateInterval(float interval) (ClientOnly)","0":"중력 센서 측정 주기를 설정합니다. 단위는 '초'이고 기본값은 0입니다."}]

[{"index":"boolean StartAndWait() (ClientOnly) (Yield)","0":"중력 센서 측정을 시작합니다. 실패 시 false를 반환합니다."}]

[{"index":"boolean StopAndWait(boolean resetData) (ClientOnly) (Yield)","0":"중력 센서 측정을 종료합니다. 측정값을 초기화하려면 resetData에 true를 전달합니다. 실패 시 false를 반환합니다."}]

##### inherited from Service:

[{"index":"EventHandlerBase ConnectEvent(string key, IScriptFunction eventHandler)","0":"이벤트를 연결합니다. 이 서비스에서 타입의 이름이 key인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다."}]

[{"index":"EventHandlerBase ConnectEvent(Type eventType, IScriptFunction eventHandler)","0":"이벤트를 연결합니다. 이 서비스에서 타입이 eventType인 이벤트가 발생하면, 핸들러로 통지받습니다. 핸들러는 event 매개 변수를 전달받습니다."}]

[{"index":"boolean DisconnectEvent(string key, EventHandlerBase eventHandler)","0":"타입의 이름이 key인 이벤트와 핸들러와의 이벤트 연결을 끊습니다."}]

[{"index":"boolean DisconnectEvent(Type eventType, EventHandlerBase eventHandler)","0":"타입이 eventType인 이벤트와 핸들러와의 연결을 끊습니다."}]

[{"index":"void SendEvent(EventType sendEvent)","0":"이벤트를 발생시킵니다."}]

# Examples

자이로스코프 센서를 활용해 공 모양 Entity를 움직이는 예제입니다.
    
    
    @Component
    script GyroscopePhysicsController extends Component
        property number ForcePower = 100
    
        @ExecSpace("ClientOnly")
        method void OnBeginPlay()
        if _MobileGyroscopeService:IsHWSupported() then
        	local enabled = _MobileGyroscopeService:StartAndWait()
        	if enabled then
        		 _UIToast:ShowMessage("Gyroscope Started!")
        	else
        		log_error("Failed to start gyroscope")
        	end
        end
        end
    
        method void OnUpdate(number delta)
        if _MobileGyroscopeService:IsEnabled() then
        	-- 기기의 기울기 값을 구합니다.
        	local rotRate = _MobileGyroscopeService:GetRotationRate()
        	local angularVelocity = Vector2(rotRate.x, rotRate.y)
        	-- 기기의 순간 회전 속도를 힘으로 가합니다.
        	self:Impact(angularVelocity)
        end
        end
    
        @ExecSpace("ServerOnly")
        method void Impact(Vector2 dir)
        if dir.x > 0.2 or dir.y > 0.2 then
        	self.BallEntityRef.PhysicsRigidbodyComponent:ApplyForce(dir * self.ForcePower)   
        end
        end
    end
    

# SeeAlso

  * PhysicsRigidbodyComponent
  * [모바일 기기의 중력 센서 사용하기](/docs?postId=831)
SpriteRendererComponent의 PlayRate와 프레임 출력 이해하기

이 게시글은 기존 정보에 기반해 크리에이터에게 유용하도록 AI가 재구성한 내용입니다.

# SpriteRendererComponent의 PlayRate와 프레임 출력 이해하기

> 이 아티클에서는 `SpriteRendererComponent`의 `PlayRate`가 애니메이션 클립의 재생 속도에 어떻게 영향을 미치는지에 대해 알아봅니다. 이를 통해 애니메이션을 보다 효율적으로 관리하고 최적화할 수 있는 방법을 배울 수 있습니다.

## PlayRate와 기본 재생 속도의 이해

`PlayRate`는 애니메이션 클립의 재생 속도를 조절하는 중요한 프로퍼티입니다. `PlayRate`가 1일 때는 기본 재생 속도로 설정되며, 각 프레임의 `delay` 값이 0이라면 1초에 최대 프레임 수만큼 출력됩니다. 예를 들어, 60 FPS 환경에서는 초당 60프레임이 출력됩니다. 이는 `PlayRate`가 애니메이션의 자연스러운 흐름을 유지하는 데 중요한 역할을 한다는 것을 의미합니다.

## FPS와 프레임 출력의 관계

FPS(Frame Per Second)는 초당 얼마나 많은 프레임이 출력되는지를 나타내는 지표입니다. 60 FPS 환경에서는 이론적으로 초당 60프레임이 출력될 수 있습니다. 그러나 애니메이션의 각 프레임에 `delay`가 설정되어 있다면 실제로 출력되는 프레임 수는 이보다 적을 수 있습니다. 이는 클라이언트의 FPS에 따라 출력되는 프레임 수가 달라질 수 있음을 의미합니다.

## PlayRate가 Delay 값에 미치는 영향

`PlayRate`는 각 프레임에 설정된 `delay` 값을 조정하여 애니메이션의 재생 속도를 변경합니다. 예를 들어, `PlayRate`가 2.0으로 설정되면 각 프레임의 `delay` 값이 반으로 줄어들어 애니메이션이 더 빠르게 재생됩니다. 이는 `PlayRate`가 애니메이션의 속도뿐만 아니라 그 표현 방식에도 큰 영향을 미친다는 것을 보여줍니다.

## 애니메이션 클립 에디터에서의 설정

애니메이션 클립 에디터에서는 각 프레임의 `delay` 값을 직접 설정함으로써 원하는 재생 속도를 조절할 수 있습니다. 이는 `PlayRate`와 함께 사용되며, `PlayRate`가 `delay` 값을 어떻게 조정하는지에 따라 애니메이션의 최종 출력이 결정됩니다. 이를 통해 크리에이터는 보다 정밀하게 애니메이션의 흐름을 제어할 수 있습니다.

## 실전 예제 및 결과 분석

딜레이가 없는 30프레임 애니메이션을 60 FPS 환경에서 실행하면 초당 60프레임이 출력될 수 있습니다. 그러나 `PlayRate`를 변경하면 애니메이션의 재생 속도가 달라질 수 있습니다. 예를 들어, `PlayRate`가 2.0일 때는 애니메이션이 더 빠르게 재생되며, 이는 각 설정이 프레임 출력에 미치는 실제 영향을 보여줍니다.

## 결론 및 추가 자료

이 아티클에서는 `SpriteRendererComponent`의 `PlayRate`가 애니메이션의 재생 속도에 어떻게 영향을 미치는지를 살펴보았습니다. 이를 통해 애니메이션의 최적화를 위한 다양한 전략을 세울 수 있습니다. 추가적으로,  및  문서를 참조하여 더 깊이 있는 학습을 진행할 수 있습니다.
루아 프로파일링 요약 보고서

# 학습 과정 소개

루아 프로파일링 요약 보고서에서 어떤 정보가 제공되는지 살펴봅시다.

##### 참고 가이드

[루아 프로파일러를 활용하여 최적화하기](/docs/?postId=762)

# 루아 프로파일링 요약 보고서

루아 프로파일러에서 File - Export Report를 클릭하면 루아 프로파일링 요약 리포트를 XML로 Export할 수 있습니다. 다음은 요약 리포트에서 제공되는 정보 목록입니다.

[{"항목":"Name","설명":"콘텍스트 이름"},{"항목":"FrameCount","설명":"계측된 프레임 수"},{"항목":"StartTime","설명":"프로파일링 시작 Tick"},{"항목":"EndTime","설명":"프로파일링 종료 Tick  Tick은 10ns 단위 프로파일링 시간은 (EndTime - StartTime) \/ 10,000,000 초로 계산 될 수 있음"},{"항목":"AvgElapsedTime","설명":"프레임 당 평균 소요 시간 (단위 ms)"},{"항목":"PeakElapsedTime","설명":"최대 프레임 소요 시간 (단위 ms)"},{"항목":"AvgNetworkSend","설명":"프레임 당 평균 네트워크 전송량 (단위 byte)"},{"항목":"PeakNetworkSend","설명":"한 프레임에서 최대 네트워크 전송량 (단위 byte)"},{"항목":"AvgNetworkRecv","설명":"프레임 당 평균 네트워트 수신량 (단위 byte)"},{"항목":"PeakNetworkRecv","설명":"한 프레임에서 최대 네트워크 수신량 (단위 byte)"},{"항목":"AvgManagedObjectCount","설명":"루아에서 관리되는 오브젝트 수의 평균"},{"항목":"PeakManagedObjectCount","설명":"루아에서 관리되는 최대 오브젝트 수"},{"항목":"AvgTotalLuaMemory","설명":"루아에서 사용 중인 메모리 양의 평균 (단위 byte)"},{"항목":"PeakTotalLuaMemory","설명":"루아에서 사용 중인 최대 메모리 양 (단위 byte)"},{"항목":"SampleSummary","설명":"각 샘플의 프로파일링 요약 호출 트리"}]

# 샘플의 프로파일링 요약

다음은 SampleSummary에서 제공되는 정보 목록입니다.

[{"항목":"Name","설명":"샘플의 이름"},{"항목":"Category","설명":"샘플의 종류"},{"항목":"CallCount","설명":"호출 횟수"},{"항목":"AvgElapsedTime","설명":"샘플의 평균 실행 소요 시간 (단위 ms)"},{"항목":"PeakElapsedTime","설명":"샘플의 최대 실행 소요 시간 (단위 ms)"},{"항목":"AvgSelfElapsedTime","설명":"자식 샘플의 실행 시간을 제외한 샘플의 평균 실행 소요 시간 (단위 ms)"},{"항목":"PeakSelfElapsedTime","설명":"자식 샘플의 실행 시간을 제외한 샘플의 최대 실행 소요 시간 (단위 ms)"},{"항목":"AvgLuaMemory","설명":"평균 Lua memory 할당 양 (단위 byte)"},{"항목":"PeakLuaMemory","설명":"최대 Lua memory 할당 양 (단위 byte)"},{"항목":"AvgSelfLuaMemory","설명":"자식 샘플에서 할당한 Lua memory 양을 제외한 평균 Lua memory 할당 양 (단위 byte)"},{"항목":"PeakSelfLuaMemory","설명":"자식 샘플에서 할당한 Lua memory 양을 제외한 최대 Lua memory 할당 양 (단위 byte)"},{"항목":"AvgNetworkUsage","설명":"평균 네트워크 전송양 (단위 byte)"},{"항목":"PeakNetworkUsage","설명":"최대 네트워크 전송양 (단위 byte)"}]