예제 #1
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            var closestTargets = new NativeArray <Entity>(_noTargetHeroes.CalculateEntityCount(),
                                                          Allocator.TempJob);
            var targetJob = new TargetJob
            {
                targetEntities     = _targetGroup.ToEntityArray(Allocator.TempJob),
                targetTranslations = _targetGroup.ToComponentDataArray <Translation>(Allocator.TempJob),
                closestTargets     = closestTargets
            };

            var addTargetJob = new AddTargetJob
            {
                closestTargets = closestTargets,
                commandBuffer  = _endSimulationEntityCommandBufferSystem.CreateCommandBuffer().ToConcurrent()
            };

            var jobHandle       = targetJob.Schedule(this, inputDeps);
            var addTargetHandle = addTargetJob.Schedule(this, jobHandle);

            _endSimulationEntityCommandBufferSystem.AddJobHandleForProducer(addTargetHandle);

            return(addTargetHandle);
        }
예제 #2
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            var targetCount = m_TargetGroup.CalculateLength();

            if (m_Capacity < targetCount)
            {
                if (m_NodeMap.IsCreated)
                {
                    m_NodeMap.Dispose();
                }

                if (m_TranslationMap.IsCreated)
                {
                    m_TranslationMap.Dispose();
                }

                m_Capacity       = math.max(100, targetCount + targetCount >> 1);
                m_NodeMap        = new NativeMultiHashMap <int2, Entity>(m_Capacity, Allocator.Persistent);
                m_TranslationMap = new NativeHashMap <Entity, float3>(m_Capacity, Allocator.Persistent);
            }
            else
            {
                m_NodeMap.Clear();
                m_TranslationMap.Clear();
            }

            var count = m_Group.CalculateLength();

            if (count > 0)
            {
                var entityArray         = new NativeArray <Entity>(count, Allocator.TempJob);
                var targetEntityArray   = new NativeArray <Entity>(count, Allocator.TempJob);
                var engagedArray        = new NativeArray <@bool>(count, Allocator.TempJob);
                var commandBufferSystem = World.GetExistingManager <BeginSimulationEntityCommandBufferSystem>();
                var commandBuffer       = commandBufferSystem.CreateCommandBuffer();

                inputDeps = new ConsolidateNodesJob
                {
                    NodeMap        = m_NodeMap.ToConcurrent(),
                    TranslationMap = m_TranslationMap.ToConcurrent(),
                    NodeSize       = NodeSize
                }.Schedule(this, inputDeps);

                inputDeps = new EngageNearestTargetJob
                {
                    NodeMap           = m_NodeMap,
                    TranslationMap    = m_TranslationMap,
                    EntityArray       = entityArray,
                    TargetArray       = targetEntityArray,
                    EngagedArray      = engagedArray,
                    TargetFromEntity  = GetComponentDataFromEntity <Target>(),
                    FactionFromEntity = GetComponentDataFromEntity <Faction>(true),
                    DeadFromEntity    = GetComponentDataFromEntity <Dead>(true),
                    NodeSize          = NodeSize
                }.Schedule(this, inputDeps);

                inputDeps = new AddTargetJob
                {
                    CommandBuffer    = commandBuffer.ToConcurrent(),
                    EntityArray      = entityArray,
                    TargetArray      = targetEntityArray,
                    EngagedArray     = engagedArray,
                    TargetFromEntity = GetComponentDataFromEntity <Target>()
                }.Schedule(count, 64, inputDeps);

                commandBufferSystem.AddJobHandleForProducer(inputDeps);
            }

            return(inputDeps);
        }