見出し画像

あほげーでGodotを使ってゲーム制作をしてみた話


追記:2024/10/10 誤りを修正

1.はじめに

 皆さんは「Godot」というゲームエンジンをご存じでしょうか?そうです、Unity事変の際に話題になったオープンソースのゲームエンジンですね。

Godot公式ページ

「MITライセンス」で配布されている2D・3D両対応の汎用ゲームエンジンであるため、無料で誰でも利用することができます。売り上げによって後から料金を請求されるということもありません。今回私は24時間でお題に沿ったあほなゲームを作るゲームジャム、「あほげー」にGodotを用いて参加したので、そこで感じたことをこの記事にまとめます。

あほげー公式サイトの第44回のページ

参加した作品

2.Godotの長所

[1].ダウンロードやエンジンの更新が楽

 これは本当にそう。Godotを始める際にしなければならないことは「公式ページでZIPファイルを落とす」 それだけです。これが本当に手軽で良い。アカウントを作る必要もなく、ログインする必要もなく、ただ最新版をダウンロードするボタンを押すのみ。あとは数分待ち解凍すればゲーム制作開始です。今「Godot使おう!」と思ったなら、5分もしないうちには作り始められるでしょう。

[2].動作が軽い

 エンジンエディタ自体が軽くノートパソコンでも余裕で動作します。他のソフトを開きながらでも全然作業できます。起動も速いので、「今日は頑張るぞ」っていう気分がロード時間で萎えてしまう恐れもありません。これ結構大事。
 また、本体のデータサイズも小さく103MBほどです。これは総合ゲーム開発エンジンとしては破格の小ささ(のはず)
 PCの性能に自身のない方でも使用することができます。

[3].ビルド速い

 初回の各プラットフォームごとのテンプレートファイルのダウンロードこそちょっと時間がかかりますが、それ以降はすぐにビルドされゲームが出力されます。このあたりのストレスが少ないのは本当にありがたい。

[4].内部エディタ

 GodotエンジンではPythonをベースに作られた独自プログラミング言語である「GDScript」かゲーム制作ではおなじみの「C#」を用いてスクリプトを書くことになるのですが、Godotエディタには、それらを読み書きするためのエディタが内蔵されています(もちろん予測変換、シンタックスハイライト付き)Godot単独で完結するのが良いですね。もちろんVScodeのような任意のコードエディタを利用することも可能です。

内部エディタ

[5].無料

 先ほども話しましたが、Godotはオープンソース(エンジン内部のプログラムが公開されている)であり、MITライセンスで配布されています。どれだけ儲けても、どんな使い方をしても料金を請求されることはありません。またコミュニティによって開発が進められているため、突然料金を請求されたり、資本主義的な理不尽改変がされる恐れもありません。
 ゲーム制作は長期戦となることも多く、エンジンに何かトラブルがあった際に「別エンジンに移行する」という選択を簡単に取ることは難しいです。そのため安心してそのエンジンをゲームが完成するまで使い続けられるかは大切な要素です。そういった意味でもGodotの無料かつオープンソースというのは大きな利点だと思います。


他にも色々「実行結果を録画する機能」「オブジェクトどうしや関数どうしで互いに連携、処理を発火させることができるシグナル」などの機能があります。ゲーム制作に必要な機能は一通りそろってます。

3.Godotの短所

[1].日本語の情報が少ない。

 近年、かなりインターネットでもGodotの記事が見つかるようにはなりましたが、やはり大手ゲームエンジンと比べるとまだまだ日本語での情報が少ないです。公式サイトも一部日本語対応が進んでいますが、やはり英語がメインとなっています。日本のコミュニティがあるので、そちらのDiscordサーバーに所属し、いつでも質問を行える状態でゲーム制作を進めることをオススメします。

[2].Godot3とGodot4の違いがややこしい。

 現在のGodot ver4.x.x系とGodot ver3.x.x系で幾つか変更された部分があります。しかし、ネットではそのどちらもの情報が出回っていることもあり、混乱の元になっています。場合によっては公式ページでも一部更新が間に合っていない部分があるとかないとか。違いをまとめてくださっている方の記事などを参考にすることをオススメします。

[3].テストプレイでエラーが起きると少し不便

 exeファイルなどにビルドするのとは別にテストプレイ用のビルドを行うことができるのですが、ここでエラーが出ると少し面倒。ゲームの再生ボタンを押すと別ウィンドウでゲームが起動するのですが、エラーが起きるとPCにもよるとは思いますが、Windowsの場合、ゲームがフリーズして「応答がありません」のダイアログが出ます。システムの都合上、毎回Microsoftにエラーを報告することになるため、少しレスポンスが悪い。エンジン自体がフリーズしてしまうわけではないのですが、バグの検証などをしている際はストレスとなるかも。

4.Godotを使ってつまずいた部分

 Godotを使っていてつまずいた部分と対処法をまとめておきます。

シーンの管理、切り替え

 GodotもUnityと同じく、ゲームの場面ごとにシーンを作り、それらを行き来することでゲームを進行させます。しかし、このシーン機能がUnityと勝手が違うため、初めて使う際、特にもともとUnityを使っていた方は戸惑うかもしれません。

 まず、Unityはシーンとオブジェクト(プレハブ)が全くの別のものとして扱われていますが、Godotではどちらも「ノード」というものとして扱われています。ゲームを構成する様々な機能やオブジェクトを「ノート」、それらのノードを子に持つルートノード(親ノード)を「シーン」と呼ぶっぽい。
 また、シーンを他のシーンの子ノードとして追加することが可能で、これがUnityのプレハブのような働きをします。各ステージの情報を持った「ステージシーン」の子ノードにプレイヤーや敵の情報を持った「プレイヤーシーン」「敵Aシーン」を追加みたいに…。
 個人的にはGodotの方がシンプルで分かりやすいと感じたので、慣れればこのあたりは自然と理解できそう。うまく使いこなして各機能ごとに分けて管理しやすくしたいところですね。

 また、シーンを切り替える際もUnityとは異なる部分があります。現在表示しているシーンから直接次のシーンを呼び出すことはできません。Godotは、シーンの依存関係によるバグを未然に防ぐため、シーンどうしが相互参照を行えないように制限しているからですね。そのためシーンを管理するためのノードを作り、それを常に読み込ませている状態にし、そのノードに命令を送ることで間接的に次のシーンを呼び出す必要があります。
私は以下の動画を参考に実装させていただきましたので、この場で感謝の意を込めてご紹介させていただきます。

↓希杖しほな #ゲームチャンネル様の動画


画面のサイズを変更した際、アスペクト比を維持しつつ全体のサイズを拡大縮小させることができるようにする

 これは画面上部にあるタブを「設定>表示>ウィンドウ>ストレッチ>モード」を「canvas_item」か「viewport」にすることでできます。canvas_itemはノードごとに拡大縮小されて描写される&3Dは影響を受けない、それに対してviewportはレンダリング後に全体を拡大縮小するという感じらしい。各自のイラストとの相性やゲームの特徴に合わせて変更するのが良いと思います。

canvas_itemの場合

ノードの座標やサイズなどの値をある値に滑らかに変化させる

 キャラクターなどを特定の座標にスライドさせたりする際に使用します。基本的な使い方は以下のような感じです。

func _on_game_value_cutin():
	
	var tween = get_tree().create_tween();
	var new_position = Vector2(216,-13)
	tween.tween_property(self, "position", new_position, 0.5)

まず「get_tree().create_tween()」でtweenを生成します。
次に「.tween_property( 対象 , 変更する値の名前 , ゴールの値 , 変化にかける時間)」を実行します。

他にも様々な関数を実行することで追加の設定を行うことができます。並行処理や連続処理も可能です。ちなみにこれもGodot3.x.xとGodot4.x.xでメソッドの名前が変更されているため、注意が必要です。

公式サイトのページ(ただし、2024/08/11現在 英語のみ)

また、以下の記事を参考に私は実装しました。この場で感謝の意を込めてご紹介させていただきます。
↓ SLMNLL様の記事

 また、より高度なアニメーションや変化を求める場合は「AnimationPlayer」というノードがあるのでそちらを活用することをオススメします。

クリックの判定が前面にあるUIなどを担当するControl系のノードに吸われてしまう。

「Mouse」の項目にある「Filter」の項目を変更することで解決することができます。
それぞれの項目の意味は以下の通り

  • Stop
    そのノードで受け取ったクリック判定はそこで止まり、後ろにあるノードや親ノードにはクリック判定は伝播しません。

  • Pass
    そのノードでクリック判定を受け取った後、後ろにあるノードや親ノードにもクリック判定が伝播します。

    ---------------------------------------------------------------------------------
    追記
    Passは後ろにあるノードには伝播せず、自身の親や祖先にあたるノードにのみ、重なりに関係なく伝播します。誤った情報を載せてしまい申し訳ありませんでした。
    こちらのSLMNLL氏の記事が分かりやすかったので、紹介させていただきます。

    https://zenn.dev/slm/articles/e836107c5b0081

    ---------------------------------------------------------------------------------

  • Ignore
    そのノードはないものとして扱われ、クリック判定を受け取らず、そのまま後ろのノードに流します。

 画面全域の前面をConrol系のノードで覆った場合などは、適切な設定にしなければ、その後ろのキャラクターなどがクリックに反応しなくなるため注意が必要です。

この部分

エクスポートテンプレート

 Godotで作ったゲームを実際の環境に出力する前に、エクスポートテンプレートをダウンロードする必要があります。これは各バージョンごとのエクスポートに必要な色々が入っているようです。なお以前にそのバージョンのテンプレートをダウンロードしていた場合はこの作業は不要です。
 上部タブの「エディター>エクスポートテンプレートの管理」からダウロードが可能です。


他にも様々な箇所でつまずくことがあると思いますが、インターネットで調べれば案外出てきます。英語の記事も翻訳すればOK。なんならChatGPTに訊いてもそれなりの回答が返ってきます。過信は禁物ですが。

5.まとめ

 以上が私がGodotをあほげーで使用して感じたことをまとめた記事になります。おおざっぱな説明でしたが、Godotに興味を持っていただけたなら幸いです。大手ゲームエンジンと比べるとまだまだ利用者の少ないエンジンではありますが、近年高い注目を集めていることも確かです。皆さんがGodotのコミュニティに進出し、新たな作品を開発していく際に、この記事が少しでも助けになれば幸いです。

ここまで読んでいただき、ありがとうございました。



この記事が気に入ったらサポートをしてみませんか?