Skip to content

C# Parity Matrix

This page answers a different question than the wrapper coverage reports: can a Godot C# user expect the same broad workflows in Kanama?

  • API Coverage is the numeric API surface: promoted classes/methods and generator reach.
  • Wrapper Generator Report is generator internals: skip categories, helper-shape gaps, and complete draft classes.
  • This page is capability parity: scripting model, editor workflow, data marshalling, resources, signals, coroutines, and debugging.

Kanama follows the same broad principle as Godot C# — idiomatic host-language naming, GD/Mathf helpers, attribute-driven exports, signals, and typed API wrappers — but for Kotlin/JVM through GDExtension and Panama FFM. Public Kanama API uses Kotlin lower-camel names; it does not provide PascalCase C# aliases.

Legend: SUPPORTED means validated in smoke tests or real demo ports. PARTIAL means usable with caveats. MISSING means not implemented yet.

Scripting Model

Capability Status Notes
Attach Kotlin scripts to Godot nodes/resources SUPPORTED .kt resources load through Kanama's ScriptLanguage and resource loader/saver.
Register new Godot classes SUPPORTED @RegisterClass registers permanent ClassDB types.
Lifecycle callbacks SUPPORTED @OnReady, @OnProcess, @OnPhysicsProcess, @OnEnterTree, @OnExitTree.
Tool scripts SUPPORTED @Tool works for both @ScriptClass and @RegisterClass.
Global classes PARTIAL @GlobalClass/@ClassName work for typed inspector-facing classes; broader editor UI validation is still ongoing.
Hot reload PARTIAL Build + scene reload is the reliable workflow; in-place live-node replacement still has edge cases.

Editor And Build Workflow

Capability Status Notes
Kotlin project build SUPPORTED External projects use Gradle + KSP and depend on Kanama artifacts from mavenLocal().
Editor build button SUPPORTED Optional Kanama Tools plugin adds Build Scripts.
Auto build on save SUPPORTED Debounced and opt-in through project settings.
Scene reload after script sync SUPPORTED Enabled through the Kanama Tools plugin.
IntelliJ debugging SUPPORTED Enable JDWP, restart the game process, attach a Remote JVM Debug configuration.
Rider support MISSING Rider does not support Kotlin/JVM project editing the way IntelliJ IDEA does.

API Surface

Capability Status Notes
Promoted Kotlin wrappers SUPPORTED Generated wrapper promotion is the main coverage path. See API Coverage for current percentages and per-class details.
Generated KDoc SUPPORTED Wrapper docs are synced from Godot doc/classes/*.xml where available.
Core singletons and utilities SUPPORTED GD, Mathf, Input, OS, Engine, Time, ProjectSettings, DisplayServer, and related helpers are available.
2D/3D gameplay APIs PARTIAL Broad promoted coverage exists, and real demo ports exercise common movement, physics, animation, particles, UI, audio, files, scenes, resources, and tween use cases. Use the coverage reports for exact wrapper availability.
Dynamic fallback PARTIAL GodotObject.call(...), signal(...), and typed object wrappers cover mixed GDScript/Kanama edges. Prefer typed wrappers when available.
Networking/multiplayer parity PARTIAL Some wrappers are promoted, but Kanama does not yet claim C#-style multiplayer workflow parity.

Data And Marshalling

Capability Status Notes
Scalars and strings SUPPORTED Boolean, Long/Int, Double/Float, String, and null cross common Variant paths.
Godot value types SUPPORTED Vectors, transforms, colors, planes, AABB, NodePath, RID, and related helpers are covered for current promoted APIs.
Object/resource handles PARTIAL Typed wrappers and closeable Resource/RefCounted handles are available; ownership-sensitive returns still require explicit policy.
Packed strings and bytes SUPPORTED PackedStringArray maps to List<String> in supported APIs; PackedByteArray maps to ByteArray in file helpers.
Typed exported arrays PARTIAL List<String>, List<Texture2D>, and same-project global resource-script arrays are supported. Broader typed arrays remain policy work.
General Array/Dictionary/Variant APIs PARTIAL Selected dictionary/list shapes exist. Fully general heterogeneous containers are still a deliberate policy bucket.
Callable PARTIAL Signal connections, lambda callbacks, and tween callable helpers exist for bounded shapes. General public Callable ownership remains intentionally constrained.

Signals, Resources, And Async

Capability Status Notes
Custom signal declarations SUPPORTED @Signal metadata and generated *Signals emit helpers are available.
Godot signal connections SUPPORTED Use object.signal(Name.Signals.foo).connect(...) and generated method-name constants.
Lambda signal callbacks PARTIAL Zero to three emitted arguments are supported through generated dispatcher methods used by Kanama's signal connection helpers.
Runtime custom resources SUPPORTED Create a Godot Resource, attach a loaded Kanama script, then resolve kotlinScriptInstance<T>().
Inspector exports PARTIAL Scalars, strings, NodePath, groups/subgroups, common object/resource wrappers, typed node references, and selected arrays are supported. Enums, flags, and broader resource arrays are intentionally conservative.
Coroutines SUPPORTED KanamaScope, Godot main-thread dispatch, awaitNextFrame, SceneTree.delaySeconds, and signal awaits are available.

Intentional Differences From C

Difference Rationale
Kotlin script object is separate from the Godot node Keeps JVM script lifetime, Godot object lifetime, hot reload, and editor placeholders explicit. Use KanamaScript<T>.self for the attached node/resource.
Lower-camel Kotlin API only Matches Kotlin style and avoids maintaining duplicate C#-style aliases.
Explicit install paths Desktop kits cover new packaged projects, store addons cover existing packaged projects, and source checkouts remain the development path for unreleased Kanama changes.
Desktop-first runtime Kanama embeds a normal JVM in a desktop Godot process. Android is experimental through ART and PanamaPort; web export is not planned.

Coverage References

For exact wrapper coverage, use API Coverage. For generator blockers, use Wrapper Generator Report.