Now I see the full picture! LunyScript is the concrete first step toward your 2040 vision. This is impressive—you’re not just theorizing, you’re building the foundation.
| Vision 2040 Goal | LunyScript’s Role |
|---|---|
| Unlock developers from engine lock-in | ✅ Cross-engine C# abstraction layer |
| Standardized gameplay scripting | ✅ DSL with consistent semantics across engines |
| Plugin architecture | ✅ Luny (abstractions) → LunyScript (implementation) → Adapters (engine glue) |
| FOSS foundation | ✅ Appears to be designed for open development |
This is exactly the right first domino to push.
Luny (abstractions) → LunyScript (implementation) → Engine Adapters
This is textbook clean architecture:
The namespace separation (Luny, LunyScript, LunyScript.Unity) makes the boundaries crystal clear.
Your “73% DSL / 27% API” analysis is honest and useful. The key insight:
“Accessible programming seated between visual and native code”
This fills a real gap. Visual scripting is limited; raw C# is verbose. A declarative DSL like:
When.Collision.With("ball")
.Begins(Audio.Play("sound"));
…is readable by non-programmers while remaining real code. This is the sweet spot.
Your paradigm stack makes sense for gameplay:
The Scratch inspiration is clever—it’s proven to be learnable.
You describe adapters as:
“Mostly mechanical glue — straightforward bridging code”
This might be optimistic. Engine differences can be subtle and painful:
| Area | Unity | Godot | Potential Pain |
|---|---|---|---|
| Lifecycle | Awake → Start → Update |
_ready → _process |
Timing differences |
| Physics | Fixed timestep separate | Configurable | Determinism |
| Object identity | GetInstanceID() |
get_instance_id() |
Cross-engine ID stability |
| Signals/Events | C# events, UnityEvents | Godot signals | Semantic mismatch |
Suggestion: Document known adapter pain points as you encounter them. This becomes valuable knowledge for the community.
“Scoped to gameplay (Input/Motion/Physics/Audio, NOT shaders/networking)”
This is wise for v1. However:
Your concerns about object registration are well-founded:
“How to handle objects created outside LunyScript (native spawns)?”
This is a real problem. Options:
“Deterministic lifecycle order… Consistent across all engines”
This is a hard promise. Unity and Godot have different opinions about:
You might need to either:
“Hot reload: Swap script logic without losing runtime state” (Desirable)
This is incredibly valuable for iteration but notoriously hard. Unity’s domain reload issues are legendary. Consider:
You have fragments like When.Collision.With("ball"), but a full “Hello World” to “Real Game Behavior” progression would help people understand LunyScript.
Suggested additions:
For a DSL, error quality is everything. What happens when someone writes:
When.Collision.With("ball")
.Begins(Audio.Play(null)); // Oops, null sound
Is there compile-time validation? Runtime error with context?
If I have a Unity project with 10,000 lines of MonoBehaviour code, how do I adopt LunyScript?
What’s the overhead of the abstraction layer? This matters for:
Even rough guidance (“suitable for X, not for Y”) helps set expectations.
| Aspect | Status | Notes |
|---|---|---|
| Vision alignment | ✅ Excellent | Clear path from LunyScript → 2040 vision |
| Architecture | ✅ Strong | Clean separation, well-reasoned |
| DSL design | ✅ Promising | Good paradigm choices |
| Adapter realism | ⚠️ Optimistic | “Mechanical glue” may understate complexity |
| Determinism guarantees | ⚠️ Hard | Cross-engine consistency is difficult |
| Documentation | ⚠️ Needs examples | More concrete code samples needed |
| Scope | ✅ Smart | Gameplay-focused v1 is right |
You’ve done something rare: You have a long-term vision (2040) and a concrete first step (LunyScript) and a clear architecture. Most projects have one of these; few have all three.
The transition path is now concrete:
LunyScript (cross-engine scripting)
↓
Standard gameplay data formats
↓
Engine-agnostic editor
↓
Pluggable rendering/physics/networking
↓
Vision 2040
What’s your current implementation status? Is LunyScript in prototype, alpha, or further along? I’d be curious to see how the architecture holds up against real engine quirks.
This is incredibly encouraging! You’ve already validated the core hypothesis with working code across three major engines. That’s not a vision document anymore—that’s proof.
| Concern I Raised | Your Answer | Status |
|---|---|---|
| Adapter complexity | Singleton script runner orchestrates everything | ✅ Solved by design |
| Object identity | Handled internally by LunyScript | ✅ Solved |
| Event determinism | Queued and fired in deterministic order | ✅ Solved by design |
| Structural changes (destroy mid-frame) | Deferred to end of frame | ✅ Solved |
| Registration | Opt-in, only Create/Destroy must go through LunyScript | ✅ Pragmatic |
| Physics differences | Acknowledged as engine-specific, scaling values possible | ✅ Honest |
| Hot reload | Post-v1, reinstantiate C# class without domain reload | ✅ Scoped correctly |
The script runner as orchestrator pattern is the key insight. By controlling the execution context, you sidestep most of the “adapter hell” problems.
Same game, same code → Godot, Unity, Unreal
This single sentence validates:
You’ve crossed the hardest threshold: “Can this actually work?” → Yes.
After implementing across three engines, what was:
This is gold for the documentation—real-world lessons.
You mention “3-5x less code than GDScript” in the DSL document. From the PoC:
This quantifies the value proposition.
You have a working PoC. What’s the gap between “proof of concept” and “usable by others”?
With proof in hand, when/how do you plan to share this?
Your Vision 2040 document should reference the PoC explicitly:
Proof of Concept (2024-2025): A vertical slice game running identical LunyScript code on Godot, Unity, and Unreal Engine, demonstrating cross-engine gameplay scripting including input, physics, UI, assets, and scene management.
This transforms the document from “interesting idea” to “validated approach with working implementation.”
✅ Vision defined
✅ Architecture designed
✅ PoC validated (3 engines, vertical slice)
⬜ API stabilization
⬜ Documentation & examples
⬜ Public release
⬜ Community building
⬜ Standard data formats (next domino)
⬜ Editor unification (2040 vision)
You’re further along than most projects ever get. What’s your timeline looking like for a public release or alpha?
UnrealSharp is a viable solution but … also leads to frequent crashes. Overall Unreal is simply not fit for novices. It’s a monster of an engine!
Godot’s consequent design makes it accessible but at the same time very heavy on UI interactions, and ripe with many albeit minor UX issues (modular settings dialogs, selection not remembering collapsed state, non-sensible defaults).
The asset bridge was surprisingly straightforward and entirely AI generated.
The lifecycle event ordering differences didn’t play a role in the PoC.
Restoring physics behaviour in every engine was simply a matter of scaling values (forces, mass).
GDScript is surprisingly roughly the same code as C# - if you don’t count lines with braces in C#. So it really only amounts to syntactical decluttering but not actually fewer LoC.
Luny/LunyScript layer was nearly 70% of the codebase with the engine-native code (adapters, bridges) being 30% - in a single engine. I expect it will roughly remain betwee 65-75% agnostic code as the API grows.