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:`뷰포트 <class_Viewport>`의 자식 노드는 생성된 이미지로 렌더링됩니다. 이는 "현재" 씬 외부의 노드에도 적용됩니다. 자동 로드는 이 범주에 속하며 런타임 시 인스턴스화하고 트리에 추가하는 장면도 포함됩니다.

var simultaneous_scene = preload("res://levels/level2.tscn").instantiate()

func _add_a_scene_manually():
    # This is like autoloading the scene, only
    # it happens after already loading the main scene.
    get_tree().root.add_child(simultaneous_scene)

주기를 완료하고 새 씬을 기존 ZZZ로 교체하려면 선택할 수 있습니다. 뷰포트 보기에서 씬을 제거하기 위한 많은 전략이 있습니다. 트레이드오프에는 작업 속도와 메모리 소비의 균형은 물론 데이터 액세스와 무결성의 균형도 포함됩니다.

  1. 기존 씬을 삭제합니다. SceneTree.change_scene_to_file() 및 :ref:`SceneTree.change_scene_to_packed() <class_SceneTree_method_change_scene_to_packed>`는 현재를 삭제합니다. 즉시 씬. 기본 씬을 삭제할 수도 있습니다. 루트 노드의 이름이 "Main"이라고 가정하면 ``get_node("/root/Main").free()``를 수행하여 전체 씬을 삭제할 수 있습니다.

    • 메모리를 언로드합니다.

      • 장점: RAM이 더 이상 무게를 끌지 않습니다.

      • 단점: 씬로 돌아가는 것은 메모리에 다시 로드해야 하기 때문에 이제 비용이 더 많이 듭니다(시간과 메모리가 소요됨). 곧 돌아올 필요가 없다면 문제가 되지 않습니다.

      • 단점: 더 이상 해당 씬의 데이터에 액세스할 수 없습니다. 해당 데이터를 곧 사용할 필요가 없어도 문제가 되지 않습니다.

      • 참고: 하나 이상의 노드를 다른 씬에 다시 연결하거나 :ref:`SceneTree <class_SceneTree>`에 직접 연결하여 곧 삭제될 씬의 데이터를 보존하는 것이 유용할 수 있습니다.

    • 프로세싱(Processing)

      • 장점: 노드가 없다는 것은 처리, 물리 처리 또는 입력 처리가 없음을 의미합니다. CPU는 새로운 씬의 콘텐츠를 작업하는 데 사용할 수 있습니다.

      • 단점: 노드' 처리 및 입력 처리가 더 이상 작동하지 않습니다. 업데이트된 데이터를 사용할 필요가 없다면 문제가 되지 않습니다.

  2. 기존 씬을 숨깁니다. 노드의 가시성 또는 충돌 감지를 변경하면 플레이어의 관점에서 전체 노드 하위 트리를 숨길 수 있습니다. 씬을 숨기려면 :ref:`CanvasItem.hide() <class_CanvasItem_method_hide>`를 사용하고 다시 표시하려면 :ref:`CanvasItem.show() <class_CanvasItem_method_show>`를 사용하세요.

    • 기억은 아직 존재합니다.

      • 장점: 필요한 경우 계속 데이터에 액세스할 수 있습니다.

      • 장점: 데이터를 절약하기 위해 더 이상 노드를 이동할 필요가 없습니다.

      • 단점: 더 많은 데이터가 메모리에 보관되고 있으며 이는 웹이나 모바일과 같이 메모리에 민감한 플랫폼에서 문제가 될 것입니다.

    • 프로세싱(Processing)

      • 장점: 데이터는 계속해서 처리 업데이트를 수신하므로 씬는 업데이트된 델타 시간 또는 프레임 데이터에 의존하는 모든 데이터를 유지합니다.

      • 장점: 노드는 여전히 그룹의 구성원입니다(그룹은 :ref:`SceneTree <class_SceneTree>`에 속하므로).

      • 단점: 이제 CPU의 관심이 두 장면으로 나누어집니다. 로드가 너무 많으면 프레임 속도가 낮아질 수 있습니다. 대상 플랫폼이 이 접근 방식의 로드를 지원할 수 있는지 확인하려면 성능을 테스트해야 합니다.

  3. 기존 씬을 트리에서 제거합니다. 기존 씬의 루트 노드에 변수를 할당합니다. 그런 다음 :ref:`노드.remove_child(노드) <class_Node_method_remove_child>`를 사용하여 전체 씬을 트리에서 분리합니다. 나중에 연결하려면 :ref:`노드.add_child(노드) <class_Node_method_add_child>`를 사용하세요.

    • 메모리는 여전히 존재합니다(보기에서 숨기는 것과 비슷한 장단점).

    • 처리가 중지됩니다(완전히 삭제하는 것과 비슷한 장단점).

    • 장점: 이러한 "숨기기" 변형은 표시/숨기기가 훨씬 쉽습니다. 씬에 대한 여러 변경 사항을 잠재적으로 추적하는 대신 add/remove_child 메소드만 호출하면 됩니다. 이는 다른 엔진에서 게임 개체를 비활성화하는 것과 유사합니다.

    • 단점: 보기에서만 숨기는 것과는 달리, 씬 내에 포함된 데이터가 SceneTree 액세스에서 파생된 델타 시간, 입력, 그룹 또는 기타 데이터에 의존하는 경우 오래된 데이터가 됩니다.

런타임에 자신만의 싱글톤를 추가하거나 씬 변경 사이에 씬의 데이터를 보존하는 등(씬을 루트 노드에 추가) 동시에 많은 장면을 표시하려는 경우도 있습니다.

get_tree().root.add_child(scene)

또 다른 경우는 :ref:`SubViewportContainers <class_SubViewportContainer>`를 사용하여 여러 장면을 동시에 표시하는 것일 수 있습니다. 이는 화면의 다양한 부분(예: 미니맵, 분할 화면 멀티플레이어)에서 다양한 콘텐츠를 렌더링하는 데 적합합니다.

각 옵션에는 가장 적합한 사례가 있으므로 각 접근 방식의 효과를 검토하고 고유한 상황에 가장 적합한 경로를 결정해야 합니다.