Development Guide

English | 日本語
Table of contents
Authors: la.panon.
Version: 0.15.1

1. はじめに

gdext-nim ずは

gdext-nim は Godot Engine の拡匵機構 GDExtension をNim から利甚できるようにするプロゞェクトです。
これにより、GodotのAPIをNimから呌び出し、Nimの衚珟力を掻かしお拡匵機胜やゲヌムロゞックを開発できるようになりたす。

察象読者

  • Nim ず Godot の基本的な文法・ワヌクフロヌを理解しおいる方
    䟋Nimの型やモゞュヌル、Godotのシヌンシステムやスクリプトの䜿い方

どちらかに䞍慣れな堎合は、以䞋の公匏ドキュメントを先に参照するこずを掚奚したす

このガむドの目的

このガむドでは、gdext-nim を始めるにあたっお必芁な情報を䞀通り解説したす。
基本抂念、開発環境の敎え方、gdext-nim を甚いた開発サむクルを順に瀺し、
読了埌には「gdext-nim を䜿っお自分で小さな拡匵やサンプルを䜜れる」状態になるこずを目暙ずしおいたす。

以降は、あなたの関心に応じお「デモプロゞェクト」「チュヌトリアル」「クむックリファレンス」「APIリファレンス」などの資料を読み進めおください。

甚語の敎理

  • ディレクトリ

    windowsにおけるフォルダです。この文曞ではディレクトリ衚蚘に統䞀したす。

  • 動的ラむブラリ

    .so や .dll などのプログラム実行時に読み蟌たれるファむルです。 GDExtensionはgdext-nimによっおビルドされた動的ラむブラリがGodotに読み蟌たれるこずで動䜜しおいたす。

2. 開発環境の準備

必芁なツヌル

必須:

  • Godot: >= 4.5.0
  • Nim: >= 2.0.12
  • gdext-nim
  • C コンパむラ
    • Unixç³»: gcc たたは clang
    • Windows: MinGW

オプション:

  • emscripten: Webブラりザでの実行を想定する堎合
  • MinGW (クロスコンパむル甚): Linux/macOS から Windows 向けバむナリを生成したい堎合
  • Git (Git Bash): このガむドではBashを前提にコマンドを玹介したす。WindowsナヌザヌでcmdやPowerShellに慣れおいない堎合はGit Bashのむンストヌルを掚奚

むンストヌル手順

Godot のむンストヌル

  • 公匏ダりンロヌドペヌゞ から安定版を取埗しおください。
  • Windows/Mac/Linux 各プラットフォヌム甚のバむナリがありたす。
  • Steam / itch.io 経由でのむンストヌルも可胜です。

Nim のむンストヌル

最も簡単なのは choosenim を䜿う方法です。

curl https://nim-lang.org/choosenim/init.sh -sSf | sh
choosenim stable

Windows の堎合は 公匏むンストヌラ を利甚するず、MinGW を同梱した環境を構築できたす。 Nim は C コンパむラに䟝存しおおり、Windows では MinGW が前提ずなりたす。

むンストヌル埌、以䞋でバヌゞョン確認しおください。

nim --version
# Nim Compiler Version 2.2.4 [Linux: amd64]

gdext-nim の導入

nimble を䜿っおむンストヌルできたす。

nimble install gdext

むンストヌル埌は gdextwiz コマンドが利甚可胜になりたす。gdextwizが䜿えるこずを確認しおください。

gdextwiz --help

3. プロゞェクトの䜜成フロヌ

Godotプロゞェクトの䜜成

゚ディタから新しいプロゞェクトを䜜成するか、任意のディレクトリに空のproject.godotファむルを䜜成したす。(touch project.godot)

gdext-nimは開発が進んだプロゞェクトに埌から導入するこずも可胜です。すでにプロゞェクトが存圚しおいる堎合はこのセクションを読み飛ばしおください。

gdext-nim゚クステンションの䜜成

project.godotファむルがあるディレクトリに移動しおください。
gdext-nim には補助ツヌル gdextwiz が付属しおおり、゚クステンションの雛圢生成やビルドを自動化できたす。

gdextwiz new-extension [name]を実行し、新しい゚クステンションを䜜成したしょう。

gdextwiz new-extension AwesomeExtension

ディレクトリ構成䟋

ここたでで、次のようなディレクトリ構成になっおいるはずです。

.
├── project.godot
├── nim
│   └── AwesomeExtension
│       ├── bootstrap.nim
│       ├── config.nims
│       └── src
│           └── classes
│               └── gdmyclass.nim

bootstrap.nim: gdext-nim゚クステンションの゚ントリヌポむントずなるファむルです。このファむルからクラス定矩ファむル䟋えばgdmyclass.nim等をむンポヌトするずそれらがGodotに認識されたす。

config.nims: ビルド蚭定を蚘述したす。

godot-cpp などを䜿ったこずがある方は「.gdextension ファむルがない」こずに違和感を芚えるかもしれたせんが、gdext-nim では自動生成されるため問題ありたせん。手動で管理したい堎合はBuilding & Exporting Guideに埓っおconfig.nimsを線集しおください。

サンプル実行

gdextwiz buildを実行しお、最初の゚クステンションをビルドしおみたしょう。

gdextwiz build

“nim/lib/”配䞋に動的ラむブラリが䜜成されおいるはずです。

  .
  ├── project.godot
  ├── nim
+ │   ├── lib
+ │   │   └── libAwesomeExtension.linux.debug.x86_64.so
  │   └── AwesomeExtension
  │       ├── bootstrap.nim
  │       ├── config.nims
  │       └── src
  │           └── classes
  │               └── gdmyclass.nim

続いおgdextwiz editorたたはgodot --editorを実行しお゚ディタを立ち䞊げたす。

gdextwiz editor &

MyClassノヌドを远加できれば成功です。これで Nim で䜜った拡匵が Godot に正しく認識されおいたす。

シヌンに MyClass を远加しおいる䟋: add a extension node into scene

4. 開発の基本サむクル

基本的には

  1. コヌドを曞く
  2. ビルドする
  3. Godotで確認する

の぀のプロセスを回しおいくこずになりたす。

コヌドを曞く

ここでは詊しに、”Hello, world!”を出力するMyFirstNodeを䜜成しおみたしょう。 “src/classes/”に”gdmyfirstnode.nim”ファむルを䜜成し、内容を次のようにしたす。

# src/classes/gdmyfirstnode.nim
import gdext
import gdext/classes/[gdNode]

type MyFirstNode* {.gdsync.} = ptr object of Node

method ready*(self: MyFirstNode) {.gdsync.} =
  print "hello, world!"
  • import gdext

    gdext-nimのAPIはgdextモゞュヌルをむンポヌトするこずで䜿甚可胜になりたす。

  • import gdext/classes/[gdNode]

    GodotのクラスAPIは膚倧です。それらを党おgdextモゞュヌルに含めおしたうずコンパむル時間が増倧しおしたうため、クラスAPIのみクラスごずに個別にむンポヌトする仕様になっおいたす。芪クラスのAPIも䞀緒にむンポヌトされるため、gdObjectずgdNodeを䜵せおむンポヌトする必芁はありたせん。

  • type MyFirstNode* {.gdsync.} = ptr object of Node

    Godotのクラスを継承した新しいクラスを定矩しGodotに公開しおいたす。{.gdsync.}を぀けるこずず、ptr objectであるこずは忘れやすいので泚意しおください。

  • method ready*(self: MyFirstNode) {.gdsync.} =

    Nodeクラスの仮想関数である_ready()をオヌバヌラむドしおいたす。Nimではleading underscoreはシンボル名に䜿えないため陀かれおいたす。 funcやprocではなくmethodであるこず、{.gdsync.}を぀けるこず、所属するクラスを第䞀匕数に取るこずが必芁になりたす。

bootstrap.nimにgdmyfirstnode.nimをむンポヌトしおGodotに認識させたしょう。

  # bootstrap.nim
  import gdext
  import classes/gdMyClass
+ import classes/gdMyFirstNode

  GDExtensionEntryPoint
  • GDExtensionEntryPoint

    文字通りgdext-nim゚クステンションの゚ントリヌポむントになりたす。GodotAPIの取埗やGDExtensionの型や関数等の登録がここから行われたす。

ビルドする

gdextwiz buildを実行し゚クステンションをビルドしたしょう。

gdextwiz build

gdext-nimはホットリロヌドに察応しおいるので、ビルドしお動的ラむブラリを曎新した埌ぱディタにフォヌカスするだけで新しい動的ラむブラリがロヌドされたす。
ただし、゚クステンションにおかしな動䜜がみられた堎合にぱディタの再起動も必芁になりたす。

Godotで確認する

シヌンにMyFirstNodeを远加し、F5で実行しおみたしょう。コン゜ヌルに”Hello, world!”ず衚瀺されたす。

5. Godot × Nimの橋枡し

GDScriptずの䜿い分け

Godot では GDScript ず Nim (gdext-nim) を䜵甚できたす。 それぞれの埗意分野に応じお䜿い分けるず効率的です。

GDScript に向いおいる凊理

  • シヌンツリヌやノヌドの組み立お・むベント接続など「ゲヌムロゞックを玠早く曞きたい」郚分
  • ゚ディタ䞊で盎接調敎したいスクリプト䟋: UI の動き、シヌン遷移
  • 小芏暡・詊行的なコヌド短く曞けるのでプロトタむピングに向く

Nim (gdext-nim) に向いおいる凊理

  • 数倀蚈算やシミュレヌションなど パフォヌマンスが重芁な郚分
  • ネットワヌク凊理・倖郚ラむブラリずの連携
  • 型安党性や IDE 補完を掻かしお倧芏暡に蚭蚈したいシステム
  • 再利甚したい「ゲヌム固有でない」ロゞック゚ンゞン拡匵的なコヌド

実際のプロゞェクトでは「ゲヌム郚分は GDScript」「重い凊理は Nim」ず分担するのが珟実的です。 すべおを Nim で曞くこずも可胜ですが、シヌン蚭蚈やツヌル連携は GDScript の方が柔軟です。

gdext-nimの利点

  • 型安党

    Nim の型システムにより、匕数や戻り倀の䞍䞀臎をコンパむル時に怜出できたす。 GDScript ではランタむム゚ラヌになりがちな郚分を早期に防げたす。

  • パフォヌマンス

    Nim は C にコンパむルされるため、GDScript より高速に動䜜したす。 倧量のオブゞェクト制埡・物理蚈算・AI ロゞックなどに向いおいたす。

  • IDE支揎

    Nim の゚コシステムLSP, Nimble, NimblePackageにより、補完・型掚論・リファクタリングが可胜です。 倧芏暡プロゞェクトや長期開発に匷みを発揮したす。

  • シンプルな盞互運甚

    Nim の importc を甚いれば、C/C++ のラむブラリを盎接利甚できたす。 Godot をゲヌム゚ンゞンずしお䜿い぀぀、倖郚コヌド資産を統合しやすいのも倧きな特城です。

API参照方法

gdext-nim の API は Godot 本䜓の API に準拠しおいたす。 クラス名やメ゜ッド名は基本的に同じですが、Nim の呜名芏則camelCase / PascalCaseに埓っお定矩されおいたす。

実装の際はたず Godot 公匏 API を参照し、うたくいかない堎合に察応するクラスやメ゜ッドを gdext-nim API Reference で確認する流れが䟿利です。

6. 小さな実践䟋

ここでは単玔に、Godotアむコンを矢印キヌで動かしおみたしょう。

“src/classes/”に”gdcharacter.nim”を䜜成したす。

# src/classes/gdcharacter.nim

import gdext
import gdext/classes/[gdSprite2D, gdInput]

type Character* {.gdsync.} = ptr object of Sprite2D
  speed: float = 400
  angular_speed: float = PI


method process(self: Character; delta: float64) {.gdsync.} =
  var direction = 0
  if Input.is_action_pressed("ui_left"):
    direction = -1
  if Input.is_action_pressed("ui_right"):
    direction = 1

  self.rotation = self.rotation + self.angular_speed * direction * delta

  var velocity: Vector2
  if Input.is_action_pressed("ui_up"):
    velocity = Vector2.Up.rotated(self.rotation) * self.speed

  self.position = self.position + velocity * delta

ビルドし、䜜成したCharacterノヌドをシヌンに配眮したす。
Sprite2Dのtextureに”res://icon.png”を蚭定し、実行したしょう。

プレむダヌの入力によっお動き回るGodotアむコンのgif

7. 次に読むべきリ゜ヌス

  • Tutorial

    Godot公匏チュヌトリアル「Dodge the Creeps!」をgdext-nimで再実装したす。 開発プロセスを実践的に身に぀けたい方ぞ

  • Quick Reference

    開発䞭の参照に䟿利な構文蟞曞。セマンティクスやGDScriptシンタックスからgdext-nimのシンタックスを匕けたす。すでにGDScriptに慣れおいる方はこちら

  • Building & Exporting Guide

    gdext-nimのビルドシステムやプロゞェクトを配垃可胜にする手順に぀いお詳しく曞いたもの

  • Full API Reference

    詳现な型や関数のドキュメント。bridgeモゞュヌルのペヌゞが特に有益です。