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(); state.RequireForUpdate(); state.RequireForUpdate(); state.RequireForUpdate(); } public void OnUpdate(ref SystemState state) { if (!Input.GetMouseButtonDown(0)) return; var physic = SystemAPI.GetSingleton(); 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().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 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, }); } } }