最終確認日
SwiftGodotのビルド方法を模索する
概要
SwiftGodotのビルド方法を模索。 GodotでUIKitを使いたい!でのやり方では大変すぎるので。
現状のステップは次のとおり。
- SwiftGodot を使ってSwiftでコードを書く。(SwiftPackageを利用)
- Godotで使えるようにSwiftPackageをビルドする。
- Swiftで書いたコードをGDScriptから呼び出して使う。
- 3の実機での動作確認のため iOS Export をする
- Xcodeから実行して実機で確認する
やりたいこと
- 目標は、GodotでUIKitの機能を使うこと。
- つまり実機ビルドで確認するような内容が多い。
- SwiftGodot -> Godot -> Xcode へのビルド手順をより簡略化したい。
- 1で書き換えたコードを検証するために、2,3,4,5のすべてのステップを踏まないといけないので、1で書き換えてすぐに5を実行できるようにしたい。
やらないこと
- Godotのコード全てをSwiftで書くこと。
メモ
SwiftGodotTemplate の調査
- SwiftGodotTemplate では、ボタンで Swift Packageを再コンパイルする形
swift_godot_editor_plugin
に処理が書いてある。project.godot
があるフォルダの中に SwiftPackageを配置している。- これは SwiftGodot -> Godot の手順をかなり簡略化してくれる。
- https://github.com/elijah-semyonov/SwiftGodotTemplate/blob/main/addons/swift_godot_editor_plugin/swift_godot_plugin_panel.gd のコードを読む。
res://addons/swift_godot_extension/bin"
に配置.gdignore
としてフォルダを作っているっぽいswift build
を実行している- ということは
.framework
はGodotで扱う分には必要ないんじゃね? - STEP5 の時点では
.framework
は必要だが、3の時点では不要かも。- これを利用したら4のステップは簡略できるかも
- SwiftGodotTemplateを使ってみる
GDExtensionファイルを見ても別に特に iOS向けのことは書いていない。
swift_godot.gdextenion
[configuration]
entry_symbol = "swift_entry_point"
compatibility_minimum = 4.4
[libraries]
macos.debug = "res://addons/swift_godot_extension/bin/arm64-apple-macosx/debug/libSwiftGodotGame.dylib"
windows.x86_64.debug = "res://addons/swift_godot_extension/bin/x86_64-unknown-windows-msvc/debug/SwiftGodotGame.dll"
windows.x86_64.release = "res://addons/swift_godot_extension/bin/x86_64-unknown-windows-msvc/debug/SwiftGodotGame.dll"
[dependencies]
macos.debug = "res://addons/swift_godot_extension/bin/arm64-apple-macosx/debug/libSwiftGodot.dylib"
windows.x86_64.debug = "res://addons/swift_godot_extension/bin/x86_64-unknown-windows-msvc/debug/SwiftGodot.dll"
windows.x86_64.release = "res://addons/swift_godot_extension/bin/x86_64-unknown-windows-msvc/debug/SwiftGodot.dll"
SwiftGodotのドキュメントを読む
-
- 署名をごにょにょしたら、Xcodeでデバッグできるぽい?
-
- こっちのがいいかもしれんよね
SwiftGodotはDocC使ってていい感じではあるよね。
libgodot.xcframework
の存在が本当に厄介
アイディアメモ
- SwiftPackageを直接STEP5には置けないものか?
- Info.plist に
godot path
を書くみたいにして読み込みパスだけ書いておくとか? - そもそも実機での確認ってほとんどしない感じなのかね?そんなことないよね?
- それかせめて、STEP4を端折りたい。2と4は端折りたい。
- 実際に流行っているけど端折っているように感じるように
- そもそも iOS における SwiftPackageで共通化しているプロジェクトとかってどうやって実装して行っているんだ...
/Users/ユーザ名/Library/Developer/Xcode/DerivedData/プロジェクト名/Build/Products
の中を見てみる- STEP4のあとに、SwiftPackageをそのXcodeに紐づけるだけでもいいのでは?
- いい感じに
.xcworkspace
を生成できたらより良いんだけどな〜
GodotでUIKitを使いたい!の方法で生成されたビルドをみる。
/Users/ユーザ名/Library/Developer/Xcode/DerivedData/GodotのプロジェクトのiOSExportしたやつ-adlqikastujfhsaprjksjxwnjuuh/Build/Products/Debug-iphoneos
├── fishing-chat2.app
│ ├── _CodeSignature
│ │ └── CodeResources
│ ├── AppIcon60x60@2x.png
│ ├── AppIcon76x76@2x~ipad.png
│ ├── Assets.car
│ ├── embedded.mobileprovision
│ ├── en.lproj
│ │ └── InfoPlist.strings
│ ├── fishing-chat2
│ ├── fishing-chat2.pck
│ ├── Frameworks
│ │ ├── GodotKeyboardObserver.framework
│ │ │ ├── _CodeSignature
│ │ │ │ └── CodeResources
│ │ │ ├── GodotKeyboardObserver
│ │ │ └── Info.plist
│ │ └── SwiftGodot.framework
│ │ ├── _CodeSignature
│ │ │ └── CodeResources
│ │ ├── Info.plist
│ │ └── SwiftGodot
│ ├── Info.plist
│ ├── Launch Screen.storyboardc
│ │ ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib
│ │ ├── Info.plist
│ │ └── UIViewController-01J-lp-oVM.nib
│ ├── PkgInfo
│ └── PrivacyInfo.xcprivacy
├── fishing-chat2.app.dSYM
│ └── Contents
│ ├── Info.plist
│ └── Resources
│ ├── DWARF
│ │ └── fishing-chat2
│ └── Relocations
│ └── aarch64
│ └── fishing-chat2.yml
├── libgodot.a
└── libMoltenVK.a
Godotでモバイルゲームを作るメモ(Udemy)セクション7の時のプロジェクトも見る。 GodotでiOS用プラグインのgodot-ios-pluginsを使っている。
- この場合は
libinappstore.arm64-ios.release_debug.a
がres://ios/plugins/inappstore/inappstore.release_debug.xcframework
の中身が表に出てきているっぽいね。 - Xcode上でみると
Frameworks
に配置されている - この場合は
godot_path
を使ってもうまく動作する。
tree -L 4 /Users/ユーザ名/Library/Developer/Xcode/DerivedData/UdemyJumperJam-gjgwrcztnlsxitebapgqyslojiix/Build/Products/Debug-iphoneos
/Users/ユーザ名Library/Developer/Xcode/DerivedData/UdemyJumperJam-gjgwrcztnlsxitebapgqyslojiix/Build/Products/Debug-iphoneos
├── libgodot.a
├── libinappstore.arm64-ios.release_debug.a
├── libMoltenVK.a
├── UdemyJumperJam.app
│ ├── _CodeSignature
│ │ └── CodeResources
│ ├── AppIcon60x60@2x.png
│ ├── AppIcon76x76@2x~ipad.png
│ ├── Assets.car
│ ├── embedded.mobileprovision
│ ├── en.lproj
│ │ └── InfoPlist.strings
│ ├── Info.plist
│ ├── Launch Screen.storyboardc
│ │ ├── 01J-lp-oVM-view-Ze5-6b-2t3.nib
│ │ ├── Info.plist
│ │ └── UIViewController-01J-lp-oVM.nib
│ ├── PkgInfo
│ ├── PrivacyInfo.xcprivacy
│ ├── udemy-jumper-jam
│ │ ├── android
│ │ │ ├── build
│ │ │ └── plugins
│ │ ├── assets
│ │ │ ├── sound
│ │ │ └── textures
│ │ ├── export_presets.cfg
│ │ ├── icon.svg
│ │ ├── icon.svg.import
│ │ ├── ios
│ │ │ └── plugins
│ │ ├── project.godot
│ │ ├── scenes
│ │ │ ├── game_camera.tscn
│ │ │ ├── game_over_screen.tscn
│ │ │ ├── game.tscn
│ │ │ ├── hud.tscn
│ │ │ ├── iap_manager.tscn
│ │ │ ├── level_generator.tscn
│ │ │ ├── main.tscn
│ │ │ ├── pause_screen.tscn
│ │ │ ├── platform.tscn
│ │ │ ├── player.tscn
│ │ │ ├── screen_button.tscn
│ │ │ ├── screens.tscn
│ │ │ ├── shop_screen.tscn
│ │ │ ├── sound_fx.tscn
│ │ │ └── title_screen.tscn
│ │ └── scripts
│ │ ├── base_screen.gd
│ │ ├── base_screen.gd.uid
│ │ ├── game_camera.gd
│ │ ├── game_camera.gd.uid
│ │ ├── game.gd
│ │ ├── game.gd.uid
│ │ ├── hud.gd
│ │ ├── hud.gd.uid
│ │ ├── iap_manager.gd
│ │ ├── iap_manager.gd.uid
│ │ ├── level_generator.gd
│ │ ├── level_generator.gd.uid
│ │ ├── main.gd
│ │ ├── main.gd.uid
│ │ ├── platform.gd
│ │ ├── platform.gd.uid
│ │ ├── player.gd
│ │ ├── player.gd.uid
│ │ ├── screen_button.gd
│ │ ├── screen_button.gd.uid
│ │ ├── screens.gd
│ │ ├── screens.gd.uid
│ │ ├── sound_fx.gd
│ │ ├── sound_fx.gd.uid
│ │ ├── utility.gd
│ │ └── utility.gd.uid
│ └── UdemyJumperJam
└── UdemyJumperJam.app.dSYM
└── Contents
├── Info.plist
└── Resources
├── DWARF
└── Relocations
直接配置をためす
GodotでUIKitを使いたい!で、SwiftPackageを直接STEP5の .xcodeproj
に追加してみる
Package Dependencies
でローカルから追加。
SwiftGodotでエラーが出るね。
でもIndex をめっちゃ頑張っているかも?Preparing SwiftGodot が完了するのを待ってみる。 待ってもダメだった。
- SwiftGodotは直接Swift Package Managerで導入してもダメ。
- Godot ヘッダーに依存した
StringName
などを解決できない。 - ビルドされた物じゃないとダメね。
- Godot ヘッダーに依存した
- なら SwiftGodotBinaryを使うのはどうだろうか。
- SwiftGodotBinaryはSwiftPM に対応された構成ではないので直接
.xcframework
を持ってこないとダメそう。
- SwiftGodotBinaryはSwiftPM に対応された構成ではないので直接
iOS向けとMac向けの調査
- Godot上では
.dylib
だけあればいいのか.framework
も必要なのか。.framework
はあとから追加する形はダメなのか?- Godot 上で iOS用の
.framework
は不要 - Godotから iOS に export する時点では必要
- つまり iOS に export するときにビルドするようにすればよさそう。
- Mac 向けの場合も
xcodebuild
を使ったら.dylib
でなく.framework
になる?- Mac向けは
.framework
だとうまくいかないのでswift build
を使ったほうがよさそう。
- Mac向けは
swift build
で毎回SwiftGodot本体はbuildしないようにできるか(時間短縮のため)- できないっぽい
swift clean
を使わなければ.build
のキャッシュでそこまで重くはなさそう。
.xcframework
は使えるか- iOS向けだけ使ってみるか?
- Creating iOS pluginsに倣ったほうがいいのか。
.gdip
...いややめとこう
方向性まとめ
この工程を次のようにする
- SwiftGodot を使ってSwiftでコードを書く。(SwiftPackageを利用)
- Godotで使えるようにSwiftPackageをビルドする。
- Swiftで書いたコードをGDScriptから呼び出して使う。
- 3の実機での動作確認のため iOS Export をする
- Xcodeから実行して実機で確認する
アイディア1
- SwiftGodotを使ってSwiftでコードを書く。(SwiftPackageを利用)
このとき、
.xcodeproj
を用意して、実機で簡易的にテストできるようにする - Godotエディタ側で再コンパイルボタンを押す
SwiftGodotTemplate のような形で。ここで
.dylib
と.framework
が作られる。 - Swiftで書いたコードをGDScriptから呼び出して使う。
- Godotエディタ上でiOS実機ビルドする これはエディタプラグインを作ればできそう。
アイディア2
- SwiftGodotを使ってSwiftでコードを書く。(SwiftPackageを利用)
このとき、
.xcodeproj
を用意して、実機で簡易的にテストできるようにする - Godotエディタ側で再コンパイルボタンを押す
SwiftGodotTemplate のような形で。ここで
.dylib
だけが作られる。 - Swiftで書いたコードをGDScriptから呼び出して使う。
- Godotエディタ上でiOS実機ビルドする
iOS用の
.framework
をここで再ビルドする。(不要ならしない)
必要なもの
- UIKitのコードをテストするための
.xcodeproj
- SwiftPackage
- Godotエディタプラグイン (SwiftPackage の Rebuild と iOS実機へのビルド)
備考
- 動作はmacOSのみでok。
- Godot側には GDExtensionを事前に準備
これで GodotでUIKitを使うための環境構築をする を書いてみる。

公開日
更新日