CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Godot Engineで2Dキャラクターを移動させる方法

前回のGodot Engineの記事の続きです。前回インポートしたアセットを使って、キャラクターを動かす方法について紹介します。

1. キャラクターを動かした時の結果

まずは先にキャラクターを動かした例です。

キャラクターは、こちらのサイトの「ハロウィンキャラクター」を使用させていただいています。

pipoya.net

2. キャラクターを動かすための準備

チュートリアルに記載のスクリプトを改造してもできると思いますが、アセットライブラリにちょうど良いのがありました。

Asset library on Godot Engine

PlatformerController2D - Godot Asset Library

このように、2D画面上での移動やジャンプを実現できます。

https://raw.githubusercontent.com/Ev01/PlatformerController2D/assets/jumping.GIF

まずは準備したsprite画像でこのスクリプトを使う準備をします。Playerというシーンを作り、AnimatedSprite、CollisionShape2Dという子ノードを追加します。

AnimatedSpriteには、前進と後進の画像をセットします。方法は公式のチュートリアルにあるのでここでは省略します。

https://docs.godotengine.org/ja/stable/getting_started/step_by_step/your_first_game.html#sprite-animation

Set sprite textures on Animated Frames in Godot Engine

AnimatedSpriteノードを選択、InspectorのFramesから新規フレームを作成してモーションを作成します。モーションの名称はwalkとwalk_backにしました。なお、公式チュートリアルでは個別の画像を登録してアニメーションを作っていますが、sprite画像を直接読み込み、縦と横の行を指定し、使いたい切り出し画像だけを読み込むこともできます。

How to call sprite frames in Godot Engine

Adjust sprite frames in Godot Engine

参考:2Dスプライトアニメーション — Godot Engine (stable)の日本語のドキュメント

これで前進 (walk) と、後進 (walk_back) ができたので、これをplatformer_controller.gdスクリプトから呼び出せるようにします。

まず、キーボードの左右キーとスペースキーの入力で動作するようにします。
Project > Project Settings > Input Maps の順番に開くことで、主要なキーのキーバインド一覧を確認できます。

Godot Key Bindings Tutorial - GoTut: Game and Other Tutorials

今回は"ui_left", "ui_right", "ui_accept"を使用します。

gist.github.com

Godot Engineでは、"func ready():" がUnityのStart()関数、"func physics_process(delta):" が、FixedUpdate()関数に相当します。今回使ったアセットでは"func _physics_process(delta):"でキー入力に応じた処理が書かれており、ここでアニメーションの再生処理を追加します。

func_physics_process (delta) : の一番下の行に以下を追加します。なお、gdスクリプトは、pythonと同じくインデントに意味があるので、追加する位置に注意する必要があります。

gist.github.com

スクリプトはこれで完了です。しかし、処理はこれで正しいのですが、KinematicBody2Dを使っているのでステージがないと開始と同時に落下します。
そこで、次にステージを作ります。

3. 補足:Godot Engineでの「シーン」の考え方

少し話が変わりますが、Godot Engineでは色々なオブジェクトや関係をシーンと呼びます。おそらくですが全てを1つのシーンで書いても良いし、個別のオブジェクトや処理単位でシーンを分けて後でリンクさせてもよいようです。

Unityとは異なる概念ですが、Godot Engineでは、プレーヤ、敵、弾、ステージなどを別々のシーンで分けて記述することができます。プレーヤだけを「シーン」と呼ぶのは違和感がありましたが、慣れるとそういうものかなと思いました。

4. キャラクターを動かすためのステージ作成

Scene > New Scene > Other Node でノード選択画面を開き、StaticBody2Dを選択します。今回はこれをStageというシーンにしました。StaticBody2Dを使うと重力などの力を受けないでオブジェクトを配置できるようです。地面とか、ブロックなどに使えます。KinematicBody2Dを選択すると、Playerの落下でステージごと落ちてしまうので今回は使いません。

また、床や壁を表すために、ColorRectというノードを追加しました。ただし、これだけだとキャラクターが透き通ってしまうので、CollisionShape2Dも追加して同じ場所に配置しました。

Example of stage in Godot Engine

CollisionShape2Dが緑色で表示されるので床が緑のように見えますが、プレイしたときはColorRectの色が表示されます。今回はColorRectを白にしているので白色の床と壁になります。

5. PlayerとStageシーンを呼び出すMainシーンを作って、全てを結合する

個別のシーン (Unityではオブジェクトが近い?) を一つにまとめるためにMainというシーンを作ります。その後、それぞれのシーンとインスタンスを紐づけます。これにより、Playerというキャラクターが表示されるだけの部分と、Stageという床と壁があるだけの部分が1つになって、床の上をキャラクターが移動するという1つのシーンが完成します。

以下の公式ドキュメントにやり方が書かれている通り、Mainシーンを開いた状態から「インスタンス」ボタンをクリックして他のシーンを選ぶことで、紐づけることができます。

https://docs.godotengine.org/ja/stable/getting_started/step_by_step/your_first_game.html#main-scene

こうしてMainシーンを動かした結果が冒頭のTwitterでの投稿です。

6. おわりに

少しずつわかってきたので、次は何か弾を出す処理を作ってみようと思います。あとは、もう少ししたら2Dではなく3D側に移ってXR系のアプリ開発の方法を調べてみる予定です。