엔티티와 컴포넌트 참조

# 학습 과정 소개

엔티티와 컴포넌트 구조를 간략하게 이해하고, 스크립트를 통해 엔티티와 컴포넌트에 접근하는 방법을 알아봅니다.

# 엔티티와 컴포넌트 구조

먼저 엔티티와 컴포넌트의 구조를 알아보겠습니다. 기본적으로 엔티티는 각기 다른 컴포넌트들로 구성되어 있고, 각각의 엔티티는 상위, 하위 관계로 연결되어 있습니다. 이 연결 구조를 이용하면 특정 컴포넌트에서 다른 엔티티나 컴포넌트로 접근할 수 있습니다. 아래 이미지는 엔티티 간의 상-하위 구조와 각 엔티티를 구성하는 컴포넌트를 도식화한 것입니다. 이후 이 구조를 바탕으로 설명하겠습니다. [png](16371471617051e7a31dbcf5742d8b8f61020bf6913db)   


> 엔티티와 컴포넌트 개념은 다음 강의를 참고하세요. [Entity, Component, Property](https://mod-developers.nexon.com/docs?postId=54)

# 엔티티 참조

스크립트 컴포넌트에서 다른 엔티티를 참조하는 방법을 살펴봅니다.

#### self.Entity

먼저 컴포넌트 자신을 포함하는 엔티티 참조 방법을 알아봅시다. [png](1635291524024e210da552eaf462a8558eddda0c5b43c)   
스크립트를 작성할 때, 위 도식처럼 Component A에서 Entity C를 참조하는 경우가 빈번하게 발생합니다. 참조 방법은 매우 간단합니다. 아래 코드처럼 self.Entity를 통해 엔티티를 받아올 수 있습니다.
    
    
    @Component
    script EntityNameLogger extends Component
        method void OnBeginPlay()
        local myEntity = self.Entity
        log(myEntity.Name)  -- 엔티티 이름 출력
        end
    end
    

#### Entity.Parent

상위 엔티티 참조 방법을 알아봅니다. 아래와 같이 Component A에서 Entity A를 참조하는 경우입니다. Entity C를 참조한 다음, 그 부모인 Entity A를 참조할 수 있습니다. [png](1635291534007f6d3e36ca453424485607b7fda2dd06b)   
예시 코드는 다음과 같습니다.
    
    
    @Component
    script HierarchyInfoLogger extends Component
        method void OnBeginPlay()
        local myEntity = self.Entity
        log(myEntity.Name)  -- Entity C의 이름 출력
    
        local parentEntity = myEntity.Parent
        log(parentEntity.Name) -- Entity A의 이름 출력
        end
    end
    

#### Entity.Children

상위 엔티티에서 하위 엔티티를 가져오는 방법을 알아봅니다. Entity.Children으로 상위 엔티티에서 하위 엔티티들을 참조할 수 있습니다. 다만 Entity.Children는 하위의 모든 엔티티를 목록으로 가져옵니다. 아래 그림처럼 Entity A의 하위 엔티티 중 특정 엔티티인 Entity D만 참조하려면 배열을 순회하여 조건에 맞는 엔티티만 참조해야 합니다. [png](163529154797085c3b3e542834bb89e508df36a58dd18)   
다음은 위 그림처럼 Component A에서 Entity D를 참조하는 코드 예시입니다.
    
    
    @Component
    script ChildNameFinder extends Component
        method void OnBeginPlay()
        local myEntity = self.Entity
        log(myEntity.Name)    -- Entity C의 이름 출력
    
        local parentEntity = myEntity.Parent
        log(parentEntity.Name)   -- Entity A의 이름 출력
    
        local children = parentEntity.Children  --Entity A의 하위 엔티티를 테이블 형태로 받아 옴
        local childrenEntityName = ""
    
        for index, child in pairs(children) do
            if child.Name == "EntityD" then
                childrenEntityName = child.Name
                break
            end
        end
    
        if childrenEntityName == "" then
            log("EmptyEntityD")
            return 
        end
    
        log(childrenEntityName)
        end
    end
    

#### Entity:GetChildByName()

Entity.Children처럼 하위 엔티티를 참조하는 또 다른 방법을 알아봅시다. Entity:GetChildByName()은 하위 엔티티 중 매개 변수로 넘겨진 값과 같은 이름의 엔티티를 반환하는 함수입니다. 따라서 Entity.Children처럼 모든 하위 엔티티를 받아온 후 반복문을 통해 원하는 엔티티를 찾을 필요가 없습니다. 찾고자 하는 엔티티의 이름만 알고 있다면 훨씬 간단하게 하위 엔티티를 가져올 수 있습니다.

  * 매개 변수

    * GetChildByName 함수는 두 개의 매개 변수를 받을 수 있습니다.

[{"Parameter":"name","Type":"string","Description":"찾고자 하는 하위 엔티티의 이름을 넘겨줍니다."},{"Parameter":"recursive","Type":"bool","Description":"하위에 하위 엔티티를 재귀적으로 계속 찾을 것인지를 설정합니다.true일 경우 하위에 하위 엔티티까지 재귀적으로 찾습니다false일 경우 바로 아래 단계까지만 찾습니다.옵셔널 매개 변수이기 때문에 아무 값도 넣지 않아도 됩니다.값을 넣지 않으면 false(하위에 하위 엔티티 찾지 않음)로 설정됩니다."}]

  

  * 반환 값

    * 만일 찾고자 하는 엔티티가 존재하면 해당 엔티티를 반환하고,
    * 그렇지 않으면 nil을 반환합니다.   

  * 스크립트 작성 예시

    * 다음은 상위 엔티티인 EntityA에서 하위 엔티티인 EntityD를 받아오는 스크립트입니다. [png](163529158705102eb762c67b14c3cbe9c07c0ef87e8f4)   

          
          @Component
          script ChildEntityFinder extends Component
          method void OnBeginPlay()
          local entityA = self.Entity    -- EntityA를 받아 옴
          local entityD = entityA:GetChildByName("EntityD")    -- 하위 엔티티인 EntityD를 받아 옴
          log(entityD.Name)    -- 콘솔 창에 EntityD의 이름 출력
          

\--만약 하위 엔티티가 없는 엔티티를 찾으면 nil 반환 local entityF = entityA:GetChildByName("EntityF") log(entityF) -- 콘솔 창에 nil 출력 end end



    
    
          
    
    * 다음은 상위 엔티티 EntityA에서 하위에 하위 엔티티인 EntityJ를 참조하는 스크립트입니다.
    하위 엔티티를 가져올 때는 두 번째 매개 변수인 recursive 값을 true로 설정합니다.
    [png](1635291597805292fc8bfa543454eb370f7861ad928e3)
      
    
        ```lua
    @Component
    script ChildByNameFinder extends Component
        method void OnBeginPlay()
        local entityA = self.Entity    -- EntityA를 받아 옴
        local entityJ = entityA:GetChildByName("EntityJ", true)
        -- EntityJ의 이름인 "EntityJ"로 하위에 하위 엔티티를 찾습니다. 하위에 하위까지 찾아야 하기 때문에 두 번째 매개 변숫값을 true로 설정     
        log(entityJ.Name)    -- 콘솔 창에 EntityJ의 이름 출력
        end
    end
    

# _EntityService를 통한 Entity 참조

지금까지는 컴포넌트에서 상위, 하위 엔티티의 연결 구조로 엔티티를 참조하는 방법을 알아보았습니다. 이 방법은 컴포넌트와 가까운 엔티티를 찾을 때는 효율적이지만, 아래와 같이 부모의 부모의 부모를 찾고 다시 그 부모의 하위 엔티티를 찾아야 한다면 상당히 번거롭습니다. [png](16352916095449bc3ee34f64745c8856c713169446ff5)   
_EntityService를 활용하면 원하는 엔티티를 바로 찾아 반환하는 함수를 사용할 수 있어 편리합니다.

#### GetEntityByPath()

찾으려는 엔티티 경로(Path)를 매개 변수로 넘겨주면, 해당 경로의 엔티티를 반환하는 함수입니다. 가장 보편적으로 사용되는 함수입니다.

  * 매개 변수

[{"index":"Parameter","0":"worldPath"},{"index":"Type","0":"string"},{"index":"Description","0":"얻고자 하는 엔티티 경로를 넣어줍니다.경로는 \/maps\/부터 시작해서 하위 엔티티들을 입력합니다.예를 들어 다음과 같은 계층 구조에서 \"object_1\"의 경로는 다음과 같습니다.[png](1635483238562b41e1da8c00d4eeaab15d6db6080a4a3)\"\/maps\/map01\/object_1\""}]

  
> **Tip** > 엔티티 경로를 수동으로 입력하면 번거롭고 오타 발생 가능성도 높아 비효율적입니다. > 엔티티 경로 복사 기능을 사용하면 손쉽고 정확하게 엔티티 경로를 입력할 수 있습니다. > 특정 엔티티의 콘텍스트 메뉴에서 **Copy Entity Path**를 클릭하면 해당 엔티티 경로가 클립보드에 저장됩니다. > [png](1686210532005a4a5c0075ed74dfd84667cb938b58532) 
  * 반환 값

    * 매개 변수로 입력한 경로와 일치하는 엔티티가 있으면 엔티티를 반환합니다.
    * 만일 경로 값과 일치하는 엔티티가 여러 개일 경우, 가장 먼저 찾은 엔티티만 반환합니다.
    * 경로 값과 일치하는 엔티티가 없으면 nil을 반환합니다.   

  * 스크립트 작성 예시

    * 다음 그림과 같이 Component A에서 Entity E를 참조하는 예시 코드는 다음과 같습니다. [png](1635291664607739291779c984748ad56f8bb91fddb83)   

          
          @Component
          script EntityPathFinder extends Component
          method void OnBeginPlay()
          --EntityE의 경로를 매개 변수로 입력하여 EntityE를 반환
          local EntityE = _EntityService:GetEntityByPath("/maps/map01/EntityO/EntityB/EntityE")   
          if isvalid(EntityE) == false then return end   
          

log(EntityE.Name) end end



    
    
    #### GetEntitiesByPath()
    매개 변수로 넘겨진 경로와 일치하는 모든 엔티티를 리스트 형태로 반환하는 함수입니다.
    생성된 엔티티는 서로 다르지만, 생성 시 같은 이름으로 생성되어 경로가 같을 때 사용하면 편리합니다.
    예를 들어, 탄막이나 총알처럼 동일한 이름으로 대량 생성된 엔티티를 한 번에 제어할 때 유용하게 사용할 수 있습니다.
    
    * **매개 변수**
    
        | Parameter | Type | Description |
        | --- | --- | --- |
        | worldPath | string | 얻고자 하는 엔티티 경로를 넣어줍니다.  
    경로는 /maps/부터 시작해서 하위 엔티티들을 입력합니다. |
    
    * **반환 값**
        * 매개 변수로 입력한 경로 값과 일치하는 모든 엔티티를 반환합니다.
        * 경로 값과 일치하는 엔티티가 없으면 nil을 반환합니다.
      
    
    * **스크립트 작성 예시**
        * 다음은 ComponentA에서 EntityB의 하위 엔티티 중 이름이 EntityE인 엔티티를 가져오는 코드입니다.
        [png](16352916806362d0bfb38644b44e78e8ab10b2ce762e8)
          
    
            ```lua
    @Component
    script EntityPathLogger extends Component
        method void OnBeginPlay()
        --매개 변수로 넘겨진 경로 값과 일치하는 모든 엔티티를 List 형식으로 반환
        local entityTable = _EntityService:GetEntitiesByPath("/maps/map01/EntityO/EntityB/EntityE")
        if entityTable == nil then return end
    
        -- 반환된 모든 엔티티를 순회하며 엔티티의 이름을 출력. (모두 EntityE로 출력)
        for index, entity in pairs(entityTable) do
            log(entity.Name)
        end
        end
    end
    

#### GetEntity()

매개 변수로 엔티티 ID를 넘겨주면 해당 ID의 엔티티를 반환하는 함수입니다. 엔티티의 계층 구조가 동적으로 변경되거나 엔티티의 이름이 바뀌면서 경로가 변경될 여지가 있으면, 유니크한 ID를 이용해 엔티티를 받아올 수 있는 GetEntity를 사용하는 것이 효율적입니다.

  * 매개 변수

[{"index":"Parameter","0":"ID"},{"index":"Type","0":"string"},{"index":"Description","0":"얻고자 하는 엔티티 ID를 넣어줍니다.엔티티의 콘텍스트 메뉴에서 Copy Entity ID를 클릭하면해당 엔티티의 ID가 클립보드에 복사됩니다.[png](16862106228295b326090f635424abcc59cf1e2980a19)또는 스크립트에서도 엔티티의 ID를 다음과 같이 얻을 수 있습니다.local id = Entity.ID"}]

  * 반환 값

    * 매개 변수로 입력한 ID의 엔티티를 반환합니다.
    * ID에 해당하는 엔티티가 없으면 nil을 반환합니다.   

  * 스크립트 작성 예시

    * ComponentA에서 EntityB 하위의 EntityE를 가져오는 예시 코드입니다. [png](1635291706386333eb05e82114f21a88219ec5980a571)   

          
          @Component
          script TargetEntityLocator extends Component
          method void OnBeginPlay()
          --매개 변수로 찾고자 하는 엔티티의 ID를 넘겨주면 해당 ID의 엔티티를 반환
          local entityE = _EntityService:GetEntity("eb9c3412-9730-4e32-a180-69f4d1596652")
          if entityE == nil then
          return nil
          end
          log(entityE.Name)
          end
          end
          



    
    
    # 고유 엔티티 참조
    
    지금까지 맵에 배치하거나 _SpawnService를 통해 동적으로 생성된 엔티티 참조 방법을 알아보았습니다.
    이번에는 world, maps 또는 Player와 같이 고유한 엔티티 참조 방법을 알아봅시다. world, maps 같은 엔티티도 위의 방법으로 참조할 수 있지만, 게임 내에 하나만 존재하는 고유한 엔티티이기에 좀 더 쉽게 참조할 수 있습니다.
    #### Entity.CurrentMap
    Entity.CurrentMap은 특정 엔티티가 있는 맵 정보를 읽어옵니다.
    엔티티의 Parent를 타고 들어가 맵 엔티티를 읽어올 순 있지만, CurrentMap을 활용하면 좀 더 쉽게 맵 엔티티를 가져올 수 있습니다.
    다음은 EntityH의 ComponentA에서 EntityH가 있는 map01엔티티를 받아오는 예시 코드입니다.
    [png](1635291720112228087ed833e456688e74f3153ac2670)
      
    
    

@Component script CurrentMapNameLogger extends Component method void OnBeginPlay() local myEntity = self.Entity -- 자신이 포함하고 있는 EntityH를 받아 옴 local curMap = myEntity.CurrentMap -- 현재 EntityH가 속한 맵인 map01엔티티를 받아 옴 if isvalid(curMap) == false then return end
    
    
    log(curMap.Name)    --콘솔 창에 "map01" 출력
    end
    

end
    
    
    #### Entity.CurrentWorld
    엔티티를 통해 world 엔티티를 읽어올 수 있는 프로퍼티입니다.
    maps와 마찬가지로 게임 내에서 단 하나만 존재하기 때문에 어떤 엔티티에서든 CurrentWorld를 통해 world 엔티티를 읽어올 수 있습니다.
    다음은 EntityB의 ComponentA에서 world 엔티티를 참조하는 예시 코드입니다.
    [png](163714718037512f7b2e3d4114a4ca50976d3a41504a3)
      
    
    

@Component script WorldNameLogger extends Component method void OnBeginPlay() local myEntity = self.Entity -- 자신이 포함하고 있는 EntityB를 받아 옴 local world = myEntity.CurrentWorld -- 최상위 엔티티인 World 엔티티를 받아 옴 if isvalid(world) == false then return end
    
    
    log(world.Name)    --콘솔 창에 "World" 출력
    end
    

end
    
    
    #### _UserService.UserEntities
    게임에 접속해 있는 모든 플레이어 엔티티를 딕셔너리 형태로 받아오는 읽기 전용 프로퍼티입니다.
    * Key: string UserId
    * Value: Entity PlayerEntity
    
    key 값인 UserId는 유저가 메이플스토리 월드에 가입 시 생성한 Id로 UserId와 플레이어 엔티티의 이름을 동일하게 사용하고 있습니다.
    

@Component script PlayerInfoLogger extends Component method void PrintUserEntitiesName() log(_UserService:GetUserCount()) local playerEntitiesDic = _UserService.UserEntities
    
    
    -- 모든 플레이어를 순회하며 콘솔 창에 "플레이어 key 값/플레이어 이름" 형식으로 출력
    for key, playerEntity in pairs(playerEntitiesDic) do
        log(key.."/"..playerEntity.Name)                        
    end
    end
    

end
    
    
    #### _UserService.LocalPlayer
    클라이언트 공간에서 내 플레이어 엔티티를 참조할 수 있는 읽기 전용 프로퍼티입니다.
    서버에는 내 플레이어라는 개념이 없기 때문에 서버에서 사용하면 nil을 반환합니다.
    

@Component script PlayerContextLogger extends Component @ExecSpace("ClientOnly") method void OnBeginPlay() local myPlayerEntity = _UserService.LocalPlayer log(myPlayerEntity.Name) -- 내 플레이어 엔티티 이름 출력 end
    
    
    @ExecSpace("ServerOnly")
    method void OnBeginPlay_2()
    -- 서버에서는 내 플레이어라는 개념이 없으므로 nil 반환
    local myPlayerEntity = _UserService.LocalPlayer     
    log(myPlayerEntity)    -- nil 출력
    end
    

end
    
    
    #### _UserService:GetUserEntityByUserID()
    매개 변수로 넘겨진 플레이어의 Id를 통해 플레이어 엔티티를 반환하는 함수입니다.
    * **매개 변수**
    
    | Parameter | Type | Description |
    | --- | --- | --- |
    | UserId | string | 찾고자 하는 플레이어 엔티티의 UserId를 입력합니다.  
    UserId는 유저가 메이플스토리 월드에 가입 시 생성한 Id로 현재는 플레이어 엔티티의 이름과 동일한 값으로 사용됩니다. |
    
    * **반환 값**
        * 매개 변수로 넘겨진 UserId와 동일한 플레이어 엔티티가 있으면, 플레이어 엔티티를 반환합니다.
        * UserId와 동일한 플레이어 엔티티가 없으면 nil을 반환합니다.
    
    * **스크립트 작성 예시**
        ```lua
    @Component
    script UserEntryQueryHandler extends Component
        @EventSender("Service", "UserService")
        handler HandleUserEnterEventType(any event)
        -- Parameters
        local UserId = event.UserId
        --------------------------------------------------------
        local GetUserId = _UserService:GetUserEntityByUserID(UserId)
        log(GetUserId)
        end
    end
    

#### 컴포넌트의 접근과 동작

클라이언트 공간에서 내 플레이어 엔티티를 참조할 수 있는 읽기 전용 프로퍼티입니다. 프로퍼티 에디터에서 각 컴포넌트의 프로퍼티를 변경할 수 있는 것처럼 스크립트에서도 컴포넌트의 프로퍼티를 설정할 수 있습니다. 프로퍼티 에디터에서는 게임이 실행되기 전에 프로퍼티 초깃값만 설정이 가능하지만, 스크립트에서는 게임 실행 중 동적으로 프로퍼티 값을 변경할 수 있습니다. 그리고 프로퍼티 설정 외에도 컴포넌트에 속한 함수를 호출할 수 있기 때문에 크리에이터가 개발한 기능을 게임 실행 중에 작동시킬 수도 있습니다.   
이번에는 각 엔티티에 포함된 컴포넌트 접근 방법을 알아보겠습니다. 또한 스크립트를 통해 게임 실행 중 동적으로 컴포넌트의 프로퍼티 값을 변경하고 함수를 호출하는 방법을 살펴보겠습니다.

#### 컴포넌트 접근

컴포넌트는 엔티티를 작동시키는 구성품입니다. 그러므로 반드시 엔티티를 통해 컴포넌트로 접근해야 합니다. 일반적으로 Entity.컴포넌트 명 형태로 컴포넌트에 접근할 수 있습니다. 네이티브 컴포넌트는 스크립트 에디터에서 컴포넌트 명이 자동 완성됩니다. [png](163529175281398b0a801dd3e437cabba9f493741f9a1)   
다음은 내 플레이어 엔티티의 RigidbodyComponent에 접근하는 예시 코드입니다.
    
    
    @Component
    script PlayerRigidbodyChecker extends Component
        @ExecSpace("ClientOnly")
        method void OnBeginPlay()
        local myPlayerEntity = _UserService.LocalPlayer
    
        -- 내 플레이어 엔티티의 컴포넌트를 변수 rigidbody에 참조
        local rigidbody = myPlayerEntity.RigidbodyComponent 
        if rigidbody == nil then
            log("rigidbody is nil")
            return
        end
        log(rigidbody)
        end
    end
    

  
스크립트 컴포넌트도 네이티브와 동일하게 접근할 수 있습니다. 스크립트 컴포넌트를 생성할 때 작성한 컴포넌트 이름으로 접근하면 됩니다. 아래는 **CharacterStatus**라는 이름의 스크립트 컴포넌트에 접근하는 예시 코드입니다. **CharacterStatus** 컴포넌트를 직접 제작한 뒤 접근할 수 있습니다. ```lua @Component script CharacterStatusAccessor extends Component @ExecSpace("ClientOnly") method void OnBeginPlay() local myPlayerEntity = _UserService.LocalPlayer 
    
    
    -- 내 플레이어 엔티티의 스크립트 컴포넌트를 변수 status에 참조
    local status = myPlayerEntity.CharacterStatus   
    if status == nil then return nil end
    log(status)
    end
    

end
    
    
      
    
    > **더 알아보기**
    > MSW는 상황에 따라 컴포넌트에 접근하는 여러 가지 방법을 제공합니다.
    > 
    > **Array Entity:GetChildComponentsByTypeName(string typename, bool recursive)**
    > 하위 엔티티에 포함된 컴포넌트 중 컴포넌트 이름이 typename과 일치하는 모든 컴포넌트를 Array 형태로 반환합니다.
    > 
    > * **매개 변수**
    >     
    >     | Parameter | Type | Description |
    >     | --- | --- | --- |
    >     | typename | string | 찾고자 하는 컴포넌트의 이름을 입력합니다. |
    >     | recursive | bool | 하위에 하위 엔티티까지 찾아 들어갈지를 설정합니다.  
    true로 설정할 경우, 하위에 하위 엔티티까지 컴포넌트를 찾습니다.  
    false로 설정할 경우, Entity의 하위 엔티티까지만 찾습니다.  
    아무 값도 넣지 않을 경우 false로 설정됩니다. |
    > * **스크립트 작성 예시**
    >     만일 아래 그림처럼 map01 하위의 모든 엔티티에서 ComponentA를 모두 반환받고 싶을 때 다음과 같이 스크립트를 작성할 수 있습니다.
    >     [png](163529177940448f5ac49614d4075979b2c3dc83dda6d)
    >     ```lua
    @Component
    script MapComponentFinder extends Component
        method void OnBeginPlay()
        local map01Entity = self.Entity.CurrentMap
        local ComponentsArr = map01Entity:GetChildComponentsByTypeName("ComponentA")         
        log(ComponentsArr)
        end
    end
    

> 
>       
>     > 
>     만일 아래와 같이 map01하위에 하위 엔티티에 있는 ComponentA까지 반환하려면 다음과 같이 작성합니다.
>     [png](16352917921880070f662f0394704b49bd154c9903320)
>     ```lua
>     

@Component script TypedComponentRetriever extends Component method void OnBeginPlay() local map01Entity = self.Entity.CurrentMap
    
    
    --위 스크립트에서 두 번째 매개 변수에 true 입력 
    local ComponentsArr = map01Entity:GetChildComponentsByTypeName("ComponentA", true) 
    log(ComponentsArr)
    end
    

end
    
    
    >       
    
    > **Component Entity:GetFirstChildComponentByTypeName(string typename, bool recursive)**
    > 하위 엔티티들을 순회하면서 하위 엔티티에 typename과 일치하는 컴포넌트가 있으면, 해당 컴포넌트를 반환합니다.
    > * **매개 변수**
    >     
    >     | Parameter | Type | Description |
    >     | --- | --- | --- |
    >     | typename | string | 찾고자 하는 컴포넌트의 이름을 입력합니다. |
    >     | recursive | bool | 하위에 하위 엔티티까지 찾아 들어갈지를 설정합니다.  
    true로 설정할 경우, 하위에 하위 엔티티까지 컴포넌트를 찾습니다.  
    false로 설정할 경우, Entity의 하위 엔티티까지만 찾습니다.  
    아무 값도 넣지 않으면 false로 설정됩니다. |
    > * **스크립트 작성 예시**
    >     만일 아래 그림처럼 map01하위의 모든 엔티티 중에서 ComponentA를 가진 첫 번째 엔티티의 ComponentA를 반환받고 싶다면 다음과 같이 스크립트를 작성해 줍니다.
    >     (하위 엔티티의 순회는 EntityA에서부터 EntityD로 한다는 가정)
    >     [png](16352918189148ef0321fb0ad4e038085c66dd874e31a)
    >     ```lua
    @Component
    script MapChildComponentFinder extends Component
        method void GetChildComponents()
        local map01Entity = self.Entity.CurrentMap
    
        --EntityA의 ComponentA 반환
        local ComponentsArr = map01Entity:GetFirstChildComponentByTypeName("ComponentA")   
        end
    end
    

> 
>       
>     > 
>     이번에는 엔티티의 하위뿐만 아니라 하위에 하위 엔티티에 있는 Component까지 검색하려면 다음과 같이 두 번째 매개 변숫값을 true로 설정해 줍니다.
>     [png](163529183127423266c0257414814a3a380f36d667ad0)
>     ```lua
>     

@Component script ChildComponentFinder extends Component method void GetChildComponents() local map01Entity = self.Entity.CurrentMap
    
    
    --EntityF의 ComponentA 반환
    local ComponentsArr = map01Entity:GetFirstChildComponentByTypeName("ComponentA", true) 
    end
    

end