SwiftGodotTemplateを使ってみる
SwiftGodotTemplate とは
SwiftGodotTemplate は、Swift で Godot の拡張機能(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
を開く。
AssetLib
の横に SwiftGodotのタブがあり、その中に Rebuild
ボタンがある。
押すとGodotが再起動する。
SwiftPackageを編集してみる
Package.swift
をXcodeで開く。
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.1
を 6.0
に下げた。
チュートリアルの通りに編集
SwiftGodotのチュートリアルの通りに編集してみる。
SwiftGodotGame.swift
に以下を追記
import SwiftGodot
#initSwiftExtension(cdecl: "swift_entry_point", types: [
PlayerController.self
])
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
を行ったあと、生成された dylib
をGodotプロジェクト側に配置する必要があるが、先ほどの Rebuild
ボタンを押すだけでそれらが行われるはず。
SwiftPackageがXcode上でビルドできるようになっている必要があるわね。
エラーが出た
/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
ボタンを押す。
Swiftで定義したPlayerController
が使えるようになっている。
挙動を確認
Rebuild
ボタンを押す。res://addons/swift_godot_editor_pluginswift_godot_plugin_panel.gd
内のrecomplile_swift()
が呼ばれるswift build
が実行されるres://addons/swift_godot_extension/bin
フォルダに.dylib
が配置される- 変更を反映するためにGodotエディタが再起動する
別のプロジェクトで使いたい場合
res://addons/swift_godot_editor_plugin
をコピーして適応したいプロジェクトにペースト。Project Settings
>Plugins
でEnabled
を On にする。swift_godot_plugin_panel.gd
内のswift_path
とtargetDir
を正しいパスに変更する。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ゲームを開発するためのプロジェクトである。
- エクスポート先は iOSやmacOS向けなわけではない。
- これだけでも手間はかなり減るように感じる。
おわりに
SwiftGodotを使うなら入れておきたい機能の1つである。が、自分の用途ではこれだけでは不足なので、この SwiftGodotTemplate を参考に、よりiOS向けのプラグインを作りたい。
さらに、 SwiftGodotTemplateのプラグインの中身を理解しよう でプラグインの構成をお勉強した。
