본문 바로가기
Programming/Godot

Godot 엔진 시작하기 - 스크립팅

by Wilkyway 2022. 1. 12.
반응형

스크립팅 언어

 

사용 가능한 스크립팅 언어

Godot는 GDNative 기술을 통해 GDScript, C#, VisualScript, C++ 의 4가지 게임플레이 프로그래밍 언어를 공식적으로 제공합니다 . 커뮤니티에서 지원하는 언어로 Python, Lua, Rust 등도 있습니다.

단일 프로젝트에서 여러 언어를 사용할 수 있습니다. 예를 들어 팀에서 GDScript로 게임 플레이 로직을 코딩할 수 있습니다. 작성 속도가 빠르기 때문에 레벨 디자이너가 그래픽 언어 VisualScript로 퀘스트를 스크립팅하도록 하고, C# 또는 C++를 사용하여 복잡한 알고리즘을 구현하고 성능을 극대화할 수 있습니다. 또는 GDScript 또는 C#으로 모든 것을 작성할 수 있습니다. 

어떤 언어를 사용해야 하는가?

GDScript  시작하는 것을 추천합니다. 이 언어는 Godot와 게임 개발자의 요구를 위해 특별히 만들었습니다. 가볍고 간단한 구문을 가지고 있으며 Godot와 가장 긴밀하게 통합됩니다.

C#의 경우 VSCode 또는 Visual Studio 와 같은 외부 코드 편집기가 필요합니다 . C# 지원이 이제 완성되었지만 GDScript에 비해 학습 리소스가 더 적습니다. 그렇기 때문에 이미 C# 언어에 대한 경험이 있는 사용자에게 주로 C#을 권장합니다.

각 언어의 특징과 장단점을 살펴보겠습니다.

GD스크립트

GDScript  Godot를 위해 구축된 객체 지향  명령형 프로그래밍 언어입니다. 게임 개발자가 게임을 코딩하는 시간을 절약할 수 있도록 제작되었습니다. 기능은 다음과 같습니다.

  • 간단한 구문.
  • 빠른 컴파일 및 로딩 시간.
  • 노드, 신호 및 연결된 장면의 추가 정보 등에 대한 코드 자동완성기능(인텔리센스) 및 긴밀한 편집기 통합.
  • 벡터 및 변환 유형이 내장되어 있어 게임의 필수 요소인 선형 대수를 사용시 효율적.
  • 정적 타입지정이 가능하여 효율적으로 다중 스레드를 지원. (Lua나 Python에서 지원하기 어려움)
  • 가비지 수집 기능 없음. 엔진은 대부분의 경우 기본적으로 Reference를 계산하고 메모리를 관리하지만 필요한 경우 메모리를 제어할 수도 있음.
  • 변수는 기본적으로 동적 유형이 있지만 강력한 유형 검사를 위해 Type Hint를 사용할 수도 있음.

GDScript는 들여쓰기를 사용하여 코드 블록을 구성할 때 Python처럼 보이지만 실제로는 같은 방식으로 작동하지 않습니다. Squirrel, Lua 및 Python을 포함한 여러 언어에서 영감을 받았습니다.

[참고]

Python이나 Lua를 직접 사용하지 않는 이유.

Godot 초기에는 Python을 사용한 다음 Lua를 사용했습니다. 두 언어의 통합에는 많은 작업이 필요했고 심각한 제한이 있었습니다. 예를 들어, 스레딩 지원은 Python에서 쉽지 않았습니다. 전용 언어를 개발하는 데 더 많은 작업이 필요하지 않으며 게임 개발자의 요구에 맞게 조정할 수 있습니다. 현재 타사 언어로는 제공하기 어려웠던 성능 최적화 및 기능을 개발하고 있습니다.

.NET / C#

Microsoft의 C# 은 게임 개발자들이 가장 좋아하는 언어로, 마이크로소프트 지원 아래 공식적으로 지원하게 되었습니다. C#은 수많은 라이브러리가 작성된 성숙하고 유연한 언어입니다. 

C#에서 스크립팅하려면 Godot Mono 버전을 사용해야 합니다. Godot 웹사이트의 다운로드 페이지에서 다운로드 할 수 있습니다. Godot는 Mono .NET 런타임을 사용하기 때문에 이론적으로 Godot의 모든 타사 .NET 라이브러리 또는 프레임워크는 물론 F#, Boo 또는 ClojureCLR과 같은 공용 언어 인프라 호환 프로그래밍 언어를 사용할 수 있습니다. 그러나 공식적으로는 C#이 유일한 .NET 지원 언어입니다.

[참고]

GDScript 코드 자체는 컴파일된 C# 또는 C++만큼 빠르게 실행되지 않습니다. 그러나 대부분의 스크립트 코드는 엔진 내부의 C++ 코드에서 빠른 알고리즘으로 작성된 함수를 호출합니다. 많은 경우 GDScript, C# 또는 C++로 게임 플레이 로직을 작성하는 것은 성능에 큰 영향을 미치지 않습니다.

비주얼스크립트(VisualScript)

비주얼 스크립팅 은 블록을 연결하는 그래프 기반의 비주얼 프로그래밍 언어입니다. 게임 디자이너와 아티스트와 같은 프로그래머가 아닌 사람들에게 유용한 도구가 될 수 있습니다.

다른 언어를 사용하여 게임에 특정한 맞춤형 블록을 생성할 수 있습니다. 예를 들어 AI, 퀘스트 또는 대화를 스크립팅합니다. 

완전한 게임을 코딩하는 데 필요한 모든 기본 빌딩 블록을 제공하지만 VisualScript를 이런 방식으로 사용하지 않는 것이 좋습니다. 그것으로 모든 것을 프로그래밍하는 것은 다른 프로그래밍 언어를 사용하는 것에 비해 오히려 느립니다. 자세한 내용은 VisualScript 시작하기 를 참조하십시오 .

 

GDNative를 통한 C 및 C++

마지막으로, GDNative를 이용한 C++ 스크립팅은 Godot를 재컴파일(또는 다시 시작)할 필요가 없습니다.

 

모든 C++ 버전을 사용할 수 있으며 내부 C API Bridge 사용 덕분에, 생성된 공유 라이브러리에 대해 컴파일러 브랜드와 버전을 혼합하는 것이 완벽하게 작동합니다.

이 언어는 성능을 위한 최선의 선택이며 다른 부분은 GDScript 또는 Visual Script로 작성할 수 있으므로 전체 게임에서 사용할 필요는 없습니다. GDNative 인터페이스를 통해 더 많은 언어를 사용할 수 있지만, 공식적으로 지원되는 언어는 C++입니다.

 

씬 스크립팅

아래 부분에서는 버튼과 레이블로 구성된 GUI 씬을 제작합니다. 여기서 버튼을 누르면 레이블이 업데이트됩니다. 

  • 스크립트를 작성하고 노드에 연결합니다.
  • 신호를 통해 UI 요소 연결.
  • 장면의 다른 노드에 액세스할 수 있는 스크립트 작성.

[GDScript 참조문서]

씬 설정

새 프로젝트를 만들어 시작하겠습니다. 씬 탭에서 "Add Child Node"(또는Ctrl + A)를 눌러 아래와 같이 노드를 추가합니다.

  • Panel
    • Label
    • Button

 

2D 편집기에서는 아래의 이미지와 같이 보이도록 크기 및 위치를 조정하고, Inspector 탭에서 텍스트를 작성합니다.

마지막으로 씬 이름을 sayhello.tscn로 하여 저장합니다.

스크립트 추가

패널 노드를 마우스 오른쪽 버튼으로 클릭한 다음 상황에 맞는 메뉴에서 "스크립트 첨부"를 선택합니다.

스크립트 생성 대화 상자가 나타납니다. 이 대화 상자에서는 스크립트의 언어, 클래스 이름 및 기타 관련 옵션을 설정할 수 있습니다.

GDScript에서 파일 자체는 클래스를 나타내므로 클래스 이름 필드는 편집할 수 없습니다.

스크립트를 연결할 노드는 패널이므로 상속 필드는 자동으로 "패널"로 채워집니다. 즉, 우리는 패널노드의 기능을 확장한다는 의미입니다.

마지막으로 스크립트의 경로 이름을 입력하고 Create 버튼을 선택합니다.

그러면 스크립트가 생성되어 노드에 추가됩니다. 이것은 씬탭의 노드 옆에 있는 "스크립트 열기" 아이콘과 Inspector 아래의 스크립트 속성에서 확인할 수 있습니다.

스크립트를 편집하려면 위 이미지에서 강조 표시된 두 버튼 중 하나를 선택합니다. 그러면 기본 템플릿이 포함된 스크립트 편집기로 이동합니다.

_ready() 함수는 노드와 모든 자식이 활성 장면에 들어갈 때 호출됩니다. 단, _ready() 생성자가 아닙니다. 생성자는 _init()입니다.

스크립트의 역할

스크립트는 노드에 동작을 추가합니다. 노드가 작동하는 방식과 다른 노드(자식, 부모, 형제 등)와의 상호 작용을 제어하는 ​​데 사용됩니다. 스크립트는 해당 노드에서 제공하는 기능을 상속합니다.

Signal 처리

Signal은 특정 종류의 액션이 발생할 때 "Emit(방출)"되며 모든 스크립트 인스턴스의 모든 기능에 연결될 수 있습니다. Signal은 다른 노드에도 있지만 대부분 GUI 노드에서 사용되며 자신의 스크립트에서 사용자 정의 Signal을 정의할 수도 있습니다.

이 단계에서는 "pressed" Signal을 사용자 정의 함수에 연결합니다. 첫번째는 Signal 생성이고, 두번째는 연결 함수 정의입니다. 첫 번째 부분에서 Godot는 연결을 생성하는 두 가지 방법을 제공합니다: 편집기가 제공하는 시각적 인터페이스를 이용하거나 코드를 이용하는 것입니다.

우선 편집기의 인터페이스를 사용하는 방법을 알아보겠습니다.

장면 트리에서 버튼 노드를 선택한 다음 "노드" 탭을 선택합니다. 다음으로 "신호"가 선택되어 있는지 확인하십시오.

그런 다음 "BaseButton" 아래에서 "pressed()"를 선택하고 오른쪽 하단의 "연결..." 버튼을 클릭하면 연결 생성 대화 상자가 열립니다.

대화 상자의 상단에는 방출 노드의 이름이 파란색으로 강조 표시된 상태로 해당 씬의 노드 목록이 표시됩니다. 여기에서 "Panel" 노드를 선택합니다. Panel 노드의 스크립트에 해당 함수를 추가하는 것입니다.

대화 상자의 맨 아래에는 생성될 메서드의 이름이 표시됩니다. 기본적으로 메서드 이름은 _on_[EmitterNode]_[signal_name] 형식에 따라 생성됩니다.

 

다음으로 코드로 Signal을 연결하는 방법을 알아보겠습니다. 

Godot 프로그래머가 가장 많이 사용하는 Node.get_node() 함수를 소개합니다 . 이 함수는 경로를 사용하여 스크립트가 작성되는 노드를 기준으로 자식노드를 가져올 수 있습니다.

 

extends Panel 아래에 있는 모든 항목을 삭제 합니다. 나머지 스크립트는 수동으로 작성합니다.

스크립트가 첨부된 Panel노드 아래에서 Button과 Label은 형제노드이기 때문에 _ready() 함수 내부에 다음을 입력하여 Button을 가져올 수 있습니다.

func _ready():
    get_node("Button")

다음으로, 버튼을 눌렀을 때 호출될 함수를 작성합니다.

func _on_Button_pressed():
    get_node("Label").text = "HELLO!"

마지막으로 Object.connect()함수를 이용하여 "Pressed" Signal과 _on_Button_pressed()함수를 연결합니다.

func _ready():
    get_node("Button").connect("pressed", self, "_on_Button_pressed")

[최종 스크립트]

extends Panel

func _ready():
    get_node("Button").connect("pressed", self, "_on_Button_pressed")

func _on_Button_pressed():
    get_node("Label").text = "HELLO!"

씬을 실행하고 버튼을 누르면 아래 화면과 같이 나타납니다.

드디어 첫 스크립트를 완성하였습니다. 

[참고]

Button이 Label의 자식인 경우 이를 얻기 위한 코드는 다음과 같습니다.

# Not for this case,
# but just in case.
get_node("Label/Button")

또한 예제에서는 이름을 변경하지 않고 노드이름을 그대로 사용했지만, 실제로는 Label, Button등의 노드는 유형이 아니라 우리가 정의한 bullet, player등의 Name으로 참조된다는 점도 유의하시기 바랍니다.

반응형

댓글