【Godot 4.0】スマホ３Dゲームを作るための勉強　その１６　ゲームシステムを作る　その１　シーンとファイル構成を整理する

　ゲームエンジンGodot4.0で3Dスマホゲームを作りたいと思いますが、その前にお勉強しています。
　2023/3/1にstable版がリリースされました。
 [Godot_v4.0-stable_win64.exe.zip](https://godotengine.org/download/windows/)を使用しています。

# 目的
　ゲームシステムをつくりたいとおもいます。
　その前にシーン構成とファイル構成を整理します。

# ベースプロジェクト
　下記で作成したプロジェクトをベースに機能追加をします。
　【Godot 4.0】スマホ３Dゲームを作るための勉強　その１５　Playerをデザインする。アニメーションも。
　https://qiita.com/FootInGlow/items/4ed492ba96645ddfca1c
　
　github(Godotのプロジェクトマネージャーからインポートして利用できます）
　https://github.com/footinglow/Godot4/tree/main/02_study/S15_CharacterDesign_Player

# ブランチをまとめてシーンにする
 global.tscnを整理します。

## Playerシーンを作成する
　Playerブランチをシーンにします。

　res://global.tscnを開きます。
　Playerノードを右クリックして、「ブランチをシーンとして保存」を実行します。
　![スクリーンショット (94).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/2be1a1e6-911c-1bb0-3aa8-1aab55ad2c38.png)
　ファイル名とディレクトリを確認して、保存します。
![スクリーンショット (95).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/59d5b5db-1d1a-57a8-c724-d468de566ab0.png)
保存されました。
![スクリーンショット (96).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/f201ebd5-33a6-a007-7a7c-bb4f781c1b6e.png)

## StaticBody3DをGroundシーンとして保存する
　StaticBody3DをGroundに名称変更しましょう。
　Groundをシーンとして保存します。
![スクリーンショット (97).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/45927d59-d4f0-4a1e-3e4a-1bd210b42d7d.png)
ファイル名と保存先を確認して、保存します。
![スクリーンショット (99).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/b4afc442-a1dd-24c3-ee49-10ec7837cb59.png)
保存されました。
![スクリーンショット (98).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/681baf9a-5236-77a4-045b-17227fc76993.png)

　global.tscnがすっきりしましたね。
![スクリーンショット (100).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/16e0ee6e-5a99-9e67-8a2a-cd528101ed6a.png)

## global.tscnについての考察とstage001.tscnへの名称変更
　今回のゲームは敵の砦(Enemyシーン)をすべて破壊するとステージクリアです。逆に敵ソルジャー(EnemyBullet)がPlayerの陣地までくるとゲームオーバーです。
　ステージをクリアすると次のステージに切り替わります。敵の砦の数、位置や障害物の配置など変化します。
　そうするとglobal.tscnのうち変化しそうなのは、Enemy、Enemy2だけのようです。

　ただステージを設計するときにPlayerやGroundもそろっていると、ステージデザインをGodotのエディターで編集しやすいメリットがあります。そうするとCamera3DとDirectionalLight3Dもあるとうれしいですね。

　編集しやすいメリットを優先して、global.tscnはそのままひとつのステージの構成要素にします。
　stage001.tscnに名称を変更します。
![スクリーンショット (101).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/8450b0fc-62c4-333f-8805-4d88fca4889e.png)
　「stage001.tscn」に変更します。
![スクリーンショット (102).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/e7f79106-bc69-98af-4077-970db8442353.png)
　変更されました。
![スクリーンショット (103).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/2141ff77-7c88-0fbd-c961-0521538549ab.png)
「stage001.tscn」を開いて、ルートノードの「global」を「Stage」に変更します。
![スクリーンショット (105).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/8ad796ee-dbd8-06be-79d1-f8044296cf3b.png)

　保存します。

## GameSystemノードの作成とファイル整理
　GameSystemシーンを作成します。
　GameSystemシーンはゲームの開始終了やステージの入れ替えなど管理するので、res://stage001.tscn(先ほどglobal.tscnから名称変更したばかり）に代わり、メインシーンとしてプロジェクトに設定します。

# GameSystemシーンを作成する
　シーンメニューの新規シーンを実行します。３Dシーンボタンを押下するとNode3Dがルートノードとして追加されます。
　「GameSystem」に名称を変更します。
　子ノードとしてNode3Dを追加してください。
　名称を「CurrentStage」に変更します。
　![スクリーンショット (106).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/57369851-3ec5-1298-ac33-2e86b46a7d32.png)
　res://stage001.tscnをシーン内の「CurrentStage」にドラッグアンドドロップします。
![スクリーンショット (109).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/68e791b8-1ffe-00ac-8172-9260c66d6644.png)
　Stageという名前で子ノードとして追加されました。
![スクリーンショット (111).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/959b393f-2119-561d-d967-feb8db7c59fe.png)
　保存します。game_system.tscnという名称になります。

　game_system.tscnをメインシーンにします。
　プロジェクトメニューからプロジェクト設定を実行します。
　「アプリケーション/実行」にある「メインシーン」をgame_system.tscnに変更します。
![スクリーンショット (112).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/9b0c6bf3-f644-6149-1c86-353b6dd57591.png)

　保存して実行しましょう。今までと同じように動作すると思います。

:::note
ファイルシステムやシーン構成変更の作業時はまめに保存しましょう。
ファイルを保存せずに移動するとエラーがでてよくわからない状態になります。
:::

# ファイルシステムを整理する。
　ファイルシステムを整理しましょう。

## ディレクトリの作成
|ディレクトリ名|役割|
|:-|:-|
|Characters|プレイヤー、敵の砦、戦士たちなど|
|Design|デザインシーン|
|StageItems|Stageを構成する地面や障害物などのアイテム|
|Stages|ステージデータ。名称はStage＋数字|

　Characters、StageItems、Stagesの３つのフォルダを作成します。
　（Designフォルダはすでにあるはず）
![スクリーンショット (113).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/988b4927-f7c0-247d-014f-170e945cd28e.png)
フォルダ名を入力します。
![スクリーンショット (114).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/89b70b01-dae7-3550-aaf2-908fca5cea64.png)

　3つフォルダを追加するとファイルシステムは下記のようになります。
![filesystem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/49d7e85c-a555-3110-5d4d-07eca566d0bc.png)

:::note
　新規に追加したフォルダに合わせて、「Design」フォルダを「Designs」に変更したところアプリケーションが起動しなくなりました。ファイルに移動は対応していそうですが、フォルダ名変更には対応していないのかもしれません。
:::

## ファイルの移動
　ファイルを移動しましょう。

:::note
　シーンファイルをドラッグアンドドロップすると以下のようなAlertが表示されます。
　そのあと動作確認すると正常に動作しているようですが、心配なので作業前後で環境を保存しておきましょう。
![スクリーンショット (118).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/4b29e496-e4b8-684e-a312-c24c3979146c.png)
:::
　Charactersに移動するファイルをCtrlキーを押しながらクリックして選択して、Charactersディレクトリにドラッグアンドドロップします。

　・bullet.gd
　・bullet.tscn
　・Enemy.gd
　・enemy.tscn
　・Enemybullet.gd
　・Enemybullet.tscn
　・Player.gd
　・player.tscn
![drag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/5e4503df-04aa-a302-51f7-c86fbb46b025.png)


　res://ground.tscnは「res://StageItems/」にドラッグアンドドロップします。
　res://stage001.tscnはres://Stages/にドラッグアンドドロップしましょう。

　Designフォルダ以外を開いて表示しました。
　このような形になったでしょうか？
![スクリーンショット (120).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/283c699e-5701-e45e-42dc-26a743ba203c.png)

　以上です。