노드 그리고 용어

계속 하기 전에, Node 용어 사용에 유의해야 합니다. Visual Script Nodes (또는 일반적으로 Nodes)를 볼 때 이 텍스트는 당신이 그래프의 일부인 선으로 연결한 작은 상자를 보여줄 것입니다. Scene Nodes를 볼 때, 씬이 보이도록 구성하는 요소로, 트리의 일부분임을 상징합니다. 그들의 이름은 비슷하지만 그들의 함수는 다릅니다. 여기에서 Node를 본다면, 달리 명시되지 않는 한 Visual Script Node가 보여지는 것을 상징할 것입니다.

../../../_images/visual_script16.png

노드 속성

대부분의 Visual scripting 구현과 마찬가지로, 각 노드에는 편집 가능한 속성이 있습니다. 하지만 godot에서는, 가독성을 높이기 위해 편집 가능한 제어 수단을 사용하여 노드가 팽창하는 것을 방지하려고 합니다.

노드는 여전히 필요한 정보를 텍스트로 표시하지만, 편집은 인스펙터를 통해 이루어집니다. 노드를 편집하려면, 아무 노드나 선택하고 인스펙터에서 해당 속성을 편집합니다.

포트 그리고 연결

Godot Visual Scripting에서 프로그래밍은 각 함수 안에서 노드포트 연결을 통해 이루어집니다.

포트(Ports)

Godot Visual Scripting의 노드는 포트를 가지고 있습니다. 노드의 왼쪽과 오른쪽에는 끝 점이 나타나고 거기서 연결(Connections)을 만들 수 있습니다: 두 가지 유형의 포트가 있습니다: 시퀀스(Sequence) 그리고 데이터(Data).

../../../_images/visual_script17.png

시퀀스 포트는 작업이 실행되는 순서를 나타냅니다. 일반적으로 노드가 처리를 완료하면, 오른쪽에 있는 포트 중 하나에서 다음 노드로 이동합니다. 연결된 것이 없으면 함수는 종료되거나, 다른 출력 시퀀스 포트가 작업될 수 있습니다 (노드마다 다름). 이 덕분에, 흰색 선을 따라 함수 내의 논리 흐름을 따라갈 수 있습니다. 모든 노드시퀀스 포트를 가지고 있지는 않습니다. 사실, 대부분이 없습니다.

데이터 포트(Data Ports) 포트는 타입 값을 포함합니다. 타입은 부울, 정수, 문자열, Vector3, 배열, 모든 객체 또는 씬 노드 등과 같은 일반 Godot 타입이 될 수 있습니다. 노드의 오른쪽에 있는 *데이터 포트*는 출력으로 간주되며, 한편 왼쪽의 포트는 입력입니다. 이들을 연결하면 정보를 다음 노드로 전달할 수 있습니다.

모든 데이터 포트 타입이 호환되거나 연결이 되는 것은 아닙니다. 각 타입마다 다르게 표현되어있는, 색상과 아이콘에 특히 주의를 기울이세요:

../../../_images/visual_script18.png

연결(Connections)

연결은 비교적 간단한 과정입니다. 출력 포트(Output Port)입력 포트(Input Port)로 드래그 합니다.

../../../_images/visual_script_connect.gif

연결 해제는 좀 더 연습이 필요합니다. 데이터 포트에서 연결 해제는 입력을 드래그 하는 것으로 이루어지는 반면, 시퀀스 포트의 경우 출력을 드래그 하는 것으로 이루어집니다.

../../../_images/visual_script_disconnect.gif

처음에는 이상하게 보일 수도 있습니다, 하지만 데이터 포트는 1:N (단일 출력 포트가 많은 입력에 연결될 수 있음)인 반면, 시퀀스 포트는 N:1 (많은 시퀀스 출력이 단일 입력에 연결될 수 있음)이기 때문입니다.

빈 공간에 연결하는 것 (드래그 하여 연결하고 빈 공간을 누르지 않은 경우) 또한 컨텍스트에 민감하여, 가장 흔한 작업 목록을 제공 합니다. 시퀀스의 경우에는 조건부 노드가 됩니다:

../../../_images/visual_script52.png

한편 데이터의 경우, 컨텍스트적 Set/Get/Call 메뉴가 열립니다:

../../../_images/visual_script53.png

노드 추가하기

마침내! 재미있는 부분에 도착했습니다! 하지만 각 노드 타입이 하는 일에 대해 구체적으로 설명하기 전에, 어떻게 노드가 가장 일반적으로 추가되고 처리되는 지 짧게 한번 알아봅시다.

씬 노드 접근하기

흔한 작업들 중 하나로는 씬 트리 노드(Scene Tree Nodes)에 접근하는 것이 있습니다 (다시 한번 말하건데, Visual Script Nodes로 착각하지 마십시오). 씬 트리에서 캔버스로 드래그 하여 놓으면 이 노드에서 "메서드 호출(call a method)" (멤버 함수(member function)라고 하기도 함) 여부를 물어봅니다.

../../../_images/visual_script19.png

대부분의 경우 속성에 접근하는 것이 좋지만 (아래에 자세히 설명되어 있음), 때로는 메서드 호출도 유용할 수 있습니다. 메서드는 객체에서 특정 작업을 실행합니다. 위의 경우로는, 마우스 포인터는 컨트롤에 대한 지역 좌표의 위치로 비틀 수 있습니다. 또 다른 일반적인 사용 사례는 노드를 삭제하기 위해 대기하는 것으로, queue_free 메서드를 사용하여 이루어집니다.

../../../_images/visual_script20.png

편집 중인 씬들 중 한 노드가 Visual Script를 포함하고 있어야만 작동된다는 것에 주의하세요! 그렇지 않으면, 경고가 표시됩니다.

씬 노드 속성 접근하기

이것은 Visual Scripting에서 씬 노드를 편집하는 가장 일반적인 방법입니다. 씬 트리에서 씬 노드를 선택하고, 인스펙터로 가서, 편집하려는 속성의 이름을 찾고 (힌트, 값이 아닙니다!) 캔버스로 드래그 해옵니다:

../../../_images/visual_script21.png

결과적으로 이 값은 데이터 포트에 기록하여 스크립트에서 변경할 수 있습니다.

이 값을 가져오는 대신, Ctrl 키 (혹은 Mac에서 Command 키)를 누른 채로 드래그 합니다. Getter가 생성됩니다:

../../../_images/visual_script22.png

이 경우에, 데이터 포트에서 값을 읽을 수 있습니다.

변수(Variable)

변수는 값을 저장할 수 있는 스크립트의 지역 메모리 컨테이너입니다. 이 값은 스크립트의 모든 기능이나 이전 단계에서 설명한 방법을 통해 다른 스크립트에서 읽을 수 있습니다.

변수를 추가하려면, 멤버 패널의 변수 섹션에 있는 "+"버튼을 누릅니다. 새 변수를 더블 클릭하여 이름을 바꿉니다:

../../../_images/visual_script23.png

우클릭으로 변수의 속성을 구성할 수 있습니다:

../../../_images/visual_script24.png ../../../_images/visual_script25.png

위에서 볼 수 있듯이, 변수의 타입과 초기 값은 물론 일부 속성 힌트도 변경할 수 있습니다. "Export"옵션을 선택하면 노드를 선택할 때 인스펙터에 변수가 표시됩니다. 이 또한 이전 단계에서 설명한 방법으로 다른 스크립트에서도 사용할 수 있습니다.

../../../_images/visual_script28.png

스크립트에서 변수를 사용하려면, 간단히 캔버스로 드래그 하여 Getter를 생성합니다:

../../../_images/visual_script26.png

마찬가지로, Ctrl (혹은 Mac에서 Command)을 눌러서 Setter를 놓습니다:

../../../_images/visual_script27.png

시그널

스크립트에서 자신의 시그널을 만들어서 사용하는 것도 가능합니다. 이를 위해 시그널을 제외하고, 이전 단계의 변수에 작업한 것과 같은 절차를 진행해야 합니다:

../../../_images/visual_script29.png

우클릭 메뉴를 통해 시그널의 인수를 정의하도록 편집할 수 있습니다:

../../../_images/visual_script30.png

생성된 시그널은 내장 노드 시그널과 함께 인스펙터에 나타납니다. 이를 통해 다른 씬 노드의 다른 스크립트에 시그널을 연결할 수 있습니다:

../../../_images/visual_script31.png

마침내, 시그널이 방출하도록, 간단히 캔버스로 드래그 합니다:

../../../_images/visual_script32.png

시그널이 방출한다는 것은 시퀀스 된 동작이므로, 반드시 시퀀스 포트로부터 와야 한다는 것을 잊지 마세요.

더 많은 노드 추가하기

이제 기초가 다듬어졌으니, 캔버스에 쓸 수 있는 많은 양의 유용한 노드에 대해 이야기해봅시다! 멤버 패널 아래에, 이용 가능한 노드 타입 목록이 존재합니다:

../../../_images/visual_script33.png

Ctrl-F (혹은 Mac에서 Command-F)로 목록을 검색할 수 있습니다.

어느 것들이든 씬으로 드래그 할 수 있습니다. 노드와 달리 (예를 들어 인스펙터에서 속성을 드래그 하는 것으로 자동으로 편집된 노드에 대한 컨텍스트를 설정하는 것), 그들은 어떤 "컨텍스트적" 정보 없이 추가됩니다, 따라서 작업을 수동으로 수행하여야 합니다.

../../../_images/visual_script34.png

노드들이 문서화 되어있기 때문에, 어떤 각각의 노드가 무엇을 하는지 알기 위해 클래스 레퍼런스를 확인할 수 있다는 것을 기억하세요. 즉, 노드 타입의 간단한 개요는 다음과 같습니다:

상수(Constant)

상수 노드는 값을 제공하고, 시간이 지나도 값이 변하지 않는 노드로서, 참조 값으로 유용합니다. 대부분 정수 또는 실수입니다.

../../../_images/visual_script36.png

첫 번째 것은 "Constant"로 상수 값이나 타입을 선택할 수 있습니다, 상수 (42)부터 문자열 ("Hello!")까지 말이죠. 기본적으로 이 노드는 데이터 포트의 기본 입력 값 때문에 자주 쓰이지는 않지만, 알아두면 좋습니다.

두 번째 것은 GlobalConstant 노드로, Godot에서 전역 타입을 위한 긴 상수 목록을 포함합니다. 여기서는 키 이름, 조이스틱이나 마우스 버튼 등을 나타내는 유용한 상수를 볼 수 있습니다.

세 번째 것은 MathConstant로, PI, E 등과 같은 전형적인 수학적 상수를 제공합니다.

데이터

데이터 노드는 정보에 대한 모든 종류의 접근를 처리합니다. Godot에서는 어떤 정보도 이 노드를 통해 접근되므로, 그들은 중요하게 쓰이는 것들 중 하나로서 꽤 다양합니다.

../../../_images/visual_script37.png

흥미를 가질만한 많은 타입의 노드가 있으므로, 그들을 설명하기 위한 간단한 시도가 따르겠습니다:

액션

액션 노드는 기기의 입력을 처리할 때 중요합니다. 액션에 대한 더 자세한 것은 (@TODO ACTION TUTE LINK)에서 볼 수 있습니다. 아래의 다음 예시는, "move_right" 액션이 눌렸을 때 컨트롤이 오른쪽으로 움직이는 것입니다.

../../../_images/visual_script38.png

엔진 싱글톤(Engine Singleton)

엔진 싱글톤은 전역 인터페이스입니다 (즉 씬 노드와 달리, 참조 없이 접근할 수 있고 항상 이용 가능합니다). 그들은 여러 목적을 지니지만, 대개 로우 레벨 접근이나 OS 관련 접근에 유용합니다.

../../../_images/visual_script39.png

연결을 빈 공간에 드래그 하는 것으로 함수나 Set/Get 속성을 불러오는 것(Call)을 기억하세요:

../../../_images/visual_script40.png

지역 변수(Local Variables)

이 노드는 그래프의 임시 저장소로 사용할 수 있는 노드입니다. 반드시 그들을 사용할 때 모두 같은 이름과 타입을 가져야 한다는 것을 명심하세요, 그러면 그들은 같은 메모리를 참조할 것입니다.

../../../_images/visual_script41.png

위에서 볼 수 있듯이, 두 개의 노드를 사용할 수 있습니다: 간단한 Getter, 그리고 시퀀스된 Getter (설정에 시퀀스 포트가 필요합니다).

씬 노드(Scene Node)

단순히 트리에서 노드의 참조이지만, 씬 트리에서 실제 노드를 캔버스로 드래그 하여 그 노드를 더 쉽게 사용할 수 있습니다 (노드가 만들어지고 구성될 것입니다).

셀프

드물긴 하지만, 씬 노드를 인수로 전달하고 싶을지도 모릅니다. 함수와 set/get 속성을 호출할 때, 혹은 이를 위해 씬 트리에서 캔버스로 노드를 드래그 할 때 (아니면 스크립트를 갖고 있는 노드에 이벤트를 줄 때) 사용될 수 있습니다.

SceneTree(씬트리)

이 노드는 활성화된 씬을 갖고 있는 SceneTree를 참조한다는 점에서 싱글톤 노드와 비슷하지만, 오직 노드가 씬에 있고 활성화된 상태이어야만 작동합니다, 그렇지 않고 접근하면 오류를 반환합니다.

SceneTree는 많은 로우 레벨 것들, 늘이기 설정, 그룹 호출, 타이머 만들기, 혹은 다른 씬 불러오기와 같은 것을 할 수 있습니다. 익숙해지기 좋은 클래스입니다.

Preload(미리 불러오기)

이것은 GDScript에서 preload()와 같은 함수입니다. 이 리소스가 불러와지고 사용할 준비인 상태를 유지합니다. 노드를 인스턴스 하는 대신, 더 쉽게 파일 시스템 독에서 원하는 리소스를 캔버스로 드래그 하면 됩니다.

리소스 경로

이 노드는 선택할 수 있는 리소스에 대한 경로를 문자열로 가질 수 있게 하는 도우미입니다. 함수에서 디스크에서 리소스를 불러올 떄 유용합니다.

주석(Comment)

주석 노드는 크기 조절을 할 수 있는 노드로 다른 노드 주변에 놓을 수 있습니다. 그것은 눈에 띄지 않고 선택할 때 최상단으로 올라가지 않습니다. 또한 글자를 쓸 때 사용할 수 있습니다.

../../../_images/visual_script42.png

Flow Control(흐름 제어)

Flow Control 노드는 다른 지점으로 데려가 실행할 수 있게 하며, 보통은 주어진 조건에 따라 다릅니다.

../../../_images/visual_script43.png

Condition(조건)

불 포트를 확인하는 간단한 노드입니다. 참이라면, "true" 시퀀스 포트를 통해 갑니다. 거짓이라면, 두 번째로 갑니다. 둘 중 하나로 간 후, "done" 포트를 통해 갑니다. 모든 시퀀스 포트를 사용하지 않는다면 연결을 끊어 두는 것이 좋습니다.

Iterator(반복자)

Godot에서 일부 데이터 타입 (즉, 배열, 딕셔너리)은 반복이 가능합니다. 이는 약간의 코드로도 가지고 있는 각 요소를 실행할 수 있다는 것을 뜻합니다.

Iterator 노드는 모든 요소를 거치면서, 그들 각각을 "each" 시퀀스 포트를 통해 갑니다, 그리고 "elem" 데이터 포트에서 요소를 사용할 수 있게 만듭니다.

끝나면, "exit" 시퀀스 포트를 통해 갑니다.

Return(반환)

일부 함수는 값을 반환할 수 있습니다. 일반적으로 가상의 경우, Godot는 Return 노드를 추가할 것입니다. Return 노드는 함수를 강제 종료합니다.

Sequence(시퀀스)

이 노드는 그래프를 조직하는 대부분에 유용합니다. 이것은 시퀀스 포트를 순서대로 호출합니다.

TypeCast(타입캐스트)

이것은 유용하며 일반적으로 사용되는 노드입니다. 인수나 다른 객체를 원하는 타입으로 캐스트할 때 이것을 사용할 수 있습니다. 나중에 객체 출력을 드래그 하여 완전 완료를 얻을 수 있습니다.

../../../_images/visual_script55.png

스크립트를 캐스트하는 것도 가능하여, 완전한 스크립트 속성과 함수를 갖게 합니다:

../../../_images/visual_script54.png

Switch(스위치)

Switch 노드는 Condition 노드와 비슷하지만, 많은 값을 동시에 맞춰봅니다.

While

반복의 더 원시적인 형태입니다. "repeat" 시퀀스 출력은 "cond" 데이터 포트가 충족되면 호출됩니다.

함수(Function)

함수는 단순한 도우미로 대부분은 결정론적 입니다. 몇 가지 인수를 입력으로 받아서 출력으로 반환합니다. 시퀀스는 거의 일어나지 않습니다.

Built-In(내장)

There is a list of built-in helpers. The list is almost identical to the one from GDScript. Most of them are mathematical functions, but others can be useful helpers. Make sure to take a look at the list at some point.

By Type(타입 별)

기본 타입에서 이용할 수 있는 메서드들 입니다. 예를 들어, 내적을 원한다면, Vector3 카테고리 대신 "dot"을 검색할 수 있습니다. 대부분의 경우는 노드 목록을 검색하는 것이 더 빠릅니다.

Call(호출)

일반적인 호출 노드입니다. 직접적으로 쓰이는 일은 거의 없고 이미 구성된 노드의 빈 공간으로 드래그 하여 사용됩니다.

Constructors(생성자)

Godot 기본 데이터 타입을 생성하는 데 필요한 모든 함수들 입니다. 예를 들어, 3개의 실수가 있는 Vector3를 생성한다면, Constructor가 사용되어야 합니다.

../../../_images/visual_script44.png

Destructor(분해자)

Constructor의 반대 성격으로, (Vector3와 같은) 기본 타입을 하위 원소로 분리합니다.

../../../_images/visual_script45.png

Emit Signal(시그널 방출)

객체로부터 시그널을 방출합니다. 일반적으로 유용하지는 않고, 시그널을 캔버스로 드래그 하는 것이 더 잘 작동합니다.

Get/Set

일반적인 Getter/Setter 노드. 인스펙터에서 속성을 드래그 하고 드롭하면 잘 구성되면 더 잘 작동합니다.

Wait(기다림)

Wait 노드는 무슨 일이 발생할 때 까지 함수의 실행을 중지합니다 (사실 다시 시작할 때까지 많은 프레임이 지나갈 수 있습니다). 기본 노드는 실행이 재개될 때까지 1 프레임, 혹은 고정된 프레임, 아니면 고정된 시간을 기다릴 수 있습니다.

Yield

이 노드는 스크립트의 실행을 완전히 중지하고, 함수가 실행을 재개하는 값을 반환하게 만듭니다.

Yield Signal(Yield 시그널)

Yield와 같지만, 주어진 시그널이 방출될 때까지 기다립니다.

Index(인덱스)

일반적인 인덱스 연산자로, 자주 쓰이진 않지만 있다는 것은 좋은 일입니다.

연산자(Operators)

대개 일반적인 연산자들로, 덧셈, 곱셈, 비교 등이 있습니다. 기본적으로 이들은 대부분 모든 데이터 타입을 받아들입니다 (그리고 연산자가 예측한 타입이 입력한 타입과 맞지 않으면 런타임 시 오류가 발생합니다). 항상 오류를 빠르게 잡고 그래프를 읽기 쉽게 하기 위해 연산자에 맞는 타입을 설정하기를 추천합니다.

../../../_images/visual_script46.png

Expression Node(표현식 노드)

연산자들 사이에서, Expression 노드는 가장 강력합니다. 잘만 쓴다면, 수학이나 논리로 무거워진 VisualScript를 엄청 간단하게 만들 수 있습니다. 표현식을 입력하면 실시간으로 실행됩니다.

Expression 노드는 가능합니다:

  • 커스텀 입력에 따라 수학 및 논리 표현식을 실행 (예: "a*5+b"에서, a와 b는 커스텀 입력입니다):
../../../_images/visual_script47.png
  • 지역 변수나 속성을 접근:
../../../_images/visual_script48.png
  • Vector3(x,y,z),Rect2(..) 등과 같은 Constructor나 sin(),cos(),print()와 같은 GDScript에서 사용할 수 있는 존재하는 내장 함수 대부분을 사용:
../../../_images/visual_script49.png
  • API 함수를 호출:
../../../_images/visual_script50.png
  • 처리 순서를 따르는 경우에 더 적합한 시퀀스 모드를 사용:
../../../_images/visual_script51.png