Godot入門:Nodeの使い方と活用法(基底クラス)

Node解説

対象読者:Godotの基本操作を少し触ったことがある初級者の方

Nodeは、パソコンのファイルをフォルダで整理するのと同じように、ゲームの要素をまとめて管理するための土台です。プロジェクトが大きくなるほど、この整理役としての重要性が増していきます。

はじめに

Godot(ゴドー)というゲームエンジンを使い始めると、最初に「Node(ノード)」という言葉に出会います。Godotにおいて、ノードはゲームを作るための最も基本的な部品です。

「ノードって何?どう使うの?」という疑問を、この記事でゼロから丁寧に解説します。

Nodeとは?

Nodeというノード(紛らわしい言い方ですね)は、Godot 4におけるすべてのオブジェクトの「お父さん(基底クラス)」です。

Godotには Sprite2D(画像を表示する)、AudioStreamPlayer(音を鳴らす)、Camera2D(カメラ)など、さまざまな種類のノードが存在します。しかし、これらすべては内部的に Node クラスを継承しています。つまり、どんなノードも必ず Node の機能を持っているのです。

イメージ: ノードは「積み木のひとつひとつ」です。それを積み重ねてツリー(木構造)を作り、ゲームの世界が出来上がります。

シーンとノードの関係

Godotでは、ゲームの画面や仕組みを「シーン」という単位で管理します。シーンは必ず1つ以上のノードで構成されており、その構造を「シーンツリー」と呼びます。

シーンツリーのイメージ

Node(ルート)
├── Sprite2D(キャラクター画像)
├── CollisionShape2D(当たり判定)
└── AudioStreamPlayer(効果音)

このように、ノードを組み合わせることでゲームの要素を作っていきます。

Nodeクラスが持つ主な機能

Node 自体は画像を表示したり音を鳴らしたりする特別な機能は持っていませんが、すべてのノードが共通して使える便利な機能を提供しています。

1. 親子関係の管理

ノードは別のノードを「子ノード」として持つことができます。親ノードが削除されると子ノードも一緒に削除されるなど、まとめて管理できます。

# 子ノードを取得する
var sprite = get_node("Sprite2D")

# または省略記法($マーク)
var sprite = $Sprite2D

2. コールバック関数(ライフサイクルメソッド)

Nodeには、ゲームの進行に合わせて自動的に呼ばれる関数があります。

関数名呼ばれるタイミング
_ready()ノードがシーンに追加されたとき(初期化処理に使う)
_process(delta)毎フレーム呼ばれる(アニメーションや入力処理に使う)
_physics_process(delta)物理演算のフレームごとに呼ばれる

貼り付け先の準備: ①シーンツリーで対象のNodeを右クリックして「アタッチスクリプト」を選ぶ ②言語は既定のGDScriptのまま「作成」を押す ③開いたスクリプトエディタに以下のコードを貼り付ける

extends Node

func _ready():
    print("ゲームスタート!")  # シーン開始時に1回だけ実行

func _process(delta):
    print("毎フレーム実行中...")  # 毎フレーム実行

3. シグナル(イベント通知)

ノード同士がやりとりするための「シグナル」という仕組みもNodeが持つ基本機能のひとつです。ボタンを押した、エリアに入った、などのイベントをほかのノードに伝えることができます。(シグナルについては別記事で詳しく解説します)

Nodeをそのまま使うケースとは?

Node 単体は見た目を持ちません。では、どんなときに Node をそのまま使うのでしょうか?

主な用途は「グループ分けや管理用のコンテナ」としてです。たとえば、複数のUI要素をまとめたいとき、あるいはゲームロジックだけを管理するスクリプト置き場として Node を使います。

  • RPGなら、「戦闘シーン」用のNodeと「街シーン」用のNodeを分けて、それぞれの下に必要なノードをまとめる
  • パズルゲームなら、「ステージ1」「ステージ2」のようにステージごとに1つのNodeを作り、その中にギミックや配置物をまとめる
  • アクションゲームなら、「敵管理」「アイテム管理」のように役割ごとにNodeでグループ化する
Node(UIマネージャー)← 見た目なし、管理だけ
├── Label(スコア表示)
├── Label(ライフ表示)
└── Button(メニューボタン)

よくある質問:似たノードとの違い

Q. NodeとNode2Dは何が違う?
A. Nodeは位置(座標)を持たない管理用のノードです。画面のどこかに何かを配置したい場合は、位置情報を持つNode2Dを使いましょう。

まとめ

項目内容
Nodeとはすべてのノードの基底クラス
主な機能親子関係、コールバック、シグナル
Nodeをそのまま使う場面グループ管理や論理処理のコンテナとして

Godotを使い始めたばかりの方にとって、Nodeの概念を理解することが最初の関門です。しかし一度理解できると、Sprite2DCharacterBody2D も「結局はNodeの一種なんだ」とすっきり見えてきます。ただ、このNodeひとつだけですべてを理解しようとするのではなく、いろいろなノードを使ってみることで感覚がつかめてくるものになります。まずは気軽に別のノードに触れてみましょう。

次回は、2Dゲームの基本となる Node2D について解説します。お楽しみに!


関連性の高いノード解説記事

インスペクターのプロパティ解説(上級者向け)

以下は非常にマニアックな説明です。初心者向けではありませんが、気になる方のために記載します。もともとの初心者向けページとは趣旨が異なりますので、ご了承ください。

Process > Mode

_process/_physics_processの実行タイミングを制御します。Inherit=親に従う、Pausable=ポーズ中は停止、When Paused=ポーズ中のみ実行、Always=常に実行、Disabled=常に停止です。ポーズメニュー表示中もUIだけ動かしたい場合などに使います。

Priority

同じフレーム内で複数ノードの_process呼び出し順序を制御する値です。数値が小さいほど先に処理されます。入力を受け取るノードを先に処理したい、など処理順序に依存関係がある場合に調整します。

Physics Priority

_physics_processが呼ばれる順序を制御する値です。考え方はPriorityと同じで、数値が小さいほど先に処理されます。物理演算の処理順序を細かく調整したい場合に使用します。

Thread Group

そのノードの処理をどのスレッドで実行するかを指定する設定です。Inherit=親のスレッドグループに従う、Sub Thread=専用のサブスレッドで実行、といった選択肢があります。重い処理を別スレッドに逃がして負荷分散したい場合に使いますが、スレッドセーフでない処理を書くと不具合の原因になるため上級者向けの機能です。

Physics Interpolation

物理フレームレートと描画フレームレートが異なる場合に、動きを滑らかに補間表示するための設定です。Inherit / On / Offから選べます。物理演算で動くオブジェクトのカクつきが気になる場合にOnにすると改善することがあります。

Auto Translate > Mode

ノードのテキストを自動翻訳の対象にするかを制御する設定です。Inherit / Always / Disabledから選べます。多言語対応(ローカライズ)のプロジェクトで、翻訳対象外にしたいノードがある場合に使用します。

Editor Description

エディタ上にのみ表示されるメモ欄です。ゲームの実行結果には影響せず、そのノードの役割や注意点をチームメンバー向けに書き残しておくためのフィールドです。

Script

このノードにアタッチされているスクリプトファイルを表示・設定する項目です。<空>の場合はスクリプトが付いていないことを意味し、ここから新規スクリプトの作成やアタッチも行えます。

コメント