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

아바타의 표정을 나타냅니다.

# Members

[{"이름":"Invalid","값":"0","설명":"유효한 상태가 아닙니다."},{"이름":"Hit","값":"1","설명":"피격 상태의 아바타 표정을 나타냅니다."},{"이름":"Smile","값":"2","설명":"웃음 상태의 아바타 표정을 나타냅니다."},{"이름":"Troubled","값":"3","설명":"난처 상태의 아바타 표정을 나타냅니다."},{"이름":"Cry","값":"4","설명":"울음 상태의 아바타 표정을 나타냅니다."},{"이름":"Angry","값":"5","설명":"분노 상태의 아바타 표정을 나타냅니다."},{"이름":"Bewildered","값":"6","설명":"당황 상태의 아바타 표정을 나타냅니다."},{"이름":"Stunned","값":"7","설명":"곤란 상태의 아바타 표정을 나타냅니다"},{"이름":"Vomit","값":"8","설명":"토 상태의 아바타 표정을 나타냅니다."},{"이름":"Oops","값":"9","설명":"황당 상태의 아바타 표정을 나타냅니다."},{"이름":"Cheers","값":"10","설명":"꺄오 상태의 아바타 표정을 나타냅니다."},{"이름":"Chu","값":"11","설명":"뽀뽀 상태의 아바타 표정을 나타냅니다."},{"이름":"Wink","값":"12","설명":"윙크 상태의 아바타 표정을 나타냅니다."},{"이름":"Pain","값":"13","설명":"눈물찍 상태의 아바타 표정을 나타냅니다."},{"이름":"Glitter","값":"14","설명":"눈 반짝반짝 상태의 아바타 표정을 나타냅니다."},{"이름":"Despair","값":"15","설명":"후아후아 상태의 아바타 표정을 나타냅니다."},{"이름":"Love","값":"16","설명":"사랑 상태의 아바타 표정을 나타냅니다."},{"이름":"Shine","값":"17","설명":"반짝반짝 상태의 아바타 표정을 나타냅니다."},{"이름":"Blaze","값":"18","설명":"활활 상태의 아바타 표정을 나타냅니다."},{"이름":"Hum","값":"19","설명":"흐음 상태의 아바타 표정을 나타냅니다."},{"이름":"Bowing","값":"20","설명":"꾸벅꾸벅 상태의 아바타 표정을 나타냅니다."},{"이름":"Hot","값":"21","설명":"앗뜨거 상태의 아바타 표정을 나타냅니다."},{"이름":"Dam","값":"22","설명":"메롱 상태의 아바타 표정을 나타냅니다."},{"이름":"qBlue","값":"23","설명":"창백 상태의 아바타 표정을 나타냅니다."},{"이름":"Default","값":"24","설명":"기본 상태의 아바타 표정을 나타냅니다."}]

# Methods

[{"index":"EmotionalType CastFrom(number value) (Static)","0":"숫자를 해당 타입으로 변환합니다."}]

[{"index":"EmotionalType CastFrom(string value) (Static)","0":"문자열을 해당 타입으로 변환합니다."}]
게임 섬네일 변경하기

# 학습 과정 소개

게임 섬네일은 유저의 흥미와 플레이 욕구를 자극할 수 있는 중요한 요소입니다. 이번 과정에서는 게임의 섬네일을 등록, 삭제하는 방법에 대해 알아보겠습니다.

# 섬네일 등록하기

  1. 만들기 메뉴에 있는 월드 목록에서 섬네일을 변경하려는 월드를 선택합니다. [png](1676443855396688088e04cbc4c62b50493b19961143a)   

  2. 이미지 탭에서 [이미지 첨부] 버튼을 클릭해 내 컴퓨터에 있는 이미지를 섬네일로 등록합니다. 섬네일은 최대 5장까지 등록 가능합니다. [png](1652839494394ff1412b0e0244ea3a4c697f3f5e7db92)   

  3. 아래와 같이 등록한 이미지를 확인할 수 있습니다. [png](165283951204852807e7f27b2417eaa4028eb5e7faabc)



# YouTube 영상 등록하기

  1. 동영상 탭을 선택한 후, [YouTube URL] 버튼을 클릭합니다. [png](1652839530338f5a40da71f894b9e917430d3dc7ad8e1)   

  2. YouTube URL을 입력하고 [확인] 버튼을 클릭합니다. [png](165283955093915a273db892549bfb137981c2fa1a4c9)   

  3. 영상이 재생되는 것을 확인할 수 있습니다. [png](16826484276740be95079568d40a2923208683e270854)



# 섬네일과 영상 삭제하기

섬네일을 삭제하려면 이미지 탭을 선택한 후, 삭제하고 싶은 섬네일이 보이는 상태에서 [삭제] 버튼을 클릭합니다. [png](1652839587302e1550d9505a04191a1db7139751c5344)

영상을 삭제하려면 동영상 탭을 선택한 후, [삭제] 버튼을 클릭합니다. [png](1682648463267027a1a3db3e64061ad133eed0eb6fe06)

# 게임을 출시하면서 섬네일과 영상 변경하기

제작한 게임을 출시할 때도 섬네일이나 영상을 등록, 변경, 삭제할 수 있습니다. 먼저 File - Release를 클릭합니다. [png](16841147126563e8e10fa3cbf402fb4a4a2cdb1a338d1)   


Release 창에서 섬네일이나 영상을 관리할 수 있습니다. 섬네일을 등록하는 방법은 3가지가 있습니다.

[{"index":"이미지","0":"[png](168411475173752829596e4f64ea48cc41c7daf35880b)내 컴퓨터에 있는 이미지를 섬네일로 등록"},{"index":"스크린샷","0":"[png](168411478437899133237b6484489a110e1284a2a85ca)현재 메이커 상의 화면을 섬네일로 등록"},{"index":"AI","0":"[png](1684114892964a1cd84432cdf42a2b75e270a2e5ddf0e)AI 자동 생성 섬네일 추가"}]

동영상을 등록하려면 동영상 탭을 선택한 뒤, [YouTube URL] 버튼을 클릭해 영상 주소를 넣으면 됩니다. [png](16528396661683c6d848466eb4b4d8f076607777ad517)

지금까지 게임 섬네일과 영상 등록 방법을 알아보았습니다. 멋진 섬네일과 영상으로 본인이 제작한 게임을 돋보이게 만들어봅시다.
로프와 충돌 이벤트 문제 해결하기

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

# 로프와 충돌 이벤트 문제 해결하기

> 게임 개발 중 로프와의 충돌 이벤트가 발생하지 않는 문제를 해결하는 방법을 알아봅니다.

## TriggerComponent 설정 확인하기

로프와의 충돌 이벤트가 발생하지 않는 가장 흔한 원인 중 하나는 `TriggerComponent` 설정이 잘못되었기 때문입니다. 로프 오브젝트에 `TriggerComponent`가 제대로 추가되어 있는지 확인해야 합니다. 이 컴포넌트는 충돌 범위를 설정하여 충돌체를 생성하는 데 사용됩니다. 프로퍼티 에디터에서 [Edit] 버튼을 눌러 충돌체의 크기와 위치가 적절하게 설정되어 있는지 확인하세요. 충돌 영역이 초록색으로 변경되는지 시각적으로 확인할 수 있습니다.

## CollisionGroup 설정 확인하기

`CollisionGroup` 설정이 올바르지 않으면 로프와 플레이어 캐릭터 간의 충돌이 발생하지 않을 수 있습니다. 로프 오브젝트와 플레이어 캐릭터의 `CollisionGroup`이 서로 충돌 가능한지 확인하세요. `CollisionGroup`은 충돌이 발생할 수 있는 그룹을 정의하며, 상단 메뉴의 Panels - Collision Groups에서 설정할 수 있습니다. 충돌 그룹 매트릭스를 확인하여 두 객체의 그룹 간 충돌이 허용되어 있는지 체크합니다.

## Event Handler 추가 및 테스트하기

로프 오브젝트에 새로운 `Event Handler`를 추가하고 `TriggerEnterEvent`를 설정하여 충돌 이벤트 발생 시 로그를 출력하도록 구성합니다. 이를 통해 이벤트가 발생하는지 실시간으로 확인할 수 있습니다. 다음은 예시 코드입니다:
    
    
    EventHandler:
    HandleTriggerEnterEvent (TriggerEnterEvent event)
    {
        local TriggerBodyEntity = event.TriggerBodyEntity
        log(TriggerBodyEntity.Name)
    }
    

플레이 버튼을 눌러 테스트 플레이 상태에서 로프와 플레이어 캐릭터가 실제로 충돌하는지 확인하세요. 로그를 통해 충돌 이벤트가 발생하는지 확인하고, 발생하지 않는 경우 추가적인 디버깅이 필요합니다.

## TransformComponent와 충돌체 상호작용 점검하기

로프 오브젝트의 `TransformComponent`가 충돌체에 영향을 미치는지 점검합니다. 충돌체는 `TransformComponent`의 Scale, Rotation 값에 영향을 받으므로, 이 값들이 올바르게 설정되어 있는지 확인합니다. 계층 구조(Hierarchy)에서 상위 엔티티의 `TransformComponent`가 로프의 충돌체에 영향을 주는지 확인하고, 필요 시 조정하세요.

## 최적화 및 성능 점검하기

충돌 감지와 이벤트 발생의 최적화를 위해 `TriggerComponent`의 `IsPassive` 프로퍼티를 점검하여 불필요한 충돌 검사가 발생하지 않도록 설정합니다. 프로파일러를 사용하여 충돌 이벤트 처리의 성능을 점검하고, 병목 지점(Bottle Neck)이 있는지 확인합니다. 필요 시 최적화를 통해 월드 인스턴스의 성능을 개선합니다.

## 추가 자료

자세한 내용은 다음 링크를 참고하세요:

  * 
  * 
  *
스프라이트를 흑백으로 변환하는 간단한 방법

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

# 스프라이트를 흑백으로 변환하는 간단한 방법

> 스프라이트의 색상을 흑백으로 변환하는 것은 시각적으로 독특한 효과를 주어 게임이나 애니메이션에서 특별한 분위기를 연출할 수 있습니다. 이 아티클에서는 어떻게 스프라이트를 흑백으로 변환할 수 있는지 단계별로 설명합니다.

## 스프라이트 흑백 변환의 필요성

스프라이트는 2D 이미지로, 게임이나 애니메이션에서 자주 사용됩니다. 때로는 특정 장면의 분위기를 강조하기 위해 스프라이트의 색상을 흑백으로 변환할 필요가 있습니다. 이는 스토리의 전환점이나 특별한 이벤트를 시각적으로 표현하는 데 유용합니다.

## 스프라이트를 흑백으로 변환하기 위한 머티리얼 설정

스프라이트를 흑백으로 변환하기 위해서는 `Material`을 생성하고 이를 `SpriteRendererComponent`에 적용해야 합니다. 다음은 그 방법입니다:

  1. 새 머티리얼 생성:

     * `Workspace`의 `MyDesk`에서 우클릭하여 "Create Material"을 선택합니다.
     * 생성된 머티리얼을 선택하고, 인스펙터 창에서 `Shader`를 'GrayScale'로 지정합니다.
  2. 머티리얼 적용:

     * 흑백 효과를 적용할 `Scene`의 엔티티를 선택합니다.
     * 해당 엔티티의 `SpriteRendererComponent`에서 `MaterialID`를 생성한 머티리얼로 지정합니다.



## 스프라이트의 흑백 효과를 제어하는 스크립트 작성

스프라이트의 흑백 효과를 동적으로 제어하기 위해 스크립트를 사용할 수 있습니다. 스크립트를 통해 플레이어의 상호작용에 따라 머티리얼을 변경할 수 있습니다.

  1. 스크립트 컴포넌트 생성:

     * 새 스크립트 컴포넌트를 생성하고 엔티티에 추가합니다.
     * `TriggerComponent`를 추가하여 플레이어와의 충돌 시 이벤트가 발생하도록 설정합니다.
  2. 스크립트 작성:
         
         HandleTriggerEnterEvent (TriggerEnterEvent event) {
             local TriggerBodyEntity = event.TriggerBodyEntity
             self.Entity.SpriteRendererComponent:ChangeMaterial("material://Entry ID")
         }
         

     * 위 코드에서 "material://Entry ID" 부분에 원하는 머티리얼의 Entry ID를 입력합니다.



## 테스트 및 최적화

마지막으로, 구현한 흑백 스프라이트 효과를 테스트하여 정상적으로 작동하는지 확인합니다. 테스트 플레이 상태에서 플레이어가 엔티티와 상호작용할 때 머티리얼 변경이 제대로 이루어지는지 확인하고, 필요에 따라 최적화를 진행합니다.

이 과정을 통해 스프라이트의 색상을 흑백으로 변환할 수 있으며, 이를 통해 게임이나 애니메이션의 시각적 효과를 한층 더 강화할 수 있습니다.
BaseParticleComponent

파티클 효과를 만드는 ParticleComponent들의 부모 컴포넌트입니다.

# Properties

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

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

[{"index":"boolean IgnoreMapLayerCheck (Sync)","0":"SortingLayer에 Map Layer 이름을 지정했을 때 자동 치환을 수행하지 않습니다."}]

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

[{"index":"LitMode LitMode (Sync)","0":"머티리얼 또는 오브젝트가 광원의 영향을 받을지 여부를 결정하는 렌더링 방식을 선택합니다."}]

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

[{"index":"int32 OrderInLayer (Sync)","0":"같은 Layer 내의 우선순위를 결정합니다. 수가 클수록 앞에 보입니다."}]

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

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

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

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

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

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

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

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

[{"index":"string SortingLayer (Sync)","0":"2개 이상의 엔티티가 겹쳤을 때 Sorting Layer에 따라 보이는 우선순위가 결정됩니다."}]

##### 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 Play()","0":"파티클을 재생합니다."}]

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

##### inherited from Component:

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

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

# SeeAlso

  * AreaParticleComponent
  * BasicParticleComponent
  * SpriteParticleComponent
  * AreaParticleType
  * BasicParticleType
  * SpriteParticleType
  * ParticleService
LineRendererComponent

선을 그리며, 선의 속성을 설정할 수 있는 기능을 제공합니다.

# Properties

[{"index":"float Flexibility (Sync)","0":"꺾이는 부분의 너비를 조절합니다. IsFlexible이 true일 때 적용됩니다."}]

[{"index":"boolean IgnoreMapLayerCheck (Sync)","0":"SortingLayer에 Map Layer 이름을 지정했을 때 자동 치환을 수행하지 않습니다."}]

[{"index":"boolean IsFlexible (Sync)","0":"꺾이는 부분을 이어 그릴지 끊어 그릴지 설정합니다."}]

[{"index":"boolean IsSmooth (Sync)","0":"true면 부드러운 곡선, false면 날카로운 꺾은 선으로 그립니다."}]

[{"index":"boolean Loop (Sync)","0":"true면 자동으로 시작점과 끝점을 이어 닫힌 선을 그립니다."}]

[{"index":"string MaterialId (Sync)","0":"렌더러에 적용할 머티리얼 Id를 지정합니다."}]

[{"index":"int32 OrderInLayer (Sync)","0":"같은 Layer 내의 우선순위를 결정합니다. 수가 클수록 앞에 보입니다."}]

[{"index":"SyncList Points (Sync)","0":"선을 구성하는 정점들의 집합입니다."}]

[{"index":"string SortingLayer (Sync)","0":"2개 이상의 엔티티가 겹쳤을 때 Sorting Layer에 따라 보이는 우선순위가 결정됩니다."}]

##### 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 ChangeMaterial(string materialId)","0":"랜더러에 적용할 머티리얼을 교체합니다."}]

##### inherited from Component:

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

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

# Events

[{"index":"OrderInLayerChangedEvent","0":"Component의 OrderInLayer가 변경되었을 때 발생하는 이벤트입니다."}]

[{"index":"SortingLayerChangedEvent","0":"컴포넌트의 SortingLayer가 변경되었을 때 발생하는 이벤트입니다."}]

# Examples

엔티티 주위에 원을 그리는 예제입니다.
    
    
    @Component
    script CircleDrawer extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
        self:DrawCircle(2, 20, Color.red, 1)
        end
    
        @ExecSpace("ServerOnly")
        method void DrawCircle(number radius, integer vertexNum, Color color, number width)
        -- radius: 반지름
        -- vertexNum: 꼭지점 수
        -- color: 선 색상
        -- width: 선 두께
    
        if vertexNum < 3 then
        	log_error ("The \'vertexNum\' should be greater than or equal to 3.")
        	return
        end
    
        local lineRenderer = self.Entity.LineRendererComponent
        lineRenderer.Points:Clear()
        lineRenderer.Loop = true
    
        local delta = 360 / vertexNum
    
        for i = 0, vertexNum - 1 do
        	local theta = math.rad(90 + delta * i)
        	local position = Vector2(math.cos(theta), math.sin(theta)) * radius
    
        	local point = LinePoint(position, color, width)
    
        	lineRenderer.Points:Add(point)
        end
        end
    end
    

# SeeAlso

  * math
  * Vector2
  * [다양한 선 그리기](/docs?postId=749)
AnimationClip의 전체 시간 알아보기

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

# AnimationClip의 전체 시간 알아보기

> AnimationClip은 MSW에서 애니메이션을 관리하는데 중요한 요소입니다. 이 아티클에서는 AnimationClip의 전체 시간을 계산하는 방법을 설명하고, 이를 통해 애니메이션의 재생 시간을 효과적으로 관리하는 방법을 알아보겠습니다.

## AnimationClip의 기본 개념 이해하기

`AnimationClip`은 메이플스토리 월드(MSW)에서 애니메이션을 출력하는 데 사용되는 클래스입니다. 이 클래스는 애니메이션의 `프레임`과 `재생 속도(PlayRate)` 같은 중요한 프로퍼티를 포함하고 있습니다. 각 프레임은 애니메이션의 작은 단위로, 연속적으로 재생되어 전체 애니메이션을 구성합니다.

## AnimationClip의 전체 시간 계산 방법

AnimationClip의 전체 시간은 각 프레임의 `딜레이(Delay)`를 합산하여 계산됩니다. 각 프레임이 재생되는 시간을 모두 더하면 AnimationClip의 총 길이를 구할 수 있습니다. 이러한 계산은 애니메이션의 정확한 타이밍을 조정하는 데 필수적입니다.

## 코드 예제: GetRUIDTime 함수 사용하기

아래는 AnimationClip의 전체 시간을 계산하는 `GetRUIDTime` 함수의 코드 예제입니다. 이 함수는 주어진 `리소스 고유 ID(RUID)`를 사용하여 애니메이션을 로드하고, 각 프레임의 딜레이를 합산하여 전체 시간을 반환합니다.
    
    
    Method:
    number GetRUIDTime(string ruid)
    {
        if _UtilLogic:IsNilorEmptyString(ruid) then
            return 0
        end
             
        local time = 0
        local clip = _ResourceService:LoadAnimationClipAndWait(ruid)
        if clip == nil then
            return 0
        end
        for i = 1,#clip.Frames do
            time = time + clip.Frames[i].Delay
        end
     
        return time
    }
    

## UtilLogic 및 ResourceService 활용

이 함수는 `UtilLogic` 클래스의 `IsNilorEmptyString` 메서드를 사용하여 입력된 RUID가 유효한지 확인합니다. 그런 다음, `ResourceService`의 `LoadAnimationClipAndWait` 메서드를 통해 애니메이션 클립을 로드합니다. 각 프레임의 딜레이를 합산하여 전체 시간을 계산합니다.

## 관련 질문과 답변

  * AnimationClip의 1회 재생 시간은 어떻게 알 수 있을까요?  
위의 코드 예제를 통해 각 프레임의 딜레이를 합산하여 1회 재생 시간을 구할 수 있습니다.

  * 현재 재생 중인 애니메이션 클립의 총 길이를 코드상으로 알 수 있는 방법이 있을까요?  
`GetRUIDTime` 함수를 사용하여 현재 재생 중인 애니메이션의 RUID를 입력하면 총 길이를 계산할 수 있습니다.

  * 애니메이션 리소스의 마지막 프레임을 스크립트로 받아올 수 있는 방법이 있나요?  
`clip.Frames[#clip.Frames]`를 통해 마지막 프레임에 접근할 수 있습니다.




## 결론 및 추가 자료

AnimationClip의 전체 시간을 계산하는 것은 애니메이션의 정확한 타이밍을 관리하는 데 필수적입니다. 이 아티클에서 설명한 방법을 통해 애니메이션의 재생 시간을 효과적으로 관리할 수 있습니다.

  * 
  * 
  *
ClimbableComponent

등반 액션을 할 수 있는 영역을 지정합니다.

# Properties

[{"index":"boolean AllowHorizontalMove","0":"자유로운 등반 이동 여부를 설정합니다. true일 경우 X, Y 축 모두 이동 가능합니다."}]

[{"index":"Vector2 BoxOffset (Sync)","0":"엔티티를 기준으로 충돌체 직사각형의 중심점 위치를 설정합니다. IsUseDefaultObjectBoxSize를 false로 설정해 BoxOffset을 적용할 수 있습니다."}]

[{"index":"Vector2 BoxSize (Sync)","0":"충돌체 직사각형의 너비와 높이를 지정합니다. IsUseDefaultObjectBoxSize를 false로 설정해 BoxSize를 적용할 수 있습니다."}]

[{"index":"ClimbableType ClimbableAnimationType","0":"등반 시 애니메이션 타입을 결정합니다."}]

[{"index":"CollisionGroup CollisionGroup (ReadOnly) (HideFromInspector)","0":"등반 영역의 충돌 그룹입니다."}]

[{"index":"boolean IsUseDefaultObjectBoxSize","0":"등반 영역 설정을 스프라이트 크기에 맞출지 설정합니다. 메이커 편집 모드에서만 동작합니다. true일 경우에 Boxsize, BoxOffset을 자동으로 스프라이트 크기에 맞게 설정합니다. false일 경우 Boxsize, BoxOffset을 임의로 설정할 수 있습니다."}]

[{"index":"boolean LockMovementInBoundary","0":"이동을 등반 영역으로만 제한할지 여부를 설정합니다. true인 경우 시작점과 끝점에서만 등반 영역을 벗어날 수 있습니다. AllowHorizontalMove가 true일 때만 유효합니다."}]

[{"index":"Vector2 SpeedFactor","0":"등반 시 X, Y축 속력에 곱해지는 가중치입니다. 값이 클수록 이동 속력이 빨라집니다."}]

##### 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 Component:

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

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

# Examples

`TriggerEnterEvent` 발생 시 충돌한 엔티티의 이름에 따라 `ClimbableComponent`의 `BoxSize`와 `SpeedFactor`가 변경되는 예제입니다.
    
    
    @Component
    script ClimbableTriggerAdjuster extends Component
        @ExecSpace("ServerOnly")
        method void ChangeBoxSize(Vector2 boxSize)
        local entity = _EntityService:GetEntityByPath(EntityPath)
        entity.ClimbableComponent.BoxSize = boxSize
        end
    
        @ExecSpace("ClientOnly")
        method void ChangeSpeedVector(Vector2 speedVector)
        local entity = _EntityService:GetEntityByPath(EntityPath)
        entity.ClimbableComponent.SpeedFactor = speedVector
        end
    
        @ExecSpace("ServerOnly")
        @EventSender("Self")
        handler HandleTriggerEnterEvent(TriggerEnterEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: TriggerComponent
        -- Space: Server, Client
        ---------------------------------------------------------
    
        -- Parameters
        local TriggerBodyEntity = event.TriggerBodyEntity
        ---------------------------------------------------------
    
        if TriggerBodyEntity.Name == "Name" then
        	self:ChangeBoxSize(Vector2(3, 10))
        elseif TriggerBodyEntity.Name == "Name" then
        	self:ChangeSpeedVector(Vector2(1, 2))
        end
        end
    end
    

# SeeAlso

  * EntityService
  * [사다리와 로프 활용하기](/docs?postId=809)
WebSpriteComponent

Web에서 받아온 스프라이트를 출력하는 기능을 제공합니다.

# Properties

[{"index":"List AnimationUrl","0":"여러 개의 Url을 지정해 스프라이트를 1초 간격으로 순서대로 출력합니다. 스프라이트 Url을 한 개 이상 지정할 경우 Url 프로퍼티는 무시되고 AnimationUrl의 스프라이트가 출력됩니다."}]

[{"index":"Color Color (Sync)","0":"스프라이트에 색깔을 덧씌웁니다."}]

[{"index":"boolean FlipX (Sync)","0":"스프라이트의 X축을 기준으로 반전 여부를 결정합니다."}]

[{"index":"boolean FlipY (Sync)","0":"스프라이트의 Y축을 기준으로 반전 여부를 결정합니다."}]

[{"index":"boolean IgnoreMapLayerCheck (Sync)","0":"SortingLayer에 Map Layer 이름을 지정했을 때 자동 치환을 수행하지 않습니다."}]

[{"index":"string MaterialId (Sync)","0":"렌더러에 적용할 머티리얼 Id를 지정합니다."}]

[{"index":"boolean NeedGizmo (Deprecated) (Sync) (HideFromInspector)","0":"더는 사용하지 않는 프로퍼티입니다."}]

[{"index":"Vector2 Offset (Sync)","0":"스프라이트의 위치 Offset을 제공합니다."}]

[{"index":"int32 OrderInLayer (Sync)","0":"같은 Layer 내의 우선순위를 결정합니다. 수가 클수록 앞에 보입니다."}]

[{"index":"string SortingLayer (Sync)","0":"2개 이상의 엔티티가 겹쳤을 때 Sorting Layer에 따라 보이는 우선순위가 결정됩니다."}]

[{"index":"string Url (Sync)","0":"스프라이트의 Url을 설정합니다. AnimationUrl에 지정된 스프라이트 Url이 하나라도 있을 경우 AnimationUrl의 스프라이트가 출력됩니다."}]

##### 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 ChangeMaterial(string materialId)","0":"렌더러에 적용할 머티리얼을 교체합니다."}]

##### inherited from Component:

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

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

# Events

[{"index":"OrderInLayerChangedEvent","0":"Component의 OrderInLayer가 변경되었을 때 발생하는 이벤트입니다."}]

[{"index":"SortingLayerChangedEvent","0":"컴포넌트의 SortingLayer가 변경되었을 때 발생하는 이벤트입니다."}]

# Examples

웹에서 이미지를 로드한 뒤 서서히 보여주는 예제입니다.
    
    
    @Component
    script WebSpriteFadeIn extends Component
        property any webSprite = nil
    
        @ExecSpace("ClientOnly")
        method void OnBeginPlay()
        self.webSprite = self.Entity.WebSpriteComponent
    
        self.webSprite.Url = "Http://WebUrl"
    
        -- 초기 색을 투명하게 설정
        self.webSprite.Color = Color(1.0, 1.0, 1.0, 0.0)
        end
    
        @ExecSpace("ClientOnly")
        method void OnUpdate(number delta)
        local alpha = self.webSprite.Color.a
        self.webSprite.Color = Color(1.0, 1.0, 1.0, alpha + delta / 5.0)
        end
    end
    

# SeeAlso

  * Color
마우스 커서가 특정 UI 위에 있을 때 UI 엔티티 받아오는 법

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

# 마우스 커서가 특정 UI 위에 있을 때 UI 엔티티 받아오는 법

> 마우스 커서가 특정 UI 위에 있을 때 해당 UI 엔티티를 받아오는 것은 UI 인터랙션을 개선하고 사용자 경험을 향상시키는 중요한 요소입니다. 이 아티클에서는 `UITouchReceiveComponent`를 활용하여 이러한 기능을 구현하는 방법을 단계별로 설명합니다.

## UITouchReceiveComponent 이해하기

`UITouchReceiveComponent`는 UI 엔티티와 상호작용할 수 있는 컴포넌트로, 터치 이벤트를 제어할 수 있습니다. 이를 통해 마우스 커서의 위치를 추적하고 특정 UI 엔티티와의 인터랙션을 감지할 수 있습니다. 주요 이벤트로는 `UITouchEnterEvent`와 `UITouchExitEvent`가 있으며, 이들은 각각 마우스 커서가 UI 엔티티에 진입하거나 벗어날 때 발생합니다.

## UICheckLogic 스크립트 생성

UI 엔티티를 추적하기 위해 `UICheckLogic`이라는 스크립트를 작성합니다. 이 스크립트는 마우스가 UI에 들어오고 나가는 이벤트를 처리하여 현재 마우스가 위치한 UI 엔티티를 추적합니다.
    
    
    Property:
    Entity targetUIEntity = "nil"
    
    EventHandler: 
    HandleKeyDownEvent (KeyDownEvent event)
    {
        if self.targetUIEntity ~= nil then
            log(self.targetUIEntity.Name)
        end
    }
    

위 스크립트는 `targetUIEntity` 프로퍼티를 사용하여 현재 마우스가 위치한 UI 엔티티를 저장하고, `HandleKeyDownEvent` 핸들러를 통해 해당 엔티티의 이름을 로그에 기록합니다.

## UI 엔티티에 이벤트 핸들러 추가

이제 원하는 UI 엔티티에 이벤트 핸들러를 추가하여 마우스가 해당 엔티티 위에 있을 때 이를 감지합니다.
    
    
    EventHandler:
    HandleUITouchEnterEvent (UITouchEnterEvent event)
    {
        local Entity = event.Entity
        _UICheckLogic.targetUIEntity = Entity
    }
    
    HandleUITouchExitEvent (UITouchExitEvent event)
    {
        local Entity = event.Entity
        if _UICheckLogic.targetUIEntity == Entity then
            _UICheckLogic.targetUIEntity = nil
        end
    }
    

`HandleUITouchEnterEvent` 핸들러는 마우스 커서가 UI 엔티티에 진입했을 때 `targetUIEntity`를 업데이트하며, `HandleUITouchExitEvent` 핸들러는 마우스 커서가 UI 엔티티를 벗어났을 때 `targetUIEntity`를 `nil`로 설정합니다.

## 테스트 및 디버깅

구현한 기능을 테스트하여 올바르게 작동하는지 확인합니다. 로그를 통해 `targetUIEntity`가 올바르게 업데이트되는지 모니터링하고, 예상치 못한 동작이 발생할 경우 코드 검사를 통해 버그를 수정합니다.

## 결론 및 추가 고려사항

마우스 커서의 위치에 따라 UI 엔티티를 감지하는 방법을 성공적으로 구현한 후, `UITouchReceiveComponent`를 사용한 다른 활용 사례를 고려할 수 있습니다. 또한, 성능 최적화와 사용자 경험 향상을 위한 다양한 팁을 제공할 수 있습니다.

참고 링크:

  * 
  *
서버와 클라이언트에서 엔티티 생성 구분하기

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

# 서버와 클라이언트에서 엔티티 생성 구분하기

> 서버와 클라이언트에서 엔티티가 생성되는 방식을 이해하고 구분하는 것은 게임 개발에서 매우 중요합니다. 이를 통해 데이터 동기화와 최적화를 효율적으로 수행할 수 있습니다.

## 서버와 클라이언트의 동기화 메커니즘

서버와 클라이언트는 각각의 `실행 공간`에서 별도의 역할을 수행하며, 데이터의 일관성을 유지하기 위해 `동기화`를 사용합니다. 일반적으로, 동기화는 서버에서 클라이언트로 단방향으로 진행됩니다. 서버의 `프로퍼티` 값이 클라이언트로 전달되지만, 클라이언트에서 서버로의 동기화는 특수한 경우에만 발생합니다.

### 동기화되지 않는 경우

`클라이언트 전용 엔티티`와 같이 서버에 영향을 미치지 않는 경우에는 동기화가 이루어지지 않습니다. 이러한 엔티티는 클라이언트에서만 존재하며, 서버에서는 인식되지 않습니다.

## 엔티티 생성 시점 기록 방법

서버와 클라이언트에서 엔티티가 생성된 시점을 기록하는 것은 생성 출처를 판단하는 데 중요한 역할을 합니다. 이를 통해 엔티티가 서버에서 생성되었는지, 클라이언트에서 생성되었는지를 구분할 수 있습니다.

### OnMapEnter 및 BeginPlay 이벤트 활용

`OnMapEnter`와 `BeginPlay` 이벤트를 사용하여 엔티티가 생성될 때마다 생성 시점과 위치를 기록할 수 있습니다. 이러한 기록을 통해 서버와 클라이언트 간의 엔티티 동기화를 관리할 수 있습니다.

## 클라이언트 전용 엔티티 식별 방법

클라이언트 전용 엔티티는 서버에 존재하지 않고 클라이언트에만 존재하는 개별 엔티티입니다. 이를 식별하기 위해서는 엔티티ID를 기준으로 서버와 클라이언트 양쪽에 존재하는지를 체크해야 합니다. 클라이언트에만 존재하는 경우, 이는 클라이언트에서 생성된 엔티티임을 나타냅니다.

## 엔티티 관리 및 최적화

효율적인 엔티티 관리는 서버와 클라이언트의 자원을 적절히 활용하는 데 필수적입니다. `프로파일러` 등의 도구를 사용하여 엔티티 관리를 최적화하고 불필요한 동작을 줄이는 방법을 활용할 수 있습니다. 이를 통해 서버와 클라이언트 간의 통신을 효율적으로 관리할 수 있습니다.

## 결론 및 추가 자료

서버와 클라이언트에서 엔티티가 어떻게 생성되고 관리되는지를 이해하는 것은 게임 개발에서 매우 중요한 부분입니다. 이를 통해 데이터 동기화와 최적화를 효율적으로 수행할 수 있습니다. 더 많은 정보를 원하신다면,  문서를 참조하시기 바랍니다.