最終確認日

SwiftGodotのビルド方法を模索する

概要

SwiftGodotのビルド方法を模索。 GodotでUIKitを使いたい!でのやり方では大変すぎるので。

現状のステップは次のとおり。

  1. SwiftGodot を使ってSwiftでコードを書く。(SwiftPackageを利用)
  2. Godotで使えるようにSwiftPackageをビルドする。
  3. Swiftで書いたコードをGDScriptから呼び出して使う。
  4. 3の実機での動作確認のため iOS Export をする
  5. Xcodeから実行して実機で確認する

やりたいこと

  • 目標は、GodotUIKitの機能を使うこと。
    • つまり実機ビルドで確認するような内容が多い。
  • SwiftGodot -> Godot -> Xcode へのビルド手順をより簡略化したい。
  • 1で書き換えたコードを検証するために、2,3,4,5のすべてのステップを踏まないといけないので、1で書き換えてすぐに5を実行できるようにしたい。

やらないこと

  • Godotのコード全てをSwiftで書くこと。

メモ

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のドキュメントを読む

  • Debug in Xcode

    • 署名をごにょにょしたら、Xcodeでデバッグできるぽい?
  • Working in VS Code

    • こっちのがいいかもしれんよね
  • SwiftGodotDocC使ってていい感じではあるよね。

  • 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.ares://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のビルド方法を模索する-1754240869473

SwiftGodotでエラーが出るね。

SwiftGodotのビルド方法を模索する-1754241562300

でもIndex をめっちゃ頑張っているかも?Preparing SwiftGodot が完了するのを待ってみる。 待ってもダメだった。

  • SwiftGodotは直接Swift Package Managerで導入してもダメ。
    • Godot ヘッダーに依存した StringName などを解決できない。
    • ビルドされた物じゃないとダメね。
  • なら SwiftGodotBinaryを使うのはどうだろうか。
    • SwiftGodotBinaryはSwiftPM に対応された構成ではないので直接 .xcframework を持ってこないとダメそう。

iOS向けとMac向けの調査

  • Godot上では .dylib だけあればいいのか .framework も必要なのか。
    • .framework はあとから追加する形はダメなのか?
    • Godot 上で iOS用の .framework は不要
    • Godotから iOS に export する時点では必要
      • つまり iOS に export するときにビルドするようにすればよさそう。
  • Mac 向けの場合も xcodebuild を使ったら .dylibでなく .framework になる?
    • Mac向けは .frameworkだとうまくいかないので swift buildを使ったほうがよさそう。
  • swift build で毎回SwiftGodot本体はbuildしないようにできるか(時間短縮のため)
    • できないっぽい
    • swift clean を使わなければ .build のキャッシュでそこまで重くはなさそう。
  • .xcframeworkは使えるか
    • iOS向けだけ使ってみるか?
  • Creating iOS pluginsに倣ったほうがいいのか。.gdip ...いややめとこう

方向性まとめ

この工程を次のようにする

  1. SwiftGodot を使ってSwiftでコードを書く。(SwiftPackageを利用)
  2. Godotで使えるようにSwiftPackageをビルドする。
  3. Swiftで書いたコードをGDScriptから呼び出して使う。
  4. 3の実機での動作確認のため iOS Export をする
  5. Xcodeから実行して実機で確認する

アイディア1

  1. SwiftGodotを使ってSwiftでコードを書く。(SwiftPackageを利用) このとき、.xcodeproj を用意して、実機で簡易的にテストできるようにする
  2. Godotエディタ側で再コンパイルボタンを押す SwiftGodotTemplate のような形で。ここで .dylib.framework が作られる。
  3. Swiftで書いたコードをGDScriptから呼び出して使う。
  4. Godotエディタ上でiOS実機ビルドする これはエディタプラグインを作ればできそう。

アイディア2

  1. SwiftGodotを使ってSwiftでコードを書く。(SwiftPackageを利用) このとき、.xcodeproj を用意して、実機で簡易的にテストできるようにする
  2. Godotエディタ側で再コンパイルボタンを押す SwiftGodotTemplate のような形で。ここで .dylib だけが作られる。
  3. Swiftで書いたコードをGDScriptから呼び出して使う。
  4. Godotエディタ上でiOS実機ビルドする iOS用の .framework をここで再ビルドする。(不要ならしない)

必要なもの

  • UIKitのコードをテストするための .xcodeproj
  • SwiftPackage
  • Godotエディタプラグイン (SwiftPackage の Rebuild と iOS実機へのビルド)

備考

  • 動作はmacOSのみでok。
  • Godot側には GDExtensionを事前に準備

これで GodotでUIKitを使うための環境構築をする を書いてみる。

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