Godot で開発日記 #4
はじめに
前回は少し寄り道をしたけれど、今日は Godot の続きをしていこうと思う。
今回は Godot Engine 専用のプログラミング言語である GDScript について。
GDScript の特徴
GDScript は、
オブジェクト指向で命令型プログラミング言語
漸近的型付け( Gradual typing )である
コンパイル、読み込みが高速
ベクトル型などゲームに必須の仕組みがあらかじめ含まれている
マルチスレッドに対応
といった特徴があります。
同じオブジェクト指向の Java などに導入されているガーベッジコレクションがないのは、ゲーム用ぽいなと。
構文
代表的な構文を一部紹介。
# コメントには `#` を使う
# クラス
class_name MyClass
# 拡張
extends BaseClass
# メンバー変数
var a = 5
var s = "Hello"
# 定数
const ANSWER = 42
# Enum
enum {UNIT_NEUTRAL, UNIT_ENEMY, UNIT_ALLY}
enum Named {THING_1, THING_2, ANOTHER_THING = -1}
# ベクトル型
var v2 = Vector2(1, 2)
var v3 = Vector3(1, 2, 3)
# 関数
func some_function(param1, param2, param3):
const local_const = 5
if param1 < local_const:
print(param1)
elif param2 > 5:
print(param2)
else:
print("Fail!")
for i in range(20):
print(i)
while param2 != 0:
param2 -= 1
match param3:
3:
print("param3 is 3!")
_:
print("param3 is not 3!")
var local_var = param1 + 3
return local_var
# コンストラクター
func _init():
print("Constructed!")
var lv = Something.new()
print(lv.a)
個人的にはかなり読みやすいし、書きやすそうな印象を受けた。
オブジェクト指向についてはバックエンドエンジニア時代に Java を長くやってたし、フロントエンドエンジニアになってからは、(厳密には漸近的型付けではないものの) TypeScript を多く触って来ているので、すんなり受け入れられそうだ。
実装
ノードを回転させるコードを書きました。
extends Sprite2D
func _init():
print("Hello world!")
var speed = 400
var angular_speed = PI
func _process(delta):
rotation += angular_speed * delta
var velocity = Vector2.UP.rotated(rotation) * speed
position += velocity * delta
GDScript はインデントベースの言語なので、関数を書くときはインデントさせる必要がある。
func _init():
print("Hello world!")
コンストラクターで Hello world! をログ出力するコード。
func _process(delta):
rotation += angular_speed * delta
var velocity = Vector2.UP.rotated(rotation) * speed
position += velocity * delta
ゲーム開発でよくあるフレーム単位で呼び出される関数は _process となり、引数に前回フレームからの経過時間 delta を持つ。
このあたりは流石の専用言語。かなり便利だと思う。
rotation や position なんかも、 Node2D クラスから継承されたプロパティで、そのまま使える。やはり便利。
おわりに
GDScript が思っていた以上に書き心地が良いかも。
自分で実装しないといけないものが少なく、ゲーム開発に必要なものが用意されているのはかなり強力。
早速キャラが動かせたのも嬉しかった(思ってたのと違ったけど)。
引き続き、どんどん進めて一通りの知識をつけていこうと思う。