🎮

Unity 使いのための Godot 入門メモ

に公開

Unity 使いのための Godot 入門メモ

Unity で培った感覚を Godot 4 系にスムーズに移植するための対比リファレンス
項目名は Unity 側の用語で統一し、右に Godot の対応概念を示します。


1. 基本レイヤ

Unity Godot 4 備考
GameObject / Component Node(単一クラスが両者を兼ねる) Node はツリー上の単位。複数スクリプトをアタッチする発想はなく、継承で機能を増やす。
Prefab PackedScene (.tscn) インスタンス化は packed.instantiate() / 親へ add_child().
Scene (階層の保存) Scene (.tscn) Unity の Prefab+Scene を兼ねる。エディタ上で分割自由。
MonoBehaviour Script (GDScript / C# / C++) 1 Node=1 スクリプトが原則。
SerializeField @export var value インスペクタ公開。初期値を付ける場合は = 10.
[Header] / [Tooltip] @export_category("Header") / @export_description("text") 4.2 以降の GDScript 注釈。C# は Export(PropertyHint.None, "説明").
ScriptableObject Resource (.tres / .res) 独立データ資産。Resource.new()/ロードは load().
Singleton (DontDestroyOnLoad) Autoload (Project Settings → AutoLoad) グローバル変数・シングルトンの登録場所。

ポイント:

  • Prefab(Unitu)≒Scene(Godot)だが、Unityでよくある「シーン上でprefabいじって、良さげになったからApplyして全箇所に反映」みたいなことはできないので注意

2. ライフサイクル対応

Unity Godot 4
Awake() _enter_tree() (ツリー追加直後)
OnEnable() _ready() 内で visible = true など
Start() _ready() (全子ノードが揃った後)
Update() _process(delta)
FixedUpdate() _physics_process(delta)
OnDestroy() _exit_tree()
コルーチン (StartCoroutine) await (asyncキーワードはない)

ポイント:

  • コルーチンはC#のように外側からキャンセルする仕組みがないので注意
    • アニメーションで割り込みとかキャンセルを手軽に実現するなら Tween を使うと良いゾイ
    • issueでも議論されてたしそのうち実装されそう。
  • Godot の _ready() は「子を含めた初期化」が完了した時点で 1 回だけ呼ばれる
  • ウィンドウのサイズ変更初期化などは_enter_tree()で書くのが無難
    • 各コンポーネントのレイアウトが決定される前に実行する必要があるため

3. インスタンス生成と参照渡し

Unity

var go = Instantiate(prefab, parent);

Godot

@export var enemy_scene: PackedScene

func spawn_enemy():
    var e := enemy_scene.instantiate()
    add_child(e)              # 親ノードへ追加
    e.global_position = Vector2(100, 100)
  • インスペクタで enemy_scene.tscn をドラッグすれば Prefab と同じ感覚で差し替え可能です。
  • var e := enemy_scene.instantiate() as Enemy みたいにキャストも効きます。ルートノードのスクリプトが取れる。

4. シリアライズと Inspector

  • 外部参照・定数公開は @export
  • Node 参照をドラッグでセットしたい場合:
    @export var target: Node2D
    
  • SerializeReference のようなポリモーフィズムを持つ特性は Variant(動的型)で表現できますが、型安全を求める場合は RefCounted 基底クラスを自作し登録するのが一般的です。

5. イベント/シグナル

Unity Godot 4
C# event / UnityEvent / SendMessage Signal (signal hit(damage))
インスペクタでコールバックを紐づけ エディタの Node タブ → Signals で接続
OnCollisionEnter body_entered シグナル

Godot の signal はネイティブでスレッドセーフ&非同期発火可能。


6. Input システム

  • Unity Input ManagerProject Settings → Input Map でアクション名を定義。
  • コード側は物理キーを参照せず Input.is_action_pressed("jump") を使用
  • 新 Input System 相当のリバインド UI は InputMap のランタイム編集で実装可能

7. コルーチンと非同期

Unity Godot 4
StartCoroutine(MyRoutine()) await MyRoutine() / yield(signal)
WaitForSeconds(1) await get_tree().create_timer(1.0).timeout
DOTween / LeanTween などの簡易 Tween create_tween().tween_property(...)

Godot の Tween はシーケンス API が標準搭載。SceneTreeTimer と組み合わせれば大半のコルーチンワークは置き換え可能です。


8. UI システム

対応はあるけどGUI側での設定に慣れるまでちょっと大変だと思いますが
Godotは各種便利Nodeがあり、例えばItemListは「スクロール+グリッドレイアウト配置+トグルボタン」がセットになっており、そのままアイテム一覧に使えて便利です。

  • RectTransformControl ノード
    • アンカー・マージン概念は同じ。九分割 GUI も PanelStyleBox で表現。
  • CanvasCanvasLayer(2D)/Viewport(3D 表示を 2D に合成)
  • ScrollRectScrollContainer
  • Layout GroupBoxContainer / GridContainer / FlowContainer

9. Physics

Unity Godot 4
Rigidbody / Rigidbody2D RigidBody3D / RigidBody2D
Collider / Collider2D CollisionShape3D / 2D
PhysicsMaterial PhysicsMaterialResource
Physics.Raycast direct_space_state.intersect_ray

物理層のビットマスクは collision_layercollision_mask の 2 値で設定します。


10. アセット管理

Unity Godot 4
Asset Database, GUID リソースパス (res://…) が ID そのもの
Addressables ResourceLoader.load_async() + 自前キャッシュ
AssetBundle Pck パッケージ (--export-pack)
Unity Package Manager (UPM) Asset Library / git submodule + add_subfolder
  • pckはまだ使ってないしパフォーマンスとか調べられてないです。
  • Asset Libraryは全然充実してない、ほぼツールしかないっす。
    • UI画像とか3Dモデルは別のサイトで探すしかない
    • Itch.ioとか使ってみたい

11. ビルドとデプロイ

  • Editor → Project → Export でプリセット作成。Unity における Build Settings 相当。
  • コマンドラインビルドもできる。 godot --export-release "PresetName" build.exe
  • Steam配信は生成物を depot に突っ込めば完了(詳細は Steamworks ドキュメント参照)。

12. Tips for Smooth Migration

  1. コンポーネント指向との違いに注意する
    • Godot はスクリプト継承/シグナル(イベント駆動)が基本
      • そもそも1Nodeに1スクリプトしかアタッチできない。
  2. Autoload を早期に設計
    • シングルトンを作りたい場合、プロジェクト設定側で設定できる。
    • Globalでスクリプトを選ぶと 勝手にインスタンスが作られてDontDestroyOnLoadされるイメージ。その後Staticで各種関数を呼び出せる。
  3. GDScript を触る
    • C# だけでも開発可能ですが、サンプルやプラグインは大半が GDScript 製。
    • ゲームロジックを書くことに集中できて、個人的にかなり好みです。
    • まぁC#も4系から.Net(8.0)になったし mono時代より食指が伸びるけど、、

以上

Discussion