ここではじぇんがねこがGodotにおける開発テクニックや手法を大衆へ紹介する形で語られる

皆さん、こんにちはじぇんがねこです。

最近寒くなってきましたね。
7℃の風を顔に吹き付けられる季節が来ていることに驚いてます。

本題です。
ここでは私が「Godotにおける開発テクニック」を語ります

## ここではGodotについて語られる
一応Godotについて前提知識として軽く説明します。

>Godotは様々なプロジェクト向けにデザインされた、汎用の2D/3Dゲームエンジンです。ゲームやアプリケーションを作成し、デスクトップ用、モバイル、Webでリリースすることが出来ます。パワフルなプログラミングスキルやゲーム開発者がいなくても、コンソール機のゲームを作る事もできます。
>>[Godot公式より](https://docs.godotengine.org/ja/4.x/getting_started/introduction/introduction_to_godot.html#:~:text=Godot%E3%81%AF%E6%A7%98%E3%80%85,%E3%82%82%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)

Godotは2Dも3Dも作れるゲームエンジンです。
スマホやPC向けに作れるだけでなく、契約を結べばコンシューマーゲーム機にも出せます。
Godotは独自の言語「GDScript」でコーディングします。SwiftやPythonに似てます。
特徴的なのと言えば「ノード」と「シグナル」です。

ノードは「機能を持った材料」みたいなもので、
音声を出せる物や、画像を出せる物、アニメーション再生できる物など
色んな種類のノードがあります。
![スクリーンショット 2024-11-10 182014.png](https://docs.godotengine.org/ja/4.x/_images/introduction_editor.webp)

Godotについてもう少し知りたい方は以下の動画を見てください

<iframe width="560" height="315" src="https://www.youtube.com/embed/QKgTZWbwD1U?si=CMfAP7TLQQK7jJda" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

今回の趣旨はGodotの開発テクニックですので、Godot初心者に向けたお話になります。

## コンポーネントシステムについて

突然ですが、「継承」を使ったことがありますか？継承、便利ですよね。
攻撃力やHPを"キャラクター"から"敵"に継承させたり、他にも色々できますが...
もし、"破壊できるツボ"を"キャラクター"から継承させるときはどうしますか？

![keisyou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927524/6afd3e42-d364-2b0d-8262-0d38150ec622.png)
もちろん、攻撃力や防御力を"破壊できるツボ"に入れても使わないし、
要らない要素の塊が増えて**邪魔**になってしまいますよね？

**そんな時に使えるのがコンポーネントシステムです。**

そもそもコンポーネントシステムは何なのかというと
「独立して機能し、他の部品と組み合わせて動かすパーツ」という感じです。

「HPはHPの機能だけを持っている」「攻撃は攻撃の機能だけを持っている」といったように
これらのパーツを組み合わせることによって構築することが出来て、
要らない機能を省くことが出来ます
![konpo-nent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927524/4dfc151d-55aa-30be-706a-4a172245c623.png)

実例として、自分の作ったゲームにも取り入れています。
![スクリーンショット 2024-11-20 161428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927524/31b15b29-bf3e-1407-fd24-525f324d28ca.png)

一体化させてしまうと新しい機能を入れる時大変なことになってしまう（1敗）ので
是非活用してみましょう。

参考元として以下の動画を貼っておきます

https://youtu.be/74y6zWZfQKk?si=LM5HxHxvUHND-hC0

## 有限オートマトンについて
皆さんは敵を作る時、FSMを使っていますか？
まさかenum型の変数のみでやってたりしませんよね？

そういう時は有限オートマトン(FSM)を使いましょう！

FSMを作れると敵のバリエーションを増やしたり状態の管理ができます！

![FSM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927524/88dbf537-63e7-7487-8b82-ea273422a2c0.png)

この図だけみると難しそうに見えますが、
実は簡単に実現することができるのでおすすめです。

FSMを作るには割と工程が多いので動画を見ることを推奨します。
決して説明がめんどくさいとか説明が下手くそというわけではありません。

<iframe width="560" height="315" src="https://www.youtube.com/embed/ow_Lum-Agbs?si=T3gYMmFcCKsJ28wy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## BreakPointの存在について
これはどんなプログラミングにも重要ですが、デバッグをする時に使いましょう
使い方は「該当の処理の行の左」を左クリックすることで赤い丸が付きます。
付ける目安としては関数の中のif文やfor文に付けるといいです

![Breakponit1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927524/7d2235c3-be05-04f7-3684-915ddae76a61.png)

もしちゃんと入っていればBreakpointと表示されるので便利です。
![Breakpoint2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927524/f4016d28-6988-2af4-d7a1-cddb1f2d1cdb.png)

:::note info
printとBreakpointの使い分け
数直などを表示したい時はprintを使って、
それ以外はBreakpointを使いましょう
(理由としてはコンソールに表示する処理が無駄だから)
:::

## シェーダーについて
みなさんはシェーダーって知ってますか？
マイクラをやったことある人なら多分わかるかと思いますが、影MODがそれです。
そして一般的なゲームにもシェーダーは沢山使われています。
例をあげると"Baratro"というゲームにも至る所で使われてます。
![card_katamuki_muxout-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3927524/2d46f341-1db0-4c81-0fc1-ecbc31607599.gif)
初心者にとってこのようなシェーダーを一から作るのはとてもじゃないですが至難の業でしょう。
ですが、このようなシェーダーが作られているGodot専用サイトがあります。
そしてライセンスはCC0のシェーダーが多いです。
なので商用利用しても構わない、まじですごいサイトです。
VHS風シェーダーや64風スカイボックスもあります。

https://godotshaders.com/

自分もこのサイトにあるカードが傾くシェーダーを使ってBalatroのような
カードが傾くやつを作りました。

https://vimeo.com/1035901503?share=copy

是非活用してみてね～

## その他について
・forループなどの処理を沢山使う場合、GDExtensionを使用すること
・ダメージが入らないとき、Collision layerとMaskを確認しよう
・Moving Platformも確認しようね
・ゲーム作る時、素材に困ったらitch.ioに頼ろう

## さいごに
タイトルはドン・キホーテの目次にある題名をオマージュしたものです
今回はGodotの開発テクニックについて書きましたが、
何かの役に立つことをお祈りしています。

気になったら調べることが一番だと考えています。