SceneTree(씬트리)

소개

In previous tutorials, everything revolved around the concept of nodes. Scenes are collections of nodes. They become active once they enter the scene tree.

MainLoop(메인루프)

Godot가 내부적으로 작동되는 과정은 다음과 같습니다. OS 클래스는 처음에 실행되는 유일한 인스턴스 입니다. 그 이후에, 모든 드라이버, 서버, 스크립트 언어, 씬 시스템 등을 불러옵니다.

초기화를 마칠 때, OS 를 실행하기 위해 MainLoop 가 공급되어야 합니다. 여기까지, 이 모든 것이 내부 작업입니다 (어떻게 내부 작업이 이루어지는지 관심이 있으시다면, 소스 코드의 main/main.cpp 파일에서 이를 확인하실 수 있습니다).

사용자 프로그램, 게임은 MainLoop에서 시작합니다. 이 클래스는 몇 가지 메소드를 갖고 있는데, 초기화, 휴식(Idle)(프레임 동기화된 콜백), 고정된(fixed)(물리 동기화된 콜백), 그리고 입력입니다. 이것은 로우 레벨이며, Godot에서 게임을 만들 때 당신만의 MainLoop를 만드는 일은 드뭅니다.

SceneTree(씬트리)

Godot가 어떻게 작동하는지 설명하는 방법으로 이것은 로우 레벨 미들웨어에 비해 높은 수준의 게임 엔진이란 것입니다.

씬 시스템은 게임 엔진입니다, 반면에 OS 와 서버는 로우 레벨 API입니다.

The scene system provides its own main loop to OS, SceneTree. This is automatically instanced and set when running a scene, no need to do any extra work.

이 클래스가 몇 가지 중요한 용도에 쓰이기 때문에 존재하는 것을 알아야 합니다:

  • 처음 열렸을 때 씬 트리 의 일부분이 되도록 씬이 자식으로 추가되는, 루트 Viewport 를 포함합니다, (자세한 설명은 다음에)
  • 그룹에 관한 정보를 포함하고 그룹의 모든 노드를 호출하거나 그룹의 목록을 가져옵니다.
  • 일시 정지 모드 설정이나 프로세스 종료하기와 같은, 일부 전역 상태 기능성을 포함합니다.

When a node is part of the Scene Tree, the SceneTree singleton can be obtained by calling Node.get_tree().

루트 뷰포트(Root viewport)

루트 Viewport 는 항상 씬의 맨 위에 있습니다. 노드에서, 두 가지 다른 방법으로 포함할 수 있습니다:

get_tree().get_root() # Access via scene main loop.
get_node("/root") # Access via absolute path.
GetTree().GetRoot(); // Access via scene main loop.
GetNode("/root"); // Access via absolute path.

This node contains the main viewport. Anything that is a child of a Viewport is drawn inside of it by default, so it makes sense that the top of all nodes is always a node of this type otherwise nothing would be seen.

반면에 다른 뷰포트는 씬에서 만들 수 있지만(분리 화면 효과와 같은 것을 위해), 사용자가 절대 만들 수 없는 유일한 것입니다. 씬 트리에서 자동으로 생성됩니다.

씬 트리

노드가 뷰포트에 연결될 때, 직접적이든 아니든, 그것은 씬 트리 의 일부분이 됩니다.

이전 튜토리얼에서 설명했듯이, 그것은 (_exit_tree()과 마찬가지로) _enter_tree()와 _ready() 콜백을 가질 것입니다.

../../_images/activescene.png

When nodes enter the Scene Tree, they become active. They get access to everything they need to process, get input, display 2D and 3D visuals, receive and send notifications, play sounds, etc. When they are removed from the scene tree, they lose these abilities.

트리 순서

Most node operations in Godot, such as drawing 2D, processing, or getting notifications are done in tree order. This means that parents and siblings with a lower rank in the tree order will get notified before the current node.

../../_images/toptobottom.png

씬 트리 에 들어가서 "활성화하기"

  1. 씬은 디스크에서 불러오거나 스크립트에 의해 만들어집니다.
  2. 씬의 루트 노드 (단 하나의 루트, 기억하시나요?) 는 "루트" 뷰포트의 자식으로, 혹은 노드의 자식으로 (씬 트리에서) 추가됩니다.
  3. 새롭게 추가되는 씬의 각 노드는, 위에서 아래 순으로 "enter_tree" 알림을 (GDScript에서 _enter_tree() 콜백을) 받습니다.
  4. 추가 알림으로, 노드와 모든 자식이 활성화된 씬 안에 있을 때, "ready"가 (GDScript에서는 _ready() 콜백이) 편의로 제공됩니다.
  5. 씬(이나 일부분)이 제거될 때, 그들은 아래에서 위 순으로 "exit scene" 알림을 (GDScript에서는 _exit_tree() 콜백을) 받습니다

현재 씬 변경하기

씬이 불러온 후, 그것을 다른 씬으로 바꾸고 싶을 수 있습니다. 간단한 방법으로 SceneTree.change_scene() 함수를 사용하는 것입니다:

func _my_level_was_completed():
    get_tree().change_scene("res://levels/level2.tscn")
public void _MyLevelWasCompleted()
{
    GetTree().ChangeScene("res://levels/level2.tscn");
}

파일의 경로를 사용하기보다는, SceneTree.change_scene_to(PackedScene scene) 함수를 사용하여 이미 만들어져 있는 PackedScene 리소스를 사용합니다:

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

func _my_level_was_completed():
    get_tree().change_scene_to(next_scene)
public void _MyLevelWasCompleted()
{
    var nextScene = (PackedScene)ResourceLoader.Load("res://levels/level2.tscn");
    GetTree().ChangeSceneTo(nextScene);
}

These are quick and useful ways to switch scenes but have the drawback that the game will stall until the new scene is loaded and running. At some point in the development of your game, it may be preferable to create proper loading screens with progress bar, animated indicators or thread (background) loading. This must be done manually using autoloads (see next chapter) and Background loading.