public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) { var data = new GridTileHighlight { tileIndex = tileIndex }; dstManager.AddComponentData(entity, data); }
protected override void OnUpdate() { var commandBuffer = m_EntityCommandBufferSystem.CreateCommandBuffer().AsParallelWriter(); var selectedTile = m_selectedTile.ToComponentDataArray <SelectedTile>(Allocator.TempJob); var gameState = m_gameStateGroup.ToComponentDataArray <GameState>(Allocator.TempJob); var spawner = m_highlightSpawner.ToComponentDataArray <GridHighlightSpawner>(Allocator.TempJob); var tileMap = m_tileMapGroup.ToComponentDataArray <Tile>(Allocator.TempJob); var placingBuilding = m_placingBuilding.ToComponentDataArray <Building>(Allocator.TempJob); float gridHighlightDisplayDistance = Settings.Instance.gridHighlightDisplayDistance; int tilesPerWidth = TerrainSystem.tilesPerWidth; var highlightJob = Entities .ForEach((Entity entity, int entityInQueryIndex, ref Tile t) => { if ((gameState[0].gameState == e_GameStates.state_BuildingPlacement) || (gameState[0].gameState == e_GameStates.state_RoadPlacement)) { if ((math.distance(t.tileCoord, selectedTile[0].tileCoord) < gridHighlightDisplayDistance) && (t.isValid == 1)) { if (gameState[0].gameState == e_GameStates.state_BuildingPlacement) { // if we are in building placement, we should have a placing building for (int i = 0; i < placingBuilding.Length; i++) { if (TileUnderPlacingBuilding(selectedTile[0].tileID, t.tileID, placingBuilding[0].templateCoords, tilesPerWidth)) { t.highlighted = 0; return; } } } if (t.highlighted == 0) { Entity instance = commandBuffer.Instantiate(entityInQueryIndex, spawner[0].Prefab); GridTileHighlight g = new GridTileHighlight { tileIndex = t.tileID }; commandBuffer.SetComponent(entityInQueryIndex, instance, g); Translation tr = new Translation { Value = new float3(t.tileCoord) }; commandBuffer.SetComponent(entityInQueryIndex, instance, tr); t.highlighted = 1; } } else { t.highlighted = 0; } } else { t.highlighted = 0; } }).Schedule(Dependency); m_EntityCommandBufferSystem.AddJobHandleForProducer(highlightJob); var destroyHighlightJob = Entities .ForEach((Entity entity, int entityInQueryIndex, ref GridTileHighlight g, ref Translation t) => { if ((gameState[0].gameState == e_GameStates.state_BuildingPlacement) || (gameState[0].gameState == e_GameStates.state_RoadPlacement)) { if ((math.distance(t.Value, selectedTile[0].tileCoord) >= gridHighlightDisplayDistance) || (tileMap[g.tileIndex].isValid == 0)) { commandBuffer.DestroyEntity(entityInQueryIndex, entity); } if (gameState[0].gameState == e_GameStates.state_BuildingPlacement) { for (int i = 0; i < placingBuilding.Length; i++) { if (TileUnderPlacingBuilding(selectedTile[0].tileID, g.tileIndex, placingBuilding[0].templateCoords, tilesPerWidth)) { commandBuffer.DestroyEntity(entityInQueryIndex, entity); } } } } else { commandBuffer.DestroyEntity(entityInQueryIndex, entity); } }).Schedule(highlightJob); m_EntityCommandBufferSystem.AddJobHandleForProducer(destroyHighlightJob); destroyHighlightJob.Complete(); selectedTile.Dispose(); gameState.Dispose(); spawner.Dispose(); tileMap.Dispose(); placingBuilding.Dispose(); }