GODOT Game engineでゲームを作ってみよう!
どうも僕です。
以前から、ゲームエンジンに興味があり、
軽量かつ完全フリーなものはないかと探してました。
UnityやUnrealEngineなどのメジャーもありますが、
「GODOT」は軽量かつ完全フリー*です。
*寄付はできる!
マイナーではありますが、
ダウンロードしてZIP解凍すればすぐ始められるので
ゲームエンジンの入門としては最適なんじゃないかと思います。
ダウンロードしよう!
上記URLのDownload Latestボタンよりダウンロードページに行きます。
以下のボタンをクリックしてダウンロードしよう。
寄付してね!って出ると同時にダウンロード始まる。
解凍しよう。
フォルダを適当な場所に移し、好みのフォルダ名にしよう。
(別に移動しなくてもいいし、フォルダ名を変更しなくてもいい)
始めよう!
「Godot_vX.X.X-stable_win64.exe」をダブルクリックで起動しよう!
プロジェクトが無いよって、サンプルいる?出るけど、キャンセルで。
(サンプルを理解するのにも時間かかるのでwww)
新規プロジェクトを作ろう。
適当なプロジェクト名にして、
フォルダ作成を押す。
バージョン管理メタデータはNoneにして作成して編集を押す。
準備よし!
2Dシーンにキャラを置いてみよう!
プレイヤーシーンの追加
「シーン」タブの「その他のノード」をクリックして
プレイヤーシーンを追加しよう。
(もしくは「シーン」メニューの「新規シーン」からのその他のノード)
「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()をコメントアウトを外しておこうね。
今回は以上です。
では、また!
<補足>
次回は敵キャラを発生させてます!
よかったら次回も見てください。
この記事が気に入ったらサポートをしてみませんか?