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

데이터셋의 데이터를 읽어오는 기능을 제공합니다.

# Methods

[{"index":"string GetCell(string name, int32 row, int32 col)","0":"이름이 name인 데이터셋에서 row 번째 행, col 번째 열 데이터를 읽어옵니다."}]

[{"index":"string GetCell(string name, int32 row, string columnName)","0":"이름이 name인 데이터셋에서 row 번째 행 columnName열 데이터를 읽어옵니다."}]

[{"index":"int32 GetRowCount(string name)","0":"이름이 name인 데이터셋의 행 개수를 반환합니다."}]

[{"index":"UserDataSet GetTable(string name)","0":"이름이 name인 데이터셋을 읽어옵니다."}]

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

데이터셋에서 데이터를 읽어오는 예제입니다. 예제에서 사용할 데이터셋은 아래와 같습니다.

이름: SampleDataSet

[{"name":"mod1","level":"1","hp":"50"},{"name":"mod2","level":"2","hp":"100"},{"name":"mod3","level":"3","hp":"150"}]
    
    
    @Component
    script DataSetReader extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
        log(_DataService:GetRowCount("SampleDataSet")) -- 3
        log(_DataService:GetCell("SampleDataSet", 3, 3)) -- 150
        log(_DataService:GetCell("SampleDataSet", 2, "name")) -- mod2
    
        local dataSet = _DataService:GetTable("SampleDataSet")
        log(dataSet:GetRowCount()) -- 3
        log(dataSet:GetCell(1, 1)) -- mod1
        log(dataSet:GetCell(2, "level")) -- 2
    
        for i = 1, dataSet:GetRowCount() do
            log(dataSet:GetCell(i, "name"), dataSet:GetCell(i, "level"), dataSet:GetCell(i, "hp"))
        end
    
        -- mod1     1   50
        -- mod2     2   100
        -- mod3     3   150
        end
    end
    

# SeeAlso

  * [데이터 편집](/docs?postId=69)
WeldJointComponent

WeldJoint를 생성, 삭제합니다. 연결된 강체들이 하나의 물체인 것처럼 고정됩니다.

# Properties

[{"index":"SyncList Joints (Sync) (ReadOnly)","0":"Joint 정보를 설정합니다."}]

##### 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":"int32 AddJoint(Entity targetEntity, Vector2 localAnchorA, Vector2 localAnchorB)","0":"Joint를 추가합니다. 성공 시 index, 실패 시 -1을 반환합니다"}]

[{"index":"void DestroyJoint(int32 index)","0":"순번이 index에 해당하는 Joint를 제거합니다."}]

[{"index":"int32 GetJointsCount()","0":"joint 수를 반환합니다."}]

[{"index":"void SetCollideConnected(int32 index, boolean collideConnected)","0":"순번이 index에 해당하는 Joint의 CollideConnected 값을 설정합니다."}]

[{"index":"void SetLocalAnchorA(int32 index, Vector2 localAnchorA)","0":"순번이 index에 해당하는 Joint의 LocalAnchorA 값을 설정합니다."}]

[{"index":"void SetLocalAnchorB(int32 index, Vector2 localAnchorB)","0":"순번이 index에 해당하는 Joint의 LocalAnchorB 값을 설정합니다."}]

##### inherited from Component:

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

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

# Examples

#### AddJoint

`WeldJointComponent`에 `Joint`를 추가하는 예제입니다.
    
    
    @Component
    script SnowBodyWelder extends Component
        @ExecSpace("ServerOnly")
        method void Connect(Entity target)
        self.Entity.WeldJointComponent:AddJoint(target, Vector2(0, -1), Vector2.zero)
        end
    
        @EventSender("Self")
        handler HandlePhysicsContactBeginEvent(PhysicsContactBeginEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: PhysicsColliderComponent
        -- Space: Server, Client
        ---------------------------------------------------------
    
        -- Parameters
        local ContactedBodyEntity = event.ContactedBodyEntity
        ---------------------------------------------------------
        if ContactedBodyEntity.Name == "SnowBody" and self.Entity.WeldJointComponent:GetJointsCount() == 0 then
        	self:Connect(ContactedBodyEntity)
        end
        end
    end
    

# SeeAlso

  * PhysicsColliderComponent
  * PhysicsContactBeginEvent
  * [다양한 물리 joint 활용하기](/docs?postId=760)
  * [물리 사용하기](/docs?postId=757)
  * [엔티티에 물리 적용하기 ](/docs?postId=761)
AIWanderComponent

주변을 배회하는 AI입니다. StateComponent가 없다면 자동으로 추가됩니다.

# Properties

##### inherited from AIComponent:

[{"index":"string BehaviourTreeId (ReadOnly)","0":"행동 트리 엔트리의 고유 식별자입니다."}]

[{"index":"Blackboard BlackBoard (ReadOnly)","0":"AI 행동 트리에서 사용하는 데이터 저장소입니다. 키-값 쌍으로 데이터를 관리하며 행동 트리 노드 간 데이터를 공유합니다."}]

[{"index":"boolean IsLegacy (ReadOnly)","0":"Legacy 시스템 지원 여부를 설정합니다. 이전 시스템은 노드의 Running 상태를 구현하기 위해 ExclusiveExecutionWhenRunning 프로퍼티를 사용해야 합니다. Legacy 시스템은 더 이상 지원하지 않으며, 추후 삭제 예정입니다."}]

[{"index":"boolean LogEnabled (ReadOnly)","0":"값이 true면 행동 트리가 실행될 때 실행 관련 정보가 로그로 출력됩니다. 메이커 환경에서만 동작합니다."}]

[{"index":"UpdateAuthorityType UpdateAuthority (ReadOnly)","0":"업데이트 권한입니다. Server와 Client 중 설정한 곳에서 실행됩니다."}]

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

[{"index":"BTNode CreateLeafNode(string nodeName, func -> BehaviourTreeStatus onBehaveFunction)","0":"Action 노드를 생성합니다. 노드가 실행될 때 onBehaveFunction으로 전달된 함수가 호출됩니다. onBehaveFunction의 매개 변수는 프레임당 시간인 delta입니다."}]

[{"index":"BTNode CreateNode(string nodeType, string nodeName = nil, func -> BehaviourTreeStatus onBehaveFunction = nil)","0":"BTNodeType을 기반으로 Action 노드를 생성합니다. nodeType은 BTNodeType의 타입명입니다. onBehaveFunction가 nil이 아니라면 노드가 실행될 때 BTNodeType의 OnInit(), OnBehave() 함수 대신 onBehaveFunction으로 전달된 함수가 호출됩니다. onBehaveFunction의 매개 변수는 프레임당 시간인 delta입니다."}]

[{"index":"void SetRootNode(BTNode node)","0":"node를 최상위 노드로 설정합니다."}]

##### inherited from Component:

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

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

# SeeAlso

  * StateComponent
몬스터의 HitBox를 쉽게 확인하는 방법

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

# 몬스터의 HitBox를 쉽게 확인하는 방법

> 몬스터의 사이즈에 맞게 HitBox를 시각적으로 확인하는 방법을 알아보겠습니다. 이 방법은 게임 개발에서 중요한 요소인 HitBox를 정확하게 설정하는 데 큰 도움이 될 것입니다.

## HitBox란 무엇인가요?

HitBox는 게임 내에서 충돌을 감지하는 보이지 않는 영역입니다. 몬스터와 같은 `엔티티`의 크기에 맞게 설정되어야 하며, 플레이어의 공격이나 이동과 같은 상호작용에서 중요한 역할을 합니다. HitBox를 정확하게 설정하면 게임의 공정성과 재미를 높일 수 있습니다.

## HitBox를 확인해야 하는 이유

HitBox는 게임 플레이의 정확성을 결정합니다. 잘못된 HitBox 설정은 부정확한 충돌 감지로 이어져 플레이어에게 불만을 줄 수 있습니다. 따라서, 정확한 HitBox 설정은 필수적입니다.

## HitBox 시각화를 위한 도구: ColliderVisualizer

ColliderVisualizer는 `스크립트 에디터`에서 사용할 수 있는 도구로, 엔티티의 HitBox를 시각적으로 표시해 줍니다. 이를 통해 몬스터의 HitBox를 쉽게 확인하고 조정할 수 있습니다.

## HitBox 시각화 단계별 가이드

### 1\. ColliderVisualizer 다운로드

  1. Script Manager 열기: 상단 메뉴에서 `Window - Script Manager`로 이동합니다.
  2. ColliderVisualizer 다운로드: Script Manager에서 ColliderVisualizer를 검색하여 다운로드합니다.



### 2\. 몬스터 Entity에 ColliderVisualizer 추가

  1. 몬스터 Entity 선택: `Workspace`에서 HitBox를 확인하고자 하는 몬스터 `엔티티`를 선택합니다.
  2. ColliderVisualizer 추가: 선택한 몬스터 엔티티에 ColliderVisualizer를 추가합니다.



### 3\. HitBox 확인 및 조정

  1. HitBox 시각화 확인: ColliderVisualizer를 통해 몬스터의 HitBox가 제대로 표시되는지 확인합니다.
  2. 조정 필요 시 수정: 필요에 따라 ColliderVisualizer의 `프로퍼티`를 조정하여 HitBox 크기를 수정합니다.



## 잠재적 문제 및 해결책

  * 문제: HitBox가 정확하지 않을 경우, 충돌 감지가 부정확할 수 있습니다.
  * 해결책: ColliderVisualizer의 프로퍼티를 조정하여 정확한 크기와 위치로 수정합니다.
MobileAccelerometerService

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

# Methods

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

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

[{"index":"boolean IsHWSupported() (ClientOnly)","0":"기기의 가속도 센서 지원 여부를 반환합니다."}]

[{"index":"void Start() (ClientOnly)","0":"가속도 센서 측정을 시작합니다."}]

[{"index":"void Stop() (ClientOnly)","0":"가속도 센서 측정을 중지합니다."}]

##### 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 TiltForceApplier extends Component
        property number ForcePower = 100
    
        @ExecSpace("ClientOnly")
        method void OnBeginPlay()
        if _MobileAccelerometerService:IsHWSupported() then
        	_MobileAccelerometerService:Start()
        	_UIToast:ShowMessage("Start AccelerometerService")
        end
        end
    
        method void OnUpdate(number delta)
        if _MobileAccelerometerService:IsEnabled() then
        	local accDir = _MobileAccelerometerService:GetLastAcceleration()
        	local dir = Vector2(accDir.x, accDir.y)
        	-- 기기의 기울어진 정도만큼 물체에 힘을 가합니다.
        	self:Tilt(dir)
        end
        end
    
        @ExecSpace("ServerOnly")
        method void Tilt(Vector2 dir)
        self.BallEntityRef.PhysicsRigidbodyComponent:ApplyForce(dir * self.ForcePower)
        end
    end
    

# SeeAlso

  * PhysicsRigidbodyComponent
  * Vector2
  * [모바일 기기의 가속도 센서 사용하기](/docs?postId=832)
UIBaseParticleComponent

UI에 사용하는 파티클 효과를 만드는 UIParticleComponent의 부모 컴포넌트입니다.

# Properties

[{"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

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

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

##### inherited from Component:

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

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

맵에 스폰할 Freeform 타입의 광원 정보입니다.

# Properties

[{"index":"Color Color","0":"광원의 색상입니다."}]

[{"index":"float FalloffDistance","0":"광원이 Freeform 타입일 때, 빛이 FreeformPoints로부터 얼마나 뻗어 나갈지 결정합니다. 값이 클수록 크기가 커집니다."}]

[{"index":"float FalloffIntensity","0":"광원이 사라지는 곡선의 부드러움을 조절합니다. 값이 클수록 광원의 경계선이 흐릿하고 부드러워 보입니다. 값이 작을수록 광원의 경계선이 날카롭고 또렷하게 보입니다."}]

[{"index":"List FreeformPoints","0":"Freeform 타입의 광원의 모양을 정의하는 점들입니다. 점의 개수는 2000개를 초과할 수 없습니다."}]

[{"index":"Entity Instigator","0":"광원이 생성될 맵에 소속된 엔티티입니다."}]

[{"index":"float Intensity","0":"광원의 광도입니다."}]

[{"index":"float Lifetime","0":"광원이 표시될 시간입니다. 적혀있는 시간을 경과하면 생성되었던 광원이 자동으로 사라집니다. 단, 0 이하의 값을 입력할 경우에는 아무리 시간이 지나도 사라지지 않습니다."}]

[{"index":"int32 LightOrder","0":"광원이 라이트 텍스처에 렌더링되는 순서를 결정합니다. 낮은 수의 광원이 먼저 렌더링되고, 높은 수의 광원이 그 위에 렌더링됩니다. OverlapOperation이 AlphaBlend일 때 동작합니다. 예외적으로 Global 타입 광원은 LightOrder를 갖지 않습니다."}]

[{"index":"OverlayLightOverlapOperation OverlapOperation","0":"광원의 연산 방식입니다. Global 타입 광원은 OverlapOperation을 갖지 않습니다."}]

[{"index":"Vector3 WorldPosition","0":"광원이 위치할 월드 공간 상의 좌표입니다."}]

[{"index":"Vector3 WorldScale","0":"광원에 적용될 월드 공간 상의 스케일입니다."}]

[{"index":"float WorldZRotation","0":"광원에 적용될 월드 공간 상의 Z축 기준 회전값입니다."}]

# Constructors

[{"index":"FreeformTypeOverlayLightInfo(Entity instigator)","0":"지정한 값으로 FreeformTypeOverlayLightInfo를 초기화합니다."}]

[{"index":"FreeformTypeOverlayLightInfo(Entity instigator, float lifetime, Vector3 worldPosition, float worldZRotation, Vector3 worldScale, Color color, float intensity, OverlayLightOverlapOperation overlapOperation, int32 lightOrder, List freeformPoints, float falloffDistance, float falloffIntensity)","0":"지정한 값으로 FreeformTypeOverlayLightInfo를 초기화합니다."}]
CollisionService

충돌 관련 기능을 제공합니다.

# Methods

[{"index":"table GetCollisionGroupsWith(CollisionGroup filterCollisionGroup)","0":"filterCollisionGroup과 충돌하는 충돌 그룹들을 테이블로 얻어옵니다."}]

[{"index":"CollisionMapService GetMapServiceFor(Entity entity) (Deprecated)","0":"더는 사용하지 않는 함수입니다. GetSimulator(Entity) 함수를 사용하세요."}]

[{"index":"CollisionSimulator GetSimulator(Entity entity)","0":"엔티티를 담당하는 CollisionSimulator를 얻습니다."}]

[{"index":"CollisionSimulator GetSimulator(string mapName)","0":"mapName에 해당하는 맵의 CollisionSimulator를 얻습니다."}]

[{"index":"boolean IsCollidableBetweenCollisionGroups(CollisionGroup collisionGroup1, CollisionGroup collisionGroup2)","0":"입력한 두 충돌 그룹이 서로 충돌하는지 여부를 확인합니다."}]

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

엔티티 주위 반경 1 이내에 있는 `TriggerComponent`를 찾아 엔티티 이름을 출력하는 예제입니다. `CollisionService`를 이용해 엔티티가 속한 맵의 `CollisionSimulator`를 얻어올 수 있습니다.
    
    
    @Component
    script TriggerOverlapDetector extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
        local simulator = _CollisionService:GetSimulator(self.Entity)
        local transform = self.Entity.TransformComponent
    
        -- TriggerComponent의 충돌 그룹 기본값은 'TriggerBox'입니다.
        local overlaps = simulator:OverlapCircleAll("TriggerBox", transform.WorldPosition:ToVector2(), 1)
    
        for i = 1, #overlaps do
            local trigger = overlaps[i]
    
            if trigger.Entity == self.Entity then
                continue
            end
    
            if trigger.EnableInHierarchy == false then
                continue
            end
    
            log (trigger.Entity.Name)
        end
        end
    end
    

# SeeAlso

  * TransformComponent
  * TriggerComponent
  * CollisionGroup
  * CollisionSimulator
  * [엔티티의 충돌](/docs?postId=175)
  * [충돌 그룹 만들기](/docs?postId=754)
AvatarStateAnimationComponent

아바타의 상태 변화에 따라 재생될 애니메이션을 지정합니다.

# Properties

[{"index":"SyncDictionary ActionSheet (Sync)","0":"애니메이션의 이름과 AnimationClip이 매핑된 table입니다. IsLegacy의 값이 true일 때 사용됩니다."}]

[{"index":"boolean IsLegacy (ReadOnly)","0":"Legacy 시스템을 지원할지를 설정합니다. 이전 시스템은 더 이상 지원하지 않으며, 추후 삭제 예정입니다."}]

[{"index":"SyncDictionary StateToAvatarBodyActionSheet (Sync)","0":"상태의 이름과 AvatarBodyActionState가 매핑된 table입니다. IsLegacy의 값이 false일 때 사용됩니다."}]

##### inherited from StateAnimationComponent:

[{"index":"SyncDictionary ActionSheet (Sync)","0":"애니메이션의 이름과 AnimationClip이 매핑된 table입니다. IsLegacy의 값이 true일 때 사용됩니다."}]

##### 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 ReceiveStateChangeEvent(IEventSender sender, StateChangeEvent stateEvent) (ScriptOverridable)","0":"StateChangeEvent를 받았을 때 처리하는 함수입니다. 기본적으로 State에 매핑된 AnimationClip을 재생하는 AnimationClipEvent를 발생시킵니다."}]

##### inherited from StateAnimationComponent:

[{"index":"void ReceiveStateChangeEvent(IEventSender sender, StateChangeEvent stateEvent) (ScriptOverridable)","0":"StateChangeEvent를 받았을 때 처리하는 함수입니다. 기본적으로 State에 매핑된 AnimationClip을 재생하는 AnimationClipEvent를 발생시킵니다."}]

[{"index":"void RemoveActionSheet(string key)","0":"StateToAvatarBodyActionSheet에서 key에 해당하는 요소를 제거합니다. IsLegacy 값이 true면 ActionSheet에서 요소를 제거합니다."}]

[{"index":"void SetActionSheet(string key, string animationClipRuid)","0":"StateToAvatarBodyActionSheet에 요소를 추가합니다. 요소로 추가되는 AvatarBodyActionElement 객체의 AvatarBodyActionStateName 프로퍼티 값은 animationClipRuid, PlayerRate 프로퍼티 값은 1이 됩니다. IsLegacy의 값이 true면 ActionSheet에 요소를 추가합니다."}]

[{"index":"string StateStringToAnimationKey(string stateName) (ScriptOverridable)","0":"State에 매핑된 Animation의 이름을 반환합니다."}]

##### inherited from Component:

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

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

# Events

[{"index":"BodyActionStateChangeEvent","0":"BodyAction의 상태가 변경되었을 때 발생하는 이벤트입니다."}]
LogStorageService

기록을 저장하고 불러옵니다. 제작 중인 월드에서는 동작하지 않습니다.

# Methods

[{"index":"void GetPurchaseLogPagesAsync(DateTime fromDate, DateTime toDate, func callbackFunction) (ServerOnly) (ReleaseOnly)","0":"월드 상품 구매 기록을 불러옵니다. fromDate와 toDate로 불러올 구매 기록의 기간을 설정합니다. 비동기로 수행되며, 작업이 완료되면 callbackFunction으로 전달된 함수가 호출됩니다. callbackFunction의 매개변수는 불러온 구매 기록입니다. 제작 중인 월드에서는 동작하지 않습니다. 임시 제공 함수이며 사용을 권장하지 않습니다."}]

[{"index":"void LogPurchaseInfo(WorldShopPurchaseInfo purchaseInfo, string message) (ServerOnly) (ReleaseOnly)","0":"월드 상품 구매 기록을 저장합니다. 제작 중인 월드에서는 동작하지 않습니다"}]

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

#### LogPurchaseInfo

구매 정보를 기록하는 예제입니다.
    
    
    @Component
    script ShopPurchaseHandler extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local processPurchase = function(purchaseInfo)
            	_LogStorageService:LogPurchaseInfo(purchaseInfo, "Item purchase completed")
            	return true
            end
            
            _WorldShopService:SetProcessPurchaseCallback(processPurchase)
        end
    end
    

#### GetPurchaseLogPagesAsync

구매 정보를 조회하는 예제입니다.
    
    
    @Component
    script PurchaseLogRetriever extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
            local fromDate = DateTime(2023, 11, 25)
            local toDate = DateTime(2023, 11, 30)
            
            local onComplete = function(purchaseLogPages)
            
            	while true do
            		local purchaseLogs = purchaseLogPages:GetCurrentPageDatas()
            
            		for index, purchaseLog in ipairs(purchaseLogs) do
            			log(purchaseLog)
            		end
            
            		if purchaseLogPages.IsLastPage == true then
            			break
            		end
            
            		purchaseLogPages:MoveToNextPageAndWait()
            	end
            end
            
            _LogStorageService:GetPurchaseLogPagesAsync(fromDate, toDate, onComplete)
        end
    end
    

# SeeAlso

  * DateTime
  * WorldShopService
TweenBaseComponent

Tween 종류의 부모 컴포넌트입니다.

# Properties

[{"index":"boolean AutoDestroy (Sync)","0":"true일 경우, 트윈이 목적지에 도달하여 끝나거나 직접 Stop()을 호출했을 때 이 컴포넌트를 엔티티에서 제거합니다."}]

[{"index":"boolean AutoStart (Sync)","0":"값이 true일 경우, 게임이 시작되면 트윈이 자동으로 재생합니다."}]

[{"index":"TweenState CurrentState (Sync) (ReadOnly) (HideFromInspector)","0":"현재 재생 상태입니다."}]

[{"index":"Vector3 OriginPosition (Sync) (ReadOnly) (HideFromInspector)","0":"트윈의 시작 위치입니다."}]

[{"index":"Quaternion OriginRotation (Sync) (ReadOnly) (HideFromInspector)","0":"트윈의 시작 회전값입니다."}]

[{"index":"Vector3 OriginScale (Sync) (ReadOnly) (HideFromInspector)","0":"트윈의 시작 크기입니다."}]

[{"index":"TweenSyncType SyncType (ReadOnly)","0":"재생 주체를 설정합니다. 기본값은 Default입니다. 서버와 클라이언트에서 함수로 트윈을 제어할 수 있습니다. 서버 상태는 클라이언트로 항상 동기화됩니다. 실행 공간 제어를 client only로 설정하면 클라이언트에서만 트윈을 제어하도록 제한하고, 서버로 동기화하지 않습니다.트윈 제어 함수: Play, Pause, Stop, Destroy, RestartFromCurrentPosition"}]

[{"index":"number TweenTime (ReadOnly) (HideFromInspector)","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 Destroy()","0":"컴포넌트를 제거합니다. CurrentState를 Destroying으로 변경합니다."}]

[{"index":"void Pause()","0":"트윈을 일시정지합니다. CurrentState를 Pausing으로 변경합니다."}]

[{"index":"void Play()","0":"트윈을 재생합니다. CurrentState를 Playing으로 변경합니다."}]

[{"index":"void RestartFromCurrentPosition()","0":"현재 위치에서 재시작합니다."}]

[{"index":"void Stop(boolean reset)","0":"트윈을 중지합니다. CurrentState를 Idle로 변경합니다. reset에 true를 지정할 경우 트윈의 위치와 진행도를 초기 상태로 되돌립니다."}]

##### inherited from Component:

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

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