private void OnBrickClick(Brick brick) { if (GameStateController.GameState != GameState.Play) { return; } var triggered = new HashSet <Brick>(); var bricksToCheck = new Queue <Brick>(); var checkedBricks = new HashSet <Brick>(); bricksToCheck.Enqueue(brick); while (bricksToCheck.Count > 0)//check all neighbours to trigger by type { var targetBrick = bricksToCheck.Dequeue(); if (checkedBricks.Contains(targetBrick)) { continue; } triggered.Add(targetBrick); //check left if (targetBrick.PosX > 0) { var leftBrick = bricks[targetBrick.PosY][targetBrick.PosX - 1]; if (leftBrick != null && targetBrick.IsTriggerWith(leftBrick)) { bricksToCheck.Enqueue(leftBrick); } } //check right if (targetBrick.PosX < Width - 1) { var rightBrick = bricks[targetBrick.PosY][targetBrick.PosX + 1]; if (rightBrick != null && targetBrick.IsTriggerWith(rightBrick)) { bricksToCheck.Enqueue(rightBrick); } } //check top if (targetBrick.PosY < Height - 1) { var topBrick = bricks[targetBrick.PosY + 1][targetBrick.PosX]; if (topBrick != null && targetBrick.IsTriggerWith(topBrick)) { bricksToCheck.Enqueue(topBrick); } } //check bottom if (targetBrick.PosY > 0) { var bottomBrick = bricks[targetBrick.PosY - 1][targetBrick.PosX]; if (bottomBrick != null && targetBrick.IsTriggerWith(bottomBrick)) { bricksToCheck.Enqueue(bottomBrick); } } checkedBricks.Add(targetBrick); } if (triggered.Count < countToTrigger) { return; } GameStateController.SetState(GameState.AnimateFall); var activatedBricks = new HashSet <Brick>(); var collectedBricks = new HashSet <Brick>(); //Execute triggered bricks behaviours foreach (var triggeredBrick in triggered) { Activate(triggeredBrick, activatedBricks, collectedBricks); } //Collect triggered bricks foreach (var collectedBrick in collectedBricks) { bricks[collectedBrick.PosY][collectedBrick.PosX] = null; collectedBrick.OnClick -= OnBrickClick; GameStateController.CollectResources(collectedBrick.Resources); GameObject.DestroyImmediate(collectedBrick.gameObject); } currentSpeed = fallingSpeed; RecalculatePositions(); }