最終確認日

SwiftGodotTemplateを使ってみる

SwiftGodotTemplate とは

SwiftGodotTemplate は、SwiftGodot の拡張機能(GDExtension)を開発する際のスタータープロジェクト。

SwiftGodotを使ったSwiftPackageを編集後、Godotエディタでボタンを押すと、SwiftPackageを再コンパイルして、Godot側で実行できるようになる。

クローンする

// 配置したいフォルダに移動
$ cd Godot

// クローンする
$ git clone https://github.com/elijah-semyonov/SwiftGodotTemplate

フォルダ構成

tree で確認。

.
├── addons
│   ├── swift_godot_editor_plugin
│   │   ├── plugin.cfg
│   │   ├── swift_godot_editor_plugin.gd
│   │   ├── swift_godot_editor_plugin.gd.uid
│   │   ├── swift_godot_logo.svg
│   │   ├── swift_godot_logo.svg.import
│   │   ├── swift_godot_plugin_panel.gd
│   │   ├── swift_godot_plugin_panel.gd.uid
│   │   └── swift_godot_plugin_panel.tscn
│   └── swift_godot_extension
│       ├── swift_godot.gdextension
│       └── swift_godot.gdextension.uid
├── LICENSE
├── project.godot
├── readme_resources
│   └── screenshot.png
├── README.md
├── resources
│   └── images
│       ├── app_icon.png
│       └── app_icon.png.import
└── swift_godot_game
    ├── Package.swift
    ├── Sources
    │   └── SwiftGodotGame
    │       └── SwiftGodotGame.swift
    └── Tests
        └── SwiftGodotGameTests
            └── SwiftGodotGameTests.swift

Godotでひらく

project.godot を開く。

SwiftGodotTemplateを使ってみる-1754371024167

AssetLib の横に SwiftGodotのタブがあり、その中に Rebuild ボタンがある。

押すとGodotが再起動する。

SwiftPackageを編集してみる

Package.swiftXcodeで開く。

package 'swift_godot_game' is using Swift tools version 6.1.0 but the installed version is 6.0.0

自分のSwiftバージョンのが低かったので Package.swift// swift-tools-version: 6.16.0 に下げた。

チュートリアルの通りに編集

SwiftGodotのチュートリアルの通りに編集してみる。

SwiftGodotGame.swift に以下を追記

SwiftGodotGame.swift
import SwiftGodot

#initSwiftExtension(cdecl: "swift_entry_point", types: [
    PlayerController.self
])

PlayerController.swift を新しく作成

PlayerController.swift
import SwiftGodot

@Godot
class PlayerController: CharacterBody2D {

    var acceleration: Float = 100
    var friction: Double = 100
    var speed: Double = 200

    
    var movementVector: Vector2 {
        var movement = Vector2.zero
        movement.x = Float(
            Input.getActionStrength(action: "move_right") - Input.getActionStrength(action: "move_left"))
        return movement.normalized()
    }

    override func _physicsProcess(delta: Double) {
        if Engine.isEditorHint() { return }
        if movementVector != .zero {
            let acceleratedVector = Vector2(x: acceleration, y: acceleration)
            let acceleratedMovement = movementVector * acceleratedVector
            self.velocity = acceleratedMovement.limitLength(speed)
        } else {
            velocity = velocity.moveToward(to: .zero, delta: friction)
        }
        self.moveAndSlide()
        super._physicsProcess(delta: delta)
    }

}

このあと、本当は swift build を行ったあと、生成された dylibGodotプロジェクト側に配置する必要があるが、先ほどの Rebuild ボタンを押すだけでそれらが行われるはず。

SwiftPackageXcode上でビルドできるようになっている必要があるわね。

エラーが出た

/var/folders/d2/kg5523_10ds11370fqsw6nmr0000gn/T/swift-generated-sources/@_swiftmacro_14SwiftGodotGame0025SwiftGodotGameswift_jqFBgfMX2_0_33_40CB91EEAC290E0CA201CE3F4EFC4B26Ll04initA9ExtensionfMf.swift:1:42 Invalid redeclaration of 'enterExtension(interface:library:extension:)'

1回しか #initSwiftExtension を書いていないのにエラーが出ちゃっていた。

これはキャッシュの可能性があるっぽいので rm -rf ~/Library/Developer/Xcode/DerivedData をしてから再起動を試すがなおらず。

@Godot をパースし、@initSwiftExtension() を自動生成するマクロがSwiftGodotに組み込まれているらしいので、この #initSwiftExtension 定義ごと削除する。

Xcode上でエラーが消えた状態で、Godotプロジェクト側の Rebuild ボタンを押す。

SwiftGodotTemplateを使ってみる-1754373127688

Swiftで定義したPlayerController が使えるようになっている。

挙動を確認

  1. Rebuild ボタンを押す。
  2. res://addons/swift_godot_editor_pluginswift_godot_plugin_panel.gd 内の recomplile_swift() が呼ばれる
  3. swift build が実行される
  4. res://addons/swift_godot_extension/bin フォルダに .dylib が配置される
  5. 変更を反映するためにGodotエディタが再起動する

別のプロジェクトで使いたい場合

  • res://addons/swift_godot_editor_plugin をコピーして適応したいプロジェクトにペースト。
  • Project Settings > PluginsEnabled を On にする。
  • swift_godot_plugin_panel.gd 内のswift_pathtargetDirを正しいパスに変更する。
    • swift_path の方は SwiftPackageを配置しているディレクトリを指定
    • targetDir の方は res://addons/プラグイン名/プラグイン名.gdextension 内に書いてある macOS.dylib を配置する場所
  • dylib を配置するディレクトリは .gitignore に書いておく。

Godot-iOSキーボードの高さの変化を通知するネイティブプラグインを作るの場合で試す。

@onready var swift_path = ProjectSettings.globalize_path("res://SwiftPackages/GodotKeyboardObserver")

var target_dir = ProjectSettings.globalize_path("res://addons/swift/keyboard_observer/macos")

godot.project の配置したプロジェクト以下に配置しないといけないのがモニョ。

動作はする。

気づいたこと

  • このプロジェクトは、Swift言語を使ってGodotゲームを開発するためのプロジェクトである。
  • エクスポート先は iOSmacOS向けなわけではない。
  • これだけでも手間はかなり減るように感じる。

おわりに

SwiftGodotを使うなら入れておきたい機能の1つである。が、自分の用途ではこれだけでは不足なので、この SwiftGodotTemplate を参考に、よりiOS向けのプラグインを作りたい。

さらに、 SwiftGodotTemplateのプラグインの中身を理解しよう でプラグインの構成をお勉強した。

サイトアイコン
公開日
更新日