Once again, we are excited to share more on our current work on Unity 6.6 and ongoing plans for ECS in Unity. All of the ECS packages are now core packages and we have been developing them in line with Unity releases. This has allowed us to coordinate work between package and engine and move towards our goal of unifying Entities and GameObject workflows to bring the power of entities to all users and to integrate entities with new features moving forward.
EntityId Unification
A continuing focus in Unity 6.6 is the alignment of the EntityId identifier type between GameObjects and Entities. This lays the groundwork for integrating ECS into the rest of the engine and making Entities APIs available for GameObjects.
As part of this work, we’ve completed the EntityId 8-byte migration (up from 4 bytes), providing a larger address space and better alignment with modern architectures. Memory optimizations have also landed, including EntityId virtual memory support for the Editor and improved metadata paging, reducing memory overhead for EntityId storage.
Managed Component Deprecation
We are deprecating Managed Components in favor of UnityObjectRef<T>. Managed Components were a convenient, but performance-limited way to reference Unity Objects from ECS. With UnityObjectRef<T>, you get the same functionality with better performance characteristics that align with ECS principles. This work also allows us to further focus ECS components to help develop authoring of components on GameObjects in the future.
Migration example:
// Old approach (deprecated)
public class MyManagedComponent : IComponentData
{
public GameObject prefab;
}
// New approach
public struct MyComponent : IComponentData
{
public UnityObjectRef<GameObject> prefab;
}
The deprecation covers, in broad terms:
- Class-based IComponentData (managed components). Convert your component to a struct IComponentData, using UnityObjectRef for any references to UnityEngine.Object instances.
- Managed ISharedComponentData and the *Managed shared-component APIs. Make the shared component an unmanaged struct and use the shared-component APIs without the Managed suffix.
- The managed-object access APIs EntityManager.AddComponentObject / GetComponentObject / SetComponentObject. Use an unmanaged IComponentData with the unmanaged Add/Get/SetComponentData APIs instead.
- PostLoadCommandBuffer is also deprecated. Use the new
ImportEntityfield onSceneSystem.LoadParametersinstead.
A new analyzer warning, EA0017, additionally flags struct shared components that still contain managed fields. Define UNITY_DISABLE_MANAGED_SHARED_COMPONENT_WARNINGS to silence it.
Existing managed-component code continues to work for now; these warnings indicate code that should be migrated before the managed paths are removed. See the Entities upgrade guide section “Convert managed components to unmanaged components” for migration guidance. For data that is neither blittable nor a UnityEngine.Object, the ScriptableObjectHost baking sample demonstrates a last-resort pattern (bake the managed value onto a host ScriptableObject and hold a UnityObjectRef to it).
Editor Tooling
New Hierarchy
The Editor tooling is being unified so that we can support Entities and GameObjects with the same set of windows in the Editor.
The new Hierarchy window is now the default for viewing entities. This unified hierarchy provides a single place to see both GameObjects and Entities together, replacing the separate Entities Hierarchy window, which is now deprecated.
With the new Hierarchy, you can:
- Explore runtime entities across all active worlds via world nodes
- View both authoring SubScenes and their runtime entities together
- Filter entities by component type with autocomplete suggestions
- Double-click or right-click SubScenes to quickly open or close them
Systems Window: Streamlined and More Informative
The Systems window has been significantly refined to help you understand system execution at a glance:
New scheduling column: To easily see system dependencies defined with the UpdateBefore/UpdateAfter attributes.
Simplified interface: We’ve removed visual clutter that wasn’t providing value:
- The world column is gone (you select the world from the dropdown instead)
- Unused popup windows and inspector sections have been removed
- The Relationships and Attributes tabs have been removed
- The Query and Relationships tabs have been merged together
Detail view toggle: A new toggle lets you show or hide the detail panel, giving you more screen space when you just need the system list.
System selection history: We added navigation buttons to the toolbar for easy navigation between selected systems.
Memory Profiler Integration
Entities allocations are now properly labeled in Unity’s Memory Profiler. When investigating memory usage, you’ll see distinct categories for:
- Entities allocations
- Collections allocations
- Entities Graphics allocations
This makes it easier to identify which package is responsible for specific allocations.
SubScene Baking Determinism Validation
Non-deterministic baking can cause unnecessary rebuilds and subtle bugs. We’ve added EntitySceneImporterDeterminismChecker.Check() to help you verify that your custom bakers produce consistent results.
The API forces two fresh imports of a SubScene and compares their artifact hashes:
using Unity.Scenes.Editor;
var result = EntitySceneImporterDeterminismChecker.Check("Assets/Scenes/MySubScene.unity");
if (!result.Success)
Debug.LogError($"Check failed: {result.Error}");
else if (result.IsDeterministic)
Debug.Log("SubScene bakes deterministically!");
else
Debug.LogError($"Non-deterministic baking detected:\n First hash: {result.FirstHash}\n Second hash: {result.SecondHash}");
Common causes of non-determinism in bakers include iterating over unordered collections (HashSet, Dictionary) or using EntityIds that change between sessions.
Component Lifecycle Debug Callbacks
Tracking down why a component was added or removed can be tedious. The new Component Lifecycle API lets you set breakpoints or log directly at the moment a component changes. Implement IDebugOnAdded or IDebugOnRemoved on your component and add a static callback method. When that component is added or removed, your code runs immediately, giving you a callstack to inspect.
[BurstCompile]
public struct Health : IComponentData, IDebugOnAdded, IDebugOnRemoved
{
public float Value;
public static void OnAdded(ref Health health)
{
Debug.Log($"Health added with value {health.Value}");
// Set a breakpoint here to inspect the callstack
}
public static void OnRemoved(ref Health health)
{
Debug.Log($"Health removed, was {health.Value}");
}
}
These callbacks only fire in debug and collection-checks builds. They’re stripped from release builds, so there’s no performance cost in production. The static callbacks can also be Burst-compiled for fast execution during development. Callbacks fire during EntityManager operations and EntityCommandBuffer playback, covering both immediate and deferred changes.
This API is particularly useful for:
- Debugging when and where components are added or removed
- Validating component state during development
- Tracking structural changes without the overhead of Journaling
API Cleanup and Improvements
We’ve been cleaning up legacy code paths to improve maintainability and reduce binary size:
- EntityCommandBuffer operations now properly return created Entities that can be used immediately.
- EntityCommandBuffer multi-playback has been deprecated. This feature could cause bugs that could occur when an ECB was played back multiple times.
- The legacy Entity Store V1 implementation has been removed.
com.unity.entitiesno longer depends on the unsupportedcom.unity.serializationpackage.
We’d love to hear your feedback on these changes.
Thank you for your continued support!



