protected override void OnOverTile(Vector2Int tileXY) { base.OnOverTile(tileXY); UnitData structure = GetStructureData(); Vector2Int structureSize = StructureData.GetStructureSize(structure.typeID); structureSize += new Vector2Int(2, 2); // Bulldozed area Vector2Int minOffset = new Vector2Int(-structureSize.x / 2, -structureSize.y / 2); // Set each tile status based on collision within structure area for (int x = 0; x < structureSize.x; ++x) { for (int y = 0; y < structureSize.y; ++y) { Vector2Int localTileXY = new Vector2Int(x, y); Vector2Int curTileXY = tileXY + localTileXY + minOffset; bool isInBulldozedArea = x == 0 || y == 0 || x == structureSize.x - 1 || y == structureSize.y - 1; // Structures can't be placed on impassable terrain, including bulldozed area bool canPlace = TileMapData.IsTilePassable(curTileXY); // Structures can have units in bulldozed area, but not in building area if (canPlace && !isInBulldozedArea) { canPlace = !AreUnitsInArea(new RectInt(curTileXY, Vector2Int.one)); } // Structures can have walls in bulldozed area, but not in building area if (canPlace && !isInBulldozedArea) { canPlace = !AreWallsInArea(new RectInt(curTileXY, Vector2Int.one)); } Color color = Color.red; if (canPlace) { color = isInBulldozedArea ? Color.yellow : Color.green; } m_OverlayRenderer.SetTileStatus(localTileXY, color); } } }
public void RefreshOverlay() { if (!gameObject.activeSelf) { return; } if (m_SelectedButtonName == null) { return; } UnitData structure = GetStructureData(); Vector2Int structureSize = StructureData.GetStructureSize(structure.typeID); structureSize += new Vector2Int(2, 2); // Bulldozed area Vector2 offset = new Vector2(-structureSize.x / 2, -structureSize.y / 2); offset *= m_Tilemap.cellSize; PlayerData player = UserData.current.selectedVariant.players[m_DropdownPlayer.value]; m_OverlayRenderer.SetOverlay(m_UnitRenderer.AddUnit(player, structure), structureSize, offset); }