ゲームエンジン 『Godot』
Godot というゲームエンジンをご存じでしょうか? OSS で開発されているゲームエンジンで、Unity や Unreal Engine と比較しても2Dゲームの開発がしやすく、低スペックな PC でも動作することから、近年人気が高まってきています。
Godot 環境でゲームを制作するにあたり、最初に取り組むべきことは2Dゲームのチュートリアルです。ただし、このチュートリアルは現在の安定バージョンである3.*シリーズを前提としていますが、最新の環境である4.*シリーズでは多くの名称変更が行われています。
変更された名称などについては公式の Upgrading from Godot 3 to Godot 4 で確認できますが、今回はGodot 4向けに必要な修正点に焦点を当てて説明します。
最初の2Dゲーム — Godot Engine (stable)の日本語のドキュメント
Godot 4 向けの修正点について
ノード名の変更:AnimatedSprite → AnimatedSprite2D
AnimatedSprite ノードの名前が変更されています。AnimatedSprite2D のほうを使用しましょう。
インスペクタに値を公開する方法
export var speed = 400 # How fast the player will move (pixels/sec).
インスペクタに値を公開する方法が変更されていて、上記のコードでは
Parse Error: Unexpected “Identifier” in class body.
というエラーが発生します。以下のような @export アノテーションを使用するコードに変更が必要です。
@export var speed:int = 400 # How fast the player will move (pixels/sec).
AnimatedSprite のプロパティ/メソッドの変更
AnimatedSprite2D はプロパティがいくつか変更されており、以下のコードはエラーになります。
$AnimatedSprite.playing = true
var mob_types = $AnimatedSprite.frames.get_animation_names()
$AnimatedSprite.animation = mob_types[randi() % mob_types.size()]
playing というメンバーは存在しなくなっていますので、play メソッドでアニメーション名を指定しての再生に変更しています。また、frames ではなく sprite_frames というプロパティ名になっていますので、それを修正すると以下のようになります。
$AnimatedSprite2D.play("walk")
var mob_types = $AnimatedSprite2D.sprite_frames.get_animation_names()
$AnimatedSprite2D.animation = mob_types[randi() % mob_types.size()]
ノード名の変更:VisibilityNotifier2D → VisibleOnScreenNotifier2D
VisibilityNotifier2D のノード名が変更されており、VisibleOnScreenNotifier2D を使用する必要があります。
ノード名の変更:Position2D → Marker2D
Position2D のノード名が変更されており、Marker2D を使用する必要があります。これは少し元の名前からは代替ノードを検索しにくいですね。
関数名の変更:rand_range → randf_range
モブをランダムな向きとランダムな速度にするために使われている rand_range ですが、randf_range に変更します。
# Add some randomness to the direction.
#direction += rand_range(-PI / 4, PI / 4)
direction += randf_range(-PI / 4, PI / 4)
こちらは以下のようなエラーメッセージが表示されるため、解りやすいと思います。
Error: Function “rand_range()” not found in base self. Did you mean to use “randf_range()”?
インスタンスを生成する: instance() → instantiate()
インスタンスを生成するコードも変更されています。モブを生成するところで、instance() ではなく instantiate() を使用します。
# Create a new instance of the Mob scene.
#var mob = mob_scene.instance()
var mob = mob_scene.instantiate()
パスのオフセットを設定する
offset ではなく、progress プロパティに値を設定します。
#mob_spawn_location.offset = randi()
mob_spawn_location.progress = randi()
yield → await
HUD を実装するときにタイマーを実行するコードがありますが、こちらを yield メソッドから await に変更します。
# Wait until the MessageTimer has counted down.
#yield($MessageTimer, "timeout")
await $MessageTimer.timeout
最初の2Dゲームの完成
上記の修正でチュートリアルのゲームが動作可能になっていると思います。試しに自分で作成したものをエクスポートしました。以下の画像をクリックするとブラウザでプレイ可能です。
コメント