11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Godot Engine】2Dゲームチュートリアル(Part.2)

Last updated at Posted at 2021-02-21

概要

Godot Engine で2Dゲームを作るチュートリアル Part.2 です。

前回のページはこちら

↓↓↓

ゲームオブジェクトの作成

今回はクリックゲームということで、クリックの対象となるオブジェクトを作成します。
Mainタブのとなりにある「+」をクリックして、新しいシーンを作成します。
Godot_Engine_-MyFirstGame-_Main_tscn.png
すると空のシーンが作成されます。
Godot_Engine_-_MyFirstGame.png

今度は2Dシーンではなく「その他のノード」を選びます。
Godot_Engine_-_MyFirstGame.png

Nodeの新規作成画面では、検索のところに Area2Dと入力し「Area2D」を選び、「作成」をクリックします。
Godot_Engine_-_MyFirstGame.png
すると、Area2Dノードが作成されます。
Godot_Engine_-MyFirstGame___.png
警告が表示されているので、これをクリックしてみます。

すると警告内容が表示されます。
Godot_Engine_-MyFirstGame___.png
Area2Dは、当たり判定用の CollisionShape2DまたはCollisionPolygon2D を必要とするノードです。Godotはノードに設定が足りていない場合、このように警告が表示されます。そのため、使ったことがないノードの機能を試してみたい場合は警告に注意しながら使用するとうまく動作することがあります。

警告はさておき、とりあえずノード名を「Enemy」に変更しておきます。
Godot_Engine_-MyFirstGame___.png
名前を変更したら、Ctrl+S(macOSの場合は Cmd+S) でシーンを保存します。

名前が Enemy.tscn となっていることを確認して「保存」で保存します。
Godot_Engine_-MyFirstGame___.png

タブに「Enemy」、ファイルシステムに「Enemy.tscn」が表示されます。
Godot_Engine_-MyFirstGame-_Enemy_tscn.png

敵画像の登録

敵画像を登録します。Godotはプロジェクトに "icon.png" というデフォルトの素材が含まれているので、これをドラッグ&ドロップします。
Godot_Engine_-MyFirstGame-_Enemy_tscn.png

するとGodotくんの画像が配置され、Enemyノードの下に "icon" が追加されます。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png

Spriteのインスペクタを確認

"icon"ノードをクリックして選択します。すると、右側に「インスペクタ」という項目が表示されます。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png
これは "icon"ノードの詳細な情報です。
よく見ると、Spriteと表示されおり、"icon"ノードは Sprite型であることがわかります。

そうしたら、インスペクタの Node2D > Transform から回転矢印をクリックします。
shot.gif
すると、画像の位置が初期値(原点)にリセットされます。
Godotでは回転矢印をクリックすると値が初期値に戻るので、元の状態に戻したい場合は回転矢印を押せばとりあえず初期状態にできて便利です。

コリジョン情報の追加

「Enemy」ノードを右クリックして「子ノードを追加」を選びます。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png
Nodeを新規追加画面が表示されるので、以下の手順でCollisionShape2Dを作成します。

  1. 検索に「CollisionShape2D」と入力
  2. CollisionShape2D を選択
  3. 作成をクリック

Godot_Engine_-MyFirstGame-Enemy_tscn___.png
すると、「Enemy」ノードの下にCollisionShape2D が追加されます。
Godot_Engine_-MyFirstGame-_Enemy_tscn_____と_Steam.png
インスペクタから Shape > [空] をクリックして、「新規 RectangleShape2D」を選びます。
shot.gif
すると ShapeRectangleShape2D が設定されます。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png
これは当たり判定の形状を矩形(四角形)で行う設定となります。

そうしたら中央にある画像をマウスホイールで拡大します。
「+」ボタンからも拡大できます。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png
すると画像の中央に当たり判定が表示されています。

右上の赤い丸をマウスでドラッグして、画像サイズに合うように修正します。
shot.gif

動きのスクリプトを作成

このオブジェクトの動きを定義するためのスクリプトを実装します。
「Enemy」ノードを右クリックして、「スクリプトをアタッチ」を選択します。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png
スクリプトをアタッチするダイアログが表示されるので、そのまま「作成」をクリックします。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png
すると、ノードのとなりにスクリプトのアイコンが表示され、スクリプトエディタが表示されます。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png

なお、2Dの編集とスクリプトの編集画面の切り替えは画面上にあるアイコンで切り替えます。
Godot_Engine_-MyFirstGame-Enemy_tscn___.png

スクリプトには以下のように記述します。

Enemy.gd
extends Area2D

# 画面サイズ
var screen:Rect2

# 移動速度
var velocity:Vector2

func _ready():
	# 画面サイズを取得
	screen = get_viewport_rect()
	
	# 移動速度をランダムで決定
	velocity.x = rand_range(-300, 300)
	velocity.y = rand_range(-300, 300)
	
func _process(delta):
	# 移動処理
	position += velocity * delta
	
	# 画面のはしでバウンドさせる
	if position.x < 0:
		# 左側
		position.x = 0
		velocity.x *= -1
	if position.y < 0:
		# 上側
		position.y = 0
		velocity.y *= -1
	if position.x > screen.size.x:
		# 右側
		position.x = screen.size.x
		velocity.x *= -1
	if position.y > screen.size.y:
		# 下側
		position.y = screen.size.y
		velocity.y *= -1

画面内を動き回るスクリプトとなります。
_ready() というのがこのオブジェクトが生成した直後に呼び出される関数です。
_process() が定期的に呼び出される関数で、delta には前回の呼び出しからの経過時間(秒)が入っています。
なので、速度 velocitydelta をかけ合わせることで動作している環境のスペックに依存しない一定の速度となります。

では、このスクリプトを動きを確認します。
右上の「シーンを実行」ボタンをクリックします(※「▶」アイコンではないことに注意します)
Godot_Engine_-MyFirstGame-_Enemy_tscn.png

実行すると、Godotくんが画面内を動き回ります。
shot.gif

なお get_viewport_rect() で画面サイズを取得していますが、Viewportが必ず画面サイズとなるわけではなく、例えば画面をリサイズすると正しく判定ができなくなります。
shot.gif

リサイズの問題については、メニュー > プロジェクト > プロジェクト設定Display > Window > Mode を viewportにして自動スケーリングする、Resizable を無効にしてリサイズできないようにする、などで対処できます。

Godot_Engine_-MyFirstGame-Enemy_tscn___.png
Godot_Engine_-MyFirstGame-Enemy_tscn___.png

Mainシーンに敵を配置する

"Main"シーンのタブをクリック、またはファイルシステムから「Main.tscn」をダブルクリックして、Mainシーンを開きます。
Godot_Engine_-MyFirstGame-_Enemy_tscn.png

ただ、エディタがスクリプトのままなので、「2D」をクリックして2Dシーンの編集モードに切り替えます。
Godot_Engine_-MyFirstGame-_Main_tscn.png

2Dシーンに切り替えたら、ファイルシステムから「Enemy.tscn」をドラッグ&ドロップして Godotくんを配置します。
4つほど配置します。
shot.gif

シーンには "Enemy"、"Enemy2"、"Enemy3"、"Enemy4" が追加されます。
Godot_Engine_-MyFirstGame-_Main_tscn_と_Steam.png

ちなみにうっすらと2Dシーンには青い線が表示されていて、これが画面サイズのガイドとなっています。
Godot_Engine_-MyFirstGame-Main_tscn___.png

配置できたら、「▶」をクリックしてプロジェクトを実行します。
Godot_Engine_-MyFirstGame-Main_tscn___.png

実行すると、複数のGodotくんが画面内を動き回ります。
shot.gif

次回

パート3(最終回) に続きます。

↓↓↓

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?