Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

컨테이너 사용하기

:ref:`Anchors <doc_size_and_anchors>`는 GUI에서 기본 다중 해상도 처리를 위해 다양한 종횡비를 처리하는 효율적인 방법입니다.

더 복잡한 사용자 인터페이스의 경우 사용하기 어려울 수 있습니다.

이는 RPG, 온라인 채팅, 타이쿤 또는 시뮬레이션과 같은 게임의 경우인 경우가 많습니다. 더 고급 레이아웃 기능이 필요할 수 있는 또 다른 일반적인 경우는 게임 내 도구(또는 단순히 도구)입니다.

이러한 모든 상황에는 고급 레이아웃과 형식을 갖춘 더욱 유능한 OS와 유사한 사용자 인터페이스가 필요합니다. 이를 위해서는 :ref:`Containers <class_container>`가 더 유용합니다.

컨테이너 레이아웃

컨테이너는 엄청난 양의 레이아웃 기능을 제공합니다(예를 들어 Godot 편집기 사용자 인터페이스는 완전히 컨테이너를 사용하여 수행됩니다):

../../_images/godot_containers.png

Container 파생 노드를 사용하면 모든 자식 노드 Control 노드가 자체 위치 지정 능력을 포기합니다. 이는 *컨테이너*가 해당 위치를 제어하고 이러한 노드를 수동으로 변경하려는 모든 시도가 다음에 해당 상위 항목의 크기가 조정될 때 무시되거나 무효화됨을 의미합니다.

마찬가지로 컨테이너 파생 노드의 크기가 조정되면 모든 자식 노드가 이에 따라 재배치되며 사용된 컨테이너 유형에 따라 동작합니다.

../../_images/container_example.gif

자식 노드 버튼 크기를 조정하는 *HBoxContainer*의 예입니다.

컨테이너의 진정한 장점은 중첩될 수 있어(노드로) 쉽게 크기를 조정할 수 있는 매우 복잡한 레이아웃을 생성할 수 있다는 것입니다.

플러그인에 대해서

컨테이너에 노드를 추가할 때 컨테이너가 각 하위 항목을 처리하는 방식은 주로 *컨테이너 크기 조정 옵션*에 따라 달라집니다. 이러한 옵션은 *컨테이너*의 하위 항목인 *컨트롤*의 레이아웃을 검사하여 찾을 수 있습니다.

../../_images/container_sizing_options.webp

크기 조정 옵션은 수직 및 수평 크기 조정에 독립적이며 모든 컨테이너가 이를 사용하는 것은 아니지만 대부분은 사용합니다.

  • Fill: Ensures the control fills the designated area within the container. 컨트롤이 *확장*되는지 여부에 관계없이(아래 참조) 이 기능이 켜져 있으면 지정된 영역만 *채워*집니다(기본값).

  • 확장: 상위 컨테이너(각 축)에서 최대한 많은 공간을 사용하려고 시도합니다. 확장되지 않는 컨트롤은 확장되는 컨트롤에 의해 밀려나게 됩니다. 확장 컨트롤 사이에서 서로 차지하는 공간의 양은 *늘이기 비율*(아래 참조)에 따라 결정됩니다. 이 옵션은 상위 컨테이너가 올바른 유형일 때만 사용할 수 있습니다. 예를 들어 *HBoxContainer*에는 가로 크기 조정을 위한 이 옵션이 있습니다.

  • 시작점에서 수축 확장할 때는 확장된 영역의 왼쪽이나 위에서 머무르도록 합니다.

  • 중앙에서 수축 확장할 때는 확장된 영역의 가운데에서 머무르도록 합니다.

  • 끝점에서 수축 확장할 때는 확장된 영역의 오른쪽이나 아래에서 머무르도록 합니다.

  • 늘이기 비율: 확장된 컨트롤이 서로 사용 가능한 공간을 차지하는 비율입니다. "2" 컨트롤은 "1" 컨트롤보다 두 배의 사용 가능한 공간을 차지합니다.

작동 방식을 더 잘 이해하려면 이러한 플래그와 다양한 컨테이너를 실험해 보는 것이 좋습니다.

컨테이너 내장 타입

Godot는 다양한 용도로 사용되는 여러 가지 컨테이너 유형을 즉시 제공합니다:

박스컨테이너

하위 컨트롤을 수직 또는 수평으로 정렬합니다(HBoxContainer 및 :ref:`VBoxContainer <class_VBoxContainer>`를 통해). 지정된 방향의 반대 방향(수평 컨테이너의 경우 수직)에서는 자식 노드만 확장됩니다.

../../_images/containers_box.png

이러한 컨테이너는 Expand 플래그가 설정된 자식 노드의 Stretch Ratio 속성을 활용합니다.

그리드 컨테이너

:ref:`GridContainer <class_GridContainer>`를 통해 하위 컨트롤을 그리드 레이아웃으로 정렬합니다. 열의 양을 지정해야 합니다. 수직 및 수평 확장 플래그를 모두 사용합니다.

../../_images/containers_grid.png

마진 컨테이너

하위 컨트롤은 이 컨트롤의 경계를 향해 확장됩니다(:ref:`MarginContainer <class_MarginContainer>`를 통해). 테마 구성에 따라 여백에 패딩이 추가됩니다.

../../_images/containers_margin.png

여백은 테마 값이므로 각 컨트롤의 상수 재정의 섹션에서 편집해야 합니다.

../../_images/containers_margin_constants.png

탭 컨테이너

:ref:`TabContainer <class_TabContainer>`를 통해 여러 개의 하위 컨트롤을 서로 겹쳐서 배치할 수 있으며 현재 컨트롤만 표시됩니다.

../../_images/containers_tab.png

현재 항목 변경은 다음을 클릭하여 컨테이너 상단에 있는 탭을 통해 수행됩니다.

../../_images/containers_tab_click.gif

제목은 기본적으로 노드 이름에서 생성됩니다(단, TabContainer API를 통해 재정의할 수 있음).

탭 배치 및 StyleBox*와 같은 설정은 *TabContainer 테마 재정의에서 수정할 수 있습니다.

분할 컨테이너

Arranges child controls vertically or horizontally and creates grabbers between them (via HSplitContainer and VSplitContainer). Respects both horizontal and vertical expand flags, as well as Stretch Ratio.

../../_images/containers_split.png

The grabbers can be dragged around to change the size relation between the children:

../../_images/containers_split_drag.gif

패널컨테이너

StyleBox*를 그린 다음 자식 노드를 확장하여 전체 영역을 덮는 컨테이너입니다(*StyleBox 여백을 고려하여 :ref:`PanelContainer <class_PanelContainer>`를 통해). 가로 및 세로 크기 조정 옵션을 모두 준수합니다.

../../_images/containers_panel.png

이 컨테이너는 최상위 컨트롤로 유용하거나 레이아웃 섹션에 사용자 정의 배경을 추가하는 데 유용합니다.

뷰포트

:ref:`FoldableContainer <class_FoldableContainer>`를 통해 확장/축소할 수 있는 컨테이너입니다. 하위 컨트롤은 축소되면 숨겨집니다.

스크롤컨테이너

단일 자식 노드를 허용합니다. 자식 노드가 컨테이너보다 큰 경우 :ref:`ScrollContainer <class_ScrollContainer>`를 통해 노드를 패닝할 수 있도록 스크롤 막대가 추가됩니다. Both vertical and horizontal size options are respected, and the behavior can be turned on or off per axis in the properties.

../../_images/containers_scroll.png

마우스 휠과 터치 드래그(터치가 가능한 경우)도 하위 컨트롤을 이동하는 유효한 방법입니다.

../../_images/containers_center_pan.gif

위의 예에서와 같이 이 컨테이너를 사용하는 가장 일반적인 방법 중 하나는 *VBoxContainer*를 하위 항목으로 함께 사용하는 것입니다.

뷰포트

컨테이너 크기가 조정될 때 자동으로 비율을 유지하는 방식으로 하위 컨트롤을 정렬하는 컨테이너 유형입니다. (:ref:`AspectRatioContainer <class_AspectRatioContainer>`을 통해). 여기에는 "채우기", "너비 컨트롤 높이", "높이 컨트롤 너비" 및 "덮개" 등 컨테이너와 관련된 하위 컨트롤의 크기를 조정하기 위한 옵션을 제공하는 여러 가지 늘이기 모드가 있습니다.

../../_images/containers_aspectratio.webp

이는 동적이고 다양한 화면 크기에 반응해야 하는 컨테이너가 있고 의도한 모양을 잃지 않고 하위 요소의 크기를 비례적으로 조정하려는 경우에 유용합니다.

../../_images/containers_aspectratio_drag.webp

뷰포트

FlowContainer는 하위 컨트롤을 가로 또는 세로로 정렬하는 컨테이너입니다(HFlowContainer 및 :ref:`VFlowContainer <class_VFlowContainer>`를 통해). 사용 가능한 공간이 부족해지면 책에서 텍스트가 줄바꿈되는 방식과 비슷하게 자식 노드를 다음 줄이나 열로 줄 바꿈합니다.

../../_images/containers_hflow.webp

하위 컨트롤이 겹치지 않고 사용 가능한 공간에 자동으로 조정되는 유연한 레이아웃을 만드는 데 유용합니다.

../../_images/containers_hflow_drag.webp

CenterContainer

CenterContainer는 모든 하위 컨트롤을 자동으로 최소 크기로 중앙에 유지하는 컨테이너입니다. 자식 컨트롤이 항상 중앙에 정렬되도록 보장하므로 수동 위치 지정 없이 중앙 레이아웃을 더 쉽게 만들 수 있습니다(:ref:`CenterContainer <class_CenterContainer>`를 통해).

../../_images/containers_center.webp ../../_images/containers_center_drag.webp

SubViewportContainer

이는 단일 뷰포트 노드만 하위 항목으로 허용하고 이를 이미지인 것처럼 표시하는 특수 컨트롤입니다(:ref:`SubViewportContainer <class_SubViewportContainer>`를 통해).

커스텀 컨테이너 만들기

스크립트를 사용하여 사용자 정의 컨테이너를 생성할 수 있습니다. 다음은 자식 노드를 해당 크기에 맞는 컨테이너의 예입니다.

extends Container

func _notification(what):
    if what == NOTIFICATION_SORT_CHILDREN:
        # Must re-sort the children
        for c in get_children():
            # Fit to own size
            fit_child_in_rect(c, Rect2(Vector2(), size))

func set_some_setting():
    # Some setting changed, ask for children re-sort.
    queue_sort()