/* * dots-ui-patterns.cs - ECS UI Patterns with Unity DOTS * * Production-ready example demonstrating: * - ECS (Entity Component System) UI architecture * - DOTS (Data-Oriented Technology Stack) rendering * - GPU instancing for UI elements * - Job-system UI layout calculations * - Burst-compiled UI updates * - Volumetric UI with Z-depth * * © 2026 - Agent Guardrails Template */ using UnityEngine; using Unity.Entities; using Unity.DOTS; using Unity.Jobs; using Unity.Burst; using Unity.Collections; using AgentGuardrails.Spatial; using AgentGuardrails.Accessibility; namespace AgentGuardrails.UnityUI { /// /// ECS UI System manager using DOTS architecture /// Handles high-performance UI rendering through job systems /// public class DOTSUISystem : MonoBehaviour { private EntityManager entityManager; private NativeArray uiEntities; private JobHandle layoutJobHandle; public void Initialize() { entityManager = EntityManager.Instance; uiEntities = new NativeArray(100, Allocator.Persistent); // Create UI entities in batch CreateUIEntitiesBatch(); } /// /// Creates UI entities using ECS batch pattern /// Efficient entity creation for large UI hierarchies /// private void CreateUIEntitiesBatch() { var batchJob = new UIEntityCreationJob { entityManager = entityManager, uiEntities = uiEntities, count = uiEntities.Length }; // Schedule batch creation on job system layoutJobHandle = batchJob.Schedule(); layoutJobHandle.Complete(); } /// /// Updates UI layout through DOTS job system /// Burst-compiled for maximum performance /// public void UpdateUILayout() { var layoutJob = new UILayoutUpdateJob { uiEntities = uiEntities, deltaTime = Time.deltaTime, depthFactor = 0.3f // Parallax for spatial computing }; // Schedule layout update on burst-compiled thread layoutJobHandle = layoutJob.Schedule(); layoutJobHandle.Complete(); } /// /// GPU instancing for UI elements /// Batch renders UI components with shared material /// public void RenderUIWithGPUInstancing() { var instancingJob = new UIGPUInstancingJob { uiEntities = uiEntities, material = UISystem.Instance.uiMaterial, instanceCount = uiEntities.Length }; // GPU instancing job for efficient rendering instancingJob.Execute(); } /// /// Volumetric UI rendering with Z-depth /// Holographic previews for XR environments /// public void RenderVolumetricUI() { var volumetricJob = new VolumetricUIJob { uiEntities = uiEntities, depthRenderer = VolumetricRenderer.Instance, zDepth = 0.5f }; volumetricJob.Execute(); } } /// /// ECS UI Entity Creation Job /// Batch creates UI entities through DOTS /// [BurstCompile] public struct UIEntityCreationJob : IJob { public EntityManager entityManager; public NativeArray uiEntities; public int count; public void Execute() { for (int i = 0; i < count; i++) { var entity = entityManager.CreateEntity(); entity.AddComponent(); entity.AddComponent(); entity.AddComponent(); uiEntities[i] = entity; } } } /// /// UI Layout Update Job /// Calculates layout positions through DOTS /// [BurstCompile] public struct UILayoutUpdateJob : IJob { public NativeArray uiEntities; public float deltaTime; public float depthFactor; [BurstCompile] public void Execute() { for (int i = 0; i < uiEntities.Length; i++) { var entity = uiEntities[i]; var layout = entity.Get(); // Calculate layout position with parallax layout.position = CalculateLayoutPosition(entity, depthFactor); layout.depth = depthFactor; entity.Set(layout); } } private Vector3 CalculateLayoutPosition(Entity entity, float depth) { // Parallax calculation for spatial computing return new Vector3( entity.Get().x, entity.Get().y, depth ); } } /// /// GPU Instancing Job for UI Elements /// Batch renders UI components efficiently /// [BurstCompile] public struct UIGPUInstancingJob : IJob { public NativeArray uiEntities; public Material material; public int instanceCount; public void Execute() { // GPU instancing batch render var instances = new NativeArray(instanceCount, Allocator.Temp); for (int i = 0; i < instanceCount; i++) { var entity = uiEntities[i]; var render = entity.Get(); instances[i] = new UIInstance { position = render.position, scale = render.scale, color = render.color }; } // Submit to GPU instancer GPUInstancer.RenderBatch(material, instances); } } /// /// Volumetric UI Rendering Job /// Z-depth parallax for XR environments /// [BurstCompile] public struct VolumetricUIJob : IJob { public NativeArray uiEntities; public VolumetricRenderer depthRenderer; public float zDepth; public void Execute() { for (int i = 0; i < uiEntities.Length; i++) { var entity = uiEntities[i]; var volumetric = entity.Get(); // Set Z-depth for holographic rendering volumetric.depth = zDepth; depthRenderer.SetDepth(entity, zDepth); entity.Set(volumetric); } } } /// /// ECS UI Component definitions /// Data-oriented component architecture /// public struct UIElementComponent : IComponent { public string id; public bool interactive; } public struct LayoutComponent : IComponent { public Vector3 position; public Vector2 size; public float depth; public float x; public float y; } public struct RenderComponent : IComponent { public Vector3 position; public Vector2 scale; public Color color; public Material material; } public struct VolumetricUIComponent : IComponent { public float depth; public bool isHolographic; public float parallaxFactor; } public struct HapticUIComponent : IComponent { public HapticProfile profile; public float intensity; } public struct AccessibilityUIComponent : IComponent { public bool highContrast; public bool shapeRedundance; public float dwellThreshold; public ColorblindnessMode colorblindnessMode; } /// /// GPU Instancer for batch UI rendering /// Efficient rendering through shared material batches /// public static class GPUInstancer { public static void RenderBatch(Material material, NativeArray instances) { // Submit batch to GPU var commandBuffer = new CommandBuffer(); commandBuffer.DrawInstanced(material, instances); commandBuffer.Execute(); } } /// /// UI Instance data for GPU instancing /// public struct UIInstance { public Vector3 position; public Vector2 scale; public Color color; } /// /// Haptic profile definitions for ECS UI /// public enum HapticProfile { CombatTrigger, CombatSuccess, LootReveal, SkillUnlock, LevelUp } /// /// Colorblindness mode definitions /// WCAG 3.0+ compliance /// public enum ColorblindnessMode { None, Protanopia, Deuteranopia, Tritanopia } }