lvncerpedia

ここ理解するとかなり「ゲーム開発の設計」っぽくなる。 しかも君Webエンジニアだから、たぶんこの辺かなりハマる。

まず大前提

Godot は Scene を組み合わせて作るエンジン。

つまり

Scene = 再利用可能な部品

でもある。

小さい例

例えば Enemy.tscn 作る。

中身:

Enemy
├── Sprite
├── Collision
└── HPBar

instantiateすると

Enemy A
Enemy B
Enemy C

が作れる。 つまり

Scene = 設計図

Instance = 実体

Reactで例えると

Scene

function Enemy() {}

Instance

<Enemy />
<Enemy />
<Enemy />

図で見る

Enemy.tscn
    ↓ instantiate()
----------------------
Enemy Instance #1
Enemy Instance #2
Enemy Instance #3

Godotで超重要

「全部Scene化する」くらいでちょうどいい。

例えば監視ゲーム

MonitorPanel.tscn
CameraButton.tscn
WarningPopup.tscn
ReportWindow.tscn

全部Scene。 それを組み合わせる

MainGame.tscn
├── MonitorPanel
├── WarningPopup
└── ReportWindow

かなりComponent設計っぽい

大きめプロジェクトの構造

かなりよくあるのはこんな感じ。

game/
├── scenes/
│   ├── title/
│   │   ├── title.tscn
│   │   └── title.gd
│   │
│   ├── game/
│   │   ├── game.tscn
│   │   └── game.gd
│   │
│   ├── ui/
│   │   ├── monitor_panel.tscn
│   │   ├── monitor_panel.gd
│   │   ├── warning_popup.tscn
│   │   └── warning_popup.gd
│   │
│   ├── entities/
│   │   ├── enemy.tscn
│   │   ├── enemy.gd
│   │   ├── npc.tscn
│   │   └── npc.gd
│   │
│   └── effects/
│
├── scripts/
│   ├── managers/
│   │   ├── game_manager.gd
│   │   ├── save_manager.gd
│   │   └── audio_manager.gd
│   │
│   ├── utils/
│   │   └── helpers.gd
│   │
│   └── data/
│
├── assets/
│   ├── images/
│   ├── audio/
│   └── fonts/
│
├── data/
│   ├── anomalies.json
│   └── levels.json
│
└── addons/

ポイント

scenes/ = 「見えるもの」

scripts/ = 共通ロジック

assets/ = 素材

data/ = JSONとか

君向けにかなり重要

Godotは 「Scene主導」で作ると強い。

例えば悪い例

巨大なmain.gd 全部書く。

良い例

CameraPanel Scene
WarningPopup Scene
Clock Scene

分割。

Sceneを分けるメリット

  • 再利用できる
  • テストしやすい
  • instantiateで量産できる

例えば

var popup = preload(
    "res://scenes/ui/warning_popup.tscn"
).instantiate()

add_child(popup)

これ何してる?

warning_popup.tscn
↓
実体化
↓
現在Sceneに追加

してる。

Node / Scene / Instance の関係

ここ超大事。

例えば

Enemy.tscn
└── Enemy(Node)
    ├── Sprite
    └── HPBar

instantiateすると

GameScene
├── Enemy Instance
├── Enemy Instance
└── Enemy Instance

Scene自体もNode

ここGodot独特。 つまり:

Scene
↓ instantiate
Nodeになる
↓
他Sceneに入る

だから Godo tは「Sceneをネストする」設計になる。

Webっぽく言うと

かなり Component tree。

君かなり向いてると思うのが

今もう:

  • component分割
  • tree構造
  • attach
  • instantiate

を自然に理解し始めてる。 これGodotの本体にかなり近い。