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)); }
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(); }