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.
Checking the stable version of the documentation...
수동으로 씬 바꾸기
때로는 장면을 바꾸는 방법을 더 잘 제어하는 것이 도움이 됩니다. :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)
public Node simultaneousScene;
public MyClass()
{
simultaneousScene = ResourceLoader.Load<PackedScene>("res://levels/level2.tscn").Instantiate();
}
public void _AddASceneManually()
{
// This is like autoloading the scene, only
// it happens after already loading the main scene.
GetTree().Root.AddChild(simultaneousScene);
}
주기를 완료하고 새 씬을 기존 ZZZ로 교체하려면 선택할 수 있습니다. 뷰포트 보기에서 씬을 제거하기 위한 많은 전략이 있습니다. 트레이드오프에는 작업 속도와 메모리 소비의 균형은 물론 데이터 액세스와 무결성의 균형도 포함됩니다.
기존 씬을 삭제합니다. 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는 새로운 씬의 콘텐츠를 작업하는 데 사용할 수 있습니다.
단점: 노드' 처리 및 입력 처리가 더 이상 작동하지 않습니다. 업데이트된 데이터를 사용할 필요가 없다면 문제가 되지 않습니다.
기존 씬을 숨깁니다. 노드의 가시성 또는 충돌 감지를 변경하면 플레이어의 관점에서 전체 노드 하위 트리를 숨길 수 있습니다. 씬을 숨기려면 :ref:`CanvasItem.hide() <class_CanvasItem_method_hide>`를 사용하고 다시 표시하려면 :ref:`CanvasItem.show() <class_CanvasItem_method_show>`를 사용하세요.
기억은 아직 존재합니다.
장점: 필요한 경우 계속 데이터에 액세스할 수 있습니다.
장점: 데이터를 절약하기 위해 더 이상 노드를 이동할 필요가 없습니다.
단점: 더 많은 데이터가 메모리에 보관되고 있으며 이는 웹이나 모바일과 같이 메모리에 민감한 플랫폼에서 문제가 될 것입니다.
프로세싱(Processing)
장점: 데이터는 계속해서 처리 업데이트를 수신하므로 씬는 업데이트된 델타 시간 또는 프레임 데이터에 의존하는 모든 데이터를 유지합니다.
장점: 노드는 여전히 그룹의 구성원입니다(그룹은 :ref:`SceneTree <class_SceneTree>`에 속하므로).
단점: 이제 CPU의 관심이 두 장면으로 나누어집니다. 로드가 너무 많으면 프레임 속도가 낮아질 수 있습니다. 대상 플랫폼이 이 접근 방식의 로드를 지원할 수 있는지 확인하려면 성능을 테스트해야 합니다.
기존 씬을 트리에서 제거합니다. 기존 씬의 루트 노드에 변수를 할당합니다. 그런 다음 :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)
GetTree().Root.AddChild(scene);
또 다른 경우는 :ref:`SubViewportContainers <class_SubViewportContainer>`를 사용하여 여러 장면을 동시에 표시하는 것일 수 있습니다. 이는 화면의 다양한 부분(예: 미니맵, 분할 화면 멀티플레이어)에서 다양한 콘텐츠를 렌더링하는 데 적합합니다.
각 옵션에는 가장 적합한 사례가 있으므로 각 접근 방식의 효과를 검토하고 고유한 상황에 가장 적합한 경로를 결정해야 합니다.