ヘビのような動きのキャラクターを作る
2025/04/02
Godot Engine version 4.4.1 stable
作成者:ダイギイン(アクシオン管理人)

はじめに

ゲームにはヘビのような動きをするキャラクターが出てくることもあります。
これをGodotで作るにはどうするか試行錯誤してみました。

ネットを検索するとヘビゲームの作り方が幾つもヒットします。
そちらも参考になればいいなと思います。


目次


考え方

今回は頭(head)が通った場所を体(body)がなぞっていくようにしたいと思います。(fig.1)
fig.1では、head が通った場所を一定時間ごとにプロットしていき、
body はプロットした点へ向かって動くことをイメージしています。


fig.1 イメージ図

head が位置をプロットするたびに body がその履歴を参照するようにします。
参照のタイミングはシグナルを用い、その間は決まった速度で動くこととします。

ネット記事ですと頭と体を同じコードで作り配列の番号で動作を分ける方式が多く感じます。
そちらのほうが単純になると思いますので、ぜひチャレンジしてみてください。


準備・headの作成

まず、新しいプロジェクトを作成します。
Node2D シーンを作成し(シーン名は任意。今回は snake)、その子に Characterbody2D ノードを配置します。
さらに、画像を表示する Sprite2D と、コリジョン用の Collisionshape2D を作成します。
(fig.2)


fig.2 headノードを作成する
※クリックで拡大

さらに Sprite2D のテクスチャに画像を設定します。
また、Collisionshape2D にシェイプを設定します。(fig.3)


fig.3 ノードの設定
※クリックで拡大


headの動きを作る

まずは下に動くことを考えます。
Characterbody2D ノードの名前を head に変更します。
head に新規スクリプト head.gd をアタッチします。
スクリプトは下記のようにしました。(script.1)

※ head.gd

Script.1 下へ動く

スクリプトは次のことを行います
  • 最初に場所プロット用の配列を作成します。
  • 下方向へ動くように指定します
  • 場所のプロット間隔をカウントダウンします
  • 時間が来たら現在の場所をプロットします
  • プロット番号を +1 します
  • プロットしたことを body へ伝えるためのシグナルを発行します
スクリプトの定数である MOVE_SPEED と WAY_TIME は、
body でも同じ値を指定します。

ルートシーン snake にスクリプトをアタッチしてそこに定数を記載して
各々から参照させると後々、スピード調整が楽になります。

ここまでで一度シーンを実行してみましょう。
画像が徐々に下へ移動するでしょうか?


headの動きを作る2

body が head の位置履歴を参照できるように head.gd に下記を追加します。(script.2)

※ head.gd (追記)

Script.2 body が位置履歴を参照できるようにする

ここで行っていることを解説します。

参照位置は「headの最新記録位置」から数えて「bodyの番号」だけ以前の位置とします。(fig.4)
ループカウンタをカウントダウンにも対応できるようにしたものです。

ここまででエラーがなければ、次はbodyを作っていきます。

fig.4 ノードの設定
※クリックで拡大


bodyの作成

先ほどの head と同じ要領で body ノード を作成します。
body ノードの作成位置は snake の子とします。(head と同じ階層にします) (fig.5)

body ノードを head の子にしてしまうと、想定通りに動きません。


fig.5 body ノードの作成
※作成位置に注意!

body ノードに新しいスクリプト(body.gd)をアタッチします。

スクリプトは次のことを行います(Script.3)
  • head から出されたシグナルを接続します
  • シグナルを受けたら head の位置履歴を参照します
  • 次の移動地点までの単位時間あたりの移動量を計算します
  • 計算した移動量の分だけ移動します
※ body.gd

Script.3 head に追従する

重要:インスペクターの BodyNum を 1 に設定します。

ここまでエラーがなければ動作確認をしてみましょう。
ちょっと怪しい動きをしますが、おおむね狙い通りに動いたと思います。(fig.6)

fig.6 下に動く(bodyはheadに追従する)

body が head より前に描画されていますが、ノードの順番を入れ替えると見た目が良くなります。


見た目の調整

前項 fig.6 では実行すると head と body の間隔が随分狭いことがわかります。
head と body のスクリプトの定数を下記のように変えてみましょう。

WAY_TIME = 1.0

動きはどうなったでしょうか?
間隔は広がったでしょうか?


head の動きを変えてみる

head.gd に追記をしました。(Script.4)
Script.1 から3か所追記があります。

色付けはごめんなさい。力尽きました。
全体をコピー&ペーストでなんとかなると思います。

※ head.gd (全体)

Script.4 改造してみる

動作確認してみましょう。
少し下に動いた後、反時計回りに移動を始めましたか?
body は追従してきていますか?


おわりに

最初の動きは怪しいですが、おおむね狙った通りに動いたかと思います。
結局、ネット記事は参考にしませんでしたが、個人的に良くやったと自画自賛したいと思います。

長丁場、お疲れさまでした。

今回はここまでです。
ありがとうございました。


参考

グラディウスⅢのボスなどゲームのキャラクター

ページトップ