This article is a log of my initial research into Unreal Engine 6 (August 2026 ue6_main) as it relates to the future development of Tyra. It documents my strategizing, perspective, and experience working directly with the early UE6 source. Unreal Engine 6 is still in active development, so these observations are provisional; I may continue expanding this article as research clarifies or challenges my conclusions.
Crash Course
Unreal Engine is one of the leading real-time engines. It's available to the public, and I would argue that it is the dominant engine today. "Real-time" is broader than games alone, extending into film, all kinds of commercial production, scientific applications, and even military training. It broadly means producing frames fast enough to create continuous interactive motion, like a movie. A real-time engine showing a game usually has somewhere between 8.33 and 33.33 milliseconds to draw a frame, whereas film and animation studios can take hours or days to render a single frame. Unreal has spent years earning a reputation as one of the most capable and widely adopted engines in this space, and it recently announced a major new version, Unreal Engine 6, which is the subject of this article.
Tyra


Tyra is a party-based, primarily single-player, third-person RPG framework intended to support games broadly in the territory of Final Fantasy VII Remake, Granblue Fantasy: Relink, or The Witcher. The emphasis is on an expressive RPG surface: party mechanics, responsive action combat, "spellbook" ability systems, progression, and support for narrative and intricate storytelling. It is not a particular game so much as the underlying machinery from which a series of games can be authored.
I consider Tyra one of my most valuable long-term development assets and invest heavily in its progression. The goal is for its development to advance alongside the games built with it, allowing each project to inherit the engineering of the previous one rather than beginning again from a generic engine. Ideally, a new game starts much closer to authoring: its engineering phase is substantially reduced, while development effort can instead improve the framework itself, expand its capabilities, or address limitations discovered during previous releases. In that sense, the investment is intended to pay itself forward from one project to the next.
This makes longevity unusually important. Tyra has existed in various forms throughout the Unreal Engine 4 and 5 eras, and I have also built versions of its architecture in Unity and Godot, although the Unreal implementation is by far the most developed. My initial investigation into Unreal Engine 6 made it increasingly clear that this transition may be different from prior Unreal Engine upgrades. Epic may provide a considerable grace period in which old and new systems coexist, as well as migration tooling, but the fundamental gameplay surface appears to be changing. Actors, components, gameplay scripting, world composition, and potentially many of the assumptions around which an Unreal gameplay framework is organized are being reconsidered.
At some level, systems architecture simply falls outside what I think migration tooling can reasonably solve, although perhaps agentic AI will eventually change this. Common advice is to isolate the game from the engine and make the underlying architecture as engine-agnostic as possible. I have attempted this to varying degrees over the years and have become skeptical of taking it too far. A game framework has to be designed around the strengths, constraints, and patterns of an engine, much as its visual production ultimately has to accommodate the renderer. Some things can be abstracted cleanly; others cannot. Even when abstraction succeeds technically, it carries its own continuing development burden.
So what should the future of Tyra look like? How should I allot my time? I wanted to understand how expensive a genuine Unreal Engine 5 to 6 refactor might be, whether there are architectural decisions I can make today that translate naturally into the emerging model, and ultimately how I should value additional engineering time invested into Tyra on Unreal Engine 5.
Defining Framework Development
Tyra is in an unusual position where I can consider Unreal Engine 6 this early. I am developing the framework before committing heavily to game content, without a production schedule requiring it to ship next year. My concern at this stage is not whether UE6 is production-ready, particularly in areas like rendering and visual effects, but whether its emerging architecture is developed enough to begin serious engineering effort toward it.
Framework development at this stage often barely resembles a game. For long periods, pressing play may produce a black screen while I inspect logs and details as systems are progressively designed and wired. A character running around a beautiful environment is easy to demonstrate: you can open Unreal's third-person template and press play, but it says very little about what the underlying architecture can support.
Considering Unreal 6 at all carries an obvious risk: I would be developing against an engine that Epic itself is still developing. It is entirely possible for my requirements to reach parts of Unreal Engine 6 that simply do not exist yet, leaving me unable to continue a particular system until Epic advances its own implementation. I have no control over that schedule, and unforeseen changes could invalidate work I have already done. However, game production has many demands that take time. When my engineering requirements temporarily outrun the engine, I can redirect my attention toward art, characters, environment animation, writing, music, or other commitments. This flexibility is a luxury I have but most productions do not.
Context and Disclaimer
This research uses Epic Games' UE6 development source available to Unreal Engine licensees through its GitHub repository. I have no affiliation with Epic Games, no privileged access, and no knowledge of Epic Games' internal roadmap beyond what can be observed from the source and public information available to licensees. I'm not deeply familiar with Unreal Engine's source, and my experience with deep engine internals is limited. Broad systems knowledge helps me understand what I'm looking at, but I'm not a specialist.
These are my observations from UE6-main in August 2026 and the experiments I performed. This is not a tutorial, but if you're comfortable with C++ and have compiled Unreal 4/5 from source, it is likely you can also do this. If it's daunting an agentic AI system can probably help you through most of the steps.
Setup
I compiled UE6-main onto a 1 TB Samsung T7 external SSD connected to a Gen2 USB port. The initial downloads took a few hours. Compiling was done on an AMD Ryzen 9 5900X 12-Core Processor with 64 GB of RAM. The initial build took roughly two hours and occupied approximately 450 GB including intermediates once it was complete.
There were a handful of compile errors involving signature changes that were relatively easy to resolve. Out of the box, the ue6-main source was configured to build DevelopmentCookedEditor; I switched this to DevelopmentEditor.
After this phase I would have been fairly lost without an excellent article by Ronald Burns (https://ronaldburns.dev/projects/how-to-verse-in-ue6/), which included instructions for console commands, plugins, and some magic to get Verse working.
First Impressions
I had no real performance issues or quirks; the engine feels exactly like Unreal Engine 5 with some major additions bolted on. In ordinary use, my initial UE6-main build was surprisingly uneventful. I encountered no dramatic problems during these small experiments.
I would not interpret that smooth surface as evidence that the underlying transition is similarly complete. Source inspection repeatedly exposes transitional bridges between the new Entity/Component abstractions and existing Actor/UObject systems. In that sense, parts of the current implementation feel almost spoofed: the intended programming surface is already there, while underneath it an Entity may still be represented through an Actor and a component through a UObject. The abstraction can therefore be exercised before its eventual underlying implementation necessarily exists in its intended form.
Research Focus
I wanted to understand what working with the new component model felt like, how to define Verse APIs, and how to create entity components.
I investigated Epic Games' VNI patterns and was able to implement both ordinary native Verse bindings and my own native Scene Graph components in C++. Once I understood the pattern, the process felt surprisingly conventional, roughly analogous in effort to implementing custom Actors, components, and functions in traditional Unreal C++.
My native components could expose their own state and methods, participate in the Scene Graph lifecycle, and be discovered and called by ordinary Verse components. Likewise, Verse-authored components could define their own state, methods, visibility, and relationships with other components rather than existing merely as scripts attached to a fixed native API.
Examples
I will post some code that represents the main patterns that I was able to successfully implement. These are not meant to be learning resources, as I expect the API to rapidly change. I am posting them just to show what it generally looks like at the moment. *Apologies: at the time of writing, my site does not support Verse syntax highlighting.
Preparing a Plugin
The build tooling indicated that project-level modules did not currently contribute Verse, so I moved the experiment into a plugin. Verse requires a namespace to import against. Epic Games uses the domain-as-authority model, e.g., Verse.org and EpicGames.com. Personally I'm not a fan of domain-as-authority. Anyone that's tried to get a sane web domain since 2005 without 5-7 figures in cash to burn likely knows why. I went with just Tyra as an act of defiance and it worked fine. Alternatively I looked into it and brokers told me I could bid $8,000 for Tyra.org.
build.cs
I defined the Verse import namespace and included required modules.
// TyraVerseTest/Source/TyraVerseTestRuntime/TyraVerseTestRuntime.Build.cs
using UnrealBuildTool;
public class TyraVerseTestRuntime : ModuleRules
{
public TyraVerseTestRuntime(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
SetupVerse("/Tyra/TyraVerseTest", VerseScope.InternalUser);
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"Entity",
"Verse",
"VerseNative",
"VerseSimulation",
"VerseSimulationMetadata"
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject"
}
);
}
}
.uplugin
Some required Verse settings and plugin activation so the compiler recognizes the Verse package. I went with a Game Feature C++ plugin to see what it was like, but I believe a regular C++ Plugin will work too.
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "TyraVerseTest",
"Description": "",
"Category": "Game Features",
"CreatedBy": "",
"CreatedByURL": "",
"DocsURL": "",
"MarketplaceURL": "",
"SupportURL": "",
"EnabledByDefault": true,
"CanContainContent": true,
"CanContainVerse": true,
"VersePath": "/Tyra/TyraVerseTest",
"VerseScope": "InternalUser",
"VerseVersion": 0,
"EnableVerseAssetReflection": true,
"EnableSceneGraph": true,
"IsBetaVersion": false,
"IsExperimentalVersion": false,
"Installed": false,
"Modules": [
{
"Name": "TyraVerseTestRuntime",
"Type": "Runtime",
"LoadingPhase": "Default"
}
],
"Plugins": [
{
"Name": "Verse",
"Enabled": true
},
{
"Name": "Solaris",
"Enabled": true
},
{
"Name": "VerseSimulation",
"Enabled": true
},
{
"Name": "VerseSimulationMetadata",
"Enabled": true
},
{
"Name": "EntityFramework",
"Enabled": true
}
],
"ExplicitlyLoaded": true,
"BuiltInInitialFeatureState": "Active"
}
Verse Interface / Native Declaration
I defined the native Verse interface in a special .native.verse file. Both a native Verse binding and a native Scene Graph component were declared for this experiment.
// TyraVerseTest/Source/TyraVerseTestRuntime/Verse/tyra_native_test.native.verse
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
tyra_native_test<public><native> := class:
GetMagicNumber<public><native>():int
tyra_native_component<public><native> := class<final><final_super>(component):
@editable
Value<public><native>:int = 123
GetValue<public><native>()<reads>:int
C++ Native Implementation
I exposed a native C++ function to Verse.
// TyraVerseTest/Source/TyraVerseTestRuntime/Public/TyraNativeTest.h
#pragma once
#include "TyraVerseTest.tyra_native_test.gen.h"
#include "UObject/Object.h"
namespace verse
{
class tyra_native_test : public UObject
{
TYRA_NATIVE_TEST_DEF();
public:
int64 GetMagicNumber()
{
return 123;
}
};
}
// TyraVerseTest/Source/TyraVerseTestRuntime/Private/TyraNativeTest.cpp
#include "TyraNativeTest.h"
#include "TyraVerseTest.tyra_native_test.gen.ipp"
using namespace verse;
TYRA_NATIVE_TEST_IMPL()
Native Component
Next I defined a native Scene Graph component with its own methods and lifecycle hooks in C++.
// TyraVerseTest/Source/TyraVerseTestRuntime/Public/TyraNativeComponent.h
#pragma once
#include "Component.h"
#include "TyraVerseTest.tyra_native_component.gen.h"
namespace verse
{
class tyra_native_component : public component
{
TYRA_NATIVE_COMPONENT_DEF();
public:
int64 GetValue() const;
protected:
virtual void OnAddedToScene() override;
virtual void OnBeginSimulation() override;
virtual void OnEndSimulation() override;
virtual void OnRemovingFromScene() override;
private:
TVal<int64> Value;
};
}
// TyraVerseTest/Source/TyraVerseTestRuntime/Private/TyraNativeComponent.cpp
#include "TyraNativeComponent.h"
#include "TyraVerseTest.tyra_native_component.gen.ipp"
DEFINE_LOG_CATEGORY_STATIC(LogTyraNativeComponent, Log, All);
namespace verse
{
TYRA_NATIVE_COMPONENT_IMPL()
int64 tyra_native_component::GetValue() const
{
return Value.Get();
}
void tyra_native_component::OnAddedToScene()
{
Super::OnAddedToScene();
UE_LOG(LogTyraNativeComponent, Display, TEXT("OnAddedToScene Value=%lld"), GetValue());
}
void tyra_native_component::OnBeginSimulation()
{
Super::OnBeginSimulation();
UE_LOG(LogTyraNativeComponent, Display, TEXT("OnBeginSimulation Value=%lld"), GetValue());
}
void tyra_native_component::OnEndSimulation()
{
UE_LOG(LogTyraNativeComponent, Display, TEXT("OnEndSimulation Value=%lld"), GetValue());
Super::OnEndSimulation();
}
void tyra_native_component::OnRemovingFromScene()
{
UE_LOG(LogTyraNativeComponent, Display, TEXT("OnRemovingFromScene Value=%lld"), GetValue());
Super::OnRemovingFromScene();
}
}
Scripting
I made a scratch script to test it all from inside the engine. It uses the native function I created and does a few extra random things.
using { /Verse.org }
using { /Verse.org/Native }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
using { /Tyra/TyraVerseTest }
my_test_component<public> := class<final_super>(component):
@editable
var MyCustomInt<public>:int = 10
OnBeginSimulation<override>():void =
(super:)OnBeginSimulation()
Print("OnBeginSimulation")
NativeTest := tyra_native_test{}
MagicNumber := NativeTest.GetMagicNumber()
Print("Magic number is {MagicNumber}")
MyEntity := Entity
Children := MyEntity.GetEntities()
Print("I have {Children.Length} children")
OnSimulate<override>()<suspends>:void =
loop:
Print("OnSimulate")
Sleep(5.0)
Print("WOW")
OnBeginSimulation occupies a role somewhat analogous to BeginPlay, although the Scene Graph component lifecycle has important differences. OnSimulate provides a coroutine-like execution path that can suspend, loop, and wait asynchronously for other things. It is vaguely analogous to Tick: you can create a continuous update loop inside it, suspending between iterations rather than receiving a conventional per-frame callback. At the time of this experiment I did not find an obvious equivalent to yielding until the next frame, so my tests simply resumed on a timed interval.
Conclusion
The experiment exceeded my expectations. I expected to spend much of this first investigation discovering things I could not yet do, wrangling unfinished systems to the point of failure. Instead, I came away feeling that many of the pieces needed to begin establishing a framework in the emerging Unreal Engine 6 paradigm are already visible, although I cannot say how provisional they remain. I also went into this somewhat distrustful of the broader metaverse ambitions associated with these systems. In practice, however, I found many of the new ideas to be meaningful improvements that could address some of the longstanding architectural pain points I have experienced working with Unreal.
Scene Graph
Personally, I loved working in this style. It felt like a clear upgrade over Unreal's traditional Actor system and current gameplay framework, and interacting with it felt immediately familiar to the compositional workflows of engines like Unity and Godot. Composition has always felt like one of Unreal Engine's weaker areas to me: Actors and Actor Components provide composition, but the Actor remains a relatively heavy and opinionated center around which gameplay objects are expected to organize themselves. The Entity/Component model felt considerably more natural.
This becomes especially interesting when extended into Prefabs and hierarchical Entities. If Epic takes this model as far as engines like Unity do, it could make composition of complex gameplay objects substantially cleaner. In Tyra, for example, I sometimes need an Actor to exist inside another persistent conceptual object that maintains identity and state while allowing the represented Actor to change entirely—a character polymorphing, transforming into a werewolf, changing physical forms, or otherwise replacing its presentation and behavior without replacing the thing it fundamentally represents. In traditional Unreal this can require layers of inter-Actor communication and external coordination that work, but often feel unnecessarily bumpy. An Entity hierarchy with composable components and replaceable child Entities appears much better suited for this.
My investigation of the surrounding source also suggests that Scene Graph is intended to be considerably broader than a specialized rendering or isolated ECS feature. The APIs already extend into gameplay capabilities. It is possible that Actors and much of the traditional Gameplay Framework eventually recede substantially or disappear from the primary authoring model. The current branch shows the new framework being layered across existing Unreal systems through numerous bridges. Entity, Component, and Prefab are clearly being developed as major general-purpose gameplay and authoring concepts.
Levels
While I mentioned that Scene Graph currently looks and feels similar to Unity or Godot, there is one important distinction I am still unclear on. Game engines have overlapping concepts of scenes, worlds, and levels, but I tend to think in Unreal's terminology: a World is the outer spatial context in which the rendered scene exists, while a Level is a collection of Actors that exists within that World. At its root, Unreal fuses the World and Level together in a way developers can't separate.
Unity and Godot do not really have a first-class concept of a “level” in this sense. An entire level can effectively be another scene or node hierarchy streamed into an existing world, and technically a project’s worth of levels could all exist inside one persistent scene. It is not yet clear to me whether Unreal Engine 6 is moving toward something similar, where what we think of as a level becomes an entity hierarchy that can be streamed in and out without tearing down the larger world, or whether UWorld and ULevel will remain fundamental architectural boundaries as they are today. The current source contains hints in both directions, including transitional wrappers around some of these concepts, but not enough to establish where this leads.
Personally, I vastly prefer the idea of a level as just another prefab or node that can be streamed in, but it's very Epician to make the level a first-class concept in order to support enhanced rendering or streaming features.
Gameplay Framework
The larger gameplay framework is considerably less settled. The current implementation still has a world-bound simulation_entity. In the source I inspected, the clearest architectural boundary currently appears around UWorld: the new simulation roots I found are world-bound, while UGameInstance remains outside them. For Tyra, one workable bridge would be native component methods that query application state through UGameInstance, or facade components exposed at the root of the Scene Graph.
Further down the stack, however, the shape of a replacement gameplay framework is much easier to see. Player and possession abstractions already exist around entities, but some of the important possession operations are still internal. Networking is clearly being designed into the system, as is the separation of presentation between players, but the public surfaces for authority, prediction, ownership transfer, RPC-like gameplay communication, and presentation are not complete enough for me to design around with confidence. I also found no clear Scene Graph replacement for Enhanced Input, although native C++ provides an apparent path for bridging existing input infrastructure into Scene Graph components.
UObject Backing
One note I had was that Scene Graph components are currently backed by UObject. A compositional architecture naturally encourages larger numbers of smaller, more granular components, while UObjects are contextually heavy in Unreal Engine 5, particularly because garbage collection cost can become noticeable based simply on the number of objects being tracked. If this representation remains substantially unchanged, I would be concerned that aggressively composing large worlds from many small components could reproduce or amplify the familiar periodic GC hitch without significant improvements to object management.
It is too early to draw conclusions from the current implementation. Scene Graph is visibly transitional, and Epic is already experimenting with alternative GC approaches. The eventual component representation may become lighter and more data-oriented, or UObject itself may become considerably more scalable. In Unreal Engine 4/5, the UObject backing of ActorComponents encourages them to be much more individually comprehensive than a heavily compositional architecture would naturally want.
Verse
Verse was one of the areas of Unreal Engine 6 I was most uncertain about going into this research. I had never seriously used the language before, have not worked in UEFN, and had only limited exposure to Verse through documentation, examples, and the broader discussion surrounding it. My questions were both practical and architectural: what is Verse actually like to work in, how deeply can native C++ participate in it, and does it provide enough structure to plausibly form the foundation of a substantial gameplay framework?
Native Integration
One of my first concerns was how much control remained on the native side. Tyra is currently predominantly a C++ framework, with scripted game events running on Blueprints that leverage latent nodes backed by C++ coroutines. A future in which Verse became the primary gameplay language while native development was restricted to whatever functionality Epic chose to expose would represent a significant architectural limitation.
What I could establish is that native C++ and Verse are not fundamentally isolated systems. From the perspective of this experiment, the relationship felt surprisingly similar to Unreal's familiar C++/Blueprint boundary: native systems can expose functionality upward while gameplay behavior can be authored in Verse around them. Implementing that boundary was considerably more straightforward than I expected. Compared with embedding and binding an external scripting language like Lua into C++, the integration felt very easy with minimal boilerplate.
Verse as a Language
I went into Verse having heard much of the surrounding discourse: that it was ugly, bizarre, overly functional, Haskell-like, or simply alien compared with the languages game developers were accustomed to. My initial experience was almost the opposite. In practical use I found it immediately recognizable as another scripting language, somewhere between a simplified C# and Python, with object-oriented structures alongside prominent asynchronous and coroutine-like concepts. Whatever unusual ideas may exist deeper in the language, nothing I encountered while building ordinary gameplay components felt particularly unconventional or difficult to reason about.
I came away considerably more optimistic about the language itself. Verse may be a somewhat unusual amalgamation, but I can see the beginnings of something approaching an "ultimate" game scripting language, in the sense that it appears informed by Epic Games' unusually deep experience with the requirements of large networked modern games.
The metaverse ambitions historically associated with Verse are easy to dismiss because the term itself has accumulated so much baggage, but I take those ambitions less as a requirement to believe in any particular vision of the metaverse and more as evidence of the scope the language is attempting to address. Persistent worlds, concurrency, networking, simulation, composition, failure, and code that must remain manageable as projects become enormous are ambitious requirements regardless of whether they are ultimately used to build a metaverse, an online game, or a conventional single-player. It feels like an inspired foundation for sophisticated modern games.
Verse Networking
A concern regards Verse's networking model. After looking into how Verse operates practically in UEFN, I can't fully make sense of its replication approach in the context of broader development inside Unreal Engine. My netcode background isn't strong enough to fully fathom it. My current understanding of Verse in UEFN is strongly server-authoritative, and I have not yet been able to map that model cleanly onto the more familiar Unreal concepts of replicated Actors, ownership, prediction, and client/server RPCs.
There isn't enough exposed code yet for me to reach a confident answer, but I'd flag this as a concern for my timing. In current Unreal Engine 5, it's straightforward to design single-player systems in a replication-friendly way, leaving room to later add multiplayer side-modes around what's fundamentally a single-player game. I don't yet know the form of Verse's replication model in an engine context. I simply cannot plan around it because of this.
Practicality and Controversy
Verse replacing or displacing Blueprint as the center of gameplay authoring is likely to be one of the more controversial aspects of Unreal Engine 6, and I can sympathize with that. An enormous amount of expertise, tooling, accessibility, and established workflow has accumulated around Blueprint, and the reasons people like visual scripting are entirely valid.
The colder engineering argument is that textual source provides a stronger long-term foundation for ambitious authoring, maintenance, version control, search, reuse, large-scale refactoring, source review, and increasingly AI-assisted development.
Anyone who has followed a substantial node graph tutorial like Blueprint, Substance Designer, Geometry Nodes, Houdini, etc. also knows the other side of visual programming: watching a video at 1/16 of its normal speed for hours while reproducing nodes, wires, parameters, and values. The slowed-down playback turns the background music and narrator into something faintly horrifying over the course of an hour. Visual systems can make logic approachable, but they can also make that logic unusually difficult to communicate. Sharing knowledge was already a major problem with visual scripting, and as AI increasingly becomes an interface through which we author code, I suspect visual scripting's decline is inevitable.
I expect this shift across many platforms and programs, and it is worth emphasizing that experience with visual scripting is still programming experience. The skill is learning to design software systems, and that work ultimately happens in your mind. The language or style used to encode a program is just notation, like the paper and pen an author uses to write down a story.
Seize the Day
I am left considering an unusual gamble: whether I can develop the architecture of Tyra alongside Epic Games' development of Unreal Engine 6, allowing periods of art and production work to absorb the times when my requirements advance beyond the engine. I see a threshold between two very different commitments: a long-term, potentially 5–10 year, multi-release commitment to Unreal Engine 5.8/5.9 that may ultimately conclude with a very expensive architectural reset, or accepting the risk and potential reward of an aggressive pivot toward Unreal Engine 6 now.
I don't yet know whether I should take that bet.


