Important
The current version of the project has been tested on macOS and may not work properly on Linux and Windows.
Godot Kotlin Tree enhances development of Godot games using Kotlin bindings by generating a statically typed object mapping the Godot project nodes to Kotlin.
In short, instead of referencing node with a string path and casting:
getNode(NodePath("/root/Path/To/Some/Nested/Area/Node")) as Area2Dthe same can be achieved using generated typed fields:
GDTree.Scene.Path.To.Some.Nested.Area.NodeThe references are generated automatically based on the project and scenes declarations meaning that any modifications to the node tree structure can be easily tracked in Kotlin sources. Rebuilding Kotlin project after node paths change will result in compile-time errors that otherwise could become difficult to debug runtime errors.
For more information about developing Godot games using Kotlin, head to Godot Kotlin JVM website.
Configure plugin in the build.gradle.kts file:
// Add plugin dependency
plugins {
  id("io.github.tomwyr.godot-kotlin-tree") version "1.0.0"
}
// Include generated code in the project sources
sourceSets {
    main {
        kotlin.srcDir("build/generated/godotNodeTree/kotlin")
    }
}
// Optional configuration
godotNodeTree {
    // Package that the generated code should belong to
    packageName = "your.package.name"
    // Path to Godot project relative to Kotlin project root
    projectPath = "godot/project/path"
}Add plugin repository declaration to the settings.gradle.kts file:
pluginManagement {
    repositories {
        gradlePluginPortal()
    }
}No additional setup of the Godot project is needed.
Create a scene with nodes in Godot Editor and run generateNodeTree Gradle task:
The task will scan your Godot project files and generate node tree representing the scene:
// build/generated/godotNodeTree/kotlin/com/example/game/GodotNodeTree.kt
object GDTree {
    object Main : NodeRef<Node>("/root/Main", "Node") {
        val ColorRect = NodeRef<ColorRect>("/root/Main/ColorRect", "ColorRect")
        val ColorAnimator = NodeRef<Node2D>("/root/Main/ColorAnimator", "Node2D")
        //...
    }
}Reference the generated tree from within Node classes:
@RegisterClass
class ColorAnimator : Node2D() {
    val colorRect by GDTree.Main.ColorRect
    @RegisterFunction
    override fun _process(delta: Double) {
        super._process(delta)
        colorRect.color = calcColorForDelta(delta)
    }
    //...
}Run project:
demo.mp4
The plugin works with the following Kotlin/JVM bindigns and Godot engine versions:
Note: the end part of bindings version is also the compatible engine version.
| godot-kotlin-tree | godot-kotlin-jvm | 
|---|---|
| 1.0.x | 0.8.1-4.2.0 | 
| 1.1.x | 0.13.1-4.4.1 | 
Other pairs of versions may also work but their compatibility has never been tested and proper behavior of the plugin isn't guaranteed.
Every kind of help aiming to improve quality and add new functionalities is welcome. Feel free to:
- Open an issue to request new features, report bugs, ask for help.
- Open a pull request to propose changes, fix bugs, improve documentation.
- Tell others about this project.
