見出し画像

GODOT Game engineでゲームを作ってみよう!

どうも僕です。

以前から、ゲームエンジンに興味があり、
軽量かつ完全フリーなものはないかと探してました。

UnityやUnrealEngineなどのメジャーもありますが、
「GODOT」は軽量かつ完全フリー*です。
*寄付はできる!

マイナーではありますが、
ダウンロードしてZIP解凍すればすぐ始められるので
ゲームエンジンの入門としては最適なんじゃないかと思います。

ダウンロードしよう!

上記URLのDownload Latestボタンよりダウンロードページに行きます。
以下のボタンをクリックしてダウンロードしよう。

寄付してね!って出ると同時にダウンロード始まる。

解凍しよう。

フォルダを適当な場所に移し、好みのフォルダ名にしよう。
(別に移動しなくてもいいし、フォルダ名を変更しなくてもいい)

始めよう!

「Godot_vX.X.X-stable_win64.exe」をダブルクリックで起動しよう!

プロジェクトが無いよって、サンプルいる?出るけど、キャンセルで。
(サンプルを理解するのにも時間かかるのでwww)

新規プロジェクトを作ろう。

適当なプロジェクト名にして、

フォルダ作成を押す。

バージョン管理メタデータはNoneにして作成して編集を押す。

準備よし!

2Dシーンにキャラを置いてみよう!

プレイヤーシーンの追加

GODOTのDOCSに従ってプレイヤーシーンを追加しよう。

「シーン」タブの「その他のノード」をクリックして
プレイヤーシーンを追加しよう。
(もしくは「シーン」メニューの「新規シーン」からのその他のノード)

「Area2D」を選択して「作成」をクリックしよう。
*「検索:」の欄に「Area」って打てば絞られるよ

追加したシーンを右クリックして、
子ノードとしてAnimatedSprite2Dを追加しよう。

すでに「検索:」で絞られているなら、Animatedって書き換えて
AnimatedSprite2Dを選択して作成しよう。

まずスプライトにキャラの画像を選択しよう。
右側にAnimatedSprite2Dのインスペクター欄から
Animationの左の>をクリックして展開しよう。

Sprite Framesの<空>をクリックし、新規 SpriteFramesを選択する。

右側の「SpriteFrames」をクリックすると

中央下にアニメーション、アニメーションフレームが出てくる

以下から素材をいただきました。

上記のサイトのURLが書いてあるけど、
面倒ならばここをクリックしてDLしてくれ。

ダウンロードしたら解凍して、

画像が入ったpngファルダをplayerってフォルダ名にする。

ドキュメントの中に、プロジェクトのフォルダがあるはずなので、
上記のplayerフォルダを格納する。

左下のres://に先ほど格納したフォルダが見えていればOK。

中央下にアニメーション、アニメーションフレームにて、
アニメーションのdefaultを名前を変えて「up」にしよう。

左下のres://のplayerフォルダからpng画像を
アニメーションフレームにドラッグアンドドロップ。

以下の順になるように並び変えよう*。
*back_00.pngはもう一度ドラッグアンドドロップで追加ね

back_00.png ⇒ back_01.png ⇒ back_00.png ⇒ back_02.png


アニメーションで+アイコンからアニメーションを追加して
「down」「left」「right」も追加しよう。

「down」「left」「right」も同じ要領でpngをアニメーションフレームに並べよう。
*パターンは _00 ⇒ _01 ⇒ _00 ⇒ _02 で歩いて見えるよ

アニメーションフレームの▶を押すとアニメーションするよ。
・・・いただいた画像が小さいので、主人公ちっさ!ってなる。

そこで、右側AnimatedSprite2Dのインスペクター欄から
Transformの左の>をクリックして展開しよう。
Scaleのxとyを4にして4倍のサイズにしよう。

大きくなったね!

念のため、ここでCtrlとSキーでシーンを保存しよう。

+アイコンを押して、Area2Dの子ノードをさらに追加しよう。
シーン「Area2D」をクリックして

+アイコンをクリックする。
当たり判定となる、「CollisionShape2D」を選択し、作成する。

Area2Dの子ノードとしてもう一つ追加された。

追加したら、右上のインスペクターを見るとShapeが<空>なので
<空>をクリック

キャラに合わせてCapsuleShape2Dを選択すると

キャラに当たり判定の枠(さっきの選んだカプセルの形)が出てくるので大きさを調整して・・・

こんな感じかな。

保存しておこう。(キーCtrl+Sね!)

んで、シーン(左上)のタブの工程はこうなればOK

プレイヤーのプログラミング

スクリプトを書いてゆこう。
シーンのArea2Dを選択して、

スクリプト+アイコンをクリックする。

そのまま、作成ボタンをぽちー。

以下のように書きなおす。

extends Area2D

@export var speed = 400 # How fast the player will move (pixels/sec).
var screen_size # Size of the game window.

# Called when the node enters the scene tree for the first time.
func _ready():
	screen_size = get_viewport_rect().size


# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	pass

キャラを動かすために、キーボードを割り当てる。
メニューのプロジェクト⇒プロジェクト設定をクリックしよう。

"move_right"って入力して追加ボタンぽちー

+をクリックしよう。

「キーボードのキー」の>をクリックして、rightを選択しよう。

そしたらOKボタンね。"move_right"に右キーが割り当てられたね。

上下左キーも割り当てよう。
 move_up:上キー
 move_down:下キー
 move_left:左キー

最後に閉じるボタンぽちー
あと、保存しておこう。

スクリプトにキャラ移動とアニメーション変化ロジックを足そう。
(func _process(delta):の下を書き換えよう)

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	var velocity = Vector2.ZERO # The player's movement vector.
	if Input.is_action_pressed("move_right"):
		velocity.x += 1
	if Input.is_action_pressed("move_left"):
		velocity.x -= 1
	if Input.is_action_pressed("move_down"):
		velocity.y += 1
	if Input.is_action_pressed("move_up"):
		velocity.y -= 1

	if velocity.y < 0:
		$AnimatedSprite2D.animation = "up"
	elif velocity.y > 0:
		$AnimatedSprite2D.animation = "down"
	elif velocity.x > 0:
		$AnimatedSprite2D.animation = "right"
	elif velocity.x < 0:
		$AnimatedSprite2D.animation = "left"

	if velocity.length() > 0:
		velocity = velocity.normalized() * speed
		$AnimatedSprite2D.play()
	else:
		$AnimatedSprite2D.stop()

	position += velocity * delta
	position = position.clamp(Vector2.ZERO, screen_size)

ゲーム開始直後は、主人公キャラを非表示とするhide()を追加。
(func _ready():の下にhide()を追加しよう)

func _ready():
	hide()
	screen_size = get_viewport_rect().size

さらに衝突時用に発信される独自のhitシグナルを宣言。
(extends Area2Dの下に以下を追加しよう)

extends Area2D

signal hit

左側のシーンでArea2Dを選択し、

右側のインスペクターの横の「ノード」タブをクリックする。

「ノード」タブの「シグナル」の中の
Area2D配下にあるbody_entered(body: Node2D)を右クリして
「接続」を選択する。
*オーバーラップ検出(キャラ同士の重なりを検出)した時のシグナル

接続をぽちー。

"area_2d.gd"スクリプトに以下のfuncが現れる。

その"func _on_body_entered(body):"の中を以下の通りに書き換える。

func _on_body_entered(body):
	hide() # Player disappears after being hit.
	hit.emit()
	# Must be deferred as we can't change physics properties on a physics callback.
	$CollisionShape2D.set_deferred("disabled", true)

最後にstartメソッドを作成する。

func start(pos):
	position = pos
	show()
	$CollisionShape2D.disabled = false

"area_2d.gd"スクリプト全体としては以下の感じです。

一旦、func _ready():hide()をコメントアウト"#"して
キャラの動きを確認してみよう。

右上に再生アイコンがあるからクリック。

初めて動かすときに、メインシーンが定義されていないと出るので
「現在のものを選択」をぽちー。

キーボートの上下左右キーを押すとキャラがうごく!

これだけでも嬉しい!

最後にfunc _ready():のhide()をコメントアウトを外しておこうね。

今回は以上です。
では、また!

<補足>
次回は敵キャラを発生させてます!
よかったら次回も見てください。


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