Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class TowerTargetJobSystem : ComponentSystem
- {
- ComponentGroup enemyGroup;
- protected override void OnCreateManager()
- {
- enemyGroup = GetComponentGroup(typeof(EnemyData), typeof(Position));
- }
- protected override void OnUpdate()
- {
- if (enemyGroup.CalculateLength() == 0)
- return;
- var entityType = this.GetArchetypeChunkEntityType();
- var positionType = this.GetArchetypeChunkComponentType<Position>(true);
- var enemyChunks = this.enemyGroup.CreateArchetypeChunkArray(Allocator.TempJob);
- var job = new TowerTargetJob() { enemyChunks = enemyChunks, entityType = entityType, positionType = positionType };
- job.Schedule(this).Complete();
- enemyChunks.Dispose();
- }
- [BurstCompile]
- struct TowerTargetJob : IJobProcessComponentData<Tower, Position>
- {
- [ReadOnly] public NativeArray<ArchetypeChunk> enemyChunks;
- [ReadOnly] public ArchetypeChunkEntityType entityType;
- [ReadOnly] public ArchetypeChunkComponentType<Position> positionType;
- public void Execute(ref Tower tower, [ReadOnly] ref Position towerPosition)
- {
- var nearestEntity = default(Entity);
- var minDist = float.MaxValue;
- for (int i = 0; i < enemyChunks.Length; i++)
- {
- var chunk = enemyChunks[i];
- var enemyPositions = chunk.GetNativeArray(positionType);
- var enemyEntities = chunk.GetNativeArray(entityType);
- for (int j = 0; j < enemyPositions.Length; j++)
- {
- var enemyPosition = enemyPositions[j];
- var enemyEntity = enemyEntities[j];
- var distsq = lengthsq(enemyPosition.Value - towerPosition.Value);
- if (distsq < minDist)
- {
- minDist = distsq;
- nearestEntity = enemyEntity;
- }
- }
- }
- tower.Target = nearestEntity;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement