SwiftGodotKit 提供了一种将 Godot 嵌入到现有 Swift 应用程序中并从 Swift 驱动 Godot 的方法,而无需使用扩展。它是 SwiftGodot 的配套,后者提供了 Godot API 的 API 绑定。

请查看此处的 TrivialSample 以了解其工作原理。

您需要 Swift 5.9 (Xcode 15 发布候选版本即可)。

引用此 Package.swift,然后您可以编写一个简单的程序,如下所示

import Foundation
import SwiftGodot
import SwiftGodotKit

func loadScene (scene: SceneTree) {
    let rootNode = Node3D()
    let camera = Camera3D ()
    camera.current = true
    camera.position = Vector3(x: 0, y: 0, z: 2)
    
    rootNode.addChild(node: camera)
    
    func makeCuteNode (_ pos: Vector3) -> Node {
        let n = SpinningCube()
        n.position = pos
        return n
    }
    rootNode.addChild(node: makeCuteNode(Vector3(x: 1, y: 1, z: 1)))
    rootNode.addChild(node: makeCuteNode(Vector3(x: -1, y: -1, z: -1)))
    rootNode.addChild(node: makeCuteNode(Vector3(x: 0, y: 1, z: 1)))
    scene.root?.addChild(node: rootNode)
}


class SpinningCube: Node3D {
    required init (nativeHandle: UnsafeRawPointer) {
        super.init (nativeHandle: nativeHandle)
    }
    
    required init () {
        super.init ()
        let meshRender = MeshInstance3D()
        meshRender.mesh = BoxMesh()
        addChild(node: meshRender)
    }
    
    override func _input (event: InputEvent) {
        guard event.isPressed () && !event.isEcho () else { return }
        print ("SpinningCube: event: isPressed ")
    }
    
    public override func _process(delta: Double) {
        rotateY(angle: delta)
    }
}

func registerTypes (level: GDExtension.InitializationLevel) {
    switch level {
    case .scene:
        register (type: SpinningCube.self)
    default:
        break
    }
}

runGodot(args: [], initHook: registerTypes, loadScene: loadScene, loadProjectSettings: { settings in })

一个您可以作为起点的独立示例可在此处获得,当用作 SwiftPM 时

https://github.com/migueldeicaza/SwiftGodotKit/tree/main/StandaloneExample

幕后细节

如果您想编译您自己的 libgodot.framework 版本,请按照以下说明进行操作

将 SwiftGodot 和 SwiftGodotKit 以及适合用作库的 Godot 版本作为对等项目检出

git clone git@github.com:migueldeicaza/SwiftGodot
git clone git@github.com:migueldeicaza/SwiftGodotKit
git clone git@github.com:migueldeicaza/libgodot

编译 libgodot,此示例显示了我自己是如何执行此操作的,但您可以使用不同的版本

cd libgodot
scons target=template_debug dev_build=yes library_type=shared_library debug_symbols=yes 

上述操作将生成您想要的二进制文件,然后使用 SwiftGodot 中的脚本(与此存储库对等)从中创建一个 xcframework

cd ../SwiftGodot/scripts
sh -x make-libgodot.xcframework ../../SwiftGodot ../../libgodot /tmp/

然后您可以引用该版本的 libgodot.xcframework

细节

目前,这依赖于当前正在等待批准的 LibGodot 补丁。

https://github.com/godotengine/godot/pull/72883

为了您的方便,我已经将 Mac 上的可嵌入 Godot 打包为 xcframework,因此仅仅依赖于此包就应该获得您需要的一切。