Godot を使ったゲーム開発 🤖

Skip to content

これは機械翻訳されたテキストであり、誤りを含む可能性があります!

この情報はどこから来ているのですか?

これは主にGodotの公式ドキュメントの説明を再構成したものです。以下に、このPiggy版よりもむしろ推奨する公式ドキュメントへの有用なリンクがあります(こちらが好みであればこれをご利用ください!)

便利なリソース:

グラフィックはどうすればいいですか?自分で作る必要がありますか?

いいえ! ここでたくさんの無料アセットを見つけることができます:

その他の便利なリンク:

他のゲームエンジンは?

もしよろしければ、他のゲームエンジンを使用することも可能です。他のゲームエンジンの例は以下の通りです:

他にもたくさんありますので、他のものを試してみたい場合はぜひ検索してみてください!

Godotとは?

Godot(発音:グド)は、「ゲームエンジン」です。簡単に言えば、ゲーム(あるいは、望むなら一般的なプログラム)を作成することを可能にするソフトウェアです。Godotは、2Dと3Dの両方において、他の多くのゲームエンジンができることのほとんどすべてを行うことができます。

Godotで制作されたゲームの例:Godot Showcase

Godotで制作されているのはインディーゲームだけではありません。Sonic Colors UltimateもGodotで制作されています!🦔🦔🦔

Godotの入手方法

以下からGodotをダウンロードできます。

ダウンロードしてインストールするか、Steamで起動してください。

プロジェクトを設定!

Godot を起動すると、このウィンドウが表示されます:

Godot プロジェクト

ここで、プログラミング言語として GDScript または C# が尋ねられます。GDScript は Python と非常に似ています。

GDScript と Python の違い (色なし):

def hello():
    text = "Hello world!"

    print(text)
func hello():
    var text = "Hello world!"

    print(text)

Python の変数では、変数名だけを書くことができます。GDScript では、var を最初に書く必要があります。関数を作成するには、funcdef の代わりに書きます。

シーンとノード

Godot における最も重要な概念の一つが、シーンとノードです。ノードから始めましょう。ノードは Godot におけるオブジェクトであり、何でも表現できます。プレイヤー、敵、メニューのボタン、画面上のテキストなど、何でも表現できます。シーンはノードの集まりです。

ここでは、非常にシンプルな例を作成します。

パート1a - 「player」シーンを作成する

Godotウィンドウの上部にある「2D」ボタンを押して、ビューを2Dモードに変更します。

ウィンドウの左側には次のインターフェースが表示されます:

シーンの作成

「Other Nodes…(他のノード)」ボタンをクリックし、「CharacterBody2D」と検索して選択後、「Create(作成)」を押してください。これはプレイヤー用のキャラクターを表すためのノードです。「CharacterBody2D」ノードの隣に警告三角形⚠️が表示されているかもしれません。これは必要なものが不足しているためです。

ノード上で右クリックすると「+ ノードの子を追加…」というオプションがあります。これを使用して、Sprite2DとCollisionShape2Dの2つのノードを追加しましょう。 Sprite2Dはプレイヤーに表示されるグラフィックを担当し、もう一方は衝突判定のために使用されます。名前を変更することで管理がしやすくなる場合があります。私は自分のCharacterBody2Dの名前を「Player」に変えました。現在のシーンは以下のようになっているはずです:

現在のアセット配置

第1b部 - CollisionShape2Dの修正 ⚠️

*この*ケースにおける警告の内容は、CollisionShape2Dに実際の衝突判定が欠けているというものです。これは、ノード(左側)をクリックすることで修正できます。クリックすると*右側*にパネルが表示されます。ここには、変更可能なノードに関する多くの情報が表示されます。ぜひ、そこに表示されている内容をいろいろと試してみてください。しかし、今回注目したいのは「Shape」です。これを、例えば RectangleShape2D に設定してください。ここでは衝突判定を使用しないため、それほど重要ではありません。

Del 1c - スプライト、グラフィックを追加する

Sprite2D の左側をクリックすると、右側に「Texture」というフィールドが表示されます。ここにプレイヤーの画像を追加できます。画像をフィールドにドラッグ&ドロップするだけです。

スプライトを追加した後の状態は次のようになります。

Sprite menu

セクション2 -入力の追加と確認

ウィンドウ上部には「シーン」「プロジェクト」「デバッグ」「エディター」「ヘルプ」といったメニューがあります。「プロジェクト」をクリックし、その後「プロジェクト設定」を選択します。ここで多数の設定項目を含む画面が表示されますので、「入力マップ」を押してください。ここではキーボードのボタンを設定できます。

  • 「新規アクションを追加」フィールドにleft と入力して、「追加」を押す。
  • その後 right, up, down をそれぞれ同様に追加する。
  • これらは「アクション」と呼ばれます。
  • 各「アクション」では、右側の+ボタンを押し、キーを入力してから「追加」することで対応付けることができます。

プラス ボタン

  • ここでは単に入力を求めるプロンプトに従ってキーを押した後、「追加」を押せばよいです。
  • すべてのアクションに対応したキーを追加してください。

第3部 - プレイヤーを制御するためのスクリプトを追加する。

ゲームロジック、つまりプレイヤー、背景、またはゲーム内の何らかの要素に対して何かを行うためには、スクリプトが必要です。スクリプトはコードであり、GDScriptまたはC#という2つの言語で記述できます。デフォルトはGDScriptです。

  • “CharacterBody2D” (私はそれを “Player” と呼んでいます) ノードを選択します。
  • 「スクリプトをアタッチ」ボタン (下記参照) を押します。

スクリプトをアタッチ

  • ここで、言語を選択できるウィンドウが表示されます (GDScriptを選択)。そしてパス (デフォルトのままにしておいて問題ありませんが、名前を付けても構いません)、その後「次へ」をクリックします。すると、「スクリプト」ウィンドウが表示されます。最初はあまり記述されていません。

CharacterBody2Dを拡張する

このコードが現在行っていることは、コードが “CharacterBody2D” タイプノードに属するようにしているだけで、これは私たちのプレイヤーです。

ここに、プレイヤーを操作するために使用する関数を追加します。

extends CharacterBody2D

func _physics_process(delta: float) -> void:
    return

Physics Process?

_physics_process は、毎フレーム、つまりデフォルトでは1秒間に約60回更新される関数です。_process と呼ばれる別の関数もあり、こちらは常に更新されます。プレイヤーを一定の速度で動かしたい場合は、_physics_process を使用します。

ここに、プレイヤーを移動させるコードを追加します。

パート 4 - 基本的な入力

パート 2 でインプットボタンを追加しましたが、今度はそれらを使用します。”Inpuut マップ” に設定されたものがプレイヤーによって押されたかどうかを確認するために使用できる組み込みのオブジェクトとして Input というものがあります。

このコードを _physics_process の中に追加してみてください:

# 만약 '오른쪽' 액션이 눌려 있다면:
if Input.is_action_pressed('right'):
    # 속도의 x 성분을 100으로 설정합니다.
    velocity.x = 100

# 슬라이드하며 이동합니다.
move_and_slide()

move_and_slide()とは何ですか?

move_and_slide()は、対象としているものを実際に移動させたい場合に使用するGodotの組み込み関数です。これがないとプレイヤーが動きません。

Warning

行間のスペースは非常に重要です。これはPythonと同じです。

Godotウィンドウで再生ボタンをクリックした後、「right」をクリックするとどうなりますか?

今何も起こらない場合:

  • 「Input Map」で何かを設定しましたか?
  • rightRight を間違えていませんか? つまり、コードに書いた名前とInput Mapの名前が一致していますか?

ここまでの全コード
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100

    move_and_slide()

`'left'`, `'up'`, `'down'` のコードを追加してみてください。

`left` の場合、`velocity.x` はいくつである必要がありますか? `up``down` の場合はどうですか?

全コードはこちら
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

第5部 - コードの修正

おそらく、方向キーを離してもプレイヤーが止まらないことに気づいたかもしれません。今、それを修正しましょう!

すべての if 文の前に、velocity を 0 に設定する行を追加します。velocity = Vector2() と記述することで実現できます。

Godot のすべての速度と方向は ベクトル です。これは今すぐ掘り下げるべき数学の概念ではありませんが、この意味がもっと詳しく知りたい場合は、こちらをご覧ください: Wikipedia vectors

コードの全容
extends CharacterBody2D

func _physics_process(delta: float) -> void:
    velocity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = 100
    if Input.is_action_pressed('left'):
        velocity.x = -100
    if Input.is_action_pressed('down'):
        velocity.y = 100
    if Input.is_action_pressed('up'):
        velocity.y = -100

    move_and_slide()

ゲームを開始すると、プレイヤーを移動させることができます:

さらに、速度が単なる数値ではなく、別の場所に保存できるようにコードを修正できます。

たとえば(関数より前に)、速度を追跡する 定数 を追加することができます。

最終的なコード全体をconstを使用する

extends CharacterBody2D

const SPEED = 100

func _physics_process(delta: float) -> void:
    velocity = Vector2()

    if Input.is_action_pressed('right'):
        velocity.x = SPEED
    if Input.is_action_pressed('left'):
        velocity.x = -SPEED
    if Input.is_action_pressed('down'):
        velocity.y = SPEED
    if Input.is_action_pressed('up'):
        velocity.y = -SPEED

    move_and_slide()

パート 6 - 自分で遊んでみよう!

最初のパート「有用なリソース」に戻ると、引き続き遊ぶことができる内容がわかります。

その後で自分自身のゲームを作ってみましょう。何を作るかはあなた次第です!全く新しいものを作りたければそうしてください!すでに存在するゲームを模倣してみたいのであればそれも大丈夫です!学ぶための最良の方法は実際に試すことです!