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

자식 노드 중에 하나를 무작위로 선택해 실행합니다.

# Properties

##### inherited from BTNode:

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

[{"index":"func InitFunction","0":"초기화 시점에 호출되는 함수입니다."}]

[{"index":"string Name","0":"이 노드의 이름입니다."}]

[{"index":"AIComponent ParentAI (ReadOnly) (HideFromInspector)","0":"이 노드를 가진 AIComponent입니다."}]

# Constructors

[{"index":"RandomSelectorNode(string name = \"RandomSelectorNode\")","0":"지정한 이름으로 RandomSelectorNode를 초기화합니다."}]

# Methods

[{"index":"void AttachChild(BTNode node, number probability)","0":"node를 자식 노드로 추가하고 확률을 부여합니다. 확률은 0에서 1 사이의 실숫값으로 나타냅니다."}]

[{"index":"boolean SetChildNodeProbability(BTNode node, number probability)","0":"자식 노드의 확률을 설정합니다. 확률은 0에서 1 사이의 실숫값으로 나타냅니다."}]

##### inherited from CompositeNode:

[{"index":"void AttachChild(BTNode node)","0":"node를 자식 노드로 추가합니다."}]

[{"index":"void AttachChildAt(BTNode node, int32 index)","0":"index 위치에 node를 자식 노드로 추가합니다. index는 1부터 시작합니다."}]

[{"index":"boolean DetachChild(BTNode node)","0":"node를 자식 노드에서 제거합니다."}]

[{"index":"boolean DetachChild(string nodeName)","0":"이름이 nodeName인 노드를 찾아 자식 노드에서 제거합니다."}]

[{"index":"void DetachChildAt(int32 index)","0":"index 위치에 있는 노드를 자식 노드에서 제거합니다. index는 1부터 시작합니다."}]

##### inherited from BTNode:

[{"index":"BehaviourTreeStatus Behave(float deltaTime)","0":"노드를 실행합니다. deltaTime은 이전 프레임과 현재 프레임 사이에 흐른 시간입니다. 단위는 초입니다."}]
List<V>

동적 크기를 가지는 배열입니다. 1부터 시작하는 인덱스로 요소에 접근할 수 있으며 데이터 추가, 제거, 검색 기능을 제공합니다. 배열에 추가할 수 있는 데이터 타입을 V로 표현합니다.

# Properties

[{"index":"number Count (ReadOnly)","0":"List에 포함된 요소의 개수를 가져옵니다."}]

# Methods

[{"index":"boolean Contains(V item)","0":"List에 포함된 요소 수를 가져옵니다."}]

[{"index":"number IndexOf(V item)","0":"List에서 처음 나오는 요소의 인덱스를 반환합니다."}]

[{"index":"table ToTable()","0":"List에 포함된 요소를 가진 table을 생성합니다."}]

[{"index":"void Add(V item)","0":"요소를 List의 끝부분에 추가합니다."}]

[{"index":"void AddRange(table items)","0":"table의 요소를 List의 끝에 추가합니다."}]

[{"index":"void Clear()","0":"List에서 요소를 모두 제거합니다."}]

[{"index":"void Insert(number index, V item)","0":"List의 지정된 인덱스에 요소를 삽입합니다."}]

[{"index":"number LastIndexOf(V item)","0":"List에서 마지막으로 나오는 요소의 인덱스를 반환합니다."}]

[{"index":"boolean Remove(V item)","0":"List에서 맨 처음 발견되는 특정 요소를 제거합니다."}]

[{"index":"void RemoveAt(number index)","0":"List의 지정된 인덱스에 있는 요소를 제거합니다."}]

[{"index":"void RemoveRange(number index, number count)","0":"List에서 지정된 범위만큼 요소를 제거합니다."}]

[{"index":"table GetRange(number index, number count)","0":"List에서 지정된 범위만큼의 요소를 가진 table을 생성합니다."}]

[{"index":"void Reverse()","0":"List에서 요소의 순서를 반대로 바꿉니다."}]

[{"index":"void Reverse(number index, number count)","0":"지정된 범위에서 요소의 순서를 반대로 바꿉니다."}]

[{"index":"void Sort()","0":"List의 요소를 정렬합니다."}]
Foothold

발판의 여러 정보를 나타냅니다.

# Properties

[{"index":"Vector2 EndPoint (ReadOnly)","0":"Foothold의 끝점을 나타냅니다. 항상 StartPoint보다 오른쪽에 있습니다."}]

[{"index":"int32 Id (ReadOnly)","0":"Foothold의 Id입니다. 발판을 저장할 때 부여됩니다."}]

[{"index":"boolean IsDynamic (ReadOnly)","0":"Foothold가 동적 Foothold인지 여부를 나타냅니다."}]

[{"index":"float Length (ReadOnly)","0":"Foothold의 길이입니다."}]

[{"index":"int32 NextFootholdId (ReadOnly)","0":"다음 Foothold의 Id입니다. 항상 이 Foothold보다 오른쪽에 위치합니다."}]

[{"index":"string OwnerId (ReadOnly)","0":"이 Foothold를 소유한 Entity의 Id입니다. 그 Entity는 TileMapComponent, CustomFootholdComponent 중 하나를 가지고 있습니다."}]

[{"index":"int32 PreviousFootholdId (ReadOnly)","0":"이전 Foothold의 Id입니다. 항상 이 Foothold보다 왼쪽에 위치합니다."}]

[{"index":"Vector2 StartPoint (ReadOnly)","0":"Foothold의 시작점을 나타냅니다. 항상 EndPoint보다 왼쪽에 있습니다."}]

[{"index":"Vector2 Variance (ReadOnly)","0":"Foothold의 끝점에서 시작점까지의 변화량을 의미합니다. 기울기를 알 수 있습니다."}]

# Methods

[{"index":"Vector2 GetCenter()","0":"Foothold 중앙의 위치를 반환합니다."}]

[{"index":"float GetHeight()","0":"Foothold의 높이를 반환합니다."}]

[{"index":"float GetWidth()","0":"Foothold의 너비를 반환합니다."}]

[{"index":"float GetYByX(float x)","0":"Foothold의 X축 값이 x일 때의 Y축 값을 반환합니다."}]

[{"index":"boolean IsHorizontal()","0":"Foothold가 수평 Foothold인지 여부를 반환합니다."}]

[{"index":"boolean IsVertical()","0":"Foothold가 수직 Foothold인지 여부를 반환합니다."}]
MobileVibratorService

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

# Methods

[{"index":"boolean IsHWSupported() (ClientOnly)","0":"기기의 진동 기능 지원 여부를 반환합니다."}]

[{"index":"void Vibrate() (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

UI 버튼을 누르면 모바일 기기를 진동시키는 예제입니다.
    
    
    @Component
    script ButtonClickVibrationHandler extends Component
        @EventSender("Self")
        handler HandleButtonClickEvent(ButtonClickEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: ButtonComponent
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local Entity = event.Entity
        ---------------------------------------------------------
        if _MobileVibratorService:IsHWSupported() then
        	-- 기기를 진동시킵니다.
        	_MobileVibratorService:Vibrate()
        end
        end
    end
    

# SeeAlso

  * [모바일 기기의 진동 기능 활용](/docs?postId=833)
AccountTrustLevel

유저 계정의 인증 레벨입니다. 계정 종류마다 계정 인증 방식이 다르게 적용됩니다.\n한국 계정은 넥슨 OTP를 2차 인증 수단으로 사용합니다.\n글로벌 계정의 경우 SMS, Google Authenticator를 2차 인증 수단으로 사용합니다.\n지정된 레벨에 부합하지 않는 유저에게 계정 종류별 확인해야 하는 항목을 안내하는 것을 권장합니다.

# Members

[{"이름":"Level0","값":"0","설명":"한국 계정의 경우 e-mail 인증을 하지 않은 계정입니다. 글로벌 계정의 경우 계정 보안 설정에서 SMS와 Google Authenticator 가 모두 활성화되어 있지 않은 계정입니다."},{"이름":"Level1","값":"1","설명":"한국 계정의 경우 e-mail 인증을 완료한 계정입니다. 글로벌 계정의 경우 계정 보안 설정에서 SMS와 Google Authenticator 중 1개만 활성화되었거나 Phone Number가 등록되지 않은 계정입니다. 현재 Level 0과 Level 1을 구분하는 기능은 미구현 되었으므로 Level 1도 UserAccountTrustLevel 값이 0으로 반환됩니다. Level 0과 Level 1을 구분하는 기능은 추후 업데이트 예정입니다."},{"이름":"Level2","값":"2","설명":"한국 계정의 경우 e-mail 인증 및 본인 확인을 완료한 계정입니다. 글로벌 계정의 경우, 계정 보안 설정에서 SMS와 Google Authenticator가 활성화되어 있으며, Phone Number도 등록된 계정입니다."},{"이름":"Unknown","값":"1000000","설명":"시스템 장애로 인증 레벨 값을 받을 수 없는 상태입니다."}]

# Methods

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

[{"index":"AccountTrustLevel CastFrom(string value) (Static)","0":"문자열을 해당 타입으로 변환합니다."}]
RawImageRendererComponent

RawImage를 출력하는 기능을 제공합니다.

# Properties

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

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

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

[{"index":"string SortingLayer","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":"렌더러에 적용할 머티리얼을 교체합니다."}]

[{"index":"void SetRawImage(RawImage rawImage) (ClientOnly)","0":"RawImage를 그립니다. nil을 전달하면 아무것도 그리지 않습니다."}]

##### inherited from Component:

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

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

# Events

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

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

지역별 정책 정보를 확인할 수 있는 기능을 제공합니다.

# Methods

[{"index":"PolicyInfo GetPolicyInfoForUserAndWait(string userId) (ServerOnly) (ReleaseOnly) (Yield)","0":"유저가 거주하는 지역의 정책 정보를 불러옵니다. 실패 시 nil을 반환합니다. 수행하는 동안 스크립트 실행을 중단합니다. 출시 환경에서만 동작하는 함수입니다. 메이커에서 실행하면 nil을 반환합니다."}]

[{"index":"void GetPolicyInfoForUserAsync(string userId, func callbackFunction) (ServerOnly) (ReleaseOnly)","0":"유저가 거주하는 지역의 정책 정보를 불러옵니다. 불러오기를 완료하면 callbackFunction으로 전달된 함수가 호출됩니다. 실패 시 nil을 반환합니다. 비동기로 수행됩니다. 제작 중인 월드에서 실행 시 nil을 반환합니다. 매개변수 callbackFunction는 정책 정보를 나타내는 PolicyInfo입니다. 출시 환경에서만 동작하는 함수입니다. 메이커에서 실행하면 nil을 반환합니다."}]

##### 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":"이벤트를 발생시킵니다."}]
User

유저의 정보입니다.

# Properties

[{"index":"NexonOtpStateType NexonOtpState (ReadOnly)","0":"유저의 넥슨 OTP 사용 여부입니다."}]

[{"index":"string Nickname (ReadOnly)","0":"유저의 닉네임입니다."}]

[{"index":"string Nugu (ReadOnly)","0":"동일한 네트워크 환경에서 메이플스토리 월드 서비스에 접근한 사용자를 식별하기 위한 임의의 값입니다. Nugu 값은 일정 시간이 지나면 임의로 재생성되며, 이전에 생성된 값이 재사용 될 수 있습니다. 재사용되는 값의 경우 다른 식별 정보를 가리킬 수 있습니다. 서버 실행 공간에서만 사용할 수 있으며, 클라이언트 실행 공간에서 Nugu는 항상 빈값입니다."}]

[{"index":"string ProfileCode (ReadOnly)","0":"유저의 프로필 코드입니다."}]

[{"index":"AccountTrustLevel UserAccountTrustLevel (ReadOnly)","0":"유저의 인증 레벨입니다."}]

[{"index":"string UserId (ReadOnly)","0":"유저의 고유 식별자입니다. Client 실행제어 함수의 targetUserId 매개 변수에 활용할 수 있습니다."}]

# Methods

[{"index":"AccountRegion GetAccountRegion() (ServerOnly)","0":"유저 계정이 가입된 지역을 나타냅니다. 지역에 따라 계정을 구분하고 싶을 때 활용할 수 있습니다. 메이커에서는 항상 AccountRegion.Unknown을 반환합니다.예를 들어, 지역마다 다른 콘텐츠를 제공하거나 월드 이벤트의 시작과 종료 시간을 다르게 설정할 수 있습니다."}]

# Examples

특정 유저의 Nugu 값을 출력하는 예제입니다.
    
    
    @Component
    script UserNuguLogger extends Component
        method void Server(string userId)
        ---@type table
        local users = _UserService.Users
        local user = users[userId]
    
        if user == nil then
        	return
        end
    
        log("user.Nugu: ".. user.Nugu)
        end
    end
    

# SeeAlso

  * AccountRegion
LogService

로그 관련 기능을 제공합니다.

# Methods

[{"index":"void SetShouldShowServerLog(boolean shouldShowServerLog) (ServerOnly)","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

서버에서의 로그 출력 여부를 설정하고 서버와 클라이언트에서 각각 타입으로 로그를 출력하는 예제입니다.
    
    
    @Component
    script LoggingSystemDemo extends Component
        @ExecSpace("ClientOnly")
        method void OnBeginPlay()
        -- client와 server의 로그를 출력
        self:SetShouldShowServerLog(true)
        self:LogClient()
        self:LogServer()
    
        -- client의 로그만 출력
        self:SetShouldShowServerLog(false)
        self:LogClient()
        self:LogServer()
        end
    
        @ExecSpace("ServerOnly")
        method void LogServer()
        log("log server")
        log_warning("log_warning server")
        log_error("log_error server")
        end
    
        @ExecSpace("ClientOnly")
        method void LogClient()
        log("log client")
        log_warning("log_warning client")
        log_error("log_error client")
        end
    
        @ExecSpace("ServerOnly")
        method void SetShouldShowServerLog(boolean shouldShowLog)
        _LogService:SetShouldShowServerLog(shouldShowLog)
        end
    end
PulleyJointComponent

PulleyJoint를 생성, 삭제합니다. 연결된 두 강체가 도르래처럼 이동합니다.

# 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, Vector2 groundAnchorA, Vector2 groundAnchorB, float ratio = 1)","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 값을 설정합니다."}]

[{"index":"void SetRatio(int32 index, float ratio)","0":"순번이 index에 해당하는 Joint의 Ratio 값을 설정합니다."}]

##### inherited from Component:

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

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

# SeeAlso

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

동적 맵 관련 요청 처리 결과를 나타내는 코드입니다.

# Members

[{"이름":"InternalError","값":"-1","설명":"내부 오류가 발생했습니다."},{"이름":"Success","값":"0","설명":"동적 맵을 성공적으로 생성 또는 파괴했습니다."},{"이름":"InvalidMapName","값":"1","설명":"유효하지 않은 맵 이름입니다. 원본 맵과 동적 맵 이름으로 사용할 수 없는 문자를 사용했습니다. \\\, \/, :, *, ?, \", <, >, |, #, &, =는 사용할 수 없습니다."},{"이름":"DuplicateMapName","값":"2","설명":"중복된 맵 이름입니다. newMapName과 중복되지 않는 이름을 사용해야 합니다."},{"이름":"SourceMapNotFound","값":"3","설명":"해당 원본 맵이 존재하지 않습니다. sourceMapName에 해당하는 원본 맵이 존재하는지 확인해야 합니다."},{"이름":"DynamicMapNotFound","값":"4","설명":"파괴할 맵 이름을 가진 동적 맵이 존재하지 않습니다."},{"이름":"RoomAndSourceMapTypeMismatch","값":"5","설명":"해당 룸에서 원본 맵으로 사용할 수 없는 맵입니다. 정적 룸에서는 정적 맵, 인스턴스 룸에서는 인스턴스 맵만 원본 맵으로 사용할 수 있습니다."},{"이름":"SourceMapNotLoadable","값":"6","설명":"원본 맵이 인스턴스 룸에 포함된 맵이 아닙니다. 인스턴스 룸에 인스턴스 맵이 있는지 확인해야 합니다."},{"이름":"UserExistsInDynamicMap","값":"7","설명":"동적 맵에 입장한 유저가 있습니다. UserService의 GetUsersByMapName() 또는 GetUsersByMapComponent() 함수를 통해 맵에 존재하는 User Entity들을 확인할 수 있습니다."},{"이름":"DynamicMapNotAllowedAsSourceMap","값":"8","설명":"동적으로 생성된 맵을 원본 맵으로 사용할 수 없습니다."}]

# Methods

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

[{"index":"DynamicMapResultCode CastFrom(string value) (Static)","0":"문자열을 해당 타입으로 변환합니다."}]
테스트 서버

# 학습 과정 소개

출시한 월드에 안정적으로 콘텐츠 업데이트를 하려면 테스트 진행은 필수입니다. 예상치 못한 버그를 미리 발견하고 수정하기 위해 크리에이터는 테스트 서버를 열고 제한된 인원에게만 서버 키를 배포해 다양한 상황을 테스트할 수 있습니다. 이번 시간에는 테스트 서버 생성, 접속 및 폐쇄 방법을 알아보겠습니다.

# 테스트 서버 생성

크리에이터가 출시한 월드의 상세 정보 페이지로 들어갑니다. [⋯] 버튼을 눌러 콘텍스트 메뉴를 열고 [테스트 서버 열기] 메뉴를 클릭합니다. [png](1679281107295511e211e33bd4ee886e4d47f70887df7)

이후 열린 팝업창에서 테스트 서버로 입장하거나, 서버 키를 복사할 수 있습니다. [png](167894468121377cac3fad8884ef78987d59cb0ed440c)

# 테스트 서버 접속

[테스트 서버 참가] 메뉴를 클릭하여 테스트 서버에 접속합니다. [png](16792811969272138b2803725445c965a8401f094e6f1)

서버 참가 창에 서버 키를 입력한 사람만 테스트 서버에 접속할 수 있습니다. [png](167894580671505d0f588307546d6bb9221db37959d7e)

# 테스트 서버 폐쇄

테스트 종료 이후, 크리에이터는 테스트 서버를 폐쇄할 수 있습니다. 테스트 서버 폐쇄 방법은 두 가지입니다.

  * 월드 상세 페이지의 콘텍스트 메뉴에서 폐쇄
  * 테스트 서버 안에서 직접 폐쇄



[{"index":"월드 상세 페이지","0":"[png](1679288336258cfa88ddd5fb741a08abc2a9dac343923)"},{"index":"테스트 서버","0":"[png](1678948554540846dd9f0284242a493994244bdc8131a)"}]

테스트 서버가 폐쇄되면 서버 키 역시 폐기됩니다.
월드코인 정산 비율

# 학습 과정 소개

이번 과정에서는 크리에이터가 판매한 월드 상품과 아바타 상품(‘크리에이터 제작 콘텐츠’를 의미하며 이하 ‘CGC 상품’)이 어떻게 수익으로 전환되는지 알아봅시다. 메이플스토리 월드에서 CGC 상품을 판매하시면 일정한 정산 비율을 거쳐 크리에이터 수익으로 적립해 드립니다. 자세한 정산 비율은 아래 항목을 참고해 주세요.

# 월드코인 정산 비율

메이플스토리 월드는 CGC 상품 판매 금액의 65%를 공제한 후, 35%를 USD로 크리에이터님께 정산해 드립니다. 자세한 정산 비율은 아래 그래프를 참고해 주세요.

판매 수수료 (30%) CGC 상품 판매 시, 판매 수수료 30%가 자동 공제됩니다. 판매 수수료에는 각 스토어(Google, Apple)에서 발생하는 결제 수수료, PG 수수료 등이 해당됩니다. 메이플스토리 월드는 상품 판매 시 차감되는 판매 수수료 외 어떤 수수료도 청구하지 않습니다.

Toben (35%) CGC 상품 판매 시, 판매 수수료를 제외한 수익(70%)의 50%를 Toben Studio Inc.에 정산합니다. 정산된 수익은 서버, DB, 솔루션의 유지와 더불어 더 나은 플랫폼 서비스를 제공하기 위한 개발, R&D, 마케팅 등 운영 및 유지비용으로 사용됩니다.

크리에이터 (35%) CGC 상품 판매 시, 판매 수수료를 제외한 수익(70%)의 50%를 크리에이터님께 정산해 드립니다. CGC 상품은 모두 동일한 정산 비율을 가지고 있습니다.

[png](1744251496690ba02c799916b4c24beadc0fe044a12fd)
MapleAvatarBodyActionState

아바타의 특정 애니메이션을 구분합니다. BodyActionStateChangeEvent로 이벤트를 전달받아 아바타 애니메이션을 출력합니다. AvatarStateAnimationComponent의 ActionSheet value와 대응합니다.

# Members

[{"이름":"Invalid","값":"0","설명":"기본값입니다. 사용하지 않습니다."},{"이름":"Stand","값":"1","설명":"stand 값입니다. 아바타가 서있는 모습을 출력합니다."},{"이름":"Walk","값":"2","설명":"walk 값입니다. 아바타가 걷고 있는 모습을 출력합니다."},{"이름":"Attack","값":"3","설명":"attack 값입니다. 아바타가 공격하는 모습을 출력합니다"},{"이름":"Alert","값":"4","설명":"alert 값입니다. 아바타가 경계하는 모습을 출력합니다."},{"이름":"Crouch","값":"5","설명":"crouch 값입니다. 아바타가 엎드린 모습을 출력합니다."},{"이름":"Fall","값":"6","설명":"fall 값입니다. 아바타가 공중에서 낙하하는 모습을 출력합니다."},{"이름":"Sit","값":"7","설명":"sit 값입니다. 아바타가 앉은 모습을 출력합니다."},{"이름":"Rope","값":"8","설명":"rope 값입니다. 아바타가 로프에 매달린 모습을 출력합니다."},{"이름":"Ladder","값":"9","설명":"ladder 값입니다. 아바타가 사다리에 매달린 모습을 출력합니다."},{"이름":"Dead","값":"10","설명":"dead 값입니다. 아바타가 죽은 모습을 출력합니다."},{"이름":"Blink","값":"11","설명":"blink 값입니다. 아바타가 잠깐 사라진 모습을 출력합니다."},{"이름":"Fly","값":"12","설명":"fly 값입니다. 아바타가 나는 모습을 출력합니다."},{"이름":"Heal","값":"13","설명":"heal 값입니다. 아바타가 치유하는 모습을 출력합니다."},{"이름":"Hit","값":"14","설명":"hit 값입니다. 아바타가 피격받은 모습을 출력합니다."}]

# Methods

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

[{"index":"MapleAvatarBodyActionState CastFrom(string value) (Static)","0":"문자열을 해당 타입으로 변환합니다."}]
Sprite

MSW의 이미지를 표현하기 위한 메타 정보(피벗, 보더 등)와 이미지의 텍스쳐 바이너리를 담고 있는 클래스입니다.

# Properties

[{"index":"Vector4 Border (ReadOnly)","0":"UI에서 Sprite를 Sliced 방식으로 렌더링할 때 사용하는 경곗값입니다."}]

[{"index":"RectOffset Collision (ReadOnly)","0":"충돌 범위를 표현하는 aabb 박스입니다."}]

[{"index":"ReadOnlyList> Footholds (ReadOnly)","0":"엔티티가 올라설 수 있는 발판을 구성하는 컨벡스 정보입니다."}]

[{"index":"int32 Height (ReadOnly)","0":"스프라이트의 높이입니다."}]

[{"index":"Vector2Int OffsetInTexture (ReadOnly)","0":"아틀라스에 포함된 스프라이트의 경우, 아틀라스 텍스쳐의 위치와 크기를 기록한 값입니다."}]

[{"index":"Vector2 Pivot (ReadOnly)","0":"스프라이트를 월드에 배치시킬 때 중심점입니다."}]

[{"index":"Vector2Int PivotPixel (ReadOnly)","0":"스프라이트를 월드에 배치시킬 때 중심점입니다. Pivot을 픽셀 단위로 표현한 값입니다."}]

[{"index":"float PixelPerUnit (ReadOnly)","0":"Grid 눈금 1 Unit에 해당하는 픽셀 크기입니다."}]

[{"index":"int32 Width (ReadOnly)","0":"스프라이트의 너비입니다."}]

##### inherited from ResourceObject:

[{"index":"boolean IsLoadComplete (ReadOnly)","0":"리소스가 정상적으로 로드가 완료됐는지를 확인하는 플래그입니다. MSW 내 모든 리소스는 로드가 완료되어야 사용이 가능합니다."}]

[{"index":"string RUID (ReadOnly)","0":"리소스의 RUID입니다."}]

[{"index":"ResourceType Type (ReadOnly)","0":"이 리소스의 타입입니다."}]

# Methods

[{"index":"Sprite LoadAndWait() (Deprecated) (Yield)","0":"더는 사용하지 않는 함수입니다.ResourceService의 LoadSpriteAndWait(string) 함수를 사용하세요."}]

[{"index":"Sprite Get(string RUID) (Deprecated) (Static)","0":"더는 사용하지 않는 함수입니다. ResourceService의 LoadSpriteAndWait(string) 함수를 사용하세요."}]

[{"index":"void LoadAsync(string RUID, func loadCompleteCallback) (Deprecated) (Static)","0":"더는 사용하지 않는 함수입니다. ResourceService의 LoadSpriteAndWait(string) 함수를 사용하세요"}]
YoutubePlayerCommonComponent

Youtube 영상을 재생하는 기능을 제공합니다. YoutubePlayerWorldComponent와 YoutubePlayerGUIComponent의 부모 컴포넌트입니다.

# Properties

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

[{"index":"boolean PlayOnAwake","0":"월드 시작 시 영상 재생 여부를 설정합니다."}]

[{"index":"float PlaySpeed (Sync)","0":"영상의 재생 속도를 설정합니다. 0.5부터 3 사이의 값을 사용할 수 있습니다."}]

[{"index":"boolean Shuffle","0":"값이 true일 경우 Urls에 지정한 영상들을 무작위 순서로 재생합니다."}]

[{"index":"List Urls","0":"영상 Url들을 지정합니다."}]

[{"index":"float Volume (Sync)","0":"음량 크기를 설정합니다. 0부터 1 사이의 값을 사용할 수 있습니다."}]

##### 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 ClearScreen(string targetUserId = nil) (Client)","0":"영상 재생을 정지하고, 화면을 지웁니다."}]

[{"index":"void Jump(int32 timeInSeconds, string targetUserId = nil) (Client)","0":"재생 지점을 특정 시간으로 옮깁니다. 시간 단위는 초 단위 정수입니다."}]

[{"index":"void Pause(string targetUserId = nil) (Client)","0":"영상 재생을 일시 정지합니다."}]

[{"index":"void Play(string targetUserId = nil) (Client)","0":"모든 영상을 처음부터 다시 재생합니다."}]

[{"index":"void PlayPause(string targetUserId = nil) (Client)","0":"재생 중인 영상을 정지시키거나 일시 정지된 영상을 재생합니다."}]

##### inherited from Component:

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

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

엔티티에 태그를 지정합니다. EntityService를 이용하면 태그를 이용해 엔티티를 조회할 수 있습니다.

# Properties

[{"index":"SyncList Tags (Sync)","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 AddTag(string tag)","0":"태그를 추가합니다."}]

[{"index":"void RemoveTag(string tag)","0":"태그를 제거합니다."}]

##### inherited from Component:

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

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

# Examples

골인 지점 영역 안에 캐릭터가 들어오면 'Qualified' 태그를 추가합니다. 10초 뒤 해당 태그를 소유한 플레이어의 이름표를 변경해 승자를 표시하는 예제입니다.
    
    
    @Component
    script QualifiedPlayerMarker extends Component
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
        local showWinner = function()
        	local winners = _EntityService:GetEntitiesByTag("Qualified")
    
        	for i = 1, #winners do
        		local nametag = winners[i].NameTagComponent
        		nametag.FontColor = Color.green
        		nametag.FontSize = 4
        		nametag.Name = "★ Qualified ★"
        	end
        end
    
        _TimerService:SetTimerOnce(showWinner, 10.0)
        end
    
        @EventSender("Self")
        handler HandleTriggerEnterEvent(TriggerEnterEvent event)
        -- Parameters
        local TriggerBodyEntity = event.TriggerBodyEntity
        --------------------------------------------------------
    
        if TriggerBodyEntity.PlayerComponent == nil then
        	return
        end
    
        TriggerBodyEntity.TagComponent:AddTag("Qualified")
        end
    end
    

# SeeAlso

  * NameTagComponent
  * PlayerComponent
  * TriggerEnterEvent
  * EntityService
  * TimerService
  * [엔티티를 탐색하는 EntityService](/docs?postId=201)