using Unity.Entities; using Unity.Jobs; using Unity.Mathematics; [UpdateBefore(typeof(CartesianGridChangeDirectionSystemGroup))] public unsafe partial class CartesianGridOnCubeTargetSystem : SystemBase { EntityQuery m_GridQuery; protected override void OnCreate() { m_GridQuery = GetEntityQuery(ComponentType.ReadOnly()); RequireForUpdate(m_GridQuery); } protected override void OnUpdate() { // Get component data from the GridPlane var cartesianGridCube = GetSingleton(); var rowCount = cartesianGridCube.Blob.Value.RowCount; var targetDirectionsBufferCapacity = 6 * (((rowCount + 1) / 2) * rowCount); var targetDistancesBufferCapacity = 6 * (rowCount * rowCount); var gridWalls = (byte*)cartesianGridCube.Blob.Value.Walls.GetUnsafePtr(); var faceLocalToLocal = (float4x4*)cartesianGridCube.Blob.Value.FaceLocalToLocal.GetUnsafePtr(); Entities .WithName("InitializeTargets") .WithAll() .WithAll() .WithNone() .WithNone() .WithStructuralChanges() .ForEach((Entity entity) => { var directionBuffer = EntityManager.AddBuffer(entity); directionBuffer.ResizeUninitialized(targetDirectionsBufferCapacity); var distanceBuffer = EntityManager.AddBuffer(entity); distanceBuffer.ResizeUninitialized(targetDistancesBufferCapacity); }).Run(); // Rebuild all the paths to the target *only* when the target's grid position changes. Entities .WithName("UpdateTargetPaths") .WithNativeDisableUnsafePtrRestriction(faceLocalToLocal) .WithAll() .ForEach((Entity entity, ref CartesianGridTargetCoordinates prevTargetPosition, in CartesianGridOnCubeFace cubeFace, in CartesianGridCoordinates targetPosition, in DynamicBuffer targetDirections, in DynamicBuffer targetDistances) => { if (prevTargetPosition.Equals(targetPosition)) return; if (targetPosition.OnGrid(rowCount, rowCount)) { prevTargetPosition = new CartesianGridTargetCoordinates(targetPosition); CartesianGridOnCubeShortestPath.CalculateShortestPathsToTarget(targetDirections.Reinterpret().AsNativeArray(), targetDistances.Reinterpret().AsNativeArray(), rowCount, targetPosition, cubeFace, gridWalls, faceLocalToLocal); } }).Run(); } }