Exemple #1
0
        JobHandle scheduleCollisionJob(EntityTypeData.EntityType entityTypeToCheck,
                                       EntityTypeData.EntityType entityTypeToCheckWith,
                                       JobHandle jobDependencies)
        {
            JobHandle collisionDetectJobHandle = new JobHandle();

            if (entityTypeList.Contains(entityTypeToCheck) &&
                entityTypeList.Contains(entityTypeToCheckWith))
            {
                CollisionDetectJob collisionDetectJob = new CollisionDetectJob
                {
                    entityArray           = subsetEntityDictionary[entityTypeToCheck],
                    entityBoundMinMaxData = subsetMinMaxDataDictionary[entityTypeToCheck],
                    boundCells            = cellEntityTypeDictionary[entityTypeToCheckWith],
                    cellSizes             = cellSizeEntityDictionary[entityTypeToCheckWith],
                    collidedEntityQueue   = destroyEntityDataGroup.destroyEntityData[0].entityCollisionQueueConcurrent,
                };


                JobHandle jobDependenciesHandles = JobHandle.CombineDependencies(fillCellJobHandleDictionary[entityTypeToCheck],
                                                                                 fillCellJobHandleDictionary[entityTypeToCheckWith],
                                                                                 jobDependencies);


                collisionDetectJobHandle = collisionDetectJob.Schedule(collisionDetectJob.entityArray.Length,
                                                                       MonoBehaviourECSBridge.Instance.GetJobBatchCount(collisionDetectJob.entityArray.Length),
                                                                       jobDependenciesHandles);
            }

            return(JobHandle.CombineDependencies(collisionDetectJobHandle, jobDependencies));
        }
Exemple #2
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            //var collisionData = new NativeList<CollisionData>(Allocator.TempJob);
            
            var allocateCellsJobHandle = new AllocateCellsJob
            {
                QuadrantIndexToEntityMap = _quadrantIndexToEntityMap,
                CapacityWanted = _translationQuery.CalculateLength()
            }.Schedule(inputDeps);

            var addQuadrantDataToHashMapJobHandle = new AddQuadrantDataToHashMapJob
            {
                QuadrantIndexToEntityMap = _quadrantIndexToEntityMap.ToConcurrent()
            }.Schedule(this, allocateCellsJobHandle);
            
            var collisionDetectJobHandle = new CollisionDetectJob
            {
                QuadrantIndexToEntityMap = _quadrantIndexToEntityMap,
                //CollisionData = collisionData
            }.Schedule(this, addQuadrantDataToHashMapJobHandle);
            
            var clearCellsJobHandle = new ClearCellsJob
            {
                QuadrantIndexToEntityMap = _quadrantIndexToEntityMap
            }.Schedule(collisionDetectJobHandle);
            
            /*var collisionsCountJobHandle = new CollisionsCountJob
            {
                CollisionData = collisionData
            }.Schedule(collisionDetectJobHandle);
            
            return JobHandle.CombineDependencies(clearCellsJobHandle, collisionsCountJobHandle);*/
            return clearCellsJobHandle;
        }
Exemple #3
0
    protected override void OnUpdate()
    {
        EntityQuery enemyQuery  = GetEntityQuery(typeof(EnemyComponent), typeof(Translation));
        EntityQuery playerQuery = GetEntityQuery(typeof(PlayerComponent), typeof(Translation));

        NativeArray <Entity>      enemies    = enemyQuery.ToEntityArray(Allocator.TempJob);
        NativeArray <Translation> enemyTrans = enemyQuery.ToComponentDataArray <Translation>(Allocator.TempJob);

        NativeArray <CollisionData> enemyCollisionDatas = new NativeArray <CollisionData>(enemies.Length, Allocator.TempJob);

        for (int i = 0; i < enemies.Length; i++)
        {
            CollisionData data = new CollisionData();
            data.entity            = enemies[i];
            data.position          = enemyTrans[i].Value;
            data.radius            = GameSetting.Instance.enemyRadius + GameSetting.Instance.playerRadius;
            enemyCollisionDatas[i] = data;
        }
        enemies.Dispose();
        enemyTrans.Dispose();

        NativeQueue <Entity> collisionEnemies = new NativeQueue <Entity>(Allocator.TempJob);
        CollisionDetectJob   job = new CollisionDetectJob()
        {
            collisionDatas  = enemyCollisionDatas,
            translationType = GetArchetypeChunkComponentType <Translation>(),
            entityType      = GetArchetypeChunkEntityType(),
            collisionEntity = collisionEnemies.AsParallelWriter(),
        };
        JobHandle handle = job.Schedule(playerQuery);

        handle.Complete();


        if (collisionEnemies.Count > 0)
        {
            NativeArray <Entity> removeEntity = collisionEnemies.ToArray(Allocator.Temp);
            this.EntityManager.DestroyEntity(removeEntity);


            //foreach (var item in removeEntity)
            //{
            //    Debug.LogFormat("remove count:{0},index:{1},version:{2}" , removeEntity.Length,item.Index,item.Version);
            //}
            removeEntity.Dispose();
        }
        collisionEnemies.Dispose();
        enemyCollisionDatas.Dispose();
    }