Protfolio-Emanuel-Polsky / Assets / _Project / Code / PathFinding / Debug / DebugMouseHitSystem.cs
DebugMouseHitSystem.cs
Raw
using GarmentButton.PhysicFillters;
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Jobs;
using Unity.Mathematics;
using Unity.Physics;
using UnityEngine;


namespace GarmentButton.PathFinding
{

    public partial struct DebugMouseHitSystem : ISystem
    {


        public void OnCreate(ref SystemState state)
        {
            state.RequireForUpdate<EndSimulationEntityCommandBufferSystem.Singleton>();
            state.RequireForUpdate<PhysicsWorldSingleton>();
            state.RequireForUpdate<EndPointPath>();
            state.RequireForUpdate<MouseSelectEndPosition>();
        }
        public void OnUpdate(ref SystemState state)
        {
            if (!Input.GetMouseButtonDown(0))
                return;
            var physic = SystemAPI.GetSingleton<PhysicsWorldSingleton>();
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            var newRay = new Unity.Physics.RaycastInput
            {
                Start = ray.origin,
                End = ray.origin + ray.direction * 300,
                Filter = new CollisionFilter()
                {
                    CollidesWith = (uint)CollisionLayer.Ground,
                    BelongsTo =  (uint)CollisionLayer.Defualt,
                },
            };

            var hitCast = physic.PhysicsWorld.CastRay(newRay, out var hit);

            if (!hitCast)
                return;

            //Update path for enemies
            state.Dependency = new ImplementMousePosition
            {
                HitPosition = hit.Position,
            }.ScheduleParallel(state.Dependency)
;


            //Update Grid
            var ecb = SystemAPI.GetSingleton<EndSimulationEntityCommandBufferSystem.Singleton>().CreateCommandBuffer(state.WorldUnmanaged);
            state.Dependency = new ImplementMousePositionUpdateGrid
            {
                HitPosition = hit.Position,
                ECB = ecb,

            }.Schedule(1,state.Dependency);
;
            
        }
    }
    [BurstCompile]
    [WithDisabled(typeof(EndPointPath))]
    public partial struct ImplementMousePosition : IJobEntity
    {
        [ReadOnly] public float3 HitPosition;
        public void Execute([ChunkIndexInQuery] int sortKey, EnabledRefRW<EndPointPath> enable, ref EndPointPath data)
        {
            data.Position = HitPosition;
            enable.ValueRW = true;
        }
    }
    [BurstCompile]
    public partial struct ImplementMousePositionUpdateGrid : IJobFor
    {
        [ReadOnly] public float3 HitPosition;
        public EntityCommandBuffer ECB;
        public void Execute(int index)
        {
            var entity = ECB.CreateEntity();
            ECB.AddComponent(entity, new RequireUpdatePosition
            {
                Value = HitPosition.xz,
            });
        }
    }
}