Protfolio-Emanuel-Polsky / Assets / _Project / Code / PathFinding / Mono / PathGridCreationMono.cs
PathGridCreationMono.cs
Raw
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Mathematics;
using UnityEngine;

namespace GarmentButton.PathFinding
{
    [BurstCompile]
    public class PathGridCreationMono : MonoBehaviour
    {
        public Vector2Int Size;
        public float[] HieghtsPoints;

        [Header("All Things That Should Be turn On When Baking The Road")]
        public GameObject[] AssistPlatform;
        [Header("All Things That Should Be turn off When Baking The Road")]
        public GameObject[] DisablePlatforms;
        [Header("Debug")]
        public GameObject gameObjectText;
        public bool DebugPath;
        public bool DebugGrid;
        public bool WithMouseSelection;

        private void OnDrawGizmosSelected()
        {
            var totalSize = new float2
            {
                x = Size.x * (Global.ElementSize),
                y = Size.y * (Global.ElementSize),
            };
            var newPosition = transform.position;
            var halfGridSize = new float3(totalSize.x / 2, 0, totalSize.y / 2);
            var min = (float3)newPosition - halfGridSize;
            var max = (float3)newPosition + halfGridSize;
            DrawBoundingBox(min, max, Color.green);
            void DrawBoundingBox(Vector3 min, Vector3 max, Color boxColor)
            {
                Gizmos.color = boxColor;

                // Bottom edges
                Gizmos.DrawLine(new Vector3(min.x, min.y, min.z), new Vector3(max.x, min.y, min.z));
                Gizmos.DrawLine(new Vector3(min.x, min.y, min.z), new Vector3(min.x, min.y, max.z));
                Gizmos.DrawLine(new Vector3(max.x, min.y, min.z), new Vector3(max.x, min.y, max.z));
                Gizmos.DrawLine(new Vector3(min.x, min.y, max.z), new Vector3(max.x, min.y, max.z));

                // Top edges
                Gizmos.DrawLine(new Vector3(min.x, max.y, min.z), new Vector3(max.x, max.y, min.z));
                Gizmos.DrawLine(new Vector3(min.x, max.y, min.z), new Vector3(min.x, max.y, max.z));
                Gizmos.DrawLine(new Vector3(max.x, max.y, min.z), new Vector3(max.x, max.y, max.z));
                Gizmos.DrawLine(new Vector3(min.x, max.y, max.z), new Vector3(max.x, max.y, max.z));

                // Vertical edges
                Gizmos.DrawLine(new Vector3(min.x, min.y, min.z), new Vector3(min.x, max.y, min.z));
                Gizmos.DrawLine(new Vector3(min.x, min.y, max.z), new Vector3(min.x, max.y, max.z));
                Gizmos.DrawLine(new Vector3(max.x, min.y, min.z), new Vector3(max.x, max.y, min.z));
                Gizmos.DrawLine(new Vector3(max.x, min.y, max.z), new Vector3(max.x, max.y, max.z));
                ////
            }

        }
    }
    public class PathGridCreationBaker : Baker<PathGridCreationMono>
    {
        public const int ILIMINATE_FLOAT = 10;
        public override void Bake(PathGridCreationMono authoring)
        {
            //Create entity
            CreateWithBlobAsset(authoring);

        }
        private void CreateWithBlobAsset(PathGridCreationMono authoring)
        {
            var expectedLenght = authoring.Size.x * authoring.Size.y;
            if (expectedLenght != authoring.HieghtsPoints.Length)
                return;

            var entity = GetEntity(TransformUsageFlags.None);

            var totalSize = new float2
            {
                x = authoring.Size.x * Global.ElementSize,
                y = authoring.Size.y * Global.ElementSize,
            };
            var center = authoring.transform.position;
            var halfGridSize = new float3(totalSize.x / 2, 0, totalSize.y / 2);
            var halfCellSize = new float3(Global.ElementSize / 2, 0, Global.ElementSize / 2);


            NativeList<Point> grid = new NativeList<Point>(expectedLenght, Allocator.Temp);
            for (int y = 0; y < authoring.Size.y; y++)
            {
                for (int x = 0; x < authoring.Size.x; x++)
                {


                    var position = new float3(x * (Global.ElementSize), 0, y * (Global.ElementSize));
                    position -= new float3(halfGridSize);
                    position += new float3(halfCellSize);
                    position += new float3(center.x, 0, center.z);
                    position *= ILIMINATE_FLOAT;
                    grid.Add(new Point
                    {
                        X = (short)position.x,
                        Y = (short)position.y,
                        Z = (short)position.z,
                    });
                }
            }

            using var blobBuilder = new BlobBuilder(Allocator.Temp);
            ref var blobArray = ref blobBuilder.ConstructRoot<PointPathBlobAsset>();
            var points = blobBuilder.Allocate(ref blobArray.Array, grid.Length);

            for (int i = 0; i < grid.Length; i++)
            {
                var point = grid[i];
                point.Y = (short)(authoring.HieghtsPoints[i] * ILIMINATE_FLOAT);
                points[i] = point;
            }

            AddComponent(entity, new Grid
            {
                Value = blobBuilder.CreateBlobAssetReference<PointPathBlobAsset>(Allocator.Persistent),
            });
            AddComponent(entity, new GridData
            {
                GridSize = new int2(authoring.Size.x, authoring.Size.y),
                CellSize = Global.ElementSize,
                Center = new float2(center.x, center.z),

            });
            AddComponent<CreatedGrid>(entity);

            if (authoring.DebugPath)
            {
                AddComponent(entity, new DebugPath());
            }
            if (authoring.DebugGrid)
            {
                AddComponent(entity, new DebugObject
                {
                    GameObject = authoring.gameObjectText,
                });
                AddComponent(entity, new DebugGrid());
            }
            if (authoring.WithMouseSelection)
            {
                AddComponent<MouseSelectEndPosition>(entity);
            }
        }


        
    }
}