사용자:Senouis/고도3 도큐먼트/GDScript vs Python 3: 두 판 사이의 차이
< 사용자:Senouis | 고도3 도큐먼트
(생성) |
(초안, 작성 중) |
||
3번째 줄: | 3번째 줄: | ||
고도 엔진에서 사용하는 GDScript는 파이썬(Python) 3 프로그래밍 언어를 게임 제작 용도로 개조한 것이 아닐까 싶을 정도로 스크립트 문법이 매우 유사합니다. | 고도 엔진에서 사용하는 GDScript는 파이썬(Python) 3 프로그래밍 언어를 게임 제작 용도로 개조한 것이 아닐까 싶을 정도로 스크립트 문법이 매우 유사합니다. | ||
그러나 차이가 없는 것은 아니며, GDScript는 엄연히 독자 구현한 언어인 만큼 중요한 차이는 다음과 같습니다. | 그러나 차이가 없는 것은 아니며, [https://docs.python.org/ko/3.12/index.html 파이썬 3 문법]과 비교했을 때 GDScript는 엄연히 독자 구현한 언어인 만큼 중요한 차이는 다음과 같습니다. | ||
* 파이썬 3에서는 변수 이름을 지정할 때 그냥 변수 이름만 쓰고 거기에 뭘 대입하면 됩니다. 아래는 0 값을 집어넣어 초기화한 variable1 변수입니다. | * 파이썬 3에서는 변수 이름을 지정할 때 그냥 변수 이름만 쓰고 거기에 뭘 대입하면 됩니다. 아래는 0 값을 집어넣어 초기화한 variable1 변수입니다. | ||
20번째 줄: | 20번째 줄: | ||
** 이 때 씬의 클래스 명칭을 class_name으로 따옴표 없이 지정할 수 있습니다. 그러면 지정한 class_name을 에디터가 인식하고 클래스명 자동 완성에 넣어줍니다. 예를 들어 Class1이라는 클래스 이름을 지정하려면 다음과 같이 적습니다. | ** 이 때 씬의 클래스 명칭을 class_name으로 따옴표 없이 지정할 수 있습니다. 그러면 지정한 class_name을 에디터가 인식하고 클래스명 자동 완성에 넣어줍니다. 예를 들어 Class1이라는 클래스 이름을 지정하려면 다음과 같이 적습니다. | ||
class_name Class1 | class_name Class1 | ||
* 파이썬 3에서는 클래스를 인스턴스화하여 RAM에 오브젝트로 올려 실체화할 때, 클래스 생성자 메서드를 사용하지만, GDScript는 load 함수로 불러온 씬을 instance() 메서드로 실체화하거나, 노드 혹은 클래스에 new() 메서드를 붙여 만든 빈 오브젝트에 속성을 일일이 지정하는 방법을 사용합니다. | * 파이썬 3에서는 클래스를 인스턴스화하여 RAM에 오브젝트로 올려 실체화할 때, 클래스 생성자 메서드를 사용하지만, GDScript는 load 함수로 불러온 씬을 엔진 버전에 따라 instance()나 instantiate() 메서드로 실체화하거나, 노드 혹은 클래스에 new() 메서드를 붙여 만든 빈 오브젝트에 속성을 일일이 지정하는 방법을 사용합니다. | ||
** 파이썬 3 오브젝트 생성 | ** 파이썬 3 오브젝트 생성 | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
28번째 줄: | 28번째 줄: | ||
variable1 = Node2D.new() # 지정이 속성값이 전혀 없는 내장 Node2D 클래스에서 오브젝트 variable1 생성 | variable1 = Node2D.new() # 지정이 속성값이 전혀 없는 내장 Node2D 클래스에서 오브젝트 variable1 생성 | ||
variable2 = Class1.new() # 프로그래머가 만든 클래스 Class1에서 오브젝트 variable2 생성 | variable2 = Class1.new() # 프로그래머가 만든 클래스 Class1에서 오브젝트 variable2 생성 | ||
variable3 = load("res://scene_folder/scene_type1.tscn").instance() # scene_type1.tscn 씬을 불러와 인스턴스화하여 오브젝트 variable3 생성 | variable3 = load("res://scene_folder/scene_type1.tscn").instance() # 고도 엔진 3에서 scene_type1.tscn 씬을 불러와 인스턴스화하여 오브젝트 variable3 생성 | ||
* GDScript에서 | variable4 = load("res://scene_folder/scene_type1.tscn").instantiate() # 고도 엔진 4에서 scene_type1.tscn 씬을 불러와 인스턴스화하여 오브젝트 variable4 생성 | ||
* GDScript에서 오브젝트로 RAM 메모리에 올린, 즉 인스턴스화(instantiate)를 한 씬은 반드시 queue_free()나 free() 메서드로 해제해야 합니다. 파이썬 오브젝트가 해제할 오브젝트 앞에 del을 붙이는 것과 차이가 큽니다. | |||
** 파이썬 3의 오브젝트 해제 | ** 파이썬 3의 오브젝트 해제 | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
37번째 줄: | 38번째 줄: | ||
object1.queue_free() # 게임 프레임을 고려하여 적당한 때에 오브젝트를 해제하며, 게임 성능 저하가 적기에 추천합니다. | object1.queue_free() # 게임 프레임을 고려하여 적당한 때에 오브젝트를 해제하며, 게임 성능 저하가 적기에 추천합니다. | ||
object2.free() # 즉시 오브젝트 해제, 남용하면 성능 저하가 심각해질 수 있습니다. | object2.free() # 즉시 오브젝트 해제, 남용하면 성능 저하가 심각해질 수 있습니다. | ||
== 참고 자료 == | |||
* [https://docs.godotengine.org/en/3.6/tutorials/scripting/gdscript/index.html 고도 엔진 3의 GDScript(영어)] | |||
* [https://docs.godotengine.org/ko/4.x/tutorials/scripting/gdscript/index.html 고도 엔진 4의 GDSciprt(한글)] |
2024년 4월 22일 (월) 17:20 판
고도 엔진에서 사용하는 GDScript는 파이썬(Python) 3 프로그래밍 언어를 게임 제작 용도로 개조한 것이 아닐까 싶을 정도로 스크립트 문법이 매우 유사합니다.
그러나 차이가 없는 것은 아니며, 파이썬 3 문법과 비교했을 때 GDScript는 엄연히 독자 구현한 언어인 만큼 중요한 차이는 다음과 같습니다.
- 파이썬 3에서는 변수 이름을 지정할 때 그냥 변수 이름만 쓰고 거기에 뭘 대입하면 됩니다. 아래는 0 값을 집어넣어 초기화한 variable1 변수입니다.
<syntaxhighlight lang="python">
variable1 = 0
</syntaxhightlight>
- 그러나 GDScript는 자바스크립트처럼 변수 이름 앞에 'var'를 넣어줘야 합니다.
var variable1 = 0
- 전역 변수(global variable)에 한해, 고도 엔진 에디터에 변수 값을 지정하는 항목을 만들어주는 특수한 접두어 export까지 합치면, 에디터에서 변수에 들어갈 초기 값을 지정할 수 있습니다.
export var var_exported = 3 # 이러면 고도 엔진 에디터에 'var exported'라는 항목이 노드 속성 창에 나타나며, 처음에 값이 3으로 설정됩니다.
- 파이썬 3은 함수 이름 앞에 'def'를 붙여 함수를 선언하고 정의하지만, GDScript는 'def' 대신 'func'을 사용합니다. 파라미터 정의는 타입 강제 지정 방법까지 전부 똑같습니다.
func function1(param1 : int): pass
- GDScript는 파이썬의 import 같이 모듈 역할을 하는 다른 씬의 기능을 직접 불러와 합치는 기능이 없습니다. 대신 자바 프로그래밍 언어 같은 단일 루트 계층(Singly rooted hierarchy)을 사용하여, 원하는 기능이 있는 부모 씬을 직접 extends로 확장하여 가져와야 합니다. 가령 Node2D를 확장하여 2D 씬을 만든다면 가장 위에 다음과 같이 적습니다.
extends Node2D
- 이 때 씬의 클래스 명칭을 class_name으로 따옴표 없이 지정할 수 있습니다. 그러면 지정한 class_name을 에디터가 인식하고 클래스명 자동 완성에 넣어줍니다. 예를 들어 Class1이라는 클래스 이름을 지정하려면 다음과 같이 적습니다.
class_name Class1
- 파이썬 3에서는 클래스를 인스턴스화하여 RAM에 오브젝트로 올려 실체화할 때, 클래스 생성자 메서드를 사용하지만, GDScript는 load 함수로 불러온 씬을 엔진 버전에 따라 instance()나 instantiate() 메서드로 실체화하거나, 노드 혹은 클래스에 new() 메서드를 붙여 만든 빈 오브젝트에 속성을 일일이 지정하는 방법을 사용합니다.
- 파이썬 3 오브젝트 생성
<syntaxhighlight lang="python">
variable1 = Class1() # 클래스 Class1의 생성자 호출로 오브젝트 variable1 생성
</syntaxhightlight>
- GDScript
variable1 = Node2D.new() # 지정이 속성값이 전혀 없는 내장 Node2D 클래스에서 오브젝트 variable1 생성 variable2 = Class1.new() # 프로그래머가 만든 클래스 Class1에서 오브젝트 variable2 생성 variable3 = load("res://scene_folder/scene_type1.tscn").instance() # 고도 엔진 3에서 scene_type1.tscn 씬을 불러와 인스턴스화하여 오브젝트 variable3 생성 variable4 = load("res://scene_folder/scene_type1.tscn").instantiate() # 고도 엔진 4에서 scene_type1.tscn 씬을 불러와 인스턴스화하여 오브젝트 variable4 생성
- GDScript에서 오브젝트로 RAM 메모리에 올린, 즉 인스턴스화(instantiate)를 한 씬은 반드시 queue_free()나 free() 메서드로 해제해야 합니다. 파이썬 오브젝트가 해제할 오브젝트 앞에 del을 붙이는 것과 차이가 큽니다.
- 파이썬 3의 오브젝트 해제
<syntaxhighlight lang="python">
del object1
</syntaxhightlight>
- GDScript 오브젝트 해제
object1.queue_free() # 게임 프레임을 고려하여 적당한 때에 오브젝트를 해제하며, 게임 성능 저하가 적기에 추천합니다. object2.free() # 즉시 오브젝트 해제, 남용하면 성능 저하가 심각해질 수 있습니다.